AJ
Dúvida cruel sobre CheckGroup e como Gravar no Banco.
Ola Pessoal. Ja li inumeros posts e pesquisei mas nao consigo fazer funcionar sempre dá um erro.
Tenho uma tela com CHECKGROUP. E preciso marcar varios tipos de exames para o cliente. Na hora de gravar o registro é salva mas nao grava no banco.
Na minha tabela TB_PRESCRICAO (id, codPaciente, exames,....) ja criei uma tabela igual os exemplos do tutor ComplexView.
Tenho uma tela com CHECKGROUP. E preciso marcar varios tipos de exames para o cliente. Na hora de gravar o registro é salva mas nao grava no banco.
Na minha tabela TB_PRESCRICAO (id, codPaciente, exames,....) ja criei uma tabela igual os exemplos do tutor ComplexView.
<?phpclass AvaliacaoPrescricao extends TStandardForm{ protected $form; public function __construct() { parent::__construct(); Adianti\Control\TPage::include_css('app/resources/formdecorator.css'); $html = new \Adianti\Widget\Template\THtmlRenderer('app/resources/formdecorator.html'); $this->form = new TQuickForm('form_AvaliaçãoPrescrição');; // Bancos de dados e Active Record parent::setDatabase('permission'); parent::setActiveRecord('Prescricao'); //Campos do Formulario //origem //banco //model //gravaBanco // aparece na caixa $codPaciente = new TDBCombo('codPaciente', 'permission', 'Paciente', 'nome', 'nome'); $codAvaliador = new TDBCombo('codAvaliador','permission','Avaliador','nomeAvaliador','nomeAvaliador'); $dataPresc= new TDate('dataPresc'); $dataPresc->setMask('dd/mm/yyyy'); $dataPresc->setDatabaseMask('yyyy-mm-dd'); //Objetivos: Clinicos e Funcionais $diagnostico = new TEntry('diagnostico'); $objetivo = new Adianti\Widget\Form\TCheckGroup('objetivo'); // Esse campo que quero gravar no banco $cb = array(); $cb['1'] = 'Hipertensão Arterial Sistêmica'; $cb['2'] = 'Angina'; $cb['3'] = 'Dispnéia'; $cb['4'] = 'Dislipidemia'; $cb['5'] = 'Obesidade'; $cb['6'] = 'Tabagismo'; $cb['7'] = 'Depressão'; $cb['8'] = 'Estresse'; $objetivo->addItems($cb); $objetivo->setLayout('horizontal'); // Campos que aparecem no Formulário $this->form->addQuickField('Paciente',$codPaciente,300); $this->form->addQuickField('Avaliador',$codAvaliador,300); $this->form->addQuickField('Diagnóstico Clínico ', $diagnostico,300); $this->form->addQuickField('Objetivos ', $objetivo,300); $this->form->addQuickField('Funcionais ', $funcional,300); $this->form->addQuickField('Cicloergometro MMSS', $ciclommss,100); $this->form->addQuickField('Cicloergometro MMII',$ciclommii,100); $this->form->addQuickField('Frequênica',$frequencia,100); $this->form->addQuickField('Modalidade',$modalidade,300); $this->form->addQuickFields('Tipo Tempo', array($tipotp, new TLabel('Tempo'), $tempo)); $this->form->addQuickFields('FC Inferior', array($fcinf, new TLabel('FC Superior'), $fcsup)); $this->form->addQuickFields('Cicloergômetro M. Superiores', array( $lbl_duracaos, $duracaos, $lbl_cargas,$cargas, $lbl_rpms, $rpms, $lbl_posicaos, $posicaos )); $this->form->addQuickFields('Cicloergômetro M. Inferiores', array( $lbl_duracaoi, $duracaoi, $lbl_cargai,$cargai, $lbl_rpmi, $rpmi, $lbl_posicaoi, $posicaoi )); $this->form->addQuickField('Parecer',$parecer,200); $this->form->addQuickField('Data',$dataPresc,100); $parecer->setSize(650,70); $replace = array('form'=>$this->form); $html->enableSection('main',$replace); // Ações dos botões do formulário $this->form->addQuickAction('Salvar', new TAction(array($this,'onSave')),'ico_save.png'); $vbox = new TVBox; $vbox->add(new Adianti\Widget\Util\TXMLBreadCrumb('menu.xml', 'AvaliacaoPrescricao')); //$vbox->add($this->form); $vbox->add($html); parent::add($vbox); } function onSave() { try { TTransaction::open('permission'); $prescricao = $this->form->getData(); // AQUI PRECISO GRAVAR O CHECK COMO FACO PARA IMPLODIR O ARRAY QUE CHEGA COM OS GRUPOS E COMO DEVE TEM QUE O TIPO DE CAMPO DA TABELA VARCHAR? OU INT? SENDO QUE SERAO VARIOS VALORES. $prescricao->store(); new TMessage('info', 'Avaliação e Prescrição cadastrada com Sucesso!'); TTransaction::close(); // close the transaction } catch (Exception $e) // in case of exception { new TMessage('error', '<b>Error</b>: ' . $e->getMessage()); TTransaction::rollback(); } } }?>
Se você está planejando gravar as várias opções selecionadas em 1 só campo da tabela, você precisa criar um campo array no banco de dados. Veja o link abaixo:
https://www.adianti.com.br/forum/pt/view_2037?como-tratar-string-do-tipo-array-n
Na minha opinião seria melhor modificar seu banco de dados para criar uma agregação entre Prescricao e Objetivo, sem a necessidade de utilizar campos do tipo array.
Blz estou fazendo assim. Busquei o exemplo de customer e Skill do tutor onde uma pessoa tem varias habilidades no meu caso tenho uma Prescrição com vários exames. A prescrição é gravada na tabela system-prescrição e os exames na tabela System-prescricao-objetivo aí na hora de gravar os ChechGroup é um array e quando chega no onsave() eu tenho que concatenar? Como faço para armazenar no store. Vou postar meu código estou com muita dúvida já papirei um pouco de agregação e composição no livro.
Se você criou a agregação entre os modelos basta fazer um foreach e adicionar os objetivos à prescrição, do mesmo modo que nesse exemplo do tutor que você citou: