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

Changelog

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

5.0.0 4.0.0 3.0.0 2.0.0 1.0.3 1.0.2 1.0.1

Adianti Framework 5.0.0 (2017-10-27)

"A Hard Day's Night" release.
  • Informações gerais

  • Novidades da 5.0.0

  • Melhorias globais
    • Atualizada JQuery para 3.2.1;
    • Atualizada JQuery-UI para 1.12.1;
    • Atualizada FullCalendar para 3.4;
    • Atualizada FontAwesome para 4.7;
    • Atualizada Select2 para 4.0.3;
    • Atualizada Summernote para 0.8.7;
    • Atualizada Colorpicker para 2.5.1
    • Padronizada pasta /vendor no autoloader e incluído ali algumas dependências (qrcodes, barcodes, dompdf, rtf, phpmailer). Total compatibilidade com composer. Ex: "composer require fzaninotto/faker". O init.php foi ajustado para carregar o autoloader de vendor. Carregamentos de bibliotecas fora do composer devem estar em vendor/autoload_extras.php
  • Novos componentes
    • Um novo componente foi criado: TUniqueSearch. Ele permite selecionar um item dinamicamente com a digitação a partir de um vetor (similar a TCombo com enableSearch()). Verifique na aplicação tutor.
    • Um novo componente foi criado: TDBUniqueSearch. Funciona como o TUniqueSearch, mas permitindo buscas dinâmicas em tabelas; Verifique na aplicação tutor.
    • Um novo componente foi criado: TMultiEntry. Ele permite entrar com várias strings separadas por vírgula ou enter. Verifique na aplicação tutor.
    • Um novo componente foi criado: TFormSeparator. Ele permite criar uma divisória em formulários.
    • Uma nova classe foi criada: AdiantiBarcodeDocumentGenerator: Ela permite gerar documentos com códigos de barras e QRCode. Verifique na aplicação tutor (barcode). Verifique na aplicação tutor (qrcode).
  • Novos exemplos
    • Um novo exemplo foi criado para demonstrar a nova classe para criar formulários vetoriais. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar a nova classe para gerar barcodes. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar a nova classe para gerar QRCodes. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar Barcodes e QRCodes em tela. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como criar Dashboards. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar a conversão de documentos HTML em PDF. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar um gráfico com dados da base. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar formulários master/detail com controllers separadas (uma para o master e uma para o detail), mas na mesma tela. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar os atalhos de persistência. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar os novos métodos render() e evaluate(). Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar os vários componentes de formulários. Verifique na aplicação tutor.
    • Este exemplo foi alterado para demonstrar a geração de documentos PDF. Verifique na aplicação tutor.
  • Melhorias em classes/componentes
    • Implementado o método TFile/TMultiFile::setAllowedExtensions(), para definir as extensões permitidas (ex: jpg, png, gif) no upload;
    • TDBSeekButton recebe operator da consulta como parâmetro no final do construtor (like/ilike);
    • Implementado o método BootstrapFormBuilder::setColumnClasses(), para configurar o grid layout do formulário;
    • Agora é possível usar o componente TTextDisplay dentro de um BootstrapFormBuilder;
    • Agora é permitido passar vários campos como parâmetro de uma ação de datagrid, por meio do TDataGridAction::setFields(), que permite passar um array simples[];
    • BootstrapFormBuilder permite agora ter actions à direita da toolbar topo;
      • $this->form->addHeaderAction('Send 3', new TAction(array($this, 'onSend')), 'fa:check-circle-o green');
    • Criado o método TCombo/TRadioGroup::setBooleanMode(), que cria uma combo/radio que trata corretamente valores booleanos em tela;
    • Criado popover sobre Fullcalendar:
      • $this->fc->enablePopover( 'Title {title}', '<b>{title}</b> <br> <i class="fa fa-user" aria-hidden="true"></i> {person} <br> {description}');
        $obj = (object) ['title'=>'Event 1', 'person' => 'Mary', 'description' => 'Complementary description'];
        $this->fc->addEvent(1, 'Event 1', $before_yesterday.'T08:30:00', $before_yesterday.'T12:30:00', null, '#C04747', $obj);
    • Criado método para indicar os dias disponíveis em um calendário:
      • $this->fc->enableDays([0,1,2,3,4,5,6]);
    • MultiSearch agora permite a busca por múltiplos campos (basta separar por vírgula):
      • $search2= new TDBMultiSearch('search2', 'samples', 'Customer', 'id', 'name, birthdate');
    • Implementado o método TDBMultiSearch::disableIdSearch(), para desabilitar busca pelo ID no TDBMultisearch;
    • TMultiSearch/TDBMultiSearch agora permitem tags HTML na máscara da descrição;
    • Melhorada a aparência da janela de buscas (seek);
    • Agora é permitido passar máscaras com atributos de objetos para TAction::setParameter('chamado_id', '{id}'), ao utilizá-lo em datagrids;
    • Templates HTML agora funcionam sem cifrão (padrão mustache) {{var}};
    • Foi implementado o método TDate::setOption() (Thanks to Artur Comunello);
      • $expires->setOption('startDate', '05/05/2017');
    • TCheckGroup, TCombo, TRadioGroup, TSelect, TSortList, TMultiSearch, e TDBMultiSearch agora possuem um método setChangeFunction() para atribuir uma function Javascript pura quando trocar de valor;
    • Acrescentado o método TEntry, TPassword, TText::setExitFunction(), para atribuir uma function Javascript pura quando sair do campo;
    • TForm::sendData() agora suporta combo com enableSearch();
    • O método TForm::sendData() agora suporta check e radio na forma de botões;
    • O método TForm::sendData() agora suporta TMultiSearch, TUniqueSearch, TMultiEntry;
    • Acrescentado o método TColor::setChangeAction();
    • ReloadFromModel() agora aceita strings no formato mustache:
      • TDBCombo::reloadFromModel('form_hierarchical', 'city_id', 'samples', 'City', 'id', '{name} ({id})', 'name', $criteria, TRUE);
    • TSpinner agora aceita casas decimais;
    • Criado o método BootstrapFormBuider::getActions();
    • TPanelGroup agora permite trocar o background do header;
      • $panel = new TPanelGroup('Panel group title', 'orange');
    • A action da datagrid agora permite passar cores em RGB também:
      • $action1->setImage('bs:search #ff0000');
    • O método setSize() do TRadioGroup e TCheckGroup agora configuram o tamanho do botão (option);
    • O método TCombo::reload() agora aceita options com ">>>" para formar níveis;
    • O método TDataGridAction::setImage() agora permite passar um objeto TImage, não somente descrição da imagem;
    • Não exibir um THidden sozinho na classe BootstrapFormBuilder da mesma maneira que em BootstrapFormWrapper;
    • TFrame e TScroll agora aceitam % em width e height;
    • Agora é possível definir margin em um THtmlEditor:
      • $html->style='margin-left:50px; margin-top:20px';
    • TMultiSearch e TDBMultiSearch agora enviam a changeAction por POST, não GET;
    • Ao usar cálculos em datagrids, era necessário ter espaços em branco entre os operadores, agora não é mais necessário;
    • Se na TDBCombo tiver expressões com substituição de campos "{campo}", onde a ordenação por SQL é impossível, a ordenação será feita via PHP;
    • O método setFontSize() agora aceita "px" ou "pt";
    • Nos relatórios, agora é possível alterar formato e orientação em PDF e RTF (TTableWriter);
      • $tr = new TTableWriterPDF($widths, 'L', 'A4');
        $tr = new TTableWriterRTF($widths, 'L', 'A4');
    • Implementado o método TPageNavigation::getCount() que permite retornar a qtde de registros da datagrid;
    • TPageNavigation, agora tem os métodos getLimit(), getCount(), getPage();
    • Implementado o método TButton::addStyleClass() para permitir adicionar uma classe CSS ao botão;
    • Melhorados os gráficos usando Google Charts para permitir colocar mais de um na mesma tela;
  • Melhorias em persistência
    • Homologado suporte ao Firebird nativo via PDO;
    • Criado o método render() nas Active Records, para permitir renderizar strings com atributos.
      • print $customer->render("Oi {name} that lives in {address}");
    • Criado o método evaluate() nas Active Records, para permitir cálculos com atributos.
      • print $product->evaluate("={amount}*{price}");
    • Criado o método filterMany(), que permite carregar objetos relacionados, e ao mesmo tempo filtrando.
      • Customer::find(2)->filterMany('Contact')->where('active', 'is', TRUE)->load();
    • Implementado o método getIndexedArray() para uso com repositórios, o que permite utilização encadeada.
      • $products = Product::where('unity', '=', 'PC')->orderBy('id')->getIndexedArray('id', 'description');
    • Criado o método create(), que permite criar rapidamente um active record com base em um vetor.
      • $category = Category::create( ['name' => 'test 8'] );
    • Melhorado o metodo deleteComposite(), adicionado parâmetro ao final para indicar se vai fazer delete cascade, chamando o delete() dos objetos compostos.
    • No driver para Sql Server, havia fixo no código um order pelo 'id'. Isso foi removido.
    • Na conexão com Postgresql, agora observa o parâmetro 'char' no ini. Transforma em SET CLIENT_ENCODING.
  • Melhorias nos templates:
    • Um novo template (theme4) foi criado, baseado no AdminBSB ("Conheça o AdminBSB");
    • O novo template (theme4) usa novos diálogos (SweetAlert) e novo seletor de datas (material-datetimepicker);
    • Criada tela para visualizar os logs de erro do PHP (SystemPHPErrorLogView);
    • Criada nova tela para navegar nos bancos de dados (SystemDatabaseExplorer);
    • Criado recurso que permite Multi-empresa no template. Este recurso permite o usuário selecionar a unidade (empresa/filial) já na tela de login: Adicionar "multiunit = 0" na seção general do application.ini;
    • Alterado formulário de cadastro de usuários para permitir vincular mais de uma unidade;
    • Script de Download (download.php) do template agora verifica se o usuário está logado;
    • O diálogo "Carregando..." para requisições GET longas foi adicionado no application.js (Post original);
    • Melhorada tela de consulta e edição de perfil do usuário;
    • Foi alterado o posicionamento da barra de navegação (page navigator) para ficar dentro do footer do panelgroup;
    • Simplificada a tela padrão de seek para funcionar melhor em mobile;
    • Melhorias de performance no mecanismo de tradução do template (ApplicationTranslator);
    • Distribuído rest.php.dist e soap.php.dist junto com o template (basta renomear para ter o server SOAP ou REST);
    • Na tela de login do template botar validação nos campos;
    • Na busca de programas, lista somente os que tem permissão, mas agora filtrado pelos que são visíveis no menu;
    • Tirar o profile do menu logout, deixar somente no menu do usuário;
    • Melhoria do diálogo de "Carregando" em dispositivos móveis (centralização/largura);
    • Aceitar também https:// além de http:// como link direto no menu.xml
  • Novos controles
    • Min version aumentado para 5.5;
  • Correções de bug
    • TFile evita upload de scripts (ex: php, py, cgi);
    • Ação posterior à confirmação em dialogs era disparada duas vezes quando o usuário clicava fora da área;
    • Corrigido bug ao passar criteria para o TDBMultiSearch. Quando já tinha criteria, ele usava OR com o que o usuário digitava, não AND;
    • Corrigido erro ao registrar changelog de campos booleanos (FALSE não gravava em campo text, feito cast (String));
    • HTML's com quebras de linha gerados em métodos estáticos agora são exibidos normalmente (\n\r);
    • Na classe TFilter, o terceiro parâmetro é tratado como subconsulta se começar ou '(SELECT' ou '(select', independente do case;
    • Atribuição de id $entry->id e $combo->id não estava funcionando mais;
    • Seeks criadas pelo designer não passavam o hash de segurança;
    • Agora, quando um BootstrapFormBuilder não tiver actions, não exibe o footer vazio;
    • Se TSlider e TSpinner já iniciavam desabilitados (setEditable(false)), era impossível reabilitá-los via javascript;
  • Melhorias em apps de exemplo
    • As apps de exemplo (changeman, library) foram compatibilizadas com o novo tema material (theme4);
    • No Changeman havia um bug na tela "compartilhados comigo", invalid input syntax for type date;
    • A datagrid de chamados agora usa labels para rotular o estado (status);
    • No Changeman, agora é possível ver o link do arquivo relacionado na tela de consultar o chamado;
    • No Library, agora é tratado o valor do item ao salvar o livro/exemplar (remover a vírgula 10,20);
    • No Library, foram corrigidos bugs com as seeks nas telas de relatórios;
    • No Tutor, foi feita uma busca no código-fonte por palavras-chave (ex: componentes) na área da direita;
    • No Tutor, o cadastro de clientes (CustomerFormView) foi alterado para usar a classe TFieldList;

Adianti Framework 4.0.0 (2016-12-14)

"Free as a bird" release.
  • Informações gerais

  • Novidades da 4.0.0

  • Novos componentes
    • Um novo componente foi criado: TFullCalendar. Ele permite criar calendários com agendamentos. Verifique na aplicação tutor.
    • Um novo componente foi criado: BootstrapFormBuilder. Ele permite montar formulários responsivos Boostrap com abas de maneira ágil. Verifique na aplicação tutor.
    • Um novo componente foi criado: TDateTime. Ele permite o usuário selecionar data e hora em um mesmo objeto. Verifique na aplicação tutor.
    • Um novo componente foi criado: TQuickNotebookForm. Ela permite criar rapidamente formulários com abas. Verifique na aplicação tutor.
    • Um novo componente foi criado: TTextDisplay. Ele permite gerar um elemento span para exibir textos facilmente.
      new TTextDisplay('Teste', 'red', 12, 'biu'); Verifique na aplicação tutor.
    • Um novo componente foi criado: TActionLink. Ele permite gerar um link para uma ação (TAction) interna da aplicação.
      new TActionLink('Link', $action, 'blue', 12, 'biu'); Verifique na aplicação tutor.
    • Um novo componente foi criado: THyperLink. Ele permite gerar um link para um recurso (arquivo interno ou link externo).
      new THyperLink('THyperLink (url)', 'http://www.google.com', 'orange', 12, 'biu'); Verifique na aplicação tutor.
    • Um novo componente foi criado: TIcon. Ele permite seleção de ícones.
  • Novos exemplos
    • Um novo exemplo demonstra a utilização do novo componente de calendário com dados estáticos. Verifique na aplicação tutor.
    • Um novo exemplo demonstra a utilização do novo componente de calendário integrado com o banco de dados. Verifique na aplicação tutor.
    • Um novo exemplo demonstra a criação de formulários com campos vetoriais. Verifique na aplicação tutor.
    • Um novo exemplo demonstra uma tela de vendas com formulário com campos vetorias. Verifique na aplicação tutor.
    • Um novo exemplo demonstra gráficos de barra com Google charts. Verifique na aplicação tutor.
    • Um novo exemplo demonstra gráficos de linha com Google charts. Verifique na aplicação tutor.
    • Um novo exemplo demonstra gráficos de pizza com Google charts. Verifique na aplicação tutor.
    • Um novo exemplo demonstra uma lista de vendas com filtros inteligentes, usando funções de transformação. Verifique na aplicação tutor.
    • Um novo exemplo demonstra o carregamento de diferentes páginas em partes diferentes da tela. Verifique na aplicação tutor.
    • Um novo exemplo demonstra a criação de uma datagrid com labels. Verifique na aplicação tutor.
    • Um novo exemplo demonstra a criação de uma datagrid com campos calculados e totais. Verifique na aplicação tutor.
    • Um novo exemplo demonstra a utilização de templates com várias seções e subníveis usando a nova sintáxe com matrizes. Verifique na aplicação tutor.
    • Um novo exemplo demonstra a criação de um formulário vertical Bootstrap. Verifique na aplicação tutor.
    • Um novo exemplo demonstra como exibir/esconder linhas de um formulário. Verifique na aplicação tutor.
    • Um novo exemplo demonstra a utilização de formulários dentro de popovers. Verifique na aplicação tutor.
    • Um novo exemplo demonstra a utilização de combos hierárquicas. Verifique na aplicação tutor.
    • Um novo exemplo demonstra a utilização radios e checks em colunas. Verifique na aplicação tutor.
    • Um novo exemplo demonstra a criação de um formulário com abas laterais à esquerda. Verifique na aplicação tutor.
    • Um novo exemplo demonstra como criar links e botões para ações internas ou recursos externos. Verifique na aplicação tutor.
    • Um novo exemplo demonstra como solicitar senha antes do envio da ação do formulário. Verifique na aplicação tutor.
    • Um novo exemplo demonstra como efetuar cálculos em formulário com ações Javascript (client side). Verifique na aplicação tutor.
    • Um novo exemplo demonstra o novo container TPanelGroup. Verifique na aplicação tutor.
  • Melhorias em classes/componentes
    • Criado o método TDate::setDatabaseMask(), que define a máscara do BD de um campo date. Ao ser utilizado, já realiza a conversão dos formatos de data entre a tela (setMask) e o banco de dados (setDatabaseMask()) na edição/postagem. Verifique na aplicação tutor.
    • Agora é possível colocar campos lado a lado usando BootstrapFormWrapper, usando addQuickFields e notação de vetor []. Verifique na aplicação tutor.
    • Agora é possível botar máscara para o campo de descrição no TDBCombo, TDBRadioGroup, TDBCheckGroup, e outros. Inclusive usando atributos de objetos relacionados (como em city->name), desde que existam os métodos (Ex: get_city()):
      • $radio = new TDBRadioGroup('radio', 'samples', 'Category', 'id', '{id}-({name})');
      • $combo = new TDBCombo('combo', 'samples', 'Customer', 'id', '{id}-{name}-({city->name})');
    • Agora é possivel criar colunas calculadas com fórmulas em datagrids:
      • $datagrid->addQuickColumn('Subtotal','= {amount} * ( {price} - {discount} )', 'right', 80);
    • Agora é possível produzir facilmente totais em datagrids:
      • $column->setTotalFunction( function($values) { return array_sum((array) $values); });
    • Acrescentada uma função anonima como 4o parâmetro da addFilterField(), para transformar o valor do campo antes de injetar na query.
      • parent::addFilterField('name','like','name', function($value){ return strtoupper($value); });
    • Agora é possível usar métodos e atributos relacionados no setMask do TDBMultiSearch. Verifique na aplicação tutor.
      • $search->setMask('({id}) {name} - {state->name}');.
    • TDBMultiSearch agora aceita busca pelo código do objeto também;
    • Agora é possível passar para o popover atributos de objetos relacionados, {cidade->estado->pais->nome}, desde que existam os métodos (Ex: get_estado(), get_pais()):
      • $datagrid->enablePopover('Popover', 'Hi {name}, living at {city->name}-{city->state->name}');
    • Permite a transformação visual de TRadioGroup e TCheckGroup em buttons. Verifique na aplicação tutor.
    • TSpinner, TDate, TColor, TMultiSearch, TDBMultiSearch, TFile agora aceitam largura como percentual;
    • Popover: Implementado o atributo popside, que pode ser usado sobre qualquer objeto para definir o lado que o popover irá abrir;
    • THtmlEditor, TRadioGroup, e TCheckGroup agora são suportados pelo metodo TForm::sendData();
    • TRadioGroup, TSelect, e TText agora também disparam changeaction quando alimentado via sendData();
    • Agora é possível definir combos com separadores de subitens. Verifique na aplicação tutor.
    • Aceleração considerável no mecanismo de tradução do THtmlRenderer;
    • Implementados métodos forceLowerCase() e forceUpperCase() na TEntry. Thanks to Marco AR Campos;
    • Em requisições dinâmicas (changeActions, exitActions), agora passa _field_id, _field_name, e _field_value do requester;
    • Implemetado TNotebook::setTabsSensibility(), para definir se as abas serão sensíveis ao clique;
    • Implementado setEditable(FALSE) na TMultiSearch e TDBMultiSearch;
    • TNotebook agora aceita alterar estilos inline (Ex: $note->style = "");
    • Foi adicionado um parâmetro booleano ao TForm::clear(), que permite preservar os setValues() definidos nos contrutores dos objetos. Ex: Data default;
    • Agora é possível colocar title no header da datagrid via ->title ou setProperty(). Verifique na aplicação tutor.
    • THtmlRenderer agora suporta vários níveis de iteração em um único template. Verifique na aplicação tutor.
    • Agora é possível substituir de atributos de um objeto TRecord dentro do THtmlRenderer, sem precisar passar um a um dos atributos, basta passar o objeto ao replace e depois usar a sintaxe: {$object->name};
    • Agora é possível definir ícones font awesome com cores específicas em métodos que esperam com imagens, com a sintaxe: "fa:save #FF0000";
    • Implementados os métodos TSortList::setLimit(), para definir um limite e TSortList::setOrientation(), pra definir a orientação;
    • O construtor do TLabel, agora aceita mais parâmetros: __construct($value, $color = null, $size = null, $decoration = null);
    • Foi criado um atalho para criação de actions, já definindo os parâmetros: new TAction(array($this, 'onSave'), ['id'=>5] );
    • Foi criado um método estático para criar rapidamente objetos TTable a partir de matrizes (TTable::fromData());
    • Implementado ->titside = "top/left/right/bottom", que ao ser utilizado junto com ->title = "", define o lado para o qual o title irá ser exibido;
  • Melhorias em persistência
    • Novas configurações no INI para Oracle:
      • char=AL32UTF8 // alterar charset de conexão
      • flow=1 // força atributos para lowercase
      • date="YYYY-MM-DD" // NLS_DATE_FORMAT
      • time="YYYY-MM-DD HH:MI:SS.FF" // NLS_TIMESTAMP_FORMAT
      • nsep=',.' // NLS_NUMERIC_CHARACTERS
    • Implementado TRecord::getAttributes();
    • Implementado o update em massa:
      • Customer::where('id','IN',[1,2,3,4])->where('status','=','C')->set('gender', 'M')->update();
    • Implementado atalho para criação de critérios com "=" e "and":
      • TCriteria::create( ['state_id' => $param['state_id'] ] );
    • Implementado atalho para recarregar combo direto com valores do banco:
      • $criteria = TCriteria::create( ['state_code' => 'RS' ] );
      • TDBCombo::reloadFromModel('form_x', 'city_id', 'samples', 'City', 'id', 'name', 'name', $criteria, TRUE);
  • Melhorias globais
    • Atualizada JQuery para 2.1.4;
    • Atualizada Font-Awesome para 4.5;
    • Chamadas síncronas Javascript foram substituídas por assíncronas para evitar: Synchronous XMLHttpRequest on the main thread
    • Implementada a classe AdiantiApplicationConfig, que lê o application.ini na inicialiação e disponibiliza seu conteúdo pelo método get();
    • Agora é possível renderizar uma página (TPage) em diferentes partes (DIV's) do template HTML. Se uma página tiver definido o atributo $this->adianti_target_container = 'xyz'; então ela será renderizada neste DIV. Verifique na aplicação tutor.
    • Itens do menu.xml agora são traduzíveis usando a seguinte sintaxe: _t{Groups};
    • Atualizada versão da FPDF para 1.81;
    • Aumentada a lista de mimetypes para downloads no download.php;
    • Ajuste PHPMailer para evitar exceções de certificado SSL;
    • Melhor controle de erros quando não tem conexão com internet. Não trava mais o diálogo carregando;
    • A classe de cache TAPCache, agora usa as funções apcu_, não mais apc_;
  • Melhorias nos templates:
    • Agora é possível definir quais classes serão públicas (acessadas sem login), diretamente no application.ini:
          [permission]
          public_class[] = ProductView
          public_class[] = CartView
    • Implementada comunicação (mailbox) dentro do template para troca de mensagens entre usuários;
    • Implementado um pequeno controle de documentos, com armazenamento e compartilhamento de documentos entre usuários e grupos;
    • Implementado gráfico com os acessos por dia;
    • Implementado um cadastro de unidades (filiais, setores). Poder vincular um usuário à uma unidade;
    • Implementado controle de notificações ao usuário. É possível gerar uma notificação que leva o usuário à uma ação:
      • SystemNotification::register( $user, $title, $message, $action, $label, $icon );
      • SystemNotification::register( 1, 'Confirmar pgto', 'Aperte no botão para confirmar a ação', 'class=SystemDocumentForm&method=onEdit', 'Editar algo', 'fa fa-pencil-square-o blue' );
    • Implementada uma tela de preferências, para configurações geras do sistema que possam ser alteradas em tempo de execução pelo administrador. Inicialmente terá configurações de e-mail;
    • Implementada uma tela de envio de e-mails para suporte, e dúvidas a respeito do sistema para seus administradores;
    • Criada uma opção "Recarregar permissões" no dropdown do usuário;
    • Agora é possível desativar usuários por meio de um botão na datagrid de usuarios;
    • O cadastro de programas foi melhorado. A nome da classe é agora baseado no sistema de arquivos, para evitar erros de digitação;
    • Foi feito um controle para evitar logins duplicados;
    • No Painel SQL, agora após a seleção do banco, são listadas as tabelas, para facilitar a montagem de queries. Quando seleciona a tabela, já monta o "SELECT * FROM {tabela} limit 100" (funciona somente com PostgreSQL, MySQL, e SQLite);
    • Elaborados novo scripts para instalação das bases do template (permission.sql, log.sql, e communication.sql), testados com PostgreSQL, Mysql e SQLite;
  • Novos controles
    • O Index verifica a versão mínima do PHP para rodar o PHP com version_compare();
    • Foram melhoradas as exceções quando passa uma classe não TRecord ou não encontrada em métodos que espera-se uma;
    • Melhorada a validação de e-mail. (thanks to Paulo Amaral);
    • TStandardForm e TStandardList agora lançam exceptions se não chamar a setActiveRecord() ou setDatabase();
    • Reforçada a segurança em requests de TDBSeekButton, para impedir um usuário, mesmo logado, de fazer requisições;
  • Correções de bug
    • Ao usar o setNumericMask() sobre um campo enviado sem conteúdo, ocorria um notice de number_format();
    • Ao usar Form com BootstrapFormWrapper o campo obrigatório não ficava vermelho;
    • Ao usar BootstrapDatagridWrapper não funcionava ColumnGroup, e não exibia e não funcionava o expande/contrai;
    • TText não desabilita no setEditable(FALSE);
    • SystemChangeLogTrait não dá mais notice quando o campo de primary key não se chama ID;
    • Corrigido alinhamento das options que abrem no TMultiSearch e TDBMultiSearch;
    • Spinner::setValue() agora mantém o valor após aplicar o setRange(), desde que o valor esteja no intervalo e é divisível pelo step;
    • Campos hidden na BootstrapFormWrapper não ficavam realmente escondidos;
    • Campos hidden no TQuickForm ocupavam espaço;
    • THtmlRenderer agora substituem valores NULL também, antes ficava {$var};
    • Campos TEntry com setNumericMask() não estava validando RequiredValidator;
    • TForm::clear() não estava limpando campo com NumericMask e replaceOnPost;
    • Faltava o AutocompleteService no engine.php, por isso dava permissão negada no autocomplete;
    • TButton::disableField() não funcionava em BootstrapFormWrapper, pois nele o botão fica fora do form;
    • Ao atribuir valores NULL para um atributo de TRecord que já tinha valor não voltava para NULL;
    • Não disparava changeaction da TCombo quando a mesma estava desabilitada e tinha valor trocado;
    • Não deixava digitar espaço em branco dentro de TExpander;

Adianti Framework 3.0.0 (2015-11-25)

"What's Going On" release.
  • Informações gerais

  • Novidades da 3.0.0

  • Novos componentes
    • Um novo componente foi criado: BootstrapFormWrapper. Ele permite transformar um formulário nativo do framework em um formulário Bootstrap. Verifique na aplicação tutor.
    • Um novo componente foi criado: BootstrapDatagridWrapper. Ele permite transformar uma datagrid nativa do framework em uma datagrid Bootstrap. Verifique na aplicação tutor.
    • Um novo componente foi criado: BootstrapNotebookWrapper. Ele permite transformar um notebook nativo do framework em um notebook Bootstrap. Verifique na aplicação tutor.
    • Um novo componente foi criado: TProgressBar. Ele permite criar uma barra de progresso (agradecimentos para Ademilson Nunes). Verifique na aplicação tutor.
    • Um novo componente foi criado: TPanelGroup. Ele permite criar um painel ao redor de formulários. Verifique na aplicação tutor.
    • Um novo componente foi criado: TMultiFile. Ele permite realizar Upload de vários arquivos ao mesmo tempo (agradecimentos para Nataniel Rabaioli).
    • Um novo componente foi criado: TAlert. Ele permite criar mensagens de alerta. Verifique na aplicação tutor.
  • Novos exemplos
    • Um novo exemplo demonstra o uso de query manual com prepare. Verifique na aplicação tutor.
    • Um novo exemplo demonstra a carga de objetos pelo método find(). Verifique na aplicação tutor.
    • Um novo exemplo demonstra a conversão de objetos para JSON. Verifique na aplicação tutor.
    • Um novo exemplo demonstra a utilização de Hook Methods. Verifique na aplicação tutor.
    • Um novo exemplo demonstra a carga simplificada de objetos. Verifique na aplicação tutor.
    • Um novo exemplo demonstra a carga paginada simplificada de objetos. Verifique na aplicação tutor.
    • Um novo exemplo demonstra o método countObjects(). Verifique na aplicação tutor.
    • Um novo exemplo demonstra a contagem simplificada de objetos. Verifique na aplicação tutor.
    • Um novo exemplo demonstra a exclusão simplificada de objetos. Verifique na aplicação tutor.
    • Um novo exemplo demonstra o novo método setLoggerFunction(). Verifique na aplicação tutor.
    • Um novo exemplo demonstra Notebooks Bootstrap. Verifique na aplicação tutor.
    • Um novo exemplo demonstra Notebooks com estilo customizado. Verifique na aplicação tutor.
    • Um novo exemplo demonstra alertas. Verifique na aplicação tutor.
    • Um novo exemplo demonstra formulário com abas. Verifique na aplicação tutor.
    • Um novo exemplo demonstra formulários Bootstrap. Verifique na aplicação tutor.
    • Um novo exemplo demonstra formulários Bootstrap em colunas. Verifique na aplicação tutor.
    • Um novo exemplo demonstra formulários Bootstrap inline. Verifique na aplicação tutor.
    • Um novo exemplo demonstra as novas máscaras de digitação. Verifique na aplicação tutor.
    • Um novo exemplo demonstra datagrids Bootstrap. Verifique na aplicação tutor.
    • Um novo exemplo demonstra datagrids com imagem. Verifique na aplicação tutor.
    • Um novo exemplo demonstra datagrids com barra de progresso. Verifique na aplicação tutor.
    • Um novo exemplo demonstra uma tela de registro passo a passo. Verifique na aplicação tutor.
    • Um novo exemplo demonstra um formulário abrindo uma janela. Verifique na aplicação tutor.
    • Um novo exemplo demonstra uma tela de consulta com ações de edição. Verifique na aplicação tutor.
    • Um novo exemplo demonstra uma tela de seleção de registros com clique na datagrid. Verifique na aplicação tutor.
    • Um novo exemplo demonstra uma tela de seleção de registros com checkbox. Verifique na aplicação tutor.
    • Um novo exemplo demonstra uma tela de exclusão de registros em lote. Verifique na aplicação tutor.
    • A lista de produtos foi melhorada para exibir a imagem do produto ao passar o mouse. Verifique na aplicação tutor.
    • O cadastro de produtos agora exibe a imagem ao terminar o upload. Verifique na aplicação tutor.
    • O catálogo de produtos agora possui paginação. Verifique na aplicação tutor.
  • Melhorias em classes/componentes
    • Implementado datatables para habilitar datagrids responsivas ($datagrid->datatable='true');
    • O clique no header da datagrid permite agora ordenar de maneira ascendente ou descendente; Verifique na aplicação tutor.
    • TDataGridAction::setButtonClass() permite exibir ações de datagrid como botões. Verifique na aplicação tutor.
    • O TPageNavigation agora usa as classes nativas Bootstrap. Verifique na aplicação tutor.
    • Agora são usados ícones da Font Awesome nos diálogos;
    • Melhorado o visual dos diálogos de busca de registros (TDBSeekButton). Verifique na aplicação tutor.
    • TMultifield agora utiliza ícones Font Awesome. Verifique na aplicação tutor.
    • Criado o método (TWindow::create('Title', 0.5, 0.5);); para criar janelas de qualquer ponto. Verifique na aplicação tutor.
    • O componente THtmlEditor foi totalmente reestruturado, agora usa a biblioteca summernote. Verifique na aplicação tutor.
    • O componente TFile agora permite definir outro backend para responder ao upload (Ex: $file->setService("MyUploaderClass"));
    • O componente TFile agora permite definir uma ação ao completar o upload (Ex: $file->setCompleteAction(TAction $action)); Verifique na aplicação tutor.
    • O componente TMultiSearch agora permite definir uma máscara de edibição (Ex: setMask("{name} ({id})")); Verifique na aplicação tutor.
    • O componente TMultiSearch agora permite definir outro backend para responder a busca (Ex: $multisearch->setService($service););
    • O componente TMultiSearch/TDBMultiSearch agora permite definir uma ação localizar um registro (Ex: $multisearch->setChangeAction(TAction $action););
    • O componente TSortList agora permite definir uma ação ao alterar um item (Ex: $sortlist->setChangeAction(TAction $action);); Verifique na aplicação tutor.
    • Os componentes TCheckGroup e TRadioGroup agora permitem definir de quantos em quantos itens quebrar (setBreakItems);
    • O método TEntry::setSize() agora permite definir o tamanho em percentual;
    • Implementado o método TCombo::getItems();
    • Se passar setSize(NULL,NULL) para o notebook, ele não fica com tamanho fixo;
    • O método TEntry::setMask() possui suporte à novas máscaras (Thanks WebSeller). Verifique na aplicação tutor.
  • Melhorias em persistência
    • TRecord só carrega para a memória atributos que obrigatoriamente estiverem no addAttribute();
    • Os métodos loadComposite()/hasMany() agora aceitam um parâmetro de ordem;
    • As classes Active Record agora podem ter métodos onBeforeLoad(), onAfterLoad(), onBeforeStore() onAfterStore(), onBeforeDelete(), e onAfterDelete() on que rodam antes e depois da carga/gravação/exclusão de objetos;
    • Implementado TRecord::countObjects();
    • Implementado TRecord::getIndexedArray(), que retorna os registros de uma tabela em um array indexado;
    • Implementado o método TRecord::find(). Ex: ($product = Product::find(2););
    • Implementado o método TRecord::all(). Ex: ($products = Product::all(););
    • Implementado o método TRecord::toJson(). Ex: (User::find(1)->toJson(););
    • Implementado o método TRecord::save() como um alias para TRecord::store();
    • Implementado atalho para o método load(). Ex: (Product::where('name', 'LIKE', '%computer%')->get(););
    • Implementado atalho para o método count(). Ex: ($count = User::where('age', '>', 18)->count(););
    • Implementado atalho para o método delete(). Ex: (User::where('age', '>', 100)->delete(););
    • Implementado atalho para order. Ex: (Product::where('name', 'LIKE', '%computer%')->orderBy('price', 'asc')->get();
    • Implementado atalho para paginação. Ex: (Product::where('name', 'LIKE', '%computer%')->take(3)->skip(3);
    • Implementado o método hasMany(), como atalho para o loadComposite(). Ex: (Customer::find(1)->hasMany('Contact', 'customer_id');
    • Implementado o método belongsTo(), como atalho para o loadAggregate(). Ex: (Customer::find(1)->belongsToMany('Skill', 'CustomerSkill', 'customer_id', 'skill_id');
  • Melhorias nos templates:
    • Implementado log global de SQL. Basta habilitar (slog = "SystemSqlLog") no INI do banco de dados (app/config). A classe indicada faz parte do Template/TemplateII, recebe todos os SQL gerados pelo framework e armazena em uma base de logs (app/config/log.ini);
    • Implementado o trait SystemChangeLogTrait, que permite registrar as mudanças em valores de colunas de uma tabela. Basta acrescentar em cada classe de modelo (use SystemChangeLogTrait;);
    • Os templates agora exibem o nome do usuário logado no menu de logout;
    • Os templates agora possuem um formulário para o usuário alterar os dados de perfil (SystemProfileView);
    • Os templates agora possuem um painel de consulta SQL (SystemSQLPanel);
    • Os templates agora possuem uma tela para consultar os acessos de usuários (SystemAccessLogList);
    • Os templates agora possuem uma tela de boas-vindas (WelcomeView) que explica ao admin como conceder permissões;
    • Os templates agora possuem um campo para busca de programas na barra superior (SearchBox);
    • Os templates agora possuem uma página com o PHPInfo (SystemPHPInfoView);
  • Melhorias globais
    • Arquivos JS e CSS agora JS/CSS são compilados em menos arquivos (Ex: bootstrap-plugins.min.js e jquery-plugins.min.js);
    • Atualizada Font Awesome para 4.4;
    • Atualizada a PHPMailer para 5.2.10;
    • Menus do template1 agora usam navbar;
    • O comportamento padrão para formulários (TStandardForm) foi tranformado em um trait (AdiantiStandardFormTrait). Isto permite usar formulário-padrão com classe-pai TPage ou TWindow;
    • O comportamento padrão para datagrids (TStandardList) foi tranformado em um trait (AdiantiStandardListTrait). Isto permite usar datagrid-padrão com classe-pai TPage ou TWindow;
    • O comportamento padrão para form/list (TStandardFormList) foi tranformado em um trait (AdiantiStandardFormListTrait). Isto permite usar formlist-padrão com classe-pai TPage ou TWindow;
    • Adicionado ícone animado para diálogo de carregando;
    • Implementado TStandardFormList::setCriteria(), assim como o TStandardList;
    • O método TForm::sendData($form_name, $object, $aggregate = FALSE, $fireEvents = true), agora aceita parâmetro opcional fireEvents, que permite desligar o acionamento de events (changeaction, exitaction) quando enviado dados à um formulário;
    • Caso o método aberto a partir de uma datagrid seja estático, não provocará recarga do núcleo da página;
    • Chamadas estáticas de métodos agora também disparam onAfterLoad() e onAfterPost().
  • Novos controles
    • Construtor da TField, classe base para campos de formulário, agora exige um parâmetro válido não-vazio;
  • Correções de bug
    • Eventos dinâmicos como ChangeAction/ExitAction agora enviam requisição por POST para não estourar URL;
    • Na navegação em datagrids, quando voltava para página 1 estava ignorando os registros iniciais;
    • TDBMultiSearch/TMultiSearch não estavam funcionando com TRequiredValidator
    • TMultifield::disableField() não estava funcionando apropriadamente;
    • setNumericMask() fazia com que campos com setEditable(FALSE) tornavam-se editáveis;
    • TRadioGroup não funcionava com TMultifield. Corrigido
    • Com dois TNotebook na mesma tela, no segundo o conteúdo da primeira aba não era exibido;
    • Corrigidos z-index do TDate e blockUI
    • Corrigida falha com prepared no PHP em Windows, pelo uso da uniqid();
    • Corrigidas falhas em vários componentes ao rodar no Windows 7 ou inferior que usavam uniqid(): TDate, TMultiSearch, TSortList, TSpinner, TSlider;
    • Parâmetro "porta" agora é levado em consideração em conexões com Sql Server. Estava fixo antes.

Adianti Framework 2.0.0 (2015-01-05)

"Like a rolling stone" release.
  • Informações gerais
    • Um novo Adianti Studio Pro está sendo lançado com novas funcionalidades. Verifique a página do Adianti Studio Pro;
    • Uma nova aplicação de exemplo, que demonstra um backend de um blog foi disponibilizada. Verifique a página do blog;
    • Uma nova versão da aplicação de exemplos Library, foi disponibilizada. Verifique a página do Library;
    • Uma nova versão da aplicação de exemplos Changeman, foi disponibilizada. Verifique a página do Changeman;
    • Com a versão 2.0.0, a renderização de conteúdos do framework (formulários, datagrids) ficou cerca de 30% à 50% mais rápida em relação à versão anterior;
    • Para quem possui aplicações desenvolvidas na versão 1.X podem seguir o tutorial de migração para atualizar para a 2.0.0;

  • Novidades da 2.0.0

  • Novos componentes
    • Um novo componente foi criado: TDropDown. Ele permite criar um menu drop down. Verifique na aplicação tutor.
    • Um novo componente foi criado: TInputDialog. Ele permite criar um diálogo rápido para entrada de valores. Verifique na aplicação tutor.
    • Um novo componente foi criado: TCalendar. Ele permite exibir calendários mensais. Verifique na aplicação tutor.
    • Um novo componente foi criado: TColor. Ele permite ao usuário selecionar uma cor. Verifique na aplicação tutor.
    • Um novo componente foi criado: TExpander. Ele permite criar uma área expansível dentro de formulários. Verifique na aplicação tutor.
    • Um novo componente foi criado: TMultiSearch. Ele permite buscar valores dinamicamente com a digitação. (Agradecimentos à Matheus Agnes Dias). Verifique na aplicação tutor.
    • Um novo componente foi criado: TDBMultiSearch. Estende o TMultiSearch, permitindo buscas em tabelas. Verifique na aplicação tutor.
    • Um novo componente foi criado: TDBEntry. Permite autocomplete a partir de tabelas do banco de dados. Verifique na aplicação tutor.
  • Novos exemplos
    • Um novo exemplo foi criado para demonstrar como obter informações da transação ativa. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar diálogos de input. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar novas classes CSS, e popover. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar expander em formulários. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar grupos de ações em datagrid. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar agrupamento por colunas em datagrid. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar detalhamento de linhas em datagrid. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como esconder ações em datagrid. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como usar popover em datagrids. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como usar diálogos de input em datagrids. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como usar o calendário. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como usar do dropdown. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como usar o bread crumb. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como exibir códigos-fontes. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como usar formulário em nova janela. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como criar um catálogo de produtos. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como criar uma agenda. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como criar um formulário de vendas. Verifique na aplicação tutor.
  • Melhorias globais
    • Reestruturação de localização e nomenclatura de classes. As mudanças não afetam as aplicações já escrita, basta seguir o migration;
      Ex: lib/adianti/util/TAdiantiLoader.class.php => lib/adianti/core/AdiantiCoreLoader.php;
      Ex: lib/adianti/widget/web/general/TCoreApplication.class.php => lib/adianti/core/AdiantiCoreApplication.php
    • Foi criado mecanismo de cache do caminho das classes para acelerar o autoload (AdiantiCoreLoader::loadClassMap());
    • É permitido ao usuário definir um caminho absoluto da classe, para acelerar a carga (AdiantiCoreLoader::setClassPath());
    • A documentação dos headers das classes (tag @package) foram atualizadas;
    • Utilização de Namespaces em todas as classes do framework;
    • Foram separadas as versões WEB e GTK do framework para uma melhor organização. O download é separado;
    • A Bootstrap foi atualizada para 3.2;
    • A JQuery foi atualizada para 2.1.1;
    • Foi integrada ao framework a font-awesome 4.2. Ex: FormButtonStyleView;
      Ex: $button->setImage('fa:font awesome class');
      Ex: $button->setImage('bs:glyph class');
    • Os Javascript e CSS do framework foram todos minificados;
    • Os Javascript e CSS do framework agora são pré-carregados no primeiro acesso (libraries.html), tornando a navegação mais fluída;
    • Várias chamadas Javascript foram removidas dos componentes, e substituídas por chamadas de funções Javascript pré-carregados pelo components.js ou components.min.js, como tcombo_enable_field(), para habilitar uma combo;
    • Caso o programador precise criar Javascript próprio, fazer em app/lib/include/application.js;
    • Caso o programador precise criar CSS próprio, fazer em app/templates/theme1/application.css;
    • Criado o init.php, com os comandos de inicialização do framework, usado em engine.php, index.php e outros;
    • Criado o cmd.php, que permite executar qualquer método do framework pela linha de comando:
      Ex: php5 /www/tutor-beta/cmd.php "class=CommandLineFacade&method=getCustomers"
    • Implementada a possibilidade de atribuir popover para qualquer componente (Ex: FormButtonStyleView);
    • Classes TWindow não registram mais a ação na URL;
    • Postagens não registram mais a ação na URL, somente no projeto tutor pelo evento (Adianti.onBeforePost);
    • Implementados novos eventos Javascript, que permitem aos usuários definir ações para:
      onBeforeLoad, onAfterLoad, onBeforePost; onAfterPost;
    • Várias melhorias foram realizadas no processamento do retorno de requisições Ajax, o que permite agora usar TMessage no onExitAction. Ex: FormInteractionsView:
    • engine.php do template melhorado por questões de segurança (AdiantiFileUploader só logado);
    • Acrescentado suporte à janelas sobre janelas. Ex: TWindow que abre a partir de outra TWindow;
    • Os últimos atributos public (id) em classes como TDate, TEntry foram removidos. Foi criado o método getId() e setId() para prover a funcionalidade;
    • Em conformidade com a PSR-3, a classe TTransaction agora implementa a interface LoggerAwareInterface. e as classes de log, filhas de TLogger's agora implementam LoggerInterface;
  • Melhorias em classes/componentes
    • Acrescentado suporte nativo à Prepared statements para todas operações do framework. Para habilitar, basta acrescentar prep = "1" no arquivo de configuração (.INI) à base de dados. Veja lista de métodos que suportam prepared statements: TRepository::load(), TRepository::delete(), TRepository::count(), TRecord::load(), TRecord::store(), e TRecord::delete();
    • Melhorado o mecanismo de cache de objetos em memória. A partir de agora, nas classes Active Record, no lugar de usar OBJECTCACHE = TRUE, deve ser usado CACHECONTROL = 'TAPCache', ou outra classe de cache que implemente AdiantiRegistryInterface;
    • Acrescentado exemplo de between no exemplo de critérios:
      new TFilter('age', 'BETWEEN', 16, 60);
    • Acrescentado um exemplo de uso do NOESC nos critérios:
      new TFilter('birthdate', '<=', "NOESC:date(now()) - '2 years'::interval");
    • Acrescentado um exemplo de subselect nos critérios:
      new TFilter('id', 'IN', '(SELECT customer_id FROM purchases)')
    • Implementado o método TTransaction::getDatabaseInfo(), que permite obter informações sobre a transação ativa;
    • Adicionado o segundo parâmetro em TRecord::getObjects($criteria = NULL, $loadAggregates = TRUE);
    • TDBSeekButton agora aceita criterio como parâmetro, que permite pré-filtrar os dados a serem buscados. Verifique na aplicação tutor;
    • A TImage foi alterada para suportar de maneira nativa no método setImage(), classes Glyphicons e Font Awesome. Verifique na aplicação tutor;
    • Implementado o método TButton::create(), que permite criar um botão e já definir sua ação e ícone. Ex:
      $save_button = TButton::create('save', array($this, 'onSave'), _t('Save'), 'ico_save.png');
    • Uma nova biblioteca de autocomplete está em uso no TEntry::setCompletion. Verifique na aplicação tutor;
    • Foi alterado a biblioteca usada em TDate de jquery-ui-datepicker para bootstrap-datepicker;
    • Foram criados parâmetros adicionais na TMenuBar e TMenu para possibilitar renderizar menus com outras classes CSS. Este recurso foi utilizado no template II;
    • Implementado o método TWindow::setModal(), que faz com que o fundo da janela esteja inacessível;
    • Implementados os métodos TVBox::pack() e THBox::pack(), que criam uma box, e já empacotam os argumentos do método;
    • Implementado o método addQuickFields(), que permite adicionar campos lado a lado em quick forms. Verifique na aplicação tutor;
    • Implementados os métodos TForm::getChild(), TCheckGroup::getLayout(), TRadioGroup::getLayout(), e TText::getSize(), que retornam as informações previamente definidas por seus método setters;
    • Implementada a possibilidade de usar proporções no método TWindow::setSize(0.8, 0.8), que aplica 80% de percentual;
    • Criar um log de SQL que joga os comandos do framework na tela: TLoggerSTD;
    • Implementada a possibilidade de criar um TInputDialog baseado em um TQuickForm já existente. Verifique na aplicação tutor;
    • TStandardList agora pode ter vários campos de filtro, por meio do método addFilterField();
    • Novos métodos criados na TElement, que é a classe básica para criação de outros componentes:
      TElement::get($position): Retorna o objeto que está em determinada posição dentro do TElement;
      TElement::insert($position, $child): Insere um objeto novo (child) em determinada posição;
      TElement::__toString(): Converte automaticamente o objeto em string;
    • Melhorado o Estilo CSS para datagrids alternativas: Verifique na aplicação tutor;
    • Agora podem ser usados ícones da font-awesome e glyphicons em datagrids. Verifique na aplicação tutor;

    • Bootstrap: $action->setImage('bs:search blue');
      Font Awesome: $action->setImage('fa:external-link');
    • Implementado o método TDataGrid::setGroupColumn(), que permite criar uma coluna de agrupamento em datagrid. Verifique na aplicação tutor;
    • Implementado o método TDataGridAction::setDisplayCondition(), que permite esconder uma ação em datagrid mediante uma certa condição. Verifique na aplicação tutor;
    • Implementado o método TDatagrid::enablePopover(), que permite habilitar um popover para uma linha de datagrid. Verifique na aplicação tutor;
    • Novos métodos criados para datagrids:
      TDatagrid::getRowIndex($attribute, $value):Retorna a posição de uma linha, baseado em um atributo do objeto;
      TDatagrid::getRow($position): Retorna o objeto linha (TTableRow), baseado na sua posição;
      TDatagrid::insert($position, $content): Insere um conteúdo, baseado na sua posição na datagrid;
    • Implementado o método TTreeView::expandTo(), que permite expandir a tree view até um certo nível;
    • Melhorada a classe TMessage, para executar a ação definida para o botão, mesmo se o usuário clicar fora do diálogo;
    • Implementada a possibilidade de usar cabeçalhos e rodapés com a classe TTableWriterPdf;
      $fpdf = $writer->getNativeWriter();: Retorna instância da FPDF;
      $tr->getNativeWriter()->setHeaderCallback( array($this, 'header') );: define o método para escrever cabeçalho;
    • Implementado o método TQuickForm::addRow(), que permite adicionar uma linha TTableRow em um quick form;
    • Quando utilizado THidden em QuickForm, não cria rótulo (TLabel) na linha;
    • Permitir TLabel trocar a classe CSS ->{'class'} = 'xyz';
    • Desligado por padrão a tradução em THtmlRenderer. Caso necessário, utilizar o método THtmlRenderer::enableTranslation() para habilitar, pois a tradução quando desligada, melhora o desempenho;
    • Implementado o método TDBMultiSearch::setOperator(), para definir o operador de buscas desse componente;
    • Implementado __adianti_message(), __adianti_question() em Javascript;
    • Melhorado o exemplo DecoratedForms;
    • Implementados TVBox::addColSet() e THBox::addRowSet();
    • Implementado TCombo::setDefaultOption();
    • Demonstrada a possibilidade de manter uma combo hierárquica preenchida mesmo após postagem: FormInteractionsView;
    • Criada a classe TScript, para permitir criar códigos Javascript em tempo de execução pelo método create():
      Ex: TScript::create( ' $(\'[widget="TWindow"]\').remove() ' );
  • Novos controles
    • Se a action da datagrid não tiver campo definido pelo setField(), uma a exceção é lançada quando adicionada a action:
      You must define the field for the action (^1)
    • Na classe TDatagrid, quando o campo passado para o setField() não existir, exibir uma exceção:
      Field ^1 not exists
    • Melhorar TPageNavigation. Adicionadas os seguintes controles: Se não chamou setAction(), lançar exceção no show(); Se não chamou setCount(), setLimit(), etc, exibir uma page navigation vazia;
    • TForm::getData() emite exceção se a classe passada como parâmetro não é encontrada:
      Class ^1 not found in ^2
    • Caso a classe de controle não seja encontrada na execução da página, exibir exeção mais completa:
      Class (control) not found. Check the filename or the classname;
    • Na THtmlRenderer, lançar exceção quando o programador esquecer de declarar o final da seção;
      The section (^1) was not closed properly
    • Na TUIBuilder, se não preenchia todos os campos (database, model, key, value) dos TDB's, não funcionava. Lançar exceção:
      The parameter (database) of ^2 is required
    • Sempre deve ser usado try/catch ao redor de THtmlRenderer. Ex: TemplateViewAdvancedView;
  • Correções de bug
    • TCPFValidator estava passando mesmo quando strlen(cpf) >11. Bug corrigido;
    • Melhorias na TUIBuilder. Quando o botão não tinha ação definida ou quando a datagrid tinha uma ação inexistente, a tela não era exibida. Agora, uma exceção é exibida;
    • Quando um TFrame não tinha conteúdo, uma Warning era exibida. Bug corrigido;
    • Quando no Designer havia um botão sem ação definida, o botão não era exibido. Bug corrigido;
    • Corrigida a implementação do método setEditable() para TRadioGroup, TCheckGroup, TCombo, TSelect e derivados (TDB*);
    • Corrigido bug na TRecord que acontecia quando usava SERIAL e mesmo assim passava o ID, ocorria erro "Object not in prerequisite state". Bug corrigido;
    • Corrigido bug na TUIBuilder. Quando o tamanho declarado do form era menor que o real, não ocupava o devido espaço;

Adianti Framework 1.0.3 (2014-05-01)

"Simply the best" release. Em homenagem a Ayrton Senna.
  • Informações gerais
    • Um novo Adianti Studio Pro está sendo lançado com novas funcionalidades. Verifique a página do Adianti Studio Pro;
    • Agora o Adianti Studio Pro acompanha uma nova ferramenta para desenhos de relatórios PDF. Verifique a página do Adianti Studio Pro;
    • Uma nova aplicação tutor com novos exemplos está disponível. Verifique a página do Tutor;
    • Foi disponibilizada uma nova aplicação exemplo que trata de controle de permissões de acesso por usuários e grupos. Confira o Template ERP;

  • Novidades da 1.0.3

  • Novos componentes
    • Implementado o novo componente TSortList, que permite definir ordenação de valores. Verifique na aplicação tutor (Presentation -> Forms -> Sort List). Link direto;
    • Implementado o novo componente TSelect, que funciona como um seletor de valores múltiplos. Também foi criado o método TSelect::disableMultiple(), que desliga a seleção múltipla. Verifique na aplicação tutor (Presentation -> Forms -> Static selections). Link direto;
    • Implementado o novo componente TDBSelect, que funciona sobre o componente TSelect, permitindo exibir valores diretamente de uma tabela. Verifique na aplicação tutor (Presentation -> Forms -> Automatic database selections). Link direto;
    • Implementado o novo componente TDBSeekButton, que funciona criando um componente TSeekButton automático de maneira mais simplificada que na versão anterior. Verifique na aplicação tutor (Presentation -> Forms -> Seek button). Link direto;
    • Implementado o componente TBreadCrumb, que permite criar um caminho de migalhas de pão. Verifique na aplicação tutor (Presentation -> Page Transitions -> Static Multi Step Form II). Link direto;
    • Implementado o componente TXMLBreadCrumb, que permite criar um caminho de migalhas de pão baseado na localização da classe atual, dentro do menu.xml. Todos exemplos da aplicação tutor, agora usam esse componente;
    • Implementado o novo container TVBox, que simplifica a tarefa de organizar elementos verticalmente, sem a criação de tabelas. Verifique na aplicação tutor (Presentation -> Containers -> Vertical Box). Link direto;
    • Implementado o novo container THBox, que simplifica a tarefa de organizar elementos horizontalmente, sem a criação de tabelas. Verifique na aplicação tutor (Presentation -> Containers -> Horizontal Box). Link direto;
  • Novos exemplos
    • Um novo exemplo foi criado para demonstrar como realizar conexões com o banco sem arquivos de configuração. Verifique na aplicação tutor (Persistence -> Setup -> Manual connection). Link direto;
    • Um novo exemplo foi criado para demonstrar a busca do primeiro e último IDs de objetos de uma classe (TRecord::getFirstID() e TRecord::getLastID()). Verifique na aplicação tutor (Persistence -> Objects -> First and Last ID). Link direto;
    • Um novo exemplo foi criado para demonstrar como transformar um Active Record em array e vice-versa (TRecord::toArray() e fromArray()). Verifique na aplicação tutor (Persistence -> Objects -> Array conversion). Link direto;
    • Um novo exemplo foi criado para demonstrar como carregar objetos de uma classe pelo novo método TRecord::getObjects(). Verifique na aplicação tutor (Persistence -> Colections -> Collection get objects). Link direto;
    • Um novo exemplo foi criado para demonstrar a utilização dos novos métodos de persistência para composições loadComposite(), saveComposite(), e deleteComposite(). Verifique na aplicação tutor (Persistence -> Relationships -> Object Simple Composition). Link direto;
    • Um novo exemplo foi criado para demonstrar a utilização dos novos métodos de persistência para agregações loadAggregate(), e saveAggregate(). Verifique na aplicação tutor (Persistence -> Relationships -> Object Simple Aggregation). Link direto;
    • Um novo exemplo foi criado para demonstrar a utilização de caixas horizontais. Verifique na aplicação tutor (Presentation -> Containers -> Horizontal Box). Link direto;
    • Um novo exemplo foi criado para demonstrar a utilização de caixas verticais. Verifique na aplicação tutor (Presentation -> Containers -> Vertical Box). Link direto;
    • Um novo exemplo foi criado para demonstrar a criação de tabelas com múltiplas colunas. Verifique na aplicação tutor (Presentation -> Containers -> Table Columns). Link direto;
    • Um novo exemplo foi criado para demonstrar a criação de tabelas com células mescladas. Verifique na aplicação tutor (Presentation -> Containers -> Table Multi Cell). Link direto;
    • Um novo exemplo foi criado para demonstrar como habilitar/desabilitar e limpar campos de um formulário em tempo de execução (sem recarga). Verifique na aplicação tutor (Presentation -> Forms -> Enable/disable interactions). Link direto;
    • Um novo exemplo foi criado para demonstrar a habilitação do botão de envio do formulário somente mediante uma condição. Verifique na aplicação tutor (Presentation -> Forms -> Conditional submission). Link direto;
    • Um novo exemplo foi criado para demonstrar a criação de datagrids com estilos CSS personalizados. Verifique na aplicação tutor (Presentation -> Extras -> Stylized Datagrids). Link direto;
    • Um novo exemplo foi criado para demonstrar como criar campos de entrada de dados em datagrids. Verifique na aplicação tutor (Presentation -> Datagrid -> Datagrid with input fields). Link direto;
    • Um novo exemplo foi criado para demonstrar o novo componente TSortList, que permite definir a ordenação de valores. Verifique na aplicação tutor (Presentation -> Forms -> Sort List). Link direto;
    • Um novo exemplo foi criado para demonstrar a formatação de uma coluna em datagrid baseada em outra coluna. Verifique na aplicação tutor (Presentation -> Datagrid -> Datagrid transformers II). Link direto;
    • Um novo exemplo foi criado para demonstrar um formulário passo a passo estático com abas. Verifique na aplicação tutor (Presentation -> Page transitions -> Static Multi Step Form). Link direto;
    • Um novo exemplo foi criado para demonstrar um formulário passo a passo estático sem abas. Verifique na aplicação tutor (Presentation -> Page transitions -> Static Multi Step Form II). Link direto;
    • Um novo exemplo foi criado para demonstrar um formulário passo a passo construído dinamicamente. Verifique na aplicação tutor (Presentation -> Page transitions -> Dynamic Multi Step Form). Link direto;
    • Um novo exemplo foi criado para demonstrar uma tela passo a passo com postagem entre diferentes formulários. Verifique na aplicação tutor (Presentation -> Page transitions -> Multi Step Multi Form). Link direto;
    • Um novo exemplo foi criado para demonstrar a criação de documentos PDF criados pela nova ferramenta Studio PDF Designer. Este exemplo contém formas (retângulos, elipses), e substituição de textos; Verifique na aplicação tutor (Presentation -> Reports -> Designed PDF shapes). Link direto;
    • Um novo exemplo foi criado para demonstrar a criação de documentos PDF criados pela nova ferramenta Studio PDF Designer. Este exemplo demonstra a criação de um relatório tabular; Verifique na aplicação tutor (Presentation -> Reports -> Designed PDF report). Link direto;
    • Um novo exemplo foi criado para demonstrar a criação de documentos PDF criados pela nova ferramenta Studio PDF Designer. Este exemplo demonstra a criação de uma Nota Fiscal Eletrônica; Verifique na aplicação tutor (Presentation -> Reports -> Designed PDF NFE). Link direto;
    • Um novo exemplo foi criado para demonstrar como realizar edição em datagrid com paginação. Verifique na aplicação tutor (Organization -> Complex Views -> Product massive update). Link direto;
    • Um novo exemplo foi criado para demonstrar a filtragem dinâmica de conteúdo em um formulário. Verifique na aplicação tutor (Organization -> Complex Views -> Dynamic filtering). Link direto;
    • Um novo exemplo foi criado para demonstrar a criação de uma tela de Ponto de Vendas (PDV). Verifique na aplicação tutor (Organization -> Complex Views -> POS form). Link direto;
    • Um novo exemplo foi criado para demonstrar a utilização de fragmentos HTML para exibir as vendas para um cliente. Verifique na aplicação tutor (Organization -> Complex Views -> Customer Status). Link direto;
    • O exemplo de checkout com datagrid foi melhorado para colocar um totalizador. Verifique na aplicação tutor (Organization -> Complex Views -> Checkout form). Link direto;
    • O exemplo Master/Detail que antes era em abas, foi reestruturado para ficar em páginas separadas. Verifique na aplicação tutor (Organization -> Complex Views -> Separated master/detail). Link direto;
  • Melhorias
    • Dialogs de erro e informação foram alterados para usar Bootstrap;
    • Melhorias foram realizadas no visual (CSS) dos componentes TDataGrid, TMultiField, TDate e TSeekButton;
    • Melhorias foram realizadas na aparência dos formulários, por meio da criação de novos estilos (tform, tformtitle, e tformaction), e da atribuição inline destes estilos aos elementos de um formulário. Verifique na aplicação tutor (Organization -> Standard Controls -> Standard form). Link direto;
      Ex: $this->form->class = 'tform'; // CSS style
    • Mensagens de erro Javascript passam a suar dialog jQuery e não alert();
    • Foi criado o método TCoreApplication::registerPage(), que permite registrar uma página na URL. Este método será usado para URL's amigáveis;
    • Foi criado o método TElement::clearChildren(), que permite remover o conteúdo de um container;
    • A partir de agora, quando cria-se ações em datagrid sem imagem (ícone), estas passam a assumir o formato de um botão por padrão. Verifique na aplicação tutor (Organization -> Complex views -> Separated master/detail). Link direto;
    • O componente TFile foi totalmente reescrito para usar controles HTML5 (Créditos: Nataniel Rabaioli);
    • Foi acrescentado na classe TUIBuilder o suporte aos componentes TSelect e TDBSelect;
    • Implementados os métodos TForm::delField() e TForm::delFields(), que permitem remover um (ou todos) campo da manipulação de um formulário;
    • TForm agora pode receber atributos dinamicamente na Web.
      Ex: $this->form->class = 'my-css-form-class';
    • TButton agora pode receber atributos dinamicamente na Web.
      Ex: $button->class = 'btn-success';
    • O método TForm::sendData(), agora permite alterar o conteúdo de campos de seleção (TCombo);
    • Agora é possível apontar propriedades no formato "city->name" em colunas de datagrids. O framework percorre os atributos de objetos relacionados ao Active Record. Verifique na aplicação tutor (Organization -> Complex View -> Complete customers datagrid). Link direto;
    • Agora é possível obrigar o usuário a preencher um campo em uma multifield antes de poder adicioná-lo. Isto é possível pelo 5o parâmetro de TMultiField::addField(). Verifique na aplicação tutor (Presentation -> Forms -> Multi field). Link direto;
    • Foi criado o método TMultiField::setOrientation(), que permite definir a disposição dos campos (horizontal, vertical). Verifique na aplicação tutor (Presentation -> Forms -> Multi field). Link direto;
    • Implementando TNotebook::getCurrentPage(), que permite retornar a página corrente do TNotebook;
    • Agora, a ação definida pelo TSeekButton::setExitAction(), também é executada no evento onSelect da janela de buscas de registros. Verifique na aplicação tutor (Organization -> Complex Views -> POS form). Link direto;
    • O método TQuickForm::addQuickField() agora aceita um novo parâmetro adicional (Validador);
    • Implementados os métodos TStandardFormList::setDefaultOrder() e TStandardList::setDefaultOrder(), que permitem definir uma ordenação padrão para as listagens;
    • Implementado o métodos TStandardList::setCriteria(), que permite definir um filtro, mesmo em listagens padrão;
    • As Seeks padrão (TStandardSeek) passam a ter uma ordem default pela chave primária do registro buscado;
    • Implementados na classe TRecord, os métodos loadComposite(), deleteComposite(), saveComposite(), loadAggregate(), e saveAggregate(), que permitem lidar com relacionamentos de composição e agregação, de maneira simplificada;
    • O Between foi implementado nos filtros: new TFilter('campo' , 'BETWEEN', 1, 2);
    • Criado segundo parâmetro booleano na TRecord::__construct() e na TRepository::load(), para indicar se quer chamar o método load() sobrecarregado do Active Record deve ser chamado durante a carga (carregando objetos agregados). Isto pode ser usado para carregar informações de objetos associados sem carregar seus agregados:
      Ex: TRecord: public function __construct($id = NULL, $callObjectLoad = TRUE)
    • Melhorias foram feitas na performance das controladoras padrão (TStandardFormList, TStandardList, TStandardSeek) para não carregar objetos agregados na listagem:
      Ex: $objects = $repository->load($criteria, FALSE);
    • Melhorias de performance foram feitas nos componentes TDBCombo, TDBSortList, TDBRadioGroup, TDBSelect, TDBCheckGroup, para não carregar objetos agregados:
      Ex: $objects = $repository->load($criteria, FALSE);
    • Implementado TRadioGroup::setChangeAction() e TCheckGroup::setChangeAction(), que permitem definir uma ação quando o usuário troca o valor de uma radio ou check. Verifique na aplicação tutor (Presentation -> Forms -> Enable/disable interactions). Link direto;
    • Implementados os métodos enableField(), disableField() e clearField(), que permitem habilitar, desabilitar ou limpar um campo de maneira dinâmica (em tempo de execução) nas classes: TCombo, TDate, TEntry, TDBCombo, TRadioGroup, TDBRadioGroup, TCheckGroup, TDBCheckGroup, TText, TFile, TPassword, TSeekButton, THtmlEditor, TSpinner, TSlider, TComboCombined, TSortList e TSelect. Verifique na aplicação tutor (Presentation -> Forms -> Enable/disable interactions). Link direto;
    • Implementado o método TNotebook::setTabAction(), que permite definir uma ação para quando o usuário clicar sobre a aba de um TNotebook;
    • As validações de um formulário agora são processadas todas de uma só vez. O processamento acumula as exceções de formulário;
    • Agora é possível substituir variáveis com conteúdo vazio na THtmlRenderer;
    • Foi criado o método TNotebook::setTabsVisibility() para permitir esconder as abas de um notebook;
    • O método TDataGridColumn::setTransformer() agora também recebe o objeto Active Record inteiro, o que permite fazer formatação de um campo baseado em outro campo. Verifique na aplicação tutor (Presentation -> Datagrid -> Datagrid transformers II). Link direto;
    • Implementado o método TWindow::setPosition(), que permite definir um posicionamento absoluto para janelas TWindow;
    • Implementado o método TTable::addRowSet( $obj1, $obj2), que permite adicionar uma linha com várias células de uma só vez em uma tabela. Verifique na aplicação tutor (Presentation -> Containers -> Table Columns). Link direto;
    • Implementado o método TTableRow::addMultiCell($obj1, $obj2, $obj3), que permite adicionar uma célula mesclada com vários conteúdos em uma linha de tabela. Verifique na aplicação tutor (Presentation -> Containers -> Table Multi Cell). Link direto;
    • O exemplo sobre o componente TFrame foi melhorado para demonstrar a criação de um botão para exibir/esconder um frame. Verifique na aplicação tutor (Presentation -> Containers -> Frame). Link direto;
    • Melhorada a navegação entre classes. Agora, postagens também alteram o estado da URL (pushState). Anteriormente, somente requisições por GET atualizavam o endereço da URL (pushState);
    • Criado método para habilitar/desabilitar TButton at runtime: enableField(), disableField();
    • O método TStandardFormList::onEdit() passa a recarregar a datagrid (onReload) mantendo-se na página corrente;
    • Agora é possível passar um filtro (TCriteria) para a TDBCombo, no 7o parâmetro de seu construtor;
    • Agora é possível abrir transações passando somente as informações do banco em forma de array, sem config (INI): TTransaction::open(NULL, $data);
    • Foi implementada a possibilidade de construir uma expressão sem escape em filters, o que permite construir um filtro comparando duas colunas. Ex: $criteria->add(new TFilter('codigo', '<>', 'NOESC:ultimo_utilizado'));
    • Foi implementada a possibilidade de alterar os atributos de campos em geral (TEntry, TPassword, TText) por meio da atribuição direta de propriedades. Ex: $entry->onblur = '...'; Isto já era possível com outros elementos como TTable, TTableRow, etc;
    • Datagrids (TDataGrid) e botões (TButton) foram alterados para vasculhar pelos ícones informados pelo usuário, primeiro na pasta app/images, depois na pasta padrão do framework;
    • Foi disponibilizada uma callback Javascript chamada Adianti.onLoadClass para programar eventos JS sempre que uma nova classe for carregada por GET ou POST pelo framework. Essa callback pode ser melhor compreendida observando o arquivo app/templates/theme1/layout.html do tutor;
  • Novos controles
    • Ações (TAction) definidas em métodos como setChangeAction() e setExitAction() agora precisam necessariamente ser declaradas como static, caso contrário uma exceção será lançada;
    • Em todas classes com setActiveRecord(), agora é verificado se a classe passada como parâmetro é realmente uma filha de TRecord, caso contrário, uma exceção é lançada;
    • O Construtor de TRepository() deve receber uma classe existente e filha de TRecord. Caso contrário, uma exceção será lançada.
    • Um Active Record não pode ter atributo chamado data, pois é um atributo reservado. Sempre que alguém tentar definir um atributo com esse nome, será lançada uma exceção;
    • Objetos com os métodos setExitAction() ou setChangeAction() agora obrigatoriamente verificam se foram passados pelo TForm::setFields(). Caso contrário uma exceção (You must pass the field () as a parameter to TForm::setFields()') será lançada. Isto se deve por que nestas ações, é obrigatório que o campo faça parte de um formulário, tendo em vista que ele envia todos os dados do formulário como parâmetro para a ação;
    • O método TTransaction::setLogger() passa a emitir exceção quando não tiver transação ativa;
  • Correções de bug
    • O fechamento de transação nos TStandardSeek foi passado para depois do retorno dos campos. Assim, agora é possível retornar para o formulário-pai, um atributo dependente;
    • Foram Corrigidos bugs na TMultifield relativos à largura de colunas e atualização de valores quando utilizada com o componente TComboCombined;
    • Corrigido bug na TMultifield relacionado à postagem de caracteres acentuados;
    • Foi corrigida a TRequiredValidator para validar também Radios/Checks vazios;
    • Corrigido bug com estilos em TLabel, que por vezes não eram atualizados na página.
    • Acentos no menu.xml não estavam funcionando no Windows, causando exceção
    • A TRequiredValidator estava falhando ao validar valores com espaços em branco;
    • Corrigidos bugs na abertura de arquivos com a TPage::openFile() no Windows (Ex: Relatórios PDF);
    • THtmlEditor não estava abrindo dentro de TWindow;


Adianti Framework 1.0.2 (2013-10-15)

"Eight days a week" release

Novidades da 1.0.2

  • Informações gerais
  • Novos componentes
    • Um novo componente foi criado para permitir a exibição de árvores (TTreeView). Verifique na aplicação tutor (Presentation -> Forms -> Tree View);
  • Novos exemplos
    • Um novo exemplo foi elaborado, mostrando como construir formulários do tipo Master/Detail. Este formulário permite cadastrar um projeto e vários itens de um Product Backlog dentro do projeto. Verifique na aplicação tutor (Organization -> Complex Views -> Separated master/detail forms);
    • Um novo exemplo foi elaborado, mostrando como construir telas de checkout. Esta tela permite ao usuário selecionar itens de uma datagrid e passar para outra datagrid, usando somente a informação da sessão. Verifique na aplicação tutor (Organization -> Complex Views -> Checkout form);
    • Um novo exemplo foi elaborado, para demonstrar a utilização de templates HTML e estilos CSS para decorar objetos do framework, neste caso um formulário. Verifique na aplicação tutor (Presentation -> Extras -> Decorated forms);
    • Um novo exemplo foi elaborado, para demonstrar a utilização do componente de edição de HTML (THtmlEditor). Verifique na aplicação tutor (Presentation -> Forms -> HTML Editor);
    • Um novo exemplo foi elaborado, demonstrando como utilizar uma separação MVC total no framework, sem a criação do visual da aplicação (View) no método construtor das classes controladoras. Verifique na aplicação tutor (Presentation -> Forms -> Reusable Forms);
  • Melhorias
    • Foram aumentados os tamanhos dos diálogos de mensagem e questionamento;
    • Agora é permitido criar datagrids com rolagem e header fixo. Para tal, é necessário executar os métodos: TDataGrid::makeScrollable(), para habilitar a rolagem, e também TDataGrid::setSize(), para definir seu tamanho. Verifique na aplicação tutor (Presentation -> Datagrid -> Scrollable Datagrids);
    • O componente TSeekButton agora também aceita definir uma ação de saída de campo (setExitAction()), além de sua ação padrão de buscas (setAction()), que além de ser executada na saída do campo, também é via botão (select);
    • Foi acrescentado ao componente TEntry, a possibilidade de definir uma máscara para digitação de valores numéricos, por meio do método TEntry::setNumericMask($decimals, $decimalsSeparator, $thousandSeparator); Verifique na aplicação tutor (Presentation -> Extras -> Decorated Forms);
    • Foi acrescentada à classe TMessage, a possibilidade de acrescentar uma ação ao botão de fechamento do diálogo. Agradecimentos à contribuição de Victor Feitoza. Para tal, foi acrescentado um terceiro parâmetro ao construtor. __construct($type, $message, TAction $action = NULL). Verifique na aplicação tutor (Presentation -> Dialogs -> Error Dialog);
    • A biblioteca sack (usada em lookups) foi removida e substituída por chamadas nativas jQuery. Ela também foi removida dos templates (libraries.html);
    • Foram realizadas melhorias na API de manipulação de objetos (coleções em base de dados);
      • Foi criada uma forma simplificada de contagem de objetos que atendem um determinado critério, utilizando fluent interface. Verifique na aplicação tutor (Persistence -> Collections -> Collection simple count);
      • Foi criada uma forma simplificada de carregamento de objetos que atendem um determinado critério, utilizando fluent interface. Verifique na aplicação tutor (Persistence -> Collections -> Collection simple load);
      • Foi criada uma forma simplificada de exclusão de objetos que atendem um determinado critério, utilizando fluent interface. Verifique na aplicação tutor (Persistence -> Collections -> Collection simple delete);
    • O engine.php (motor de execução para a Web) foi simplificado em tamanho. Muitas partes deste arquivo (responsáveis por decidir a classe e o método a serem executados) foram passados para a classe TCoreApplication, do núcleo do framework. Apesar do arquivo ter ficado menor, o desenvolvedor pode perfeitamente acrescentar regras de valiação, dentro da chamada do método run(), por onde passam todas requisições Web;
    • Foi melhorada a forma de exibição de exceções que não são tratadas pelo desenvolvedor dentro das classes controladoras. Estas exceções são tratadas dentro do método run() da classe TCoreApplication, o que é realizado no engine.php. Por padrão, o framework passará a exibir uma informação mais completa (trace) sobre a exceção, para facilitar a localização dos erros. Ao final do arquivo engine.php, existe a chamada TApplication::run(TRUE). No parâmetro boolean (TRUE), identificamos se as exceções devem ser exibidas da forma completa com trace (TRUE) ou não (FALSE).
    • Dentro das classes de controle, as exceções são controladas totalmente pelo desenvolvedor, que utiliza-se normalmente da classe TMessage para exibir as mensagens de erro. Para facilitar a localização de problemas, foi criada uma classe de Debug de exceções. Assim, no lugar de utilizar simplesmente a classe TMessage, o desenvolvedor pode utilizar a chamada: new TExceptionView($e); onde $e é o objeto de exceção. O framework providenciará um debug completo da exceção lançada.
    • A constante APPLICATION_NAME, que é utilizada para separar o conteúdo de variáveis de sessão conforme o nome da aplicação, passou a ter seu conteúdo alimentado a partir do arquivo de configuração da aplicação (application.ini). Como antes ela estava definida de maneira fixa no engine.php e index.web.php, muitos desenvolvedores alteravam seu conteúdo em apenas um lugar, causando confusões;
    • Ações em datagrid agora são executadas mantendo os parâmetros de paginação. Assim, ao excluir um registro de uma datagrid, o usuário permanecerá na mesma página. Para que essa estratégia funcione, algumas mudanças devem ser realizadas:
      • Caso você ainda tenha um engine.php da versão anterior, deverá passar os parâmetros da URL ($_GET) ao executar o método show() da página $page->show( $_GET ). Na nova versão do engine.php (que utiliza a classe TCoreApplication, isso já está habilitado por default;
      • Sempre que o desenvolvedor reescrever o método show() em alguma página em que faz uma chamada ao método onReload(), deverá passar um novo parâmetro: $this->onReload( func_get_arg(0) );
      • Os metodos delete() que fazem chamada ao método onReload() devem acrescentar um novo parâmetro na chamada ($param), que representa os parâmetros da URL, da seguinte forma: $this->onReload( $param );
    • Foram criadas novas classes CSS: tdatagrid_head e tdatagrid_body, para quem desejar manipular o visual das datagrids;
    • A classe TAdiantiLoader, responsável pelo carregamento das classes, foi alterada para também efetuar carregamento de classes localizadas no diretório app/view;
  • Novos controles
    • Catchable Fatal Errors (Ex: Type hinting) agora são tratados como exceções com melhor debug (set_error_handler);
    • Algumas validações foram acrescentadas:
      • Caso o desenvolvedor passe NULL para o método TTableRow::addCell(), uma exceção será lançada;
      • O método TForm::setFields() somente aceitará um parâmetro do tipo vetor. Caso contrário, uma exceção será lançada;
      • O método TQuickForm::addQuickAction() foi modificado para aceitar somente um parâmetro do tipo TAction. Caso contrário, uma exceção será lançada;
      • No momento de instanciarmos um objeto do tipo TAction, é verificado se o parâmetro é uma callback válida do PHP. Caso contrário, uma exceção será lançada;
      • O método addCell() das classes TTableWriter*, agora verifica se o estilo identificado como parâmetro foi previamente criado. Caso contrário, uma exceção será lançada;
      • Não é permitido adicionar um item na datagrid sem executar o createModel() antes. Caso isso for realizado, uma exceção será lançada;
      • Não é permitido criar uma ação ou coluna em datagrid após o método createModel() ser executado. Caso isso for realizado, uma exceção será lançada;
      • Não é permitido adicionar 2 campos com o mesmo nome no form pelo TForm::addField(). Caso isso for realizado, uma exceção será lançada;
      • Todos os widgets agora implementam a interface IAdiantiWidget, o que permite uma maior consistência em formulários;
      • O método TForm::setFields() foi alterado para somente aceitar widgets (IWidget) em cada uma das posições do vetor passado como parâmetro;
  • Correções de bug
    • Conexões Myql, que antes estavam iniciando com encoding ISO, passaram para UTF8 por default. Caso seja necessário utilizar Mysql com encoding ISO, será necessário acrescentar "char = ISO" ao arquivo de configuração do acesso à base de dados;
    • Ao utilizar a estratégia de incremento de ID's (IDPOLICY) do tipo "serial" com PostgreSQL, o ID do objeto não estava sendo gravado após a chamada do método store(). Este bug foi corrigido;
    • O componente TMultiField apresentava um bug de scrolling com muitos itens. Este bug foi corrigido;


Adianti Framework 1.0.1 (2013-06-25)

"Do You Want to Know a Secret" release

Novidades da 1.0.1

  • A camada de persistência agora suporta o Banco de dados MS Sql Server;
  • A camada de persistência agora suporta o Banco de dados Oracle;
  • Um novo Adianti Studio Pro está sendo lançado com novas funcionalidades. Verifique a página do Adianti Studio Pro;
  • Uma nova aplicação tutor com novos exemplos está disponível. Verifique a página do Tutor;
  • Uma nova funcionalidade está disponível em formulários, permitindo lidar com interações em formulários de maneira dinamica. Verifique na aplicação tutor (Presentation -> Forms -> Dynamic interactions);
  • Um novo grupo de bibliotecas para geração de gráficos está disponível. Verifique na aplicação tutor (Presentation -> Charts/Reports -> Line/Bar/Pie chart);
  • Um novo exemplo de datagrid com filtragem no topo e exportação para CSV está disponível. Verifique na aplicação tutor (Organization -> Complex Views -> Complete customers datagrid);
  • Agora é possível utilizar edição inline nas datagrids. Um exemplo de como utilizar este recurso foi preparado. Verifique na aplicação tutor (Organization -> Complex Views -> Inline editing datagrid);
  • Um novo componente (TSpinner) está disponível. Verifique na aplicação tutor (Presentation -> Forms -> Custom Forms);
  • Um novo componente (TSlider) está disponível. Verifique na aplicação tutor (Presentation -> Forms -> Custom Forms);
  • Uma nova funcionalidade de tooltip/dica de preenchimento ($widget->setTip()) está disponível. Verifique na aplicação tutor (Presentation -> Forms -> Custom Forms);
  • Um novo validador (TNumericValidator) está disponível. Verifique na aplicação tutor (Presentation -> Forms -> Form validation);
  • Um novo exemplo demonstra como criar um componente novo no espaço da aplicação. Verifique na aplicação tutor (Presentation -> Extending -> Creating new components);
  • Um novo exemplo demonstra como criar containers do tipo Window. Verifique na aplicação tutor (Presentation -> Containers -> Window);
  • Um novo exemplo demonstra como modificar as colunas de uma datagrid para exibição. Verifique na aplicação tutor (Presentation -> Datagrid -> Datagrid transformers);
  • Um novo exemplo demonstra como criar datagrids com checkbuttons. Verifique na aplicação tutor (Presentation -> Datagrid -> Datagrids with Checkbutton);
  • Um novo exemplo demonstra como fazer datagrids que abrem uma nova janela na ação. Verifique na aplicação tutor (Presentation -> Datagrid -> Datagrids with new Window);
  • Um novo exemplo demonstra como filtrar e ordenar a datagrid por uma informação associada (tabela relacionada). Verifique na aplicação tutor (Organization -> Complex Views -> Complete customers datagrid);
  • A documentação do site agora explica como criar novos componentes;
  • A documentação do site agora explica como criar novos validadores;
  • Toda a pasta /lib de sua aplicação deve ser atualizada. Tome cuidado para não sobrescrever a pasta /app (sua aplicação). Faça um backup antes;
  • Todas bibliotecas Javascript e arquivos CSS necessários agora estão encapsulados no arquivo libraries.html, que deve ser referenciado dentro do template pela palavra-chave {LIBRARIES}. Esta palavra-chave é substituída pelo conteúdo "libraries.html" pelo "index.web.php";
  • Muitas bibliotecas externas utilizadas pelo framework foram atualizadas (jquery-1.8.3, jquery-ui-1.9.2), e algumas outras foram incluídas. Garanta que você tenha importado o libraries.html em sua aplicação usando a palavra-chave {LIBRARIES} dentro do cabeçalho de seu template;
  • TButton agora usa estilos da bootstrap;
  • TMessage e TQuestion agora usam diálogos jQuery;
  • A integridade referencial em bancos SQLite agora é ligada no início da conexão em tempo de execução;
  • Alguns estilos foram melhorados e removidos do código-fonte (veja lib/adianti/include/tdatagrid/tdatagrid.css);
  • O método __construct() das classes TDBCheckGroup, TDBCombo e TDBRadioGroup agora recebe um quinto elemento que contém o nome da coluna para ordenação;
  • O método setOperator() foi criado em TStandardList para definir qual o operador será usado para filtragem nos controladores-padrão;
  • O método disableDefaultClick() foi criado na TDataGrid para opcionalmente desligar o clique normal para executar a ação default.


Adianti Framework 1.0.0 (2012-11-10)

"Twist and Shout" release
    Release inicial.