Lançado Adianti Framework 8.1!
Clique aqui para saber mais
Funcionamento de SQL's no framewok Pessoal, desculpa a minha ignorância, mas não estou sabendo como o framework trabalha em relação a consultas SQL! Estou com o seguinte problema: tenho um formulário onde no mesmo tenho dois TCombo, um para categoria e o outro para subcategoria. O subcategoria vai ser populado de acordo com a seleção feita no categoria. Ai eu estou apanhando para trazer todas as categorias no campo cat...
EB
Funcionamento de SQL's no framewok  
Fechado
Pessoal, desculpa a minha ignorância, mas não estou sabendo como o framework trabalha em relação a consultas SQL!

Estou com o seguinte problema: tenho um formulário onde no mesmo tenho dois TCombo, um para categoria e o outro para subcategoria. O subcategoria vai ser populado de acordo com a seleção feita no categoria.

Ai eu estou apanhando para trazer todas as categorias no campo categoria (TCombo).

Este aqui é meu model:
  1. <?php
  2. class Categoria extends TRecord
  3. {
  4.     const TABLENAME 'categoria';
  5.     const PRIMARYKEY'id';
  6.     const IDPOLICY =  'max'
  7.        
  8.     public function __construct(1787 NULL)
  9.     {
  10.         parent::__construct(1787);                     
  11.         parent::addAttribute('categoria');   
  12.        
  13.     }
  14. }
  15. ?>


Como se faz um método tipo um findAll que traz todas as categorias? Ou o próprio framewok já traz isso pronto pra mim?

Ai eu queria instanciar este model de uma classe control e trazer essas informações para setar no TCombo categoria

Curso Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


Dominando o Adianti Framework Quero me inscrever agora!

Comentários (14)


IF

Olá Edilane, eu faço dessa forma. Copia todo o código pra um novo arquivo e mude os dados conforme se banco de dados e tabelas.

  1. <?php
  2. class Teste extends TPage
  3. {
  4.     private $form;
  5.     private $table;
  6.     
  7.     public function __construct()
  8.     {
  9.         parent::__construct();
  10.         
  11.     
  12.         $this->form = new TForm('formulario');
  13.         $table = new TTable;
  14.         $this->form->add($table);
  15.         
  16.         $categoria = new TDBCombo('categoria','seu_banco_de_dados','Categoria','id','nome','nome');
  17.         $categoria->setChangeAction(new TAction(array($this'onChangeCombo')));
  18.         
  19.         $sub_categoria = new TCombo('sub_categoria');
  20.         
  21.         $table->addRowSet(new TLabel('Categoria'), $categoria); 
  22.         $table->addRowSet(new TLabel('Sub_Categoria:'), $sub_categoria); 
  23.        
  24.         $this->form->setFields(array($categoria$sub_categoria));       
  25.         parent::add($this->form);
  26.     }   
  27.     
  28.     static function onChangeCombo($param)
  29.     {
  30.         $categoria $param['categoria'];
  31.         TTransaction::open('seu_banco_de_dados');
  32.         $repository = new TRepository('Subcategoria');
  33.         $criteria = new TCriteria;
  34.         $criteria->add( new TFilter('id_categoria','=',$categoria));
  35.         $criteria->setProperty('order''nome');
  36.         $object $repository->load($criteria,FALSE);
  37.         $itens = array();
  38.         foreach ($object as $obj)
  39.         {
  40.             $itens[$obj->id] = $obj->nome;
  41.         }
  42.         TCombo::reload('formulario','sub_categoria'$itens);
  43.     }
  44.         
  45.      
  46. }
  47. ?>


Me avise se deu certo ou não.
EB

Olá Ivan Fernandes. Tentando seguir sua lógica aqui, mas não sei onde estou errando que não está trazendo as categorias para o TCombo.

Estou declarando assim, veja se tem algo errado:
  1. <?php
  2. $categoria = new Adianti\Widget\Form\TCombo('categoria_id','permission','Categoria','id','categoria''categoria');
  3. ?>


Mas ainda assim não vem nada, sendo que no banco existe 11 categorias cadastradas.
EB

Olá agora consegui trazer as categorias! É que essa declaração ai deve ser utilizada é pra o TDBCombo e não para o TCombo!

Agora vou tentar implementar o restante da sua lógica.

Abraço
EB

Devido a forma como criei minha tabela de subcategoria vou ter que preencher o TCombo subcategoria com o resultado da seguinte SQL:

SELECT subcategoria.name FROM categoria_subcategoria INNER JOIN subcategoria ON categoria_subcategoria.subcategoria_id = subcategoria.id WHERE categoria_subcategoria.categoria_id = 9


Como devo utilizar essa Sql com TCriteria?
IF

Ola Edilane, eu usei o TDCombo por sua facilidade de uso, ele traz os dados da base automaticamente. Agora com relação ao preenchimento do TCombo da subcategoria, vc deve fazer como no exemplo que eu te passei, vc não precisa usar inter join e select, o framework faz isso com o de uso critérios e filtros para as seleções dos registros. Me passe os models da categoria e subcategoria da sua aplicação pra eu dar uma olhada.

JC

Olá Edilaine, Será que não é o caso de remodelar o banco partindo de uma composição onde a sub-categoria vai receber o id da categoria?
EB

Olá Jorge Cenci, fiz exatamente isso: remodelei o banco, inserindo o campo categoria_id.
Apliquei sua lógica Ivan Fernandes e funcionou perfeitamente a questão de carregar somente as subcategorias relacionadas a categoria selecionada!

Só que agora apareceu um pequeno detalhe: quando eu clico em salvar, e os dados são setados de volta no formulário, o TCombo subcategoria está vindo vázio!

Todos os demais campos voltam preenchidos, menos a subcategoria. Sabem me dizer o que pode ser isso?
IF

Edilane, eu não sei se essa é a forma correta, mas funciona, antes do $this->form->setData(), insira esse código de acordo com os seus dados.
  1. <?php
  2.         
  3.         $this->onChangeCombo($param); //Chama  função para popular o Combo de acordo com a categoria
  4.         $sub = new StdClass;
  5.         $sub->sub_categoria $data->sub_categoria;
  6.         TForm::sendData('formulario',$sub); // Carrega os dados da sub_categoria selecionada.
  7.         
  8.         $this->form->setData($data); //carrega os dados no formulário
  9. ?>


Acho que vc vai ter que carregar isso também no onEdit()
EB

Infelizmente não consegui colocar pra funcionar.

Vou postar aqui minha classe, se possível me ajudarem
  1. <?php
  2. class ProdutoFormView extends TStandardForm {
  3.     protected $form;
  4.     function __construct() {
  5.         parent::__construct();
  6.         $this->form = new TQuickForm('form_Produto');
  7.         $this->form->setFormTitle('Produtos e Serviços');
  8.         $this->form->class 'tform';
  9.         // defines the database
  10.         parent::setDatabase('permission');
  11.         // defines the active record
  12.         parent::setActiveRecord('Produto');
  13.         $id = new TEntry('id');
  14.         $id->setEditable(false);
  15.         $categoria = new \Adianti\Widget\Wrapper\TDBCombo('categoria_id','permission','Categoria','id','categoria','categoria');        
  16.         $categoria->setChangeAction(new TAction(array($this'onChangeCombo')));
  17.         $sub_categoria = new \Adianti\Widget\Form\TCombo('subcategoria_id');
  18.         $unidade = new \Adianti\Widget\Wrapper\TDBCombo('unidade_id','permission','UnidadeProduto','id','descricao','descricao');
  19.         $descricao = new \Adianti\Widget\Form\TEntry('descricao');
  20.         $especificacoes = new \Adianti\Widget\Form\TText('especificacoes');
  21.         $valor_entrada = new \Adianti\Widget\Form\TEntry('valor_entrada');
  22.         $valor_saida = new \Adianti\Widget\Form\TEntry('valor_saida');
  23.         $observacoes = new Adianti\Widget\Form\TText('observacoes');
  24.         // add the fields
  25.         $this->form->addQuickField('ID'$id50);
  26.         $this->form->addQuickField('Categoria' ': '$categoria200);
  27.         $this->form->addQuickField('Subcategoria' ': '$sub_categoria200);
  28.         $this->form->addQuickField('Unidade' ': '$unidade200);
  29.         $this->form->addQuickField('Descricao' ': '$descricao400);
  30.         $this->form->addQuickField('Especificações' ': '$especificacoes200);
  31.         $this->form->addQuickField('Valor entrada' ': '$valor_entrada200);
  32.         $this->form->addQuickField('Valor saída' ': '$valor_saida200);        
  33.         $this->form->addQuickField('Observações' ': '$observacoes200);
  34.         
  35.         $especificacoes->setSize(40070);
  36.         $valor_entrada->setNumericMask(2',''.');
  37.         $valor_saida->setNumericMask(2',''.');                      
  38.         $observacoes->setSize(40070);
  39.         // validations
  40.         $categoria->addValidation(('Categoria'), new TRequiredValidator);        
  41.         $sub_categoria->addValidation(('Subcategoria'), new TRequiredValidator);
  42.         $unidade->addValidation(('Unidade'), new TRequiredValidator);
  43.         $descricao->addValidation(('Descrição'), new TRequiredValidator);                               
  44.         // add form actions
  45.         $this->form->addQuickAction(_t('Save'), new TAction(array($this'onSave')), 'ico_save.png');
  46.         $this->form->addQuickAction(_t('New'), new TAction(array($this'onEdit')), 'ico_new.png');
  47.         $this->form->addQuickAction(_t('Back to the listing'), new TAction(array('CentroCustoDataGrid''onReload')), 'ico_datagrid.png');
  48.         $container = new TTable;
  49.         $container->style 'width: 80%';
  50.         $container->addRow()->addCell(new TXMLBreadCrumb('menu.xml''CentroCustoDataGrid'));
  51.         $container->addRow()->addCell($this->form);
  52.         // add the form to the page
  53.         parent::add($container);
  54.     }
  55.     
  56.     static function onChangeCombo($param)
  57.     {
  58.         $categoria $param['categoria_id'];
  59.         TTransaction::open('permission');
  60.         $repository = new TRepository('Subcategoria');
  61.         $criteria = new TCriteria;
  62.         $criteria->add( new TFilter('categoria_id','=',$categoria));
  63.         $criteria->setProperty('order''name');
  64.         $object $repository->load($criteria,FALSE);
  65.         $itens = array();       
  66.         foreach ($object as $obj)
  67.         {
  68.             $itens[$obj->id] = $obj->name;
  69.         }
  70.         TCombo::reload('form_Produto','subcategoria_id'$itens);
  71.     }
  72.     function onSave() {
  73.         try {
  74.             TTransaction::open('permission');
  75.             $object $this->form->getData('Produto');              
  76.             $this->form->validate();    
  77.             
  78.             $object->store();            
  79.             $this->form->setData($object);
  80.             TTransaction::close();
  81.             new TMessage('info'TAdiantiCoreTranslator::translate('Record saved'));
  82.         } catch (Exception $e) {
  83.             new TMessage('error''<b>Error</b> ' $e->getMessage());
  84.             TTransaction::rollback();
  85.         }
  86.     }
  87.     
  88.         function onEdit($param) {
  89.         try {
  90.             if (isset($param['key'])) {
  91.                 $key $param['key'];
  92.                 TTransaction::open('permission');
  93.                 $object = new Produto($key);
  94.                 $this->form->setData($object);
  95.                 TTransaction::close();
  96.             } else {
  97.                 $this->form->clear();
  98.             }
  99.         } catch (Exception $e) {
  100.             new TMessage('error''<b>Error</b> ' $e->getMessage());
  101.             TTransaction::rollback();
  102.         }
  103.     }
  104. }
  105. ?>
IF

Edilane, vou enviar por email o código pra vc. Meu email: ivanrfer@gmail.com
RC

Oi Ivan. enviei um email pra você. Pode me enviar o código pra esse mesmo email tá.
Vlew
RC

Rapaz, desculpa ai. kkkkkkk

É que eu e minha esposa que estamos implementando um projeto ela foi enviar a mensagem achando que estava no perfil dela :-)
IF

rsrs Tdo bem
EB

Oi Ivan, obrigada viu.