Inscrições abertas para nosso Webinar anual Adianti Framework 2024!
Clique aqui para saber mais
TDBCheckGroup com critério de filtro baseado em TDBCombo Olá amigos, bom dia! Estou caminhando no desenvolvimento do meu primeiro projeto usando o Adianti mas parei em uma dúvida. Estou desenvolvendo um formulário onde eu cadastro um arquivo que pode ser uma imagem ou um vídeo e esse arquivo deve pertencer a um cliente que seleciono com um TDBCombo. Devo apresentar em um TDBCheckGroup todos os dispositivos "TV's" onde esse arquivo s...
GO
TDBCheckGroup com critério de filtro baseado em TDBCombo  
Olá amigos, bom dia!

Estou caminhando no desenvolvimento do meu primeiro projeto usando o Adianti mas parei em uma dúvida. Estou desenvolvendo um formulário onde eu cadastro um arquivo que pode ser uma imagem ou um vídeo e esse arquivo deve pertencer a um cliente que seleciono com um TDBCombo. Devo apresentar em um TDBCheckGroup todos os dispositivos "TV's" onde esse arquivo será exibido porém só posso apresentar os dispositivos que pertencem ao cliente escolhido no cadastro do arquivo. Isso deveria ser dinâmico e sei que pra isso existe o setChangeAction e setChangeFunction porém não sei realimentar o TDBCheckGroup de forma dinâmica.

Segue o meu código e uma imagem do formulário que estou montando:

  1. <?php
  2. /**
  3.  * ArquivoForm Form
  4.  * @author  <your name here>
  5.  */
  6. class ArquivoForm extends TPage
  7. {
  8.     protected $form// form
  9.     private $formFields = [];
  10.     private static $database 'GestaoMedia';
  11.     private static $activeRecord 'Arquivo';
  12.     private static $primaryKey 'id';
  13.     private static $formName 'list_Arquivo';
  14.     /**
  15.      * Form constructor
  16.      * @param $param Request
  17.      */
  18.     public function __construct$param )
  19.     {
  20.         parent::__construct();
  21.         // creates the form
  22.         $this->form = new BootstrapFormBuilder(self::$formName);
  23.         // define the form title
  24.         $this->form->setFormTitle('Arquivo');
  25.         $id = new TEntry('id');
  26.         $ativo = new TRadioGroup('ativo');
  27.         $cliente_id = new TDBCombo('cliente_id''GestaoMedia''Cliente''id''{razao}','razao asc'  );
  28.         $cliente_id->setChangeFunction('onChangeCliente');
  29.         
  30.         $titulo = new TEntry('titulo');
  31.         $descricao = new TEntry('descricao');
  32.         $data_hora_inicio = new TDateTime('data_hora_inicio');
  33.         $data_hora_fim = new TDateTime('data_hora_fim');
  34.         $segundos_tela = new TEntry('segundos_tela');
  35.         $repeticoes = new TEntry('repeticoes');
  36.         $data_envio = new TDateTime('data_envio');
  37.         
  38.         $nome_arquivo = new TFile('nome_arquivo');
  39.         $nome_arquivo->setCompleteAction(new TAction(array($this'onComplete')));
  40.         
  41.         
  42.         // Preciso criar um filtro
  43.         //$criteria = new TCriteria;
  44.         //$criteria->add(new TFilter('id', 'IN', '(SELECT id FROM dispositivos where cliente_id = 0 )'));
  45.         
  46.         $dispositivos = new TDBCheckGroup('dispositivos''GestaoMedia''Dispositivo''id''nome_dispositivo');
  47.         $dispositivos->setLayout('horizontal');
  48.         $dispositivos->setBreakItems(4);
  49.    
  50.         
  51.         
  52.         
  53.         $ativo->addValidation('Ativo', new TRequiredValidator()); 
  54.         $cliente_id->addValidation('Id do cliente', new TRequiredValidator()); 
  55.         $titulo->addValidation('Titulo', new TRequiredValidator()); 
  56.         //$descricao->addValidation('Descrição', new TRequiredValidator()); 
  57.         $data_hora_inicio->addValidation('Inicio da apresentação', new TRequiredValidator()); 
  58.         $data_hora_fim->addValidation('Fim da apresentação', new TRequiredValidator()); 
  59.         $segundos_tela->addValidation('Segundos na tela', new TRequiredValidator()); 
  60.         $repeticoes->addValidation('Repetições', new TRequiredValidator()); 
  61.         $nome_arquivo->addValidation('Nome do Arquivo', new TRequiredValidator()); 
  62.         $data_envio->addValidation('Data de envio', new TRequiredValidator()); 
  63.         $id->setEditable(false);
  64.         $ativo->addItems(['1'=>'Sim','2'=>'Não']);
  65.         $ativo->setLayout('horizontal');
  66.         $ativo->setBooleanMode();
  67.         $ativo->setValue('1');
  68.         $segundos_tela->setValue('1');
  69.         $titulo->forceUpperCase();
  70.         $descricao->forceUpperCase();
  71.         //$nome_arquivo->forceUpperCase();
  72.         $data_envio->setDatabaseMask('yyyy-mm-dd hh:ii');
  73.         $data_envio->setEditable(false);
  74.         
  75.         $data_hora_fim->setDatabaseMask('yyyy-mm-dd hh:ii');
  76.         $data_hora_inicio->setDatabaseMask('yyyy-mm-dd hh:ii');
  77.         $repeticoes->setMask('99');
  78.         $repeticoes->setValue('0');
  79.         $segundos_tela->setMask('999');
  80.         $data_envio->setMask('dd/mm/yyyy hh:ii');
  81.         $data_hora_fim->setMask('dd/mm/yyyy hh:ii');
  82.         $data_hora_inicio->setMask('dd/mm/yyyy hh:ii');
  83.         $id->setSize(92);
  84.         $ativo->setSize(80);
  85.         $titulo->setSize('100%');
  86.         $data_envio->setSize(150);
  87.         $descricao->setSize('100%');
  88.         $cliente_id->setSize('100%');
  89.         $data_hora_fim->setSize(150);
  90.         $repeticoes->setSize('100%');
  91.         $nome_arquivo->setSize('100%');
  92.         $data_hora_inicio->setSize(150);
  93.         $segundos_tela->setSize('100%');
  94.         if (!empty($id))
  95.         {
  96.             $id->setEditable(FALSE);
  97.         }
  98.         $this->form->addFields([new TLabel('id:')],[$id],[new TLabel('Ativo:''#ff0000')],[$ativo]);
  99.         $this->form->addFields([new TLabel('Cliente:''#ff0000')],[$cliente_id]);
  100.         $this->form->addFields([new TLabel('Titulo:''#ff0000')],[$titulo]);
  101.         $this->form->addFields([new TLabel('Descrição:')],[$descricao]);
  102.         $this->form->addFields([new TLabel('Inicio da apresentação:''#ff0000')],[$data_hora_inicio],[new TLabel('Fim da apresentação:''#ff0000')],[$data_hora_fim]);
  103.         $this->form->addFields([new TLabel('Segundos na tela:''#ff0000')],[$segundos_tela],[new TLabel('Repetições:''#ff0000')],[$repeticoes]);
  104.         $this->form->addFields([new TLabel('Pesquisa (*.png/*.jpg/*.mp4):''#ff0000')],[$nome_arquivo]);
  105.         $this->form->addFields([new TLabel('Data de envio:''#ff0000')],[$data_envio]);
  106.         
  107.         $this->form->addContent([new TFormSeparator('Visualização do arquivo carregado''#333333''18''#eeeeee')]);
  108.         // Preview da imagem
  109.         $this->frame = new TElement('div');
  110.         $this->frame->id 'photo_frame';
  111.         $this->frame->style 'width:400px;height:auto;min-height:200px;border:1px solid gray;padding:4px;margin:auto';
  112.         $this->form->addContent([$this->frame]);
  113.         
  114.         
  115.         $this->form->addContent([new TFormSeparator('Dispositivos onde o arquivo será exibido''#333333''18''#eeeeee')]);
  116.         $this->form->addFields([$dispositivos]);
  117.         // create the form actions
  118.         $btn_onsave $this->form->addAction('Salvar', new TAction([$this'onSave']), 'fa:floppy-o #ffffff');
  119.         $btn_onsave->addStyleClass('btn-primary'); 
  120.         $btn_onclear  $this->form->addAction('Limpar formulário', new TAction([$this'onClear']), 'fa:eraser #dd5a43');
  121.         $btn_onReload $this->form->addAction(_t('Back to the listing'), new TAction(['ArquivoList','onReload']),  'fa:table blue' );
  122.         // vertical box container
  123.         $container = new TVBox;
  124.         $container->style 'width: 100%';
  125.         $container->class 'form-container';
  126.         // $container->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
  127.         $container->add($this->form);
  128.         parent::add($container);
  129.     }
  130.     /**
  131.     * On complete upload
  132.     */
  133.     public static function onComplete($param)
  134.     {
  135.         TScript::create("$('#photo_frame').html('')");
  136.         TScript::create("$('#photo_frame').append(\"<img style='width:100%' src='tmp/{$param['nome_arquivo']}'>\");");
  137.        
  138.         // Tentativa de alterar a data de envio da imagem após fazer o carregamento
  139.         //$data_envio->setValue(date("d-m-Y H:i"));
  140.         
  141.         
  142.         /*
  143.         
  144.         Esse if é importante mas não está funcionando
  145.         
  146.          
  147.         if ((strpos($param["nome_arquivo"],'.png')) && (strpos($param["nome_arquivo"],'.PNG')) && (strpos($param["nome_arquivo"],'.jpg')) && (strpos($param["nome_arquivo"],'.JPG'))){
  148.             print_r($param["nome_arquivo"]);
  149.             TScript::create("$('#photo_frame').html('')");
  150.             TScript::create("$('#photo_frame').append(\"<img style='width:100%' src='tmp/{$param['nome_arquivo']}'>\");");
  151.         }*/
  152.     }
  153.     public function onSave($param null
  154.     {
  155.         try
  156.         {
  157.             TTransaction::open(self::$database); // open a transaction
  158.             /**
  159.             // Enable Debug logger for SQL operations inside the transaction
  160.             TTransaction::setLogger(new TLoggerSTD); // standard output
  161.             TTransaction::setLogger(new TLoggerTXT('log.txt')); // file
  162.             **/
  163.             $messageAction null;
  164.             $this->form->validate(); // validate form data
  165.             $object = new Arquivo(); // create an empty object 
  166.             $data $this->form->getData(); // get form data as array
  167.             $object->fromArray( (array) $data); // load the object with data
  168.             $object->store(); // save the object 
  169.             
  170.             if ($data->dispositivos)
  171.             {
  172.                 foreach ($data->dispositivos as $dispositivo_id)
  173.                 {
  174.                     TTransaction::open('GestaoMedia');
  175.                     $dispositivo Dispositivo::find($dispositivo_id);
  176.                     //var_dump($dispositivo);
  177.                     TTransaction::close();
  178.                     $object->addArquivoDispositivo$dispositivo );
  179.                 }
  180.             }
  181.             
  182.             
  183.             $source_file   'tmp/'.$object->nome_arquivo;
  184.             $target_file   'files/'.$object->id.'-'.$object->nome_arquivo;
  185.             //var_dump($target_file);
  186.             
  187.             if (file_exists($source_file))
  188.             {
  189.                 rename($source_file$target_file);
  190.             }
  191.             
  192.             
  193.             // get the generated {PRIMARY_KEY}
  194.             $data->id $object->id
  195.             $this->form->setData($data); // fill form data
  196.             TTransaction::close(); // close the transaction
  197.             // refresh photo_frame
  198.             TScript::create("$('#photo_frame').html('')");
  199.             $nome_arquivo $param['id'].'-'.$param['nome_arquivo'];
  200.             var_dump($nome_arquivo);
  201.             TScript::create("$('#photo_frame').append(\"<img style='width:100%' src='files/{$nome_arquivo}'>\");");
  202.             /**
  203.             // To define an action to be executed on the message close event:
  204.             $messageAction = new TAction(['className', 'methodName']);
  205.             **/
  206.             new TMessage('info'AdiantiCoreTranslator::translate('Record saved'), $messageAction);
  207.         }
  208.         catch (Exception $e// in case of exception
  209.         {
  210.             new TMessage('error'$e->getMessage()); // shows the exception error message
  211.             $this->form->setData$this->form->getData() ); // keep form data
  212.             TTransaction::rollback(); // undo all pending operations
  213.         }
  214.     }
  215.     /**
  216.      * Clear form data
  217.      * @param $param Request
  218.      */
  219.     public function onClear$param )
  220.     {
  221.         $this->form->clear();
  222.     }  
  223.     public function onEdit$param )
  224.     {
  225.         try
  226.         {
  227.             if (isset($param['key']))
  228.             {
  229.                 $key $param['key'];  // get the parameter $key
  230.                 TTransaction::open(self::$database); // open a transaction
  231.                 $object = new Arquivo($key); // instantiates the Active Record 
  232.                 $object->dispositivos $object->getArquivoDispositivosIds(); // Recuperando o ID de cada dispositivo
  233.                 $this->form->setData($object); // fill the form 
  234.                 TTransaction::close(); // close the transaction 
  235.                 if ($object)
  236.                 {
  237.                     $image = new TImage('files/'.$object->id.'-'.$object->nome_arquivo);
  238.                     $image->style 'width: 100%';
  239.                     $this->frame->add$image );
  240.                 }
  241.             }
  242.             else
  243.             {
  244.                 $this->form->clear();
  245.             }
  246.         }
  247.         catch (Exception $e// in case of exception
  248.         {
  249.             new TMessage('error'$e->getMessage()); // shows the exception error message
  250.             TTransaction::rollback(); // undo all pending operations
  251.         }
  252.     }
  253.     public function onChangeCliente()
  254.     {
  255.         new TMessage('info','Preciso realimentar o TDBCheckGroup ');
  256.     }
  257.      
  258. }

Curso completo Meu Negócio Pronto
Use para si, ou transforme em um negócio: Inclui aulas e códigos-fontes
Gestor de conteúdo (SITE) + Loja Virtual (E-Commerce) + Emissor de Notas para infoprodutos


Meu negócio pronto Quero me inscrever agora!

Comentários (6)


NR

O TDBCheckGroup ainda não possui uma função para carregamento estático. Vejo 2 soluções:
1 - Usar javascript para adicionar os itens.
2 - Usar o conceito de adianti_target_container. Nesse caso você criaria uma outra classe somente para renderizar os checks. Veja o exemplo abaixo:
adianti.com.br/framework_files/tutor/index.php?class=SaleMasterForm
Nesse exemplo são usadas 2 classes, a SaleMasterForm que monta o formulário master e a classe SaleDetailForm, responsável pelos detalhes. A mágica está no adianti_target_container = 'details_area', presente na classe SaleDetailForm. Isso informa ao framework que somente o container com esse id deve ser redesenhado.
GO

Olá Nataniel, boa tarde!
Não consegui visualizar as duas classes no exemplo do tutor. Só consigo visualizar a classe SaleDetailForm. Tenho uma classe agregada à classe Arquivo que é a classe Dispositivo e eu gravo no banco os arquivos
GO

Olá Nataniel, boa tarde!
Tenho uma classe agregada à classe Arquivo que é a classe Dispositivo mas o componente TDBCheckGroup é adicionado ao form arquivo e por isso ele é persistido junto com o arquivo. Estou pensando em separar e tratar do mestre e do detalhe de forma diferente pois não estou conseguindo implementar da forma que queria. Não consegui visualizar as duas classes no exemplo do tutor. Só consigo visualizar a classe SaleDetailForm. Uma outra opção seria trocar o componente onde apresento a agregação por um componente que possua o método reload. O que ficaria melhor para o meu caso de uso?
GO

Tenho aqui o método que funciona e gostaria de uma sugestão de outro componente caso o TDBCheckGroup não consiga ser carregado de forma dinâmica.
Alguém mais poderia me ajudar?

<? php
static function onChangeCliente($params)
{

if( isset($params['cliente_id']) && $params['cliente_id'] )
{
try
{
$dispositivos_id = array();

TTransaction::open('GestaoMedia');
$dispositivos = Dispositivo::where('cliente_id','=',$params['cliente_id'])->load();

foreach ($dispositivos as $dispositivo)
{
//Tenho aqui os dados dos dispositivos agregados.
// Como recarregar o componente TDBCheckGroup ?

$dispositivos_id[] = $dispositivo->id;
}

TTransaction::close();
}
catch (Exception $e) // in case of exception
{
new TMessage('error', $e->getMessage());
TTransaction::rollback();
}
}


}

?>
NR

Geovani, você pode baixar o tutor e procurar pela classe SaleMasterForm. Basicamente ela cria uma div com o mesmo id que é definido pela variável adianti_target_container na classe SaleDetailForm. É essa div que vai ter seu conteúdo redesenhado a cada troca de cliente.
GO

Olá amigo, bom dia!

Como estava enfrentando muitas dificuldades com o componente resolvi trocar e usar o TDBSelect e está funcionando perfeitamente porém gostaria de mudar a aparência do mesmo.
Seria possível usando métodos do Adianti?

  1. <?php
  2.         $dispositivos = new TDBSelect('dispositivos''GestaoMedia''Dispositivo''id''nome_dispositivo',NULL,$criteria);
  3.         // Não consegui mudar a altura do componente TDBSelect
  4.         // Também gostaria de mudar a aparência desse componente mas percebi que ele não tem o método style, haveria uma outra forma? 
  5.         $dispositivos->setSize('100%','500');
  6. ?>