SlideShare a Scribd company logo
1 of 46
Roteiro
●

Introdução
–
–

Por que o framework? Qual o seu foco real?

–

Arquitetura, estrutura;

–
●

Contextualizar o caminho até o framework;

Templates.

Aspectos
–

Persistência de objetos;

–

Apresentação;

–

Organização.

Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#2
Contextualizar...
●

Algumas coisas só fazem sentido se contextualizar...

Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#3
O caminho
●

Clipper (1994-1998): comercial, bibliotecas, funções;

●

Delphi (1998-1999): automação, componentes;

●

PHP (2000): SAGU (php+html+sql);

●

PHP-GTK(2001): PHP só com classes;

●

Gnuteca (2002): PHP Web com classes;

●

Design Patterns (2004): Aprendizado na Unisinos;

●

Core (2006): Primeiro Framework básico MVC;

●

Mestrado (2008, 2009): Projeto em background;

●

Retomada (2011, 2012): Lançamento em Dez/12;

●

Comunidade crescente;

●

Projetos grandes provando sua eficácia.
Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#4
Por quê?
●

Explicação bom mocinho:
–

●

Porque eu quero mudar o mundo;

O mais próximo da realidade:
–

Por que eu preciso disto;

–

Porque eu sei como fazer;

–

Porque eu quero muito fazer;

–

Porque vai ficar do jeito que eu quiser;

–

Porque ninguém pode me impedir;

–

Porque eu faria de qualquer jeito mesmo;

–

Porque mais alguém pode gostar disso (you ;-).

Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#5
What's the main point
●

Softwares de negócio possuem necessidades pontuais;

●

Foco na camada de negócios, com regras complexas;

●

Maior uniformidade (padronização) na apresentação;

●

Maior padronização de estrutura entre projetos;

●

Necessidade de produtividade, mesmo para iniciantes;

●

Várias formas de fazer a mesma coisa gera fragmentação;

●

Quanto mais tecnologias diferentes, menos uniforme;

●

Uniformização facilita um entendimento comum;

●

Foco no negócio, não na tecnologia;

●

Tudo para tornar a MANUTENÇÃO mais simples;

●

MANUTENÇÃO é a grande causadora de falhas em SW.
Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#6
Arquitetura
●

Arquitetura do framework

Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#8
Estrutura
●

Estrutura do framework.

Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#9
Instalação
# cd /var/www
# unzip adianti-framework-<versão>.zip
http://localhost/framework

Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#10
Página de entrada
●

Pelo navegador:
http://localhost/framework/index.php?class=ClienteForm

●

Links internos:
<a href="index.php?class=ClienteForm" generator="adianti"> ...</a>

Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#11
Template
●

Armazenado em app/templates.
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
{LIBRARIES}
...
<script type="text/javascript">
$('[generator="adianti"]').live('click', function() {
__adianti_load_page($(this).attr('href'));
return false;
});
</script>
</head>
<body>
<div class="container">
<div class="body">
<div id="adianti_div_content" class="content"></div>
<div id="adianti_online_content"></div>
</div>
</div>
<script type="text/javascript">
//#javascript_placeholder#
</script>
</body>
</html>

Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#12
Um controlador
●

Toda página é filha de TPage ou TWindow;

●

É construída por meio de composição de objetos.
<?php
class WellcomeView extends TPage
{
function __construct()
{
parent::__construct();
$image = new TImage('app/images/frontpage.png');
// adiciona a imagem à página.
parent::add($image);
}
}
?>

Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#13
A aplicação Tutor
●

Demonstra as funcionalidades do framework.

Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#14
A aplicação Tutor
●

Roda tanto Web, quanto Desktop:

Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#15
Persistência
Active Record
●

Um objeto que representa uma linha de uma tabela e
encapsula ao mesmo tempo o acesso aos dados e a lógica
de negócios;
<?php
/**
* Active Record para Customer (clientes)
*/
class Customer extends TRecord
{
const TABLENAME = 'customer';
const PRIMARYKEY= 'id';
const IDPOLICY = 'max'; // {max, serial}
}
?>

Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#17
Salvar um novo objeto
●

Armazenar um novo objeto
<?php
//...
TTransaction::open('samples'); // abre uma transação
// cria novo objeto
$maria = new Customer;
INSERT INTO customer (
$maria->name
= 'Maria da Silva';
name,
$maria->address
= 'Rua da Conceicao';
address,
$maria->phone
= '(51) 8111-2222';
phone,
... )
$maria->birthdate
= '2013-02-15';
values
$maria->status
= 'S';
(
$maria->email
= 'maria@email.com';
'Maria da Silva',
'Rua da Conceicao',
$maria->gender
= 'M';
'(51) 8111-2222',
$maria->category_id = '1';
...);
$maria->city_id
= '1';
$maria->store(); // armazena o objeto
TTransaction::close(); // fecha a transação.
//...
?>

Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#18
Alterar um objeto
●

Carregar um cliente;

●

Alterar uma de suas propriedades.
<?php
//...
TTransaction::open('samples'); // abre uma transação
$objeto = new Customer; // instancia o cliente
$customer= $objeto->load(31); // carrega o cliente 31
if ($customer) // se existe
{
$customer->phone = '51 8111-3333'; // muda o fone
$customer->store(); // armazena o objeto
}
new TMessage('info', 'Objeto atualizado');
TTransaction::close(); // fecha a transação.
//...
?>

Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#19
Manipulando coleções
●

Carrega um conjunto de objetos que atendem ao critério.
<?php
//...
TTransaction::open('samples'); // abre uma transação
$criteria = new TCriteria;
$criteria->add(new TFilter('address', 'like', 'Rua Porto%'));
$criteria->add(new TFilter('gender', '=', 'M'));
$repository = new TRepository('Customer');
$customers = $repository->load($criteria);
foreach ($customers as $customer)
{
$customer->phone = '84 '.substr($customer->phone, 3);
$customer->store();
}
TTransaction::close(); // fecha a transação.
//...
?>

Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#20
Manipulando coleções
●

Versão simplificada
<?php
TTransaction::open('samples');
$repository = new TRepository('Customer');
$customers = $repository->where('gender', '=', 'M')
->where('name', 'like', 'A%')
->load();
foreach ($customers as $customer)
{
echo $customer->id . ' - ' . $customer->name . '<br>';
}
TTransaction::close();
?>

●

Versão super simplificada (PHP >= 5.4):
(new TRepository('Contact'))->where('customer_id', '=', $id)->delete();

Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#21
Orientação ao modelo
●

Salvo no formato XMI.

Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#22
Studio Pro
XMI

SQL
PHP
<?php
/**
* Customer Active Record
* @author <your-name-here>
*/
class Customer extends TRecord
{
public function get_city()
public function addSkill(Skill $skill)
public function getSkills()
public function load($id)
public function store()
public function delete($id = NULL)
}
?>
Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#23
Studio Pro
●

Se o modelo for feito antes, facilita tudo;

●

Relações podem ser definidas por wizards também.
<?php
// load customer
$obj = new Customer(5);
print $obj->city->name;
print $obj->category->name;
// percorre contatos
foreach ($obj->getContacts() as $contact)
{
$contact->value = '9'.$contact->value;
$contact->store();
print $contact->type . '-' . $contact->value;
}
foreach ($obj->getSkills() as $skill)
{
print $skill->name;
}
Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#24
Apresentação
Containers
<?php
class TestView extends TPage
{
function __construct()
{
parent::__construct();
$table = new TTable;
$table->width = '400px';
$table->border = '1';
$title = new TLabel('Texto1');
$title->setFontSize(18);
$title->setFontFace('Arial');
$title->setFontColor('red');
$row=$table->addRow();
$row->addCell($title);
$row->addCell(new TLabel('Texto2'));
parent::add($table);
}
}
?>
Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#26
Painéis
<?php
class TestView extends TPage
{
function __construct()
{
parent::__construct();
$panel = new TPanel(480, 260);
$title = new TLabel('Texto1');
$title->setFontSize(18);
$title->setFontFace('Arial');
$title->setFontColor('red');
$image = new TImage('app/images/mouse.png');
$name = new TEntry('name');
$name->setSize(140);
$panel->put($title, 10, 40);
$panel->put($image, 100, 80);
parent::add($panel);
}
}
?>
Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#27
Notebook
<?php
class TestView extends TPage
{
function __construct()
{
parent::__construct();
$notebook = new TNotebook(400,200);
$page1 = new TTable;
$page2 = new TPanel(370,180);
// adds two pages in the notebook
$notebook->appendPage('Basic data', $page1);
$notebook->appendPage('Other data', $page2);
$page1->addRow()->addCell(new TLabel('conteudo page1'));
$page2->put(new TEntry('name'), 50,50);
parent::add($notebook);
}
}
?>

Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#28
Informação
<?php
class TestView extends TPage
{
public function __construct()
{
parent::__construct();
new TMessage('info', 'Information message');
}
}
?>

Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#29
Questão
<?php
class TestView extends TPage
{
public function __construct()
{
parent::__construct();
$action1 = new TAction(array($this, 'onAction1'));
$action2 = new TAction(array($this, 'onAction2'));
$action1->setParameter('parameter', 1);
$action2->setParameter('parameter', 2);
new TQuestion('Deseja realizar essa operação ?', $action1, $action2);
}
function onAction1($param)
{
new TMessage('info', "Primeira opção. Parâmetro {$param['parameter']}");
}
}
?>

Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#30
Quick Forms
<?php
class TestView extends TPage
{
private $form;
function __construct()
{
parent::__construct();
$this->form
$id
$description
$date
$text

=
=
=
=
=

new
new
new
new
new

TQuickForm;
TEntry('id');
TEntry('description');
TDate('date');
TText('text');

$this->form->addQuickField('Id',
$id,
40);
$this->form->addQuickField('Description', $description, 200);
$this->form->addQuickField('Date', $date, 100);
$this->form->addQuickField('Text', $text, 120);
$action = new TAction(array($this, 'onSave'));
$this->form->addQuickAction('Save', $action, 'ico_save.png');
parent::add($this->form);
}

Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#31
Quick Forms
public function onSave($param)
{
$data = $this->form->getData();
$this->form->setData($data);
$message =
$message.=
$message.=
$message.=

'Id: '
. $data->id . '<br>';
'Description : ' . $data->description . '<br>';
'Date : '
. $data->date . '<br>';
'Text : '
. $data->text . '<br>';

new TMessage('info', $message);
}
}
?>

Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#32
Automatic Selections
<?php
class TestView extends TPage
{
private $form;
function __construct()
{
parent::__construct();
$notebook = new TNotebook(530, 160);
$this->form = new TForm;
$table = new TTable;
$this->form->add($table);
$notebook->appendPage('Automatic DBselection elements', $this->form);
$radio = new TDBRadioGroup('radio', 'samples', 'Category', 'id', 'name');
$check = new TDBCheckGroup('check', 'samples', 'Category', 'id', 'name');
$combo = new TDBCombo('combo', 'samples', 'Category', 'id', 'name');
$radio->setLayout('horizontal');
$check->setLayout('horizontal');
$combo->setSize(160);

Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#33
Datagrids
<?php
class TestView extends TPage
{
private $datagrid;
public function __construct()
{
parent::__construct();
$this->datagrid = new TDataGrid;
$code = new TDataGridColumn('code', 'Code', 'right', 70);
$name = new TDataGridColumn('name', 'Name', 'left', 180);
...
$this->datagrid->addColumn($code);
$this->datagrid->addColumn($name);
...
$action1 = new TDataGridAction(array($this, 'onView'));
$action1->setLabel('View');
$action1->setImage('ico_find.png');
$action1->setField('name');
$this->datagrid->addAction($action1);
$this->datagrid->createModel();
parent::add($this->datagrid);
}
Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#34
Datagrids
function onReload()
{
$this->datagrid->clear();
$item = new StdClass;
$item->code
= '1';
$item->name
= 'Fábio Locatelli';
$item->address = 'Rua Expedicionario';
$item->fone
= '1111-1111';
$this->datagrid->addItem($item);
...
}
function onView($param)
{
$key=$param['key'];
new TMessage('info', "The name is : $key");
}
function show()
{
$this->onReload();
parent::show();
}
}
?>
Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#35
Controladores
Formulário
<?php
class StandardFormView extends TPage
{
protected $form; // form
function __construct()
{
parent::__construct();
$this->form = new TQuickForm('form_City');
$id
= new TEntry('id');
$name
= new TEntry('name');
$id->setEditable(FALSE);
$this->form->addQuickField('id', $id, 100);
$this->form->addQuickField('name', $name, 100);
$action = new TAction(array($this, 'onSave'));
$this->form->addQuickAction('Save', $action, 'ico_save.png');
parent::add($this->form);
}
}
?>
Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#37
Formulário
<?php
class StandardFormView extends TPage
{
// ...
function onSave()
{
try
{
TTransaction::open('samples');
$object = $this->form->getData('City');
$object->store();
$this->form->setData($object);
TTransaction::close();
new TMessage('info', 'Record saved');
}
catch (Exception $e) // in case of exception
{
new TMessage('error', '<b>Error</b> ' . $e->getMessage());
TTransaction::rollback();
}
}
}
?>
Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#38
Templates
Templates
formdecorator.html
<!--[main]-->
<div class="formdecorator">
{$form}
</div>
<!--[/main]-->

formdecorator.css
.formdecorator {
background: #ddd;
margin: 0px;
padding: 17px;
width: 500px;
top: 0px;
left: 0;
border: solid 1px #b4b4b4;
border-radius: 10px;
box-shadow: 0 1px 10px rgba(0, 0, 0, .3);
}
Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#40
Templates
<?php
class FormDecoratedView extends TPage
{
private $form;
function __construct()
{
parent::__construct();
TPage::include_css('app/resources/formdecorator.css');
$html = new THtmlRenderer('app/resources/formdecorator.html');
$this->form = new TQuickForm;
$id
= new TEntry('id');
$description = new TEntry('description');
$this->form->addQuickField('Id',
$id,
// ...

40);

$this->form->addQuickAction('Save', new TAction(..., 'ico_save.png');
// substitui variáveis
$replace = array('form'=> $this->form);
$html->enableSection('main', $replace);
parent::add($html);
}
}
?>
Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#41
Studio Pro Designer

Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#42
Form Elements
<?php
class TestView extends TPage
{
private $form;
function __construct()
{
parent::__construct();
$this->form = new TForm;
try {
$ui = new TUIBuilder(500,300);
$ui->setController($this);
$ui->setForm($this->form);
$ui->parseFile('app/forms/sample.form.xml'); // lê o xml
$this->form->add($ui);
$this->form->setFields($ui->getFields());
}
catch (Exception $e)
{
new TMessage('error', $e->getMessage());
}
parent::add($this->form);
}

Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#43
Form Elements
function onView()
{
$data = $this->form->getData();
// put the data back to the form
$this->form->setData($data);
// creates
$message =
$message.=
$message.=
$message.=
$message.=
$message.=

a string with the form element's values
'ID : ' . $data->id . '<br>';
'Name : ' . $data->name . '<br>';
'Birthdate : ' . $data->birthdate . '<br>';
'Gender : ' . $data->gender . '<br>';
'Pets : ' . $data->pets . '<br>';
'Fashion : ' . implode(',', $data->fashion) . '<br>';

// show the message
new TMessage('info', $message);
}

Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#44
Próximas novidades
●

Novos componentes:
TSortList;
Melhorias:
–

●

Nova TFile com progresso;
– Novos dialogs (TMessage, TQuestion com bootstrap);
– Novos eventos (trocas em radios, checks);
– Melhorias nas exceções das validações;
Novos exemplos:
–

●

–
●

Transições de páginas (wizards);

Novas apps disponíveis:
–

Aplicação completa com controle de permissões.

Adianti Solutions Ltda © Pablo Dall'Oglio

Adianti Framework

#45
Adianti Framework PHPConf 2013

More Related Content

What's hot

Array searching sorting_pert_11,12,13,14,15
Array searching sorting_pert_11,12,13,14,15Array searching sorting_pert_11,12,13,14,15
Array searching sorting_pert_11,12,13,14,15
doudomblogspot
 
Metode Pemilihan dan Penetapan Lokasi Pabrik
Metode Pemilihan dan Penetapan Lokasi PabrikMetode Pemilihan dan Penetapan Lokasi Pabrik
Metode Pemilihan dan Penetapan Lokasi Pabrik
henrianto leo
 
Laporan Praktikum Basis Data Modul II-Primary Key
Laporan Praktikum Basis Data Modul II-Primary KeyLaporan Praktikum Basis Data Modul II-Primary Key
Laporan Praktikum Basis Data Modul II-Primary Key
Shofura Kamal
 
Database minimarket-Garnis Q
Database minimarket-Garnis QDatabase minimarket-Garnis Q
Database minimarket-Garnis Q
G Nis
 

What's hot (20)

Mysql joins
Mysql joinsMysql joins
Mysql joins
 
Array searching sorting_pert_11,12,13,14,15
Array searching sorting_pert_11,12,13,14,15Array searching sorting_pert_11,12,13,14,15
Array searching sorting_pert_11,12,13,14,15
 
PHP CRUD Database Mysql
PHP CRUD Database MysqlPHP CRUD Database Mysql
PHP CRUD Database Mysql
 
Ekonomi - Pasar Persaingan Sempurna
Ekonomi - Pasar Persaingan SempurnaEkonomi - Pasar Persaingan Sempurna
Ekonomi - Pasar Persaingan Sempurna
 
Metode Pemilihan dan Penetapan Lokasi Pabrik
Metode Pemilihan dan Penetapan Lokasi PabrikMetode Pemilihan dan Penetapan Lokasi Pabrik
Metode Pemilihan dan Penetapan Lokasi Pabrik
 
Percabangan
PercabanganPercabangan
Percabangan
 
Jack Ma Presentation
Jack Ma PresentationJack Ma Presentation
Jack Ma Presentation
 
Jaringan syaraf tiruan uas docs
Jaringan syaraf tiruan uas docsJaringan syaraf tiruan uas docs
Jaringan syaraf tiruan uas docs
 
Pengertian field, record, table, file, data dan basis data lengkap pengerti...
Pengertian field, record, table, file, data dan basis data lengkap   pengerti...Pengertian field, record, table, file, data dan basis data lengkap   pengerti...
Pengertian field, record, table, file, data dan basis data lengkap pengerti...
 
oligopoli lanjutan
oligopoli lanjutanoligopoli lanjutan
oligopoli lanjutan
 
JOIN
JOINJOIN
JOIN
 
Pertemuan x pasar persaingan sempurna
Pertemuan x  pasar persaingan sempurnaPertemuan x  pasar persaingan sempurna
Pertemuan x pasar persaingan sempurna
 
backpropagation
backpropagationbackpropagation
backpropagation
 
(37)history of ashok leyland ppt ah hari master piece
(37)history of ashok leyland ppt ah hari master piece(37)history of ashok leyland ppt ah hari master piece
(37)history of ashok leyland ppt ah hari master piece
 
Biaya peluang
Biaya peluangBiaya peluang
Biaya peluang
 
Laporan Praktikum Basis Data Modul II-Primary Key
Laporan Praktikum Basis Data Modul II-Primary KeyLaporan Praktikum Basis Data Modul II-Primary Key
Laporan Praktikum Basis Data Modul II-Primary Key
 
Bab 5
Bab 5Bab 5
Bab 5
 
6. Stack (Struktur Data)
6. Stack (Struktur Data)6. Stack (Struktur Data)
6. Stack (Struktur Data)
 
Procedure n functions
Procedure n functionsProcedure n functions
Procedure n functions
 
Database minimarket-Garnis Q
Database minimarket-Garnis QDatabase minimarket-Garnis Q
Database minimarket-Garnis Q
 

Viewers also liked

Criando relatórios com PHP - PHP Conference Brasil 2013
Criando relatórios com PHP - PHP Conference Brasil 2013Criando relatórios com PHP - PHP Conference Brasil 2013
Criando relatórios com PHP - PHP Conference Brasil 2013
Pablo Dall'Oglio
 
As novidades do PHP5 (2005)
As novidades do PHP5 (2005)As novidades do PHP5 (2005)
As novidades do PHP5 (2005)
Pablo Dall'Oglio
 
PHP: Programando com orientação a Objetos
PHP: Programando com orientação a ObjetosPHP: Programando com orientação a Objetos
PHP: Programando com orientação a Objetos
Pablo Dall'Oglio
 
Experiencias de um desenvolvedor de software livre (2005)
Experiencias de um desenvolvedor de software livre (2005)Experiencias de um desenvolvedor de software livre (2005)
Experiencias de um desenvolvedor de software livre (2005)
Pablo Dall'Oglio
 
Criando aplicações com PHP-GTK
Criando aplicações com PHP-GTKCriando aplicações com PHP-GTK
Criando aplicações com PHP-GTK
Pablo Dall'Oglio
 
Relatórios Corporativos com Java e Software Livre
Relatórios Corporativos com Java e Software LivreRelatórios Corporativos com Java e Software Livre
Relatórios Corporativos com Java e Software Livre
elliando dias
 

Viewers also liked (13)

Criando relatórios com PHP - PHP Conference Brasil 2013
Criando relatórios com PHP - PHP Conference Brasil 2013Criando relatórios com PHP - PHP Conference Brasil 2013
Criando relatórios com PHP - PHP Conference Brasil 2013
 
As novidades do PHP5 (2005)
As novidades do PHP5 (2005)As novidades do PHP5 (2005)
As novidades do PHP5 (2005)
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um Framework
 
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworks
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworksDo Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworks
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworks
 
Design for change: Fatores que influenciam na longevidade de um Software PHP
Design for change: Fatores que influenciam na longevidade de um Software PHPDesign for change: Fatores que influenciam na longevidade de um Software PHP
Design for change: Fatores que influenciam na longevidade de um Software PHP
 
Design Patterns com PHP
Design Patterns com PHPDesign Patterns com PHP
Design Patterns com PHP
 
PHP: Programando com orientação a Objetos
PHP: Programando com orientação a ObjetosPHP: Programando com orientação a Objetos
PHP: Programando com orientação a Objetos
 
Experiencias de um desenvolvedor de software livre (2005)
Experiencias de um desenvolvedor de software livre (2005)Experiencias de um desenvolvedor de software livre (2005)
Experiencias de um desenvolvedor de software livre (2005)
 
Criando aplicações com PHP-GTK
Criando aplicações com PHP-GTKCriando aplicações com PHP-GTK
Criando aplicações com PHP-GTK
 
Implementando enterprise patterns com PHP
Implementando enterprise patterns com PHPImplementando enterprise patterns com PHP
Implementando enterprise patterns com PHP
 
Relatórios Corporativos com Java e Software Livre
Relatórios Corporativos com Java e Software LivreRelatórios Corporativos com Java e Software Livre
Relatórios Corporativos com Java e Software Livre
 
Fatores que influenciam na longevidade de um Software
Fatores que influenciam na longevidade de um SoftwareFatores que influenciam na longevidade de um Software
Fatores que influenciam na longevidade de um Software
 
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
 

Similar to Adianti Framework PHPConf 2013

Drupal 7 Direto das Trincheiras
Drupal 7  Direto das TrincheirasDrupal 7  Direto das Trincheiras
Drupal 7 Direto das Trincheiras
Rafael Caceres
 

Similar to Adianti Framework PHPConf 2013 (20)

Domain Driven Design PHP TDC2014
Domain Driven Design PHP TDC2014Domain Driven Design PHP TDC2014
Domain Driven Design PHP TDC2014
 
Desenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkDesenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana framework
 
Portfólio ADS- sem 4 - atividade em grupo
Portfólio ADS- sem 4 - atividade em grupoPortfólio ADS- sem 4 - atividade em grupo
Portfólio ADS- sem 4 - atividade em grupo
 
Lampada Php Conference Brasil 2007 Palestra
Lampada Php Conference Brasil 2007 PalestraLampada Php Conference Brasil 2007 Palestra
Lampada Php Conference Brasil 2007 Palestra
 
Aplicações rápidas para a Web com Django
Aplicações rápidas para a Web com DjangoAplicações rápidas para a Web com Django
Aplicações rápidas para a Web com Django
 
IMaster Developer Week RJ - Qualidade de software: SOLID/DDD
IMaster Developer Week RJ - Qualidade de software: SOLID/DDDIMaster Developer Week RJ - Qualidade de software: SOLID/DDD
IMaster Developer Week RJ - Qualidade de software: SOLID/DDD
 
Criando software para o futuro com DDD, Arquitetura, Patterns, e Atitude
Criando software para o futuro com DDD, Arquitetura, Patterns, e AtitudeCriando software para o futuro com DDD, Arquitetura, Patterns, e Atitude
Criando software para o futuro com DDD, Arquitetura, Patterns, e Atitude
 
Rails na prática
Rails na práticaRails na prática
Rails na prática
 
Drupal 7 Direto das Trincheiras
Drupal 7  Direto das TrincheirasDrupal 7  Direto das Trincheiras
Drupal 7 Direto das Trincheiras
 
Solid
SolidSolid
Solid
 
Aplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com DjangoAplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com Django
 
Zend Framework 1.11
Zend Framework 1.11Zend Framework 1.11
Zend Framework 1.11
 
TClientDataSet - Palestra sobre MultiTier
TClientDataSet - Palestra sobre MultiTierTClientDataSet - Palestra sobre MultiTier
TClientDataSet - Palestra sobre MultiTier
 
PHP - Programação para seres humanos
PHP - Programação para seres humanosPHP - Programação para seres humanos
PHP - Programação para seres humanos
 
Introdução ao Drupal
Introdução ao DrupalIntrodução ao Drupal
Introdução ao Drupal
 
Mini Palestra: PHP no mundo mobile
Mini Palestra: PHP no mundo mobileMini Palestra: PHP no mundo mobile
Mini Palestra: PHP no mundo mobile
 
Zend Framework
Zend FrameworkZend Framework
Zend Framework
 
Grails
GrailsGrails
Grails
 
Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017
 
Aula 1 view model livedata e databinding.pptx
Aula 1   view model livedata e databinding.pptxAula 1   view model livedata e databinding.pptx
Aula 1 view model livedata e databinding.pptx
 

Recently uploaded

Recently uploaded (9)

ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdf
 
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docxATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdf
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 

Adianti Framework PHPConf 2013

  • 1.
  • 2. Roteiro ● Introdução – – Por que o framework? Qual o seu foco real? – Arquitetura, estrutura; – ● Contextualizar o caminho até o framework; Templates. Aspectos – Persistência de objetos; – Apresentação; – Organização. Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #2
  • 3. Contextualizar... ● Algumas coisas só fazem sentido se contextualizar... Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #3
  • 4. O caminho ● Clipper (1994-1998): comercial, bibliotecas, funções; ● Delphi (1998-1999): automação, componentes; ● PHP (2000): SAGU (php+html+sql); ● PHP-GTK(2001): PHP só com classes; ● Gnuteca (2002): PHP Web com classes; ● Design Patterns (2004): Aprendizado na Unisinos; ● Core (2006): Primeiro Framework básico MVC; ● Mestrado (2008, 2009): Projeto em background; ● Retomada (2011, 2012): Lançamento em Dez/12; ● Comunidade crescente; ● Projetos grandes provando sua eficácia. Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #4
  • 5. Por quê? ● Explicação bom mocinho: – ● Porque eu quero mudar o mundo; O mais próximo da realidade: – Por que eu preciso disto; – Porque eu sei como fazer; – Porque eu quero muito fazer; – Porque vai ficar do jeito que eu quiser; – Porque ninguém pode me impedir; – Porque eu faria de qualquer jeito mesmo; – Porque mais alguém pode gostar disso (you ;-). Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #5
  • 6. What's the main point ● Softwares de negócio possuem necessidades pontuais; ● Foco na camada de negócios, com regras complexas; ● Maior uniformidade (padronização) na apresentação; ● Maior padronização de estrutura entre projetos; ● Necessidade de produtividade, mesmo para iniciantes; ● Várias formas de fazer a mesma coisa gera fragmentação; ● Quanto mais tecnologias diferentes, menos uniforme; ● Uniformização facilita um entendimento comum; ● Foco no negócio, não na tecnologia; ● Tudo para tornar a MANUTENÇÃO mais simples; ● MANUTENÇÃO é a grande causadora de falhas em SW. Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #6
  • 7.
  • 8. Arquitetura ● Arquitetura do framework Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #8
  • 9. Estrutura ● Estrutura do framework. Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #9
  • 10. Instalação # cd /var/www # unzip adianti-framework-<versão>.zip http://localhost/framework Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #10
  • 11. Página de entrada ● Pelo navegador: http://localhost/framework/index.php?class=ClienteForm ● Links internos: <a href="index.php?class=ClienteForm" generator="adianti"> ...</a> Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #11
  • 12. Template ● Armazenado em app/templates. <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> {LIBRARIES} ... <script type="text/javascript"> $('[generator="adianti"]').live('click', function() { __adianti_load_page($(this).attr('href')); return false; }); </script> </head> <body> <div class="container"> <div class="body"> <div id="adianti_div_content" class="content"></div> <div id="adianti_online_content"></div> </div> </div> <script type="text/javascript"> //#javascript_placeholder# </script> </body> </html> Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #12
  • 13. Um controlador ● Toda página é filha de TPage ou TWindow; ● É construída por meio de composição de objetos. <?php class WellcomeView extends TPage { function __construct() { parent::__construct(); $image = new TImage('app/images/frontpage.png'); // adiciona a imagem à página. parent::add($image); } } ?> Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #13
  • 14. A aplicação Tutor ● Demonstra as funcionalidades do framework. Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #14
  • 15. A aplicação Tutor ● Roda tanto Web, quanto Desktop: Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #15
  • 17. Active Record ● Um objeto que representa uma linha de uma tabela e encapsula ao mesmo tempo o acesso aos dados e a lógica de negócios; <?php /** * Active Record para Customer (clientes) */ class Customer extends TRecord { const TABLENAME = 'customer'; const PRIMARYKEY= 'id'; const IDPOLICY = 'max'; // {max, serial} } ?> Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #17
  • 18. Salvar um novo objeto ● Armazenar um novo objeto <?php //... TTransaction::open('samples'); // abre uma transação // cria novo objeto $maria = new Customer; INSERT INTO customer ( $maria->name = 'Maria da Silva'; name, $maria->address = 'Rua da Conceicao'; address, $maria->phone = '(51) 8111-2222'; phone, ... ) $maria->birthdate = '2013-02-15'; values $maria->status = 'S'; ( $maria->email = 'maria@email.com'; 'Maria da Silva', 'Rua da Conceicao', $maria->gender = 'M'; '(51) 8111-2222', $maria->category_id = '1'; ...); $maria->city_id = '1'; $maria->store(); // armazena o objeto TTransaction::close(); // fecha a transação. //... ?> Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #18
  • 19. Alterar um objeto ● Carregar um cliente; ● Alterar uma de suas propriedades. <?php //... TTransaction::open('samples'); // abre uma transação $objeto = new Customer; // instancia o cliente $customer= $objeto->load(31); // carrega o cliente 31 if ($customer) // se existe { $customer->phone = '51 8111-3333'; // muda o fone $customer->store(); // armazena o objeto } new TMessage('info', 'Objeto atualizado'); TTransaction::close(); // fecha a transação. //... ?> Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #19
  • 20. Manipulando coleções ● Carrega um conjunto de objetos que atendem ao critério. <?php //... TTransaction::open('samples'); // abre uma transação $criteria = new TCriteria; $criteria->add(new TFilter('address', 'like', 'Rua Porto%')); $criteria->add(new TFilter('gender', '=', 'M')); $repository = new TRepository('Customer'); $customers = $repository->load($criteria); foreach ($customers as $customer) { $customer->phone = '84 '.substr($customer->phone, 3); $customer->store(); } TTransaction::close(); // fecha a transação. //... ?> Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #20
  • 21. Manipulando coleções ● Versão simplificada <?php TTransaction::open('samples'); $repository = new TRepository('Customer'); $customers = $repository->where('gender', '=', 'M') ->where('name', 'like', 'A%') ->load(); foreach ($customers as $customer) { echo $customer->id . ' - ' . $customer->name . '<br>'; } TTransaction::close(); ?> ● Versão super simplificada (PHP >= 5.4): (new TRepository('Contact'))->where('customer_id', '=', $id)->delete(); Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #21
  • 22. Orientação ao modelo ● Salvo no formato XMI. Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #22
  • 23. Studio Pro XMI SQL PHP <?php /** * Customer Active Record * @author <your-name-here> */ class Customer extends TRecord { public function get_city() public function addSkill(Skill $skill) public function getSkills() public function load($id) public function store() public function delete($id = NULL) } ?> Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #23
  • 24. Studio Pro ● Se o modelo for feito antes, facilita tudo; ● Relações podem ser definidas por wizards também. <?php // load customer $obj = new Customer(5); print $obj->city->name; print $obj->category->name; // percorre contatos foreach ($obj->getContacts() as $contact) { $contact->value = '9'.$contact->value; $contact->store(); print $contact->type . '-' . $contact->value; } foreach ($obj->getSkills() as $skill) { print $skill->name; } Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #24
  • 26. Containers <?php class TestView extends TPage { function __construct() { parent::__construct(); $table = new TTable; $table->width = '400px'; $table->border = '1'; $title = new TLabel('Texto1'); $title->setFontSize(18); $title->setFontFace('Arial'); $title->setFontColor('red'); $row=$table->addRow(); $row->addCell($title); $row->addCell(new TLabel('Texto2')); parent::add($table); } } ?> Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #26
  • 27. Painéis <?php class TestView extends TPage { function __construct() { parent::__construct(); $panel = new TPanel(480, 260); $title = new TLabel('Texto1'); $title->setFontSize(18); $title->setFontFace('Arial'); $title->setFontColor('red'); $image = new TImage('app/images/mouse.png'); $name = new TEntry('name'); $name->setSize(140); $panel->put($title, 10, 40); $panel->put($image, 100, 80); parent::add($panel); } } ?> Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #27
  • 28. Notebook <?php class TestView extends TPage { function __construct() { parent::__construct(); $notebook = new TNotebook(400,200); $page1 = new TTable; $page2 = new TPanel(370,180); // adds two pages in the notebook $notebook->appendPage('Basic data', $page1); $notebook->appendPage('Other data', $page2); $page1->addRow()->addCell(new TLabel('conteudo page1')); $page2->put(new TEntry('name'), 50,50); parent::add($notebook); } } ?> Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #28
  • 29. Informação <?php class TestView extends TPage { public function __construct() { parent::__construct(); new TMessage('info', 'Information message'); } } ?> Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #29
  • 30. Questão <?php class TestView extends TPage { public function __construct() { parent::__construct(); $action1 = new TAction(array($this, 'onAction1')); $action2 = new TAction(array($this, 'onAction2')); $action1->setParameter('parameter', 1); $action2->setParameter('parameter', 2); new TQuestion('Deseja realizar essa operação ?', $action1, $action2); } function onAction1($param) { new TMessage('info', "Primeira opção. Parâmetro {$param['parameter']}"); } } ?> Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #30
  • 31. Quick Forms <?php class TestView extends TPage { private $form; function __construct() { parent::__construct(); $this->form $id $description $date $text = = = = = new new new new new TQuickForm; TEntry('id'); TEntry('description'); TDate('date'); TText('text'); $this->form->addQuickField('Id', $id, 40); $this->form->addQuickField('Description', $description, 200); $this->form->addQuickField('Date', $date, 100); $this->form->addQuickField('Text', $text, 120); $action = new TAction(array($this, 'onSave')); $this->form->addQuickAction('Save', $action, 'ico_save.png'); parent::add($this->form); } Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #31
  • 32. Quick Forms public function onSave($param) { $data = $this->form->getData(); $this->form->setData($data); $message = $message.= $message.= $message.= 'Id: ' . $data->id . '<br>'; 'Description : ' . $data->description . '<br>'; 'Date : ' . $data->date . '<br>'; 'Text : ' . $data->text . '<br>'; new TMessage('info', $message); } } ?> Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #32
  • 33. Automatic Selections <?php class TestView extends TPage { private $form; function __construct() { parent::__construct(); $notebook = new TNotebook(530, 160); $this->form = new TForm; $table = new TTable; $this->form->add($table); $notebook->appendPage('Automatic DBselection elements', $this->form); $radio = new TDBRadioGroup('radio', 'samples', 'Category', 'id', 'name'); $check = new TDBCheckGroup('check', 'samples', 'Category', 'id', 'name'); $combo = new TDBCombo('combo', 'samples', 'Category', 'id', 'name'); $radio->setLayout('horizontal'); $check->setLayout('horizontal'); $combo->setSize(160); Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #33
  • 34. Datagrids <?php class TestView extends TPage { private $datagrid; public function __construct() { parent::__construct(); $this->datagrid = new TDataGrid; $code = new TDataGridColumn('code', 'Code', 'right', 70); $name = new TDataGridColumn('name', 'Name', 'left', 180); ... $this->datagrid->addColumn($code); $this->datagrid->addColumn($name); ... $action1 = new TDataGridAction(array($this, 'onView')); $action1->setLabel('View'); $action1->setImage('ico_find.png'); $action1->setField('name'); $this->datagrid->addAction($action1); $this->datagrid->createModel(); parent::add($this->datagrid); } Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #34
  • 35. Datagrids function onReload() { $this->datagrid->clear(); $item = new StdClass; $item->code = '1'; $item->name = 'Fábio Locatelli'; $item->address = 'Rua Expedicionario'; $item->fone = '1111-1111'; $this->datagrid->addItem($item); ... } function onView($param) { $key=$param['key']; new TMessage('info', "The name is : $key"); } function show() { $this->onReload(); parent::show(); } } ?> Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #35
  • 37. Formulário <?php class StandardFormView extends TPage { protected $form; // form function __construct() { parent::__construct(); $this->form = new TQuickForm('form_City'); $id = new TEntry('id'); $name = new TEntry('name'); $id->setEditable(FALSE); $this->form->addQuickField('id', $id, 100); $this->form->addQuickField('name', $name, 100); $action = new TAction(array($this, 'onSave')); $this->form->addQuickAction('Save', $action, 'ico_save.png'); parent::add($this->form); } } ?> Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #37
  • 38. Formulário <?php class StandardFormView extends TPage { // ... function onSave() { try { TTransaction::open('samples'); $object = $this->form->getData('City'); $object->store(); $this->form->setData($object); TTransaction::close(); new TMessage('info', 'Record saved'); } catch (Exception $e) // in case of exception { new TMessage('error', '<b>Error</b> ' . $e->getMessage()); TTransaction::rollback(); } } } ?> Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #38
  • 40. Templates formdecorator.html <!--[main]--> <div class="formdecorator"> {$form} </div> <!--[/main]--> formdecorator.css .formdecorator { background: #ddd; margin: 0px; padding: 17px; width: 500px; top: 0px; left: 0; border: solid 1px #b4b4b4; border-radius: 10px; box-shadow: 0 1px 10px rgba(0, 0, 0, .3); } Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #40
  • 41. Templates <?php class FormDecoratedView extends TPage { private $form; function __construct() { parent::__construct(); TPage::include_css('app/resources/formdecorator.css'); $html = new THtmlRenderer('app/resources/formdecorator.html'); $this->form = new TQuickForm; $id = new TEntry('id'); $description = new TEntry('description'); $this->form->addQuickField('Id', $id, // ... 40); $this->form->addQuickAction('Save', new TAction(..., 'ico_save.png'); // substitui variáveis $replace = array('form'=> $this->form); $html->enableSection('main', $replace); parent::add($html); } } ?> Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #41
  • 42. Studio Pro Designer Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #42
  • 43. Form Elements <?php class TestView extends TPage { private $form; function __construct() { parent::__construct(); $this->form = new TForm; try { $ui = new TUIBuilder(500,300); $ui->setController($this); $ui->setForm($this->form); $ui->parseFile('app/forms/sample.form.xml'); // lê o xml $this->form->add($ui); $this->form->setFields($ui->getFields()); } catch (Exception $e) { new TMessage('error', $e->getMessage()); } parent::add($this->form); } Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #43
  • 44. Form Elements function onView() { $data = $this->form->getData(); // put the data back to the form $this->form->setData($data); // creates $message = $message.= $message.= $message.= $message.= $message.= a string with the form element's values 'ID : ' . $data->id . '<br>'; 'Name : ' . $data->name . '<br>'; 'Birthdate : ' . $data->birthdate . '<br>'; 'Gender : ' . $data->gender . '<br>'; 'Pets : ' . $data->pets . '<br>'; 'Fashion : ' . implode(',', $data->fashion) . '<br>'; // show the message new TMessage('info', $message); } Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #44
  • 45. Próximas novidades ● Novos componentes: TSortList; Melhorias: – ● Nova TFile com progresso; – Novos dialogs (TMessage, TQuestion com bootstrap); – Novos eventos (trocas em radios, checks); – Melhorias nas exceções das validações; Novos exemplos: – ● – ● Transições de páginas (wizards); Novas apps disponíveis: – Aplicação completa com controle de permissões. Adianti Solutions Ltda © Pablo Dall'Oglio Adianti Framework #45