A melhor parceira de TI para o seu negócio English version

Extensibilidade

Home Características Cases Livro Curso Downloads Apps Docs Fórum

Conheça mais sobre com o livro:

  • Instalação e configuração;
  • Modelos, persistência e BD;
  • Componentes de apresentação;
  • Cadastros e listagens;
  • Logins, permissões, relatórios;
  • Desenvolvimento com Studio Pro.
Ver detalhes...


Esta página explica os passos básicos para estender o Adianti Framework.

Novos componentes globais

Novos componentes podem ser acrescentados ao framework de maneira simples. Para acrescentar um novo componente, você deverá salvar a classe na pasta /app/lib/widget. Caso o componente inclua arquivos não presentes no framework como arquivos javascript, estes devem ser disponibilizados nesta pasta /app/lib/include e incluídos nos headers da aplicação (app/templates/.../layout.html). Novos componentes devem preferencialmente ser subclasse de TElement, classe base para criação de novos componentes HTML. TElement simula o comportamento de uma tag HTML.
  1. <?php
  2. class TAccordion extends TElement
  3. {
  4.     protected $elements;
  5.     
  6.     public function __construct()
  7.     {
  8.         parent::__construct('div');
  9.         $this->id 'taccordion_' uniqid();
  10.         $this->elements = array();
  11.     }
  12.     
  13.     public function appendPage($title$object)
  14.     {
  15.         $this->elements[] = array($title$object);
  16.     }
  17.     
  18.     public function show()
  19.     {
  20.         foreach ($this->elements as $child)
  21.         {
  22.             $title = new TElement('h3');
  23.             $title->add($child[0]);
  24.             
  25.             $content = new TElement('div');
  26.             $content->add($child[1]);
  27.             
  28.             parent::add($title);
  29.             parent::add($content);
  30.         }
  31.         
  32.         TScript::create('$(document).ready( function() {
  33.                             $( "#'.$this->id.'" ).accordion();
  34.                         });');
  35.         parent::show();
  36.     }
  37. }

Novos componentes com Namespaces

Agora vamos supor que você queira criar um novo componente utilizando Namespaces. Vamos supor que você queira criar uma barra de progresso no estilo da Bootstrap progress bar, que possui um código similar ao que podemos ver a seguir.
  1. <div class="progress">
  2. <div class="progress-bar" role="progressbar"
  3. aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: 60%;">
  4. <span class="sr-only">60% Complete</span>
  5. </div>
  6. </div>
Então agora que já sabemos a estrutura do componente, vamos declará-lo. Para tal, vamos usar a classe TElement, classe base do framework para construção de novos componentes. Vamos supor que sua empresa chama-se "Acme". Então, este novo componente terá como Namespace "namespace Acme\Widget", e ficará no caminho "lib/acme/widget/ProgressBar.php". A classe se chamará ProgressBar. Basicamente ela é uma div com outra div em seu interior, e esta outra div, com um span. Passamos como parâmetros o percentual, e uma mensagem para a barra.
  1. <?php
  2. namespace Acme\Widget;
  3. use Adianti\Widget\Base\TElement;
  4. class ProgressBar extends TElement
  5. {
  6.     public function __construct($percentage$message)
  7.     {
  8.         parent::__construct('div');
  9.         $this->{'class'} = 'progress';
  10.         
  11.         $div = new TElement('div');
  12.         $div->{'class'} = 'progress-bar';
  13.         $div->{'role'}  = 'progressbar';
  14.         $div->{'aria-valuenow'} = $percentage;
  15.         $div->{'aria-valuemin'} = '0';
  16.         $div->{'aria-valuemax'} = '100';
  17.         $div->{'style'} = "width: {$percentage}%;";
  18.         
  19.         $span = new TElement('span');
  20.         $span->{'class'} = 'sr-only';
  21.         $span->add($message);
  22.         $div->add($span);
  23.         
  24.         parent::add($div);
  25.     }
  26. }
Agora que já criamos o componentes, vamos ver como usá-lo. Em primeiro lugar, devemos usar o operador "use" (use Acme\Widget\ProgressBar) para importar a classe daquele Namespace. Neste caso, estamos usando o componente criado (ProgressBar) dentro de uma tabela (TTable).
  1. <?php
  2. use Acme\Widget\ProgressBar;
  3. class TestView extends TPage
  4. {
  5.     function __construct()
  6.     {
  7.         parent::__construct();
  8.         
  9.         $table = new TTable;
  10.         $table->width '500px';
  11.         $table->addRow()->addCell( new ProgressBar(50'teste') );
  12.         
  13.         parent::add($table);
  14.     }
  15. }

Novos validadores

Novos validadores de formulário podem ser acrescentados ao framework também de maneira muito simples. Um novo validador deve ser salvo na pasta /app/lib/validator. Novos validadores devem ser subclasse de TFieldValidator. Em seu método validate(), recebe o label do campo, o valor a ser validado e possíveis parâmetros extra. Deve lançar uma exceção caso a validação não passe.
  1. <?php
  2. /**
  3.  * Date validation
  4.  *
  5.  * @version    1.0
  6.  * @package    validator
  7.  * @author     Pablo Dall'Oglio
  8.  * @copyright  Copyright (c) 2006-2012 Adianti Solutions Ltd. (http://www.adianti.com.br)
  9.  * @license    http://www.adianti.com.br/framework-license
  10.  */
  11. class TDateValidator extends TFieldValidator
  12. {
  13.     /**
  14.      * Validate a given value
  15.      * @param $label Identifies the value to be validated in case of exception
  16.      * @param $value Value to be validated
  17.      * @param $parameters aditional parameters for validation (ex: mask)
  18.      */
  19.     public function validate($label$value$parameters NULL)
  20.     {
  21.         $mask $parameters[0];
  22.         $year_pos  strpos($mask'yyyy');
  23.         $month_pos strpos($mask'mm');
  24.         $day_pos   strpos($mask'dd');
  25.         
  26.         $year      substr($value$year_pos4);
  27.         $month     substr($value$month_pos2);
  28.         $day       substr($value$day_pos2);
  29.         
  30.         if (!checkdate((int) $month, (int) $day, (int) $year))
  31.         {
  32.             throw new Exception("The field $label is not a valid date ($mask)");
  33.         }
  34.     }
  35. }
  36. ?>