Você está na página 1de 55

Criando as classes modelo

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.

class Person extends TRecord

3.

4.

const TABLENAME = 'person';

5.

const PRIMARYKEY= 'id';

6.

const IDPOLICY = 'max'; // {max, serial}

7.
8.

/**

9.

* Constructor method

10.

* @param $id Primary key to be loaded (optional)

11.

*/

12.

public function __construct($id = NULL)

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.

Criando controladores de aplicao


Agora o momento de criar um controlador de aplicao. A forma mais simples de escrever um controlador de
aplicao utilizando um controlador-padro disponvel no framework. O TStandardForm fornece uma
abordagem-padro para manipulao de formulrios, enquanto o TStandardList fornece uma abordagempadro para manipulao de datagrids.
Os controladores de aplicao so salvos no diretrio app/control. Neste caso, a classe PersonForm salva no
arquivo app/control/PersonForm.class.php. Todos os controladores de aplicao possuem um mtodo
construtor. No mtodo construtor, definimos a estrutura visual da aplicao. O controlador-padro
TStandardForm fornece mtodos como setDatabase() e setActiveRecord() que definem o nome da base de
dados (veja os arquivos INI) e a classe de Active Record que ir manipular os dados do formulrio. O uso dos
controladores-padro explicado notutorial.
O prximo passo criar o formulrio. Existem muitas maneiras de se fazer isso. Geralmente utilizamos a classe
TForm juntamente com a classe TTable ou TPanel. Mas se precisamos criar um formulrio rapidamente,
podemos utilizar a classe TQuickForm. Este continer organiza os campos do formulrio de uma forma padro.
O mtodo addField() usado para adicionar campos no formulrio. Cada campo pode utilizar um diferente
componente do toolkit (TEntry, TDate, TCombo, etc). Podemos ver os widgets disponveis no tutorial. O boto
de salvar no formulrio chama o mtodo-padro onSave() fornecido pela classe TStandardForm.
1.

<?php

2.

class PersonForm extends TStandardForm

3.

4.

protected $form; // form

5.
6.

function __construct()

7.

8.

parent::__construct();

9.
10.

parent::setDatabase('samples');

11.

parent::setActiveRecord('Person');

12.
13.

$this->form = new TQuickForm('form_person');

14.

$id

15.

$name

16.

$address = new TEntry('address');

17.

$birthdate = new TDate('birthdate');

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.

$this->form->addQuickField('address', $address, 200);

26.

$this->form->addQuickField('birthdate', $birthdate, 100);

27.

$this->form->addQuickField('gender',

$name,

$gender,

200);

200);

28.
29.

$this->form->addQuickAction('Save', new TAction(array($this, 'onSave')), 'ico_save.png');

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.

// define the autoloader

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.

define('OS', strtoupper(substr(PHP_OS, 0, 3)));

15.

define('PATH', dirname(__FILE__));

16.

$uri = 'http://'.$_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];

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.

$content = str_replace('{LIBRARIES}', file_get_contents("app/templates/


{$template}/libraries.html"), $content);

29.

$content = str_replace('{URI}', $uri, $content);

30.

$content = str_replace('{class}', isset($_REQUEST['class']) ? $_REQUEST['class'] : '', $content);

31.

$content = str_replace('{template}', $template, $content);

32.

$content = str_replace('{MENU}', $menu_string, $content);

33.

$css

34.

$js

35.

$content = str_replace('{HEAD}', $css.$js, $content);

= 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.

?>

Definindo o menu da aplicao


Agora o momento de definir o menu da aplicao. O menu da aplicao definido no arquivomenu.xml e
usado pelos frontend-padro fornecido pelo framework. Isto significa que somente uma recomendao, por
que voc pode definir outros frontend usando HTML/CSS para o ambiente Web ou componentes Gtk para o
ambiente Gtk. A aplicao l o menu.xml e apresenta o menu para o usurio.

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.

* Template View pattern implementation

4.

5.

* @version

6.

* @package

7.

* @subpackage tutor

8.

* @author

9.

* @copyright Copyright (c) 2006-2014 Adianti Solutions Ltd. (http://www.adianti.com.br)

10.

* @license

11.

*/

1.0
samples

Pablo Dall'Oglio

http://www.adianti.com.br/framework-license

12.

class TemplateViewBasicView extends TPage

13.

14.

/**

15.

* Constructor method

16.

*/

17.

public function __construct()

18.

19.

parent::__construct();

20.
21.

// load the styles

22.

TPage::include_css('app/resources/styles.css');

23.
24.

// create the HTML Renderer

25.

$this->html = new THtmlRenderer('app/resources/customer.html');

26.
27.

try

28.

29.

// look for customer 1

30.

TTransaction::open('samples');

31.

$customer = new Customer(1);

32.
33.

// define replacements for the main section

34.

$replace = array();

35.

$replace['code']

36.

$replace['name']

37.

$replace['address'] = $customer->address;

= $customer->id;
= $customer->name;

38.
39.

// replace the main section variables

40.

$this->html->enableSection('main', $replace);

41.
42.

// define the replacements based on customer contacts

43.

$replace = array();

44.

foreach ($customer->getContacts() as $contact)

45.

46.

$replace[] = array('type' => $contact->type,

47.
48.

'value'=> $contact->value);
}

49.
50.

// define with sections will be enabled

51.

$this->html->enableSection('contacts');

52.

$this->html->enableSection('contacts-detail', $replace, TRUE);

53.
54.

// wrap the page content using vertical box

55.

$vbox = new TVBox;

56.

$vbox->add(new TXMLBreadCrumb('menu.xml', __CLASS__));

57.

$vbox->add($this->html);

58.
59.

parent::add($vbox);

60.

TTransaction::close();

61.

62.

catch (Exception $e)

63.

64.

new TMessage('error', $e->getMessage());

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.

/*** Template View pattern implementation */

3.

class TemplateViewAdvancedView extends TPage

4.

5.

private $quickform;

6.
7.

/*** Constructor method */

8.

public function __construct()

9.

10.

parent::__construct();

11.

// load the styles

12.

TPage::include_css('app/resources/styles.css');

13.

// define two actions

14.

$action1 = new TAction(array($this, 'onAction1'));

15.

$action2 = new TAction(array($this, 'onAction2'));

16.

// create a quick form with two action buttons

17.

$form = new TQuickForm;

18.

$form->addQuickAction('Action 1', $action1, 'ico_view.png');

19.

$form->addQuickAction('Action 2', $action2, 'ico_view.png');

20.

// create the HTML Renderer

21.

$this->html = new THtmlRenderer('app/resources/content.html');

22.

// define replacements for the main section

23.

$replace = array();

24.

$replace['name']

25.

$replace['address'] = 'Test address';

= 'Test name';

26.

// replace the main section variables

27.

$this->html->enableSection('main', $replace);

28.

// Table wrapper (form and HTML)

29.

$table = new TTable;

30.

$table->addRow()->addCell(new TXMLBreadCrumb('menu.xml', __CLASS__));

31.

$table->addRow()->addCell($form);

32.

$table->addRow()->addCell($this->html);

33.

parent::add($table);

34.

35.

/*** Executed when the user clicks at the action1 button */

36.

public function onAction1()

37.

38.

// create a quickform

39.

$this->quickform = new TQuickForm('form1');

40.

$this->quickform->addQuickField('Test1', new TEntry('test1'));

41.

$this->quickform->addQuickField('Test2', new TEntry('test2'));

42.

$this->quickform>addQuickAction('Show data',new TAction(array($this, 'onForm1')),'ico_edit.png');

43.
44.

$replace = array();

45.

$replace['object'] = $this->quickform;

46.

$replace['name']

= 'TQuickForm';

47.

// replace the object section variables

48.

$this->html->enableSection('object', $replace);

49.

50.

/** Executed when the user clicks at the show data button */

51.

public function onForm1()

52.

53.

$this->onAction1();

54.

$data = $this->quickform->getData();

55.

$this->quickform->setData($data);

56.

new TMessage('info', json_encode($data));

57.

58.
59.

/*** Executed when the user clicks at the action2 button */

60.

public function onAction2()

61.

62.

$datagrid = new TQuickGrid;

63.

$datagrid->setHeight(320);

64.

// add the columns

65.

$datagrid->addQuickColumn('Code',

66.

$datagrid->addQuickColumn('Name',

67.

'code',
'name',

// creates the datagrid model

68.

$datagrid->createModel();

69.
70.

$object = new StdClass;

71.

$object->code = '001';

72.

$object->name = 'Test 001';

73.

$datagrid->addItem($object);

74.
75.

$object = new StdClass;

76.

$object->code = '002';

77.

$object->name = 'Test 002';

78.

$datagrid->addItem($object);

79.
80.

$replace = array();

81.

$replace['object'] = $datagrid;

82.

$replace['name']

= 'TQuickGrid';

83.
84.

// replace the object section variables

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

* Customer Active Record

* @author <your-name-here>

*/

6 class Customer extends TRecord


7 {
8

const TABLENAME = 'customer';

const PRIMARYKEY= 'id';

10

const IDPOLICY = 'max'; // {max, serial}

11
12

public function __construct($id = NULL)

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.

class ObjectUpdate extends TPage

3.

4.

public function __construct()

5.

6.

parent::__construct();

7.

try

8.

9.

TTransaction::open('samples'); // open transaction

10.

$objeto = new Customer; // instantiates customer

11.

$customer= $objeto->load(31); // load customer 31

12.

if ($customer) // if found

13.

14.

$customer->phone = '51 8111-3333'; // changes phone

15.

$customer->store(); // store the object

16.

17.

new TMessage('info', 'Objeto atualizado');

18.

TTransaction::close(); // close the transaction

19.

20.

catch (Exception $e)

21.

22.

new TMessage('error', $e->getMessage());

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.

class ObjectStore extends TPage

3.

4.

public function __construct()

5.

6.

parent::__construct();

7.

try

8.

9.

TTransaction::open('samples'); // open transaction

10.
11.

// create a new object

12.

$giovani = new Customer;

13.

$giovani->name

= 'Giovanni Dall Oglio';

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.

$giovani->store(); // store the object

= 'M';

= '1';

23.
24.

new TMessage('info', 'Objeto stored successfully');

25.

TTransaction::close(); // Closes the transaction

26.

27.

catch (Exception $e)

28.

29.

new TMessage('error', $e->getMessage());

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.

/*** Customer class Active Record for customer table */

3.

class Customer extends TRecord

4.

5.

const TABLENAME = 'customer';

6.

const PRIMARYKEY= 'id';

7.

const IDPOLICY = 'serial'; // (max,serial)

8.
9.

private $city;

10.
11.

/*** executed whenever the property "city_name" is accessed */

12.

function get_city_name()

13.

14.

// instantiates City, load $this->city_id

15.

if (empty($this->city))

16.

17.

$this->city = new City($this->city_id);

18.

19.

// returns the City Active Record

20.

return $this->city->name;

21.

22.

23.

$object = new Customer(1);

24.

print $object->city_name; // calls get_city_name() ?>

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.

class CollectionLoad extends TPage

3.

4.

public function __construct()

5.

6.

parent::__construct();

7.

try

8.

9.

TTransaction::open('samples');

10.

$criteria = new TCriteria;

11.

$criteria->add(new TFilter('gender', '=', 'F'));

12.
13.

$repository = new TRepository('Customer');

14.

$customers = $repository->load($criteria);

15.
16.

foreach ($customers as $customer)

17.

18.

echo $customer->id . ' - ' . $customer->name . '<br>';

19.

20.

TTransaction::close();

21.

22.

catch (Exception $e)

23.

24.

new TMessage('error', $e->getMessage());

25.

26.
27.

}
}

28.

?>

Exemplo 2
1.

<?php

2.

class CollectionSimpleLoad extends TPage

3.

4.

public function __construct()

5.

6.

parent::__construct();

7.

try

8.

9.

TTransaction::open('samples');

10.

$repository = new TRepository('Customer');

11.

$customers = $repository->where('gender', '=', 'M')


->where('name', 'like', 'A%')
->load();
foreach ($customers as $customer)

12.

13.

echo $customer->id . ' - ' . $customer->name . '<br>';

14.

15.

TTransaction::close();

16.

17.

catch (Exception $e)

18.

19.

new TMessage('error', $e->getMessage());

20.

21.

22.

23.

?>

Exemplo 3
1.

<?php

2.

class CollectionGetObjects extends TPage

3.

4.

public function __construct()

5.

6.

parent::__construct();

7.

try

8.

9.

TTransaction::open('samples');

10.

$criteria = new TCriteria;

11.

$criteria->add( new TFilter( 'gender', '=', 'M' ));

12.

$criteria->add( new TFilter( 'name', 'like', 'A%' ));

13.
14.

$customers = Customer::getObjects($criteria);

15.
16.

foreach ($customers as $customer)

17.

18.

echo $customer->id . ' - ' . $customer->name . '<br>';

19.

20.

TTransaction::close();

21.

22.

catch (Exception $e)

23.

24.

new TMessage('error', $e->getMessage());

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.

class ObjectLoad extends TPage

3.

4.

public function __construct()

5.

6.

parent::__construct();

7.

try

8.

9.

TTransaction::open('samples'); // open transaction

10.
11.

$customer= new Customer(4); // load customer 4

12.

echo 'Nome

13.

echo 'Endereco : ' . $customer->address . "<br>\n";

14.

echo "<br>\n";

15.

$customer= new Customer(25); // load customer 25

16.

echo 'Nome

17.

echo 'Endereco : ' . $customer->address . "<br>\n";

: ' . $customer->name

: ' . $customer->name

. "<br>\n";

. "<br>\n";

18.
19.
20.

TTransaction::close(); // closes transaction


}

21.

catch (Exception $e)

22.

23.

new TMessage('error', $e->getMessage());

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.

class CollectionCount extends TPage

3.

4.

public function __construct()

5.

6.

parent::__construct();

7.

try

8.

9.

TTransaction::open('samples');

10.

$criteria = new TCriteria;

11.

$criteria->add(new TFilter('name', 'like', 'Rafael%'), TExpression::OR_OPERATOR);

12.

$criteria->add(new TFilter('name', 'like', 'Ana%'), TExpression::OR_OPERATOR);

13.
14.

$repository = new TRepository('Customer');

15.

$count = $repository->count($criteria);

16.
17.

new TMessage('info', "Total of found customers: {$count} <br>\n");

18.

TTransaction::close();

19.

20.

catch (Exception $e)

21.

22.

new TMessage('error', $e->getMessage());

23.

24.

25.

26.

?>

Exemplo 2
1.

<?php

2.

class CollectionSimpleCount extends TPage

3.

4.

public function __construct()

5.

6.

parent::__construct();

7.

try

8.

9.

TTransaction::open('samples');

10.

$repository = new TRepository('Customer');

11.

$count = $repository->where('name', 'like', 'Rafael%',

12.
13.
14.
15.

TExpression::OR_OPERATOR)
->where('name', 'like', 'Ana%',
TExpression::OR_OPERATOR)
->count();

16.
17.

new TMessage('info', "Total of found customers: {$count} <br>\n");

18.

TTransaction::close();

19.

20.

catch (Exception $e)

21.

22.

new TMessage('error', $e->getMessage());

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.

$criteria = new TCriteria;

3.

$criteria->add(new TFilter('age', '<', 16), TExpression::OR_OPERATOR);

4.

$criteria->add(new TFilter('age', '>', 60), TExpression::OR_OPERATOR);

5.

echo $criteria->dump(); // (age < 16 OR age > 60)

6.
7.

$criteria = new TCriteria;

8.

$criteria->add(new TFilter('age','IN',

9.

$criteria->add(new TFilter('age','NOT IN', array(10)));

10.

echo $criteria->dump(); // (age IN (24,25,26) AND age NOT IN (10))

11.

array(24,25,26)));

12.

$criteria = new TCriteria;

13.

$criteria->add(new TFilter('nome', 'like', 'pedro%'), TExpression::OR_OPERATOR);

14.

$criteria->add(new TFilter('nome', 'like', 'maria%'), TExpression::OR_OPERATOR);

15.

echo $criteria->dump(); // (nome like 'pedro%' OR nome like 'maria%')

16.
17.

$criteria = new TCriteria;

18.

$criteria->add(new TFilter('cellphone', 'IS NOT', NULL));

19.

$criteria->add(new TFilter('gender', '=',

20.

echo $criteria->dump(); // (cellphone IS NOT NULL AND gender = 'F')

'F'));

21.
22.

$criteria = new TCriteria;

23.

$criteria->add(new TFilter('state', 'IN',

24.

$criteria->add(new TFilter('state', 'NOT IN', array('AC', 'PI')));

25.

echo $criteria->dump(); // (state IN ('RS','SC','PR') AND state NOT IN ('AC','PI'))

array('RS', 'SC', 'PR')));

26.
27.

$criteria1 = new TCriteria;

28.

$criteria1->add(new TFilter('gender', '= ', 'F'));

29.

$criteria1->add(new TFilter('age', '>', '18'));

30.
31.

$criteria2 = new TCriteria;

32.

$criteria2->add(new TFilter('gender', '= ', 'M'));

33.

$criteria2->add(new TFilter('age', '<', '16'));

34.
35.

$criteria = new TCriteria;

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.

class ObjectFirstLast extends TPage

3.

4.

public function __construct()

5.

6.

parent::__construct();

7.

try

8.

9.

TTransaction::open('samples'); // open transaction

10.

$customer= new Customer;

11.

echo 'The first ID : ' . $customer->getFirstID() . "<br>\n";

12.

echo 'The last ID : ' . $customer->getLastID() . "<br>\n";

13.

TTransaction::close(); // closes transaction

14.

15.

catch (Exception $e)

16.

17.

new TMessage('error', $e->getMessage());

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.

$criteria = new TCriteria;

5.

$criteria->add(new TFilter('address', 'like', 'Rua Porto%'));

6.

$criteria->add(new TFilter('gender', '=', 'M'));

7.

$repository = new TRepository('Customer');

8.

$repository->delete($criteria);

9.
10.

new TMessage('info', 'Records Deleted');

11.

TTransaction::close();

12.

13.

catch (Exception $e)

14.

15.

new TMessage('error', $e->getMessage());

16.

17.
1.

}
} ?>
<?php
class CollectionSimpleDelete extends TPage

2.

3.

public function __construct()

4.

5.

parent::__construct();

6.

try

7.

8.

TTransaction::open('samples');

9.

$repository = new TRepository('Customer');

10.

$repository->where('address', 'like', 'Rua Porto%')

11.

->where('gender', '=', 'M') ->delete();

12.

new TMessage('info', 'Records Deleted');

13.

TTransaction::close();

14.

15.

catch (Exception $e)

16.

17.

new TMessage('error', $e->getMessage());

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.

* Active Record for Customer

4.

*/

5.

class Customer extends TRecord

6.

7.

// ... another methods

8.
9.

public function set_birthdate($value)

10.

11.

$parts = explode('-', $value);

12.

if (checkdate($parts[1], $parts[2], $parts[0]))

13.

14.

$this->data['birthdate'] = $value;

15.

16.

else

17.

18.

throw new Exception("Cannot assign '{$value}' to birthdate");

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.

class CollectionLoadProperty extends TPage

3.

4.

public function __construct()

5.

6.

parent::__construct();

7.

try

8.

9.

TTransaction::open('samples'); // open transaction

10.

$criteria = new TCriteria;

11.
12.

// define criteria properties

13.

$criteria->setProperty('limit' , 10);

14.

$criteria->setProperty('offset', 20);

15.

$criteria->setProperty('order' , 'id');

16.
17.

$repository = new TRepository('Customer');

18.

$customers = $repository->load($criteria);

19.

20.

foreach ($customers as $customer)

21.

22.

echo $customer->id . ' - ' . $customer->name . '<br>';

23.

24.

TTransaction::close(); // close transaction

25.

26.

catch (Exception $e)

27.

28.

new TMessage('error', $e->getMessage());

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.

class ObjectFromArray extends TPage

3.

4.

public function __construct()

5.

6.

parent::__construct();

7.

try

8.

9.

TTransaction::open('samples'); // open transaction

10.
11.

// Convert an Active Record into array

12.

$customer = new Customer(4);

13.

print_r($customer->toArray());

14.
15.

// Using an array to fill the Active Record

16.

$test = array();

17.

$test['name'] = 'Customer from array';

18.

$test['address'] = 'Address from array';

19.

$test['category_id'] = 1;

20.

$test['city_id'] = 1;

21.

$test['birthdate'] = date('Y-m-d');

22.
23.

$customer2 = new Customer;

24.

$customer2->fromArray($test);

25.

$customer2->store();

26.
27.

TTransaction::close(); // closes transaction

28.

29.

catch (Exception $e)

30.

31.

new TMessage('error', $e->getMessage());

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.

class RegisterLog extends TPage

3.

4.

public function __construct()

5.

6.

parent::__construct();

7.

try

8.

9.

TTransaction::open('samples'); // open transaction

10.

// define log

11.

TTransaction::setLogger(new TLoggerTXT('/tmp/log.txt'));

12.

TTransaction::log("** inserting city");

13.
14.

$cidade = new City; // create new object

15.

$cidade->name = 'Porto Alegre';

16.

$cidade->store(); // store the object

17.
18.

new TMessage('info', 'Objeto stored successfully');

19.

TTransaction::close(); // close transaction

20.

21.

catch (Exception $e)

22.

23.

new TMessage('error', $e->getMessage());

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.

* @copyright Copyright (c) 2006-2014 Adianti Solutions Ltd. (http://www.adianti.com.br)

10.

* @license

11.

*/

1.0
samples

Pablo Dall'Oglio

http://www.adianti.com.br/framework-license

12.

class ContainerTableView extends TPage

13.

14.

/**

15.

* Class constructor

16.

* Creates the page

17.

*/

18.

function __construct()

19.

20.

parent::__construct();

21.
22.

// creates a table

23.

$table = new TTable;

24.
25.

// creates a label with the title

26.

$title = new TLabel('Table Layout');

27.

$title->setFontSize(18);

28.

$title->setFontFace('Arial');

29.

$title->setFontColor('red');

30.
31.

// adds a row to the table

32.

$row=$table->addRow();

33.

$title = $row->addCell($title);

34.

$title->colspan = 2;

35.
36.

// creates two sub-tables

37.

$table1 = new TTable;

38.

$table2 = new TTable;

39.
40.

if (PHP_SAPI !== 'cli') // just under web

41.

42.

$table-> border = '1';

43.

$table-> cellpadding = '4';

44.

$table-> style = 'border-collapse:collapse;';

45.

$table1-> border = '1';

46.

$table1-> cellpadding = '2';

47.

$table1-> style = 'border-collapse:collapse; border-color: red';

48.

$table2-> border = '1';

49.

$table2-> cellpadding = '2';

50.

$table2-> style = 'border-collapse:collapse; border-color: blue';

51.

52.
53.

// creates a series of input widgets

54.

$id

55.

$name

= new TEntry('name');

56.

$address

= new TEntry('address');

57.

$telephone = new TEntry('telephone');

58.

$city

= new TCombo('city');

59.

$text

= new TText('text');

= new TEntry('id');

60.
61.

$items

= array();

62.

$items['1'] = 'Porto Alegre';

63.

$items['2'] = 'Lajeado';

64.

$city->addItems($items);

65.
66.

// adjust the size of the fields

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.

// creates a series of labels

75.

$label1 = new TLabel('Code');

76.

$label2 = new TLabel('Name');

77.

$label3 = new TLabel('City');

78.

$label4 = new TLabel('Address');

79.

$label5 = new TLabel('Telephone');

80.
81.

// adds a row for the code field

82.

$row=$table1->addRow();

83.

$row->addCell($label1);

84.

$row->addCell($id);

85.
86.

// adds a row for the name field

87.

$row=$table1->addRow();

88.

$row->addCell($label2);

89.

$row->addCell($name);

90.
91.

// adds a row for the city field

92.

$row=$table1->addRow();

93.

$row->addCell($label3);

94.

$row->addCell($city);

95.
96.

// adds a row for the address field

97.

$row=$table2->addRow();

98.

$row->addCell($label4);

99.

$row->addCell($address);

100.
101.

// adds a row for the phone field

102.

$row=$table2->addRow();

103.

$row->addCell($label5);

104.

$row->addCell($telephone);

105.
106.

// adds the tables side by side

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.

if (PHP_SAPI !== 'cli') // just under web

116.

117.

$label6=new TLabel('Obs');

118.

">$label6->setFontStyle('b');

119.

$label6->setValue('PS: The table borders are just for understanding purposes.');

120.

$row=$table->addRow();

121.

$cell=$row->addCell($label6);

122.

$cell->colspan=2;

123.

124.
125.

// wrap the page content using vertical box

126.

$vbox = new TVBox;

127.

$vbox->add(new TXMLBreadCrumb('menu.xml', __CLASS__));

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.

class ManualQuery extends TPage

3.

4.

public function __construct()

5.

6.

parent::__construct();

7.

try

8.

9.

TTransaction::open('samples'); // open transaction

10.

$conn = TTransaction::get(); // get PDO connection

11.
12.

// run query

13.

$result = $conn->query('SELECT id, name from customer order by id');

14.
15.

// show results

16.

foreach ($result as $row)

17.

18.

print $row['id'] . '-';

19.

print $row['name'] . "<br>\n";

20.

21.

TTransaction::close(); // close transaction

22.

23.

catch (Exception $e)

24.

25.

new TMessage('error', $e->getMessage());

26.

27.

28.

29.

?>

Exemplo 2
1.

<?php

2.

class ManualConnection extends TPage

3.

4.

public function __construct()

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.

TTransaction::open(NULL, $db); // open transaction

19.

$conn = TTransaction::get(); // get PDO connection

20.
21.

// make query

22.

$result = $conn->query('SELECT id, name from customer order by id');

23.
24.

// iterate results

25.

foreach ($result as $row)

26.

27.

print $row['id'] . '-';

28.

print $row['name'] . "<br>\n";

29.

30.

TTransaction::close(); // close transaction

31.

32.

catch (Exception $e)

33.

34.

new TMessage('error', $e->getMessage());

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.

* @copyright Copyright (c) 2006-2014 Adianti Solutions Ltd. (http://www.adianti.com.br)

10.

* @license

11.

*/

1.0
samples

Pablo Dall'Oglio

http://www.adianti.com.br/framework-license

12.

class MultiStepMultiFormView extends TPage

13.

14.

protected $form; // form

15.

protected $notebook;

16.
17.

/**

18.

* Class constructor

19.

* Creates the page and the registration form

20.

*/

21.

function __construct()

22.

23.

parent::__construct();

24.
25.

// creates the notebook

26.

$this->notebook = new TNotebook;

27.

$this->notebook->setSize(400, 140);

28.
29.

// creates the form

30.

$this->form = new TQuickForm('form_account');

31.

$this->notebook->appendPage('Create account', $this->form);

32.
33.

// create the form fields

34.

$email

35.

$password

36.

$confirm

= new TEntry('email');
= new TPassword('password');
= new TPassword('confirm');

37.
38.

$this->form->addQuickField('Email: ', $email, 200);

39.

$this->form->addQuickField('Password: ', $password, 200);

40.

$this->form->addQuickField('Confirm password: ', $confirm, 200);

41.
42.

// validations

43.

$email->addValidation('Email', new TRequiredValidator);

44.

$email->addValidation('Email', new TEmailValidator);

45.

$password->addValidation('Password', new TRequiredValidator);

46.

$confirm->addValidation('Confirm password', new TRequiredValidator);

47.
48.

// add a form action

49.

$this->form->addQuickAction('Next', new TAction(array($this, 'onNextForm')), 'ico_apply.png');

50.
51.

// add the form to the page

52.

parent::add($this->notebook);

53.

54.
55.

/**

56.

* Load form from session

57.

*/

58.

public function onLoadFromSession()

59.

60.

$data = TSession::getValue('form_step1_data');

61.

$this->form->setData($data);

62.

63.
64.

/**

65.

* onNextForm

66.

*/

67.

public function onNextForm()

68.

69.

try

70.

71.

$this->form->validate();

72.

$data = $this->form->getData();

73.

74.

if ($data->password !== $data->confirm)

75.

76.

throw new Exception('Passwords do not match');

77.

78.

// store data in the session

79.

TSession::setValue('form_step1_data', $data);

80.
81.

// Load another page

82.

TApplication::loadPage('MultiStepMultiForm2View', 'onLoadFromForm1', (array) $data);

83.
84.

85.

catch (Exception $e)

86.

87.

new TMessage('error', $e->getMessage());

88.

89.

90.

91.

?>

Neste exemplo demonstramos como implementar o relacionamento de agregao no Adianti Framework. O


objeto implementado aqui (Customer) representa o todo e Skill suas partes.
Para implementar uma agregao precisamos de mtodos como addSkill(), para acrescentar partes e getSkills(),
para retornar as partes. Alm disso, precisamos reescrever mtodos como load(), store() e delete(), para que as
partes sejam carregadas, armazenadas e excludas juntamente com o objeto todo.
Como em uma agregao, as partes no so exclusivas de um todo, utilizamos uma classe Active Record
associativa (CustomerSkill) para relacionar o todo com as partes.
Obs: As classes de modelo (Active Record) de uma aplicao, podem ser geradas automaticamente pelo Adianti
Studio Pro. O Adianti Studio Pro, permite importar um modelo de classes (XMI/UML) contendo as classes e seus
relacionamentos e gerar todo o cdigo das classes Active Record para lidar com os relacionamentos
(associao, composio, agregao) definidos. Alm disso, ele tambm oferece um Wizard (passo a passo)
para gerar as classes a partir de tabelas j definidas em um banco de dados.

Exemplo
1.

<?php

2.

/**

3.

* Customer Active Record

4.

* @author <your-name-here>

5.

*/

6.

class Customer extends TRecord

7.

8.

const TABLENAME = 'customer';

9.

const PRIMARYKEY= 'id';

10.

const IDPOLICY = 'max'; // {max, serial}

11.
12.
13.

private $skills;

14.
15.

/**

16.

* Constructor method

17.

*/

18.

public function __construct($id = NULL)

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.

* Add a Skill to the Customer

36.

* @param $object Instance of Skill

37.

*/

38.

public function addSkill(Skill $object)

39.

40.
41.

$this->skills[] = $object;
}

42.
43.

/**

44.

* Method getSkills

45.

* Return the Customer' Skill's

46.

* @return Collection of Skill

47.

*/

48.

public function getSkills()

49.

50.
51.

return $this->skills;
}

52.
53.

/**

54.

* Reset aggregates

55.

*/

56.

public function clearParts()

57.

58.
59.

$this->skills = array();
}

60.
61.

/**

62.

* Load the object and its aggregates

63.

* @param $id object ID

64.

*/

65.

public function load($id)

66.

67.

$this->skills = parent::loadAggregate('Skill', 'CustomerSkill', 'customer_id', 'skill_id', $id);

68.
69.

// load the object itself

70.

return parent::load($id);

71.

72.
73.

/**

74.

* Store the object and its aggregates

75.

*/

76.

public function store()

77.

78.

// store the object itself

79.

parent::store();

80.

81.

parent::saveAggregate('CustomerSkill', 'customer_id', 'skill_id', $this->id, $this->skills);

82.

83.
84.

/*** Delete the object and its aggregates @param $id object ID

85.

public function delete($id = NULL)

86.

87.

*/

parent::deleteComposite('CustomerSkill', 'customer_id', $id);

88.
89.

// delete the object itself

90.

parent::delete($id);

91.
92.

}
}

93.
94.

/** * USAGE */

95.

$customer= new Customer(4); // lodas the customer 4

96.
97.

// add two skills

98.

$customer->addSkill(new Skill(1));

99.

$customer->addSkill(new Skill(2));

100.
101.

// stores the customer and the references to the skills

102.

// using CustomerSkill class (that handles customer_skill association table).

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();
}
{

catch (Exception $e)


new TMessage('error', $e->getMessage());

18.

19.

20.

22.

?>
<?php
class CollectionSimpleDelete extends TPage

23.

24.

public function __construct()

25.

26.

parent::__construct();

27.

try

28.

29.

TTransaction::open('samples');

30.

$repository = new TRepository('Customer');

31.

$repository->where('address', 'like', 'Rua Porto%')

32.

->where('gender', '=', 'M') ->delete();

33.

new TMessage('info', 'Records Deleted');

34.

TTransaction::close();

35.

36.

catch (Exception $e)

37.

38.

new TMessage('error', $e->getMessage());

39.

40.

41.

42.

?>

Neste exemplo demonstramos como implementar o relacionamento de composio no Adianti Framework.


O objeto implementado aqui (Customer) representa o todo e Contact, suas partes.
Para implementar uma composio precisamos de mtodos como addContact(), para acrescentar partes e
getContacts(), para retornar as partes. Alm disso, precisamos reescrever mtodos como load(), store() e
delete(), para que as partes sejam carregadas, armazenadas e excludas juntamente com o objeto todo.
Obs: As classes de modelo (Active Record) de uma aplicao, podem ser geradas automaticamente pelo Adianti
Studio Pro. O Adianti Studio Pro, permite importar um modelo de classes (XMI/UML) contendo as classes e seus
relacionamentos e gerar todo o cdigo das classes Active Record para lidar com os relacionamentos
(associao, composio, agregao) definidos. Alm disso, ele tambm oferece um Wizard (passo a passo)
para gerar as classes a partir de tabelas j definidas em um banco de dados.

Exemplo
1.

<?php

2.

class Customer extends TRecord

3.

4.

const TABLENAME = 'customer';

5.

const PRIMARYKEY= 'id';

6.

const IDPOLICY = 'max'; // {max, serial}

7.
8.

private $contacts;

9.
10.

/**

11.

* Constructor method

12.

*/

13.

public function __construct($id = NULL)

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.

public function addContact(Contact $object)

28.

29.
30.

$this->contacts[] = $object;
}

31.
32.

/** Method getContacts * Return the Customer' Contact's * @return Collection of Contact */

33.

public function getContacts()

34.

35.

return $this->contacts;

36.

37.
38.

/** * Reset aggregates */

39.

public function clearParts()

40.

41.
42.

$this->contacts = array();
}

43.
44.

/** * Load the object and its aggregates * @param $id object ID */

45.

public function load($id)

46.

47.

$this->contacts = parent::loadComposite('Contact', 'customer_id', $id);

48.
49.

// load the object itself

50.

return parent::load($id);

51.

52.
53.

/** * Store the object and its aggregates */

54.

public function store()

55.

56.

// store the object itself

57.

parent::store();

58.
59.
60.

parent::saveComposite('Contact', 'customer_id', $this->id, $this->contacts);


}

61.
62.

/** Delete the object and its aggregates * @param $id object ID */

63.

public function delete($id = NULL)

64.

65.

parent::deleteComposite('Contact', 'customer_id', $id);

66.
67.

// delete the object itself

68.

parent::delete($id);

69.

70.

71.

/** * USAGE */

72.
73.

$customer= new Customer(4); // Loads customer

74.
75.

$contact1 = new Contact; // create contact

76.

$contact2 = new Contact; // create contact

77.
78.

$contact1->type = 'fone';

79.

$contact1->value = '78 2343-4545';

80.

$contact2->type = 'fone';

81.

$contact2->value = '78 9494-0404';

82.
83.

$customer->addContact($contact1);

84.

$customer->addContact($contact2);

85.

// Store the customer and its contacts in the related table

86.

$customer->store();?>

Você também pode gostar