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

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