Adianti Framework Tutorial
Adianti Framework Tutorial
Adianti Framework Tutorial
Agora o momento de criar as classes do modelo da aplicao. Um modelo derivado da classe TRecord do
framework. Esta classe fornece mtodos como store(), delete() e load() que manipulam um objeto na base de
dados. O uso deste mtodos est explicado no tutorial. O prximo arquivo est localizado no diretrio
app/model e nomeado Person.class.php.
1.
<?php
2.
3.
4.
5.
6.
7.
8.
/**
9.
* Constructor method
10.
11.
*/
12.
13.
14.
parent::__construct($id);
15.
parent::addAttribute('name');
16.
parent::addAttribute('address');
17.
parent::addAttribute('birthdate');
18.
parent::addAttribute('gender');
19.
20.
21.
?>
A constante TABLENAME define o nome da tabela que a classe de modelo ir manipular e a constante
PRIMARYKEY define o campo de chave primria. O framework no manipula chaves compostas. A constante
IDPOLICY define a estratgia para gerao de novos ID's. max+1 ou serial (deixa o campo de chave primria
vazio e o banco de dados decide seu novo valor).
O mtodo addAttribute() limita quais atributos deste objeto sero persistidos (gravados) na base de dados.
Quaisquer atributos que no estejam no addAttribute() sero ignorados pelo mecanismo de persistncia. Caso
o addAttribute() no seja chamado nenhuma vez, todos atributos sero persistidos.
<?php
2.
3.
4.
5.
6.
function __construct()
7.
8.
parent::__construct();
9.
10.
parent::setDatabase('samples');
11.
parent::setActiveRecord('Person');
12.
13.
14.
$id
15.
$name
16.
17.
18.
$gender
= new TEntry('id');
= new TEntry('name');
= new TCombo('gender');
19.
20.
$options = array('M'=>'Male','F'=>'Female');
21.
$gender->addItems($options);
22.
23.
$this->form->addQuickField('id',
$id,
100);
24.
$this->form->addQuickField('name',
25.
26.
27.
$this->form->addQuickField('gender',
$name,
$gender,
200);
200);
28.
29.
30.
parent::add($this->form);
31.
32.
33.
?>
A pgina de entrada
A pgina de entrada, que index.web.php (Web) ou index.gtk.php (Gtk), responsvel por definir o
comportamento inicial da aplicao, selecionar idioma, definir timezone, selecionar template, dentre outros.
Configuraes globais e de ambiente da aplicao devem ser definidas na pgina de entrada, no em suas
classes (control, model, etc).
Neste exemplo temos o index.web.php (Web). A pgina de entrada define qual ser o class loader do sistema
(TAdiantiLoader), define o nome da aplicao (usado para separar sesses), define timezone e idioma, cria o
menu da aplicao (ver a seguir), carrega o layout, traduz o layout, e carrega o controlador identificado pela
URL (se existir), por meio da funo __adianti_load_page().
1.
<?php
2.
3.
include_once 'lib/adianti/util/TAdiantiLoader.class.php';
4.
spl_autoload_register(array('TAdiantiLoader', 'autoload_web'));
5.
6.
// read configurations
7.
$ini = parse_ini_file('application.ini');
8.
date_default_timezone_set($ini['timezone']);
9.
TAdiantiCoreTranslator::setLanguage( $ini['language'] );
10.
TApplicationTranslator::setLanguage( $ini['language'] );
11.
12.
// define constants
13.
define('APPLICATION_NAME', $ini['application']);
14.
15.
define('PATH', dirname(__FILE__));
16.
17.
$template = 'theme1';
18.
19.
new TSession;
20.
ob_start();
21.
$menu = TMenuBar::newFromXML('menu.xml');
22.
$menu->show();
23.
$menu_string = ob_get_contents();
24.
ob_end_clean();
25.
26.
$content = file_get_contents("app/templates/{$template}/layout.html");
27.
$content = TApplicationTranslator::translateTemplate($content);
28.
29.
30.
31.
32.
33.
$css
34.
$js
35.
= TPage::getLoadedCSS();
= TPage::getLoadedJS();
36.
37.
if (isset($_REQUEST['class']))
38.
39.
40.
$url = http_build_query($_REQUEST);
$content = str_replace('//#javascript_placeholder#', "__adianti_load_page('engine.php?{$url}');",
$content);
41.
42.
echo $content;
43.
?>
1.
2.
3.
<menu>
<menuitem label='Register'>
<menu>
4.
<menuitem label='Person'>
5.
<menu>
6.
<menuitem label='Form'>
7.
<icon>app/images/ico_store.png</icon>
8.
<action>PersonForm</action>
9.
</menuitem>
10.
</menu>
11.
</menuitem>
12.
</menu>
13.
</menuitem>
14.
</menu>
Testando a aplicao
Agora chegou o momento de testar a aplicao nos ambientes Web e Gtk. Primeiro, vamos testar a aplicao
sob o ambiente Web. Para tal, abrimos o navegador a acessamos o diretrio da aplicao sob o httpdocs do
apache. Nesse momento, o frontend index.php carregado.
http://localhost/samples
Agora o momento de testar a aplicao sob o ambiente grfico (Gtk). Primeiro, voc precisa instalar o PHPGTK para Windows, Linux ou Mac OS. Ento, temos apenas que abrir um terminal, acessar o diretrio da
aplicao e executar o php-gtk2 para interpretar o index.php, que ir automaticamente carregar o
frontend index.gtk.php.
O componente THtmlRenderer permite implementarmos o design pattern Template View, usando fragmentos
de HTML juntamente com outros componentes do Adianti Framework.
Por meio desse componente, podemos utilizar arquivos HTML para criar layouts mais elaborados para as
pginas da aplicao utilizando templates. Cada template possui sees e variveis, que so substitudas pela
aplicao. Nesse exemplo, estamos habilitando uma seo simples (main) com substituio de variveis, e uma
seo repetitiva (contacts-detail), por meio do mtodo enableSection().
Exemplo
1.
<?php
2.
/**
3.
4.
5.
* @version
6.
* @package
7.
* @subpackage tutor
8.
* @author
9.
10.
* @license
11.
*/
1.0
samples
Pablo Dall'Oglio
http://www.adianti.com.br/framework-license
12.
13.
14.
/**
15.
* Constructor method
16.
*/
17.
18.
19.
parent::__construct();
20.
21.
22.
TPage::include_css('app/resources/styles.css');
23.
24.
25.
26.
27.
try
28.
29.
30.
TTransaction::open('samples');
31.
32.
33.
34.
$replace = array();
35.
$replace['code']
36.
$replace['name']
37.
$replace['address'] = $customer->address;
= $customer->id;
= $customer->name;
38.
39.
40.
$this->html->enableSection('main', $replace);
41.
42.
43.
$replace = array();
44.
45.
46.
47.
48.
'value'=> $contact->value);
}
49.
50.
51.
$this->html->enableSection('contacts');
52.
53.
54.
55.
56.
57.
$vbox->add($this->html);
58.
59.
parent::add($vbox);
60.
TTransaction::close();
61.
62.
63.
64.
65.
66.
67.
68.
?>
O componente THtmlRenderer permite implementarmos o design pattern Template View, usando fragmentos
de HTML juntamente com outros componentes do Adianti Framework.
Neste exemplo, demonstramos a utilizao de um template com duas sees. A primeira seo (main) sempre
exibida e contm uma simples substituio de variveis. O boto Action 1 habilita a seo "object", e substitui
sua varivel por um objeto do framework (TQuickForm). J o boto Action 2, habilita a seo "object", e substitui
sua varivel por outro objeto do framework (TQuickGrid).
Exemplo
1.
<?php
2.
3.
4.
5.
private $quickform;
6.
7.
8.
9.
10.
parent::__construct();
11.
12.
TPage::include_css('app/resources/styles.css');
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
$replace = array();
24.
$replace['name']
25.
= 'Test name';
26.
27.
$this->html->enableSection('main', $replace);
28.
29.
30.
31.
$table->addRow()->addCell($form);
32.
$table->addRow()->addCell($this->html);
33.
parent::add($table);
34.
35.
36.
37.
38.
// create a quickform
39.
40.
41.
42.
43.
44.
$replace = array();
45.
$replace['object'] = $this->quickform;
46.
$replace['name']
= 'TQuickForm';
47.
48.
$this->html->enableSection('object', $replace);
49.
50.
/** Executed when the user clicks at the show data button */
51.
52.
53.
$this->onAction1();
54.
$data = $this->quickform->getData();
55.
$this->quickform->setData($data);
56.
57.
58.
59.
60.
61.
62.
63.
$datagrid->setHeight(320);
64.
65.
$datagrid->addQuickColumn('Code',
66.
$datagrid->addQuickColumn('Name',
67.
'code',
'name',
68.
$datagrid->createModel();
69.
70.
71.
$object->code = '001';
72.
73.
$datagrid->addItem($object);
74.
75.
76.
$object->code = '002';
77.
78.
$datagrid->addItem($object);
79.
80.
$replace = array();
81.
$replace['object'] = $datagrid;
82.
$replace['name']
= 'TQuickGrid';
83.
84.
85.
$this->html->enableSection('object', $replace);
86.
87.
88.
?>
'right', 100);
'left', 200);
Active Record
Toda manipulao de registros em base de dados no Adianti Framework realizada por meio de objetos Active
Record. No framework, um Active Record deve ser sublcasse de TRecord, que prov mtodos como load(),
store() e delete(). Ao definir um Active Record, preciso identificar sua tabela (TABLENAME) e chave primria
(PRIMARYKEY).
Exemplo
1 <?php
2 /**
3
* @author <your-name-here>
*/
10
11
12
13
14
parent::__construct($id);
15
parent::addAttribute('name');
16
parent::addAttribute('address');
17
parent::addAttribute('phone');
18
parent::addAttribute('birthdate');
19
parent::addAttribute('status');
20
parent::addAttribute('email');
21
parent::addAttribute('gender');
22
parent::addAttribute('category_id');
23
parent::addAttribute('city_id');
24
25 }
26 ?>
Neste exemplo iremos aprender como alterar os dados de um objeto na base de dados.
Aps carregar o objeto, ns podemos atribuir novos valores s propriedades do objeto Active Record para
definir quais colunas sero atualizadas naquele registro da base de dados.
Aps atribuir o novo valor da propriedade, chamamos o mtodo store() para armazenar o objeto na base de
dados.
Exemplo
1.
<?php
2.
3.
4.
5.
6.
parent::__construct();
7.
try
8.
9.
10.
11.
12.
if ($customer) // if found
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
?>
Neste exemplo iremos aprender como armazenar novos objetos na base de dados.
Para definir quais colunas sero preenchidas neste novo registro, basta que sejam atribudos valores para as
propriedades do objeto Active Record.
O mtodo store() realiza um mapeamento das propriedades do objeto Active Record para a tabela do banco de
dados. Obs: As classes Active Record (Ex: Customer) ficam armazenadas na pasta app/model.
Exemplo
1.
<?php
2.
3.
4.
5.
6.
parent::__construct();
7.
try
8.
9.
10.
11.
12.
13.
$giovani->name
14.
$giovani->address
= 'Rua da Conceicao';
15.
$giovani->phone
= '(51) 8111-2222';
16.
$giovani->birthdate = '2013-02-15';
17.
$giovani->status
= 'S';
18.
$giovani->email
= 'giovanni@dalloglio.net';
19.
$giovani->gender
20.
$giovani->category_id = '1';
21.
$giovani->city_id
22.
= 'M';
= '1';
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
?>
O prximo exemplo demonstra como realizar lazy loads (carga tardia) sobre objetos relacionados.
Neste caso, o objeto Customer (cliente) possui um relacionamento de associao com o objeto City (cidade) e
gostaramos de ter este objeto automaticamente disponvel quando necessrio.
Nesse caso, sempre que tentarmos ler o atributo city_name, o framework ir automaticamente chamar o
mtodo get_city_name(), retornando a propriedade 'name' do objeto City relacionado. Note que em ambos os
casos, o objeto $this->city criado somente quando o usurio precisa de alguma propriedade da cidade pela
primeira vez.
Exemplo
1.
<?php
2.
3.
4.
5.
6.
7.
8.
9.
private $city;
10.
11.
12.
function get_city_name()
13.
14.
15.
if (empty($this->city))
16.
17.
18.
19.
20.
return $this->city->name;
21.
22.
23.
24.
Nesse exemplo ns aprenderemos a carregar uma coleo objetos a partir do banco de dados.
Para carregar uma coleo de objetos, devemos utilizar a classe TRepository que uma implementao do
design pattern Repository.
Esta classe implementa mtodos como count(), load() e delete(), utilizando um critrio como parmetro.
Para carregar objetos, utilizamos o mtodo load().
Exemplo
1.
<?php
2.
3.
4.
5.
6.
parent::__construct();
7.
try
8.
9.
TTransaction::open('samples');
10.
11.
12.
13.
14.
$customers = $repository->load($criteria);
15.
16.
17.
18.
19.
20.
TTransaction::close();
21.
22.
23.
24.
25.
26.
27.
}
}
28.
?>
Exemplo 2
1.
<?php
2.
3.
4.
5.
6.
parent::__construct();
7.
try
8.
9.
TTransaction::open('samples');
10.
11.
12.
13.
14.
15.
TTransaction::close();
16.
17.
18.
19.
20.
21.
22.
23.
?>
Exemplo 3
1.
<?php
2.
3.
4.
5.
6.
parent::__construct();
7.
try
8.
9.
TTransaction::open('samples');
10.
11.
12.
13.
14.
$customers = Customer::getObjects($criteria);
15.
16.
17.
18.
19.
20.
TTransaction::close();
21.
22.
23.
24.
25.
26.
}
}
27.
28.
?>
Neste exemplo iremos aprender como carregar um objeto da base de dados por meio de sua chave primria.
Quando instanciamos um Active Record, podemos passar opcionalmente como parmetro o seu ID para o
mtodo construtor.
Nesse momento, o objeto resultante ter todas suas propriedades preenchidas com os valores de cada uma
das colunas da tabela do banco de dados. Obs: As classes Active Record (Ex: Customer) ficam armazenadas na
pasta app/model.
Exemplo
1.
<?php
2.
3.
4.
5.
6.
parent::__construct();
7.
try
8.
9.
10.
11.
12.
echo 'Nome
13.
14.
echo "<br>\n";
15.
16.
echo 'Nome
17.
: ' . $customer->name
: ' . $customer->name
. "<br>\n";
. "<br>\n";
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
?>
Nesse exemplo ns aprenderemos a contar quantos objetos satisfazem determinado critrio de seleo.
Para contar objetos, devemos utilizar a classe TRepository que uma implementao do design pattern
Repository.
Esta classe implementa mtodos como count(), load() e delete(), utilizando um critrio como parmetro.
Para contar objetos, utilizamos o mtodo count().
Exemplo
1.
<?php
2.
3.
4.
5.
6.
parent::__construct();
7.
try
8.
9.
TTransaction::open('samples');
10.
11.
12.
13.
14.
15.
$count = $repository->count($criteria);
16.
17.
18.
TTransaction::close();
19.
20.
21.
22.
23.
24.
25.
26.
?>
Exemplo 2
1.
<?php
2.
3.
4.
5.
6.
parent::__construct();
7.
try
8.
9.
TTransaction::open('samples');
10.
11.
12.
13.
14.
15.
TExpression::OR_OPERATOR)
->where('name', 'like', 'Ana%',
TExpression::OR_OPERATOR)
->count();
16.
17.
18.
TTransaction::close();
19.
20.
21.
22.
23.
24.
25.
26.
?>
Todas as operaes que manipulam colees de objetos exigem um critrio de seleo como parmetro (TCriteria).
Um objeto de critrio permite compor um critrio utilizando o mtodo add(). O mtod add() aceita como parmetro
qualquer objeto filho de TExpression, o que pode ser um objeto TFilter ou at mesmo um outro objeto TCriteria. O
segundo parmetro representa o operador lgico que ser utilizado para relacionar as expresses:
TExpression::OR_OPERATOR ou TExpression::AND_OPERATOR (default).
Exemplo
1.
<?php
2.
3.
4.
5.
6.
7.
8.
$criteria->add(new TFilter('age','IN',
9.
10.
11.
array(24,25,26)));
12.
13.
14.
15.
16.
17.
18.
19.
20.
'F'));
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
$criteria->add($criteria1, TExpression::OR_OPERATOR);
37.
$criteria->add($criteria2, TExpression::OR_OPERATOR);
38.
echo $criteria->dump(); // ((gender = 'F' AND age > '18') OR (gender = 'M' AND age < '16'))
39.
?>
Todo Active Record possui um mtodo chamado delete() que utilizado para excluir um objeto da base de dados.
Podemos excluir um objeto somente chamando o mtodo delete(), se o objeto j est carregado na memria, ou
simplesmente passando sua chave primria como parmetro para o mtodo delete() (se o objeto no est
carregado).
Exemplo
<?php
class ObjectDelete extends TPage
{
public function __construct()
{
parent::__construct();
try
{
TTransaction::open('samples'); // open transaction
$customer = new Customer(40); // load object
$customer->delete(); // delete object
$customer = new Customer;
$customer->delete(41); // delete object
new TMessage('info', 'Object deleted');
TTransaction::close(); // close transaction
}
catch (Exception $e)
{
new TMessage('error', $e->getMessage());
}
}
} ?>
Este exemplo demonstra como obter o primeiro e ltimo ID (contedo do campo primary key) de um objeto Active Record.
Exemplo
1.
<?php
2.
3.
4.
5.
6.
parent::__construct();
7.
try
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
} ?>
Para excluir objetos, devemos utilizar a classe TRepository que uma implementao do design pattern Repository.
Esta classe implementa mtodos como count(), load() e delete(), utilizando um critrio como parmetro. Para excluir
objetos, utilizamos o mtodo delete(). O mtodo delete() recebe um critrio de seleo e realiza uma operao de
delete sobre a base de dados, excluindo todos os objetos que satisfazem o critrio.
<?php class CollectionDelete extends TPage{
public function __construct()
{
parent::__construct();
1.
try
2.
3.
TTransaction::open('samples');
4.
5.
6.
7.
8.
$repository->delete($criteria);
9.
10.
11.
TTransaction::close();
12.
13.
14.
15.
16.
17.
1.
}
} ?>
<?php
class CollectionSimpleDelete extends TPage
2.
3.
4.
5.
parent::__construct();
6.
try
7.
8.
TTransaction::open('samples');
9.
10.
11.
12.
13.
TTransaction::close();
14.
15.
16.
17.
18.
19.
20.
21.
?>
Sempre que algum tenta atribuir um novo valor para uma propriedade no acessvel, a classe TRecord verifica
se existe um mtodo chamado set_ na classe final e sempre que algum tenta ler o contedo de uma
propriedade no acessvel, a classe TRecord (Layer Supertype) verifica se existe um mtodo chamado get_ na
classe final. Desta maneira, o usurio pode modificar o comportamento-padro da atribuio de valores,
declarando o mtodo set_, adicionando validaes para cada uma das propriedades do objeto antes de atribuir
um novo valor.
Exemplo
1.
<?php
2.
/**
3.
4.
*/
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
$this->data['birthdate'] = $value;
15.
16.
else
17.
18.
19.
20.
21.
22.
?>
Nesse exemplo ns aprenderemos a configurar as propriedades de um critrio (TCriteria) para realizar uma
consulta na base de dados. As propriedades que podem ser configuradas so 'limit', 'order' e 'offset'. Estas
propriedades tero efeito no mtodo de carga load() de TRepository.
Exemplo
1.
<?php
2.
3.
4.
5.
6.
parent::__construct();
7.
try
8.
9.
10.
11.
12.
13.
$criteria->setProperty('limit' , 10);
14.
$criteria->setProperty('offset', 20);
15.
$criteria->setProperty('order' , 'id');
16.
17.
18.
$customers = $repository->load($criteria);
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
?>
Este exemplo demonstra como realizar uma converso de um Active Record em array e como carregar um
Active Record a partir de um array.
Exemplo
1.
<?php
2.
3.
4.
5.
6.
parent::__construct();
7.
try
8.
9.
10.
11.
12.
13.
print_r($customer->toArray());
14.
15.
16.
$test = array();
17.
18.
19.
$test['category_id'] = 1;
20.
$test['city_id'] = 1;
21.
$test['birthdate'] = date('Y-m-d');
22.
23.
24.
$customer2->fromArray($test);
25.
$customer2->store();
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
?>
Neste exemplo, demonstrado como podemos realizar o registro (log) de operaes SQL realizadas pelo
framework.
Para tal, temos somente que executar o mtodo esttico setLogger() a partir da classe TTransaction aps abrir
a conexo com a base de dados. Podemos passar trs tipos de objetos como parmetro nesse momento:
TLoggerTXT, TLoggerXML e TLoggerHTML. Todas essas classes recebem como primeiro parmetro o caminho
do arquivo de log.
Todas as operaes realizadas pelo framework (insert, update, delete, select) sero registradas nesse arquivo.
Exemplo
1.
<?php
2.
3.
4.
5.
6.
parent::__construct();
7.
try
8.
9.
10.
// define log
11.
TTransaction::setLogger(new TLoggerTXT('/tmp/log.txt'));
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
?>
O container TTable permite ao desenvolvedor organizar os widgets conforme o layout de uma tabela,
utilizando linhas e colunas sem bordas.
A classe TTable oferece o mtodo addRow(), que adiciona uma linha na tabela e retorna uma instncia da
classe TTableRow. Com um objeto TTableRow, podemos chamar o mtodo addCell(), que adiciona uma clula
dentro de uma linha. O mtodo addCell() retorna um objeto TTableCell. Podemos pegar uma instncia de
objeto TTableCell e atribuir propriedades como 'colspan', que reconhecida por ambos toolkits Web e Gtk.
Exemplo
1.
<?php
2.
/**
3.
* ContainerTableView
4.
5.
* @version
6.
* @package
7.
* @subpackage tutor
8.
* @author
9.
10.
* @license
11.
*/
1.0
samples
Pablo Dall'Oglio
http://www.adianti.com.br/framework-license
12.
13.
14.
/**
15.
* Class constructor
16.
17.
*/
18.
function __construct()
19.
20.
parent::__construct();
21.
22.
// creates a table
23.
24.
25.
26.
27.
$title->setFontSize(18);
28.
$title->setFontFace('Arial');
29.
$title->setFontColor('red');
30.
31.
32.
$row=$table->addRow();
33.
$title = $row->addCell($title);
34.
$title->colspan = 2;
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
$id
55.
$name
= new TEntry('name');
56.
$address
= new TEntry('address');
57.
58.
$city
= new TCombo('city');
59.
$text
= new TText('text');
= new TEntry('id');
60.
61.
$items
= array();
62.
63.
$items['2'] = 'Lajeado';
64.
$city->addItems($items);
65.
66.
67.
$id->setSize(70);
68.
$name->setSize(140);
69.
$address->setSize(140);
70.
$telephone->setSize(140);
71.
$city->setSize(140);
72.
$text->setSize(400,100);
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
$row=$table1->addRow();
83.
$row->addCell($label1);
84.
$row->addCell($id);
85.
86.
87.
$row=$table1->addRow();
88.
$row->addCell($label2);
89.
$row->addCell($name);
90.
91.
92.
$row=$table1->addRow();
93.
$row->addCell($label3);
94.
$row->addCell($city);
95.
96.
97.
$row=$table2->addRow();
98.
$row->addCell($label4);
99.
$row->addCell($address);
100.
101.
102.
$row=$table2->addRow();
103.
$row->addCell($label5);
104.
$row->addCell($telephone);
105.
106.
107.
$row=$table->addRow();
108.
$row->addCell($table1);
109.
$row->addCell($table2);
110.
111.
$row=$table->addRow();
112.
$cell=$row->addCell($text);
113.
$cell->colspan=2;
114.
115.
116.
117.
$label6=new TLabel('Obs');
118.
">$label6->setFontStyle('b');
119.
120.
$row=$table->addRow();
121.
$cell=$row->addCell($label6);
122.
$cell->colspan=2;
123.
124.
125.
126.
127.
128.
$vbox->add($table);
129.
130.
parent::add($vbox);
131.
132.
133.
?>
Todas as operaes realizadas no Adianti Framework precisam estar contidas em uma transao, que
manipulada pela classe TTransaction.
Ao abrirmos uma transao, indentificamos o caminho INI criado na pasta app/config, que contm os dados de
acesso ao banco de dados.
Nesse exemplo, estamos realizando uma query manual no banco de dados.
Exemplo
1.
<?php
2.
3.
4.
5.
6.
parent::__construct();
7.
try
8.
9.
10.
11.
12.
// run query
13.
14.
15.
// show results
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
?>
Exemplo 2
1.
<?php
2.
3.
4.
5.
6.
parent::__construct();
7.
try
8.
9.
// connection info
10.
$db = array();
11.
$db['host'] = '';
12.
$db['port'] = '';
13.
$db['name'] = 'app/database/samples.db';
14.
$db['user'] = '';
15.
$db['pass'] = '';
16.
$db['type'] = 'sqlite';
17.
18.
19.
20.
21.
// make query
22.
23.
24.
// iterate results
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
?>
Neste exemplo, demonstramos como construir uma tela passo a passo entre diferentes formulrios.
Neste caso, sesses so usadas para armazenar os dados em memria entre as transies, e o mtodo
TApplication::loadPage() utilizado para carregar uma pgina diferente.
Exemplo
1.
<?php
2.
/**
3.
* MultiStepMultiFormView
4.
5.
* @version
6.
* @package
7.
* @subpackage tutor
8.
* @author
9.
10.
* @license
11.
*/
1.0
samples
Pablo Dall'Oglio
http://www.adianti.com.br/framework-license
12.
13.
14.
15.
protected $notebook;
16.
17.
/**
18.
* Class constructor
19.
20.
*/
21.
function __construct()
22.
23.
parent::__construct();
24.
25.
26.
27.
$this->notebook->setSize(400, 140);
28.
29.
30.
31.
32.
33.
34.
35.
$password
36.
$confirm
= new TEntry('email');
= new TPassword('password');
= new TPassword('confirm');
37.
38.
39.
40.
41.
42.
// validations
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
parent::add($this->notebook);
53.
54.
55.
/**
56.
57.
*/
58.
59.
60.
$data = TSession::getValue('form_step1_data');
61.
$this->form->setData($data);
62.
63.
64.
/**
65.
* onNextForm
66.
*/
67.
68.
69.
try
70.
71.
$this->form->validate();
72.
$data = $this->form->getData();
73.
74.
75.
76.
77.
78.
79.
TSession::setValue('form_step1_data', $data);
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
?>
Exemplo
1.
<?php
2.
/**
3.
4.
* @author <your-name-here>
5.
*/
6.
7.
8.
9.
10.
11.
12.
13.
private $skills;
14.
15.
/**
16.
* Constructor method
17.
*/
18.
19.
20.
parent::__construct($id);
21.
parent::addAttribute('name');
22.
parent::addAttribute('address');
23.
parent::addAttribute('phone');
24.
parent::addAttribute('birthdate');
25.
parent::addAttribute('status');
26.
parent::addAttribute('email');
27.
parent::addAttribute('gender');
28.
parent::addAttribute('category_id');
29.
parent::addAttribute('city_id');
30.
31.
32.
33.
/**
34.
* Method addSkill
35.
36.
37.
*/
38.
39.
40.
41.
$this->skills[] = $object;
}
42.
43.
/**
44.
* Method getSkills
45.
46.
47.
*/
48.
49.
50.
51.
return $this->skills;
}
52.
53.
/**
54.
* Reset aggregates
55.
*/
56.
57.
58.
59.
$this->skills = array();
}
60.
61.
/**
62.
63.
64.
*/
65.
66.
67.
68.
69.
70.
return parent::load($id);
71.
72.
73.
/**
74.
75.
*/
76.
77.
78.
79.
parent::store();
80.
81.
82.
83.
84.
/*** Delete the object and its aggregates @param $id object ID
85.
86.
87.
*/
88.
89.
90.
parent::delete($id);
91.
92.
}
}
93.
94.
/** * USAGE */
95.
96.
97.
98.
$customer->addSkill(new Skill(1));
99.
$customer->addSkill(new Skill(2));
100.
101.
102.
103.
$customer->store();
104.
?>
Para excluir objetos, devemos utilizar a classe TRepository que uma implementao do design pattern Repository.
Esta classe implementa mtodos como count(), load() e delete(), utilizando um critrio como parmetro. Para excluir
objetos, utilizamos o mtodo delete(). O mtodo delete() recebe um critrio de seleo e realiza uma operao de
delete sobre a base de dados, excluindo todos os objetos que satisfazem o critrio.
<?php class CollectionDelete extends TPage{
public function __construct()
{
parent::__construct();
try
{
TTransaction::open('samples');
$criteria = new TCriteria;
$criteria->add(new TFilter('address', 'like', 'Rua Porto%'));
$criteria->add(new TFilter('gender', '=', 'M'));
$repository = new TRepository('Customer');
$repository->delete($criteria);
new TMessage('info', 'Records Deleted');
TTransaction::close();
}
{
18.
19.
20.
22.
?>
<?php
class CollectionSimpleDelete extends TPage
23.
24.
25.
26.
parent::__construct();
27.
try
28.
29.
TTransaction::open('samples');
30.
31.
32.
33.
34.
TTransaction::close();
35.
36.
37.
38.
39.
40.
41.
42.
?>
Exemplo
1.
<?php
2.
3.
4.
5.
6.
7.
8.
private $contacts;
9.
10.
/**
11.
* Constructor method
12.
*/
13.
14.
15.
parent::__construct($id);
16.
parent::addAttribute('name');
17.
parent::addAttribute('address');
18.
parent::addAttribute('phone');
19.
parent::addAttribute('birthdate');
20.
parent::addAttribute('status');
21.
parent::addAttribute('email');
22.
parent::addAttribute('gender');
23.
parent::addAttribute('category_id');
24.
parent::addAttribute('city_id');
25.
26.
/**Method addContact * Add a Contact to the Customer * @param $object Instance of Contact */
27.
28.
29.
30.
$this->contacts[] = $object;
}
31.
32.
/** Method getContacts * Return the Customer' Contact's * @return Collection of Contact */
33.
34.
35.
return $this->contacts;
36.
37.
38.
39.
40.
41.
42.
$this->contacts = array();
}
43.
44.
/** * Load the object and its aggregates * @param $id object ID */
45.
46.
47.
48.
49.
50.
return parent::load($id);
51.
52.
53.
54.
55.
56.
57.
parent::store();
58.
59.
60.
61.
62.
/** Delete the object and its aggregates * @param $id object ID */
63.
64.
65.
66.
67.
68.
parent::delete($id);
69.
70.
71.
/** * USAGE */
72.
73.
74.
75.
76.
77.
78.
$contact1->type = 'fone';
79.
80.
$contact2->type = 'fone';
81.
82.
83.
$customer->addContact($contact1);
84.
$customer->addContact($contact2);
85.
86.
$customer->store();?>