RC
Problema com TMultiField
Fechado
Boa tarde, estou utilizando o TMultiField porém não estou conseguindo trazer os dados na hora de editar! Os mesmos são salvos normalmente no banco de dados, porém na hora de editar não estão sendo retornados.
Vou enviar o print da tela de cadastro e da edição! E abaixo segue o código fonte da classe control e do model...
Classe control: CategoriaFormView
Model Categoria:
Model CategoriaSubcategoria, que faz a relação entre a tabela Categoria e Subcategoria:
Vou enviar o print da tela de cadastro e da edição! E abaixo segue o código fonte da classe control e do model...
Classe control: CategoriaFormView
- <?php
- /**
- * CategoriaFormView Control
- * @author <Ricelli M. Carvalho>
- */
- class CategoriaFormView extends TPage {
- protected $form;
- function __construct() {
- parent::__construct();
- $this->form = new TForm('form_Categoria');
- $this->form->class = 'tform';
- $table = new TTable;
- $table->style = 'width: 100%';
- $table->addRowSet(new TLabel('Categorias'), '', '', '')->class = 'tformtitle';
- $this->form->add($table);
- $frame_programs = new TFrame(NULL, 280);
- $frame_programs->setLegend('Subcategorias');
- $frame_programs->style .= ';margin: 15px';
- // create the form fields
- 1584 = new TEntry('id');
- $categoria = new TEntry('categoria');
- $multifield_programs = new TMultiField('programs');
- $program_id = new ">TDBSeekButton('program_id', 'permission', 'form_Categoria', 'Subcategoria', 'subcategoria', 'programs_id', 'programs_name');
- $program_name = new TEntry('program_name');
- $scroll = new TScroll;
- $scroll->setSize(290, 230);
- //$scroll->add( $groups );
- $frame_programs->add($multifield_programs);
- // define the sizes
- 1584->setSize(100);
- $categoria->setSize(200);
- $multifield_programs->setHeight(140);
- // outros
- 1584->setEditable(false);
- $program_name->setEditable(false);
- // validations
- $categoria->addValidation('categoria', new TRequiredValidator);
- $program_id->setSize(50);
- $program_name->setSize(300);
- // configuracoes multifield
- $multifield_programs->setClass('Subcategoria');
- $multifield_programs->addField('id', 'ID', $program_id, 60);
- $multifield_programs->addField('name', 'Subcategoria', $program_name, 380);
- $multifield_programs->setOrientation('horizontal');
- // add a row for the field id
- $table->addRowSet(new TLabel('ID:'), 1584);
- $table->addRowSet(new TLabel('Categoria' . ': '), $categoria);
- $row = $table->addRow();
- $cell = $row->addCell($frame_programs);
- $cell->colspan = 2;
- // create an action button (save)
- $save_button = new TButton('save');
- $save_button->setAction(new TAction(array($this, 'onSave')), _t('Save'));
- $save_button->setImage('ico_save.png');
- // create an new button (edit with no parameters)
- $new_button = new TButton('new');
- $new_button->setAction(new TAction(array($this, 'onEdit')), _t('New'));
- $new_button->setImage('ico_new.png');
- $list_button = new TButton('list');
- $list_button->setAction(new TAction(array('CategoriaDataGrid', 'onReload')), _t('Back to the listing'));
- $list_button->setImage('ico_datagrid.png');
- // define the form fields
- $this->form->setFields(array(1584, $categoria, $multifield_programs, $save_button, $new_button, $list_button));
- $buttons = new THBox;
- $buttons->add($save_button);
- $buttons->add($new_button);
- $buttons->add($list_button);
- $row = $table->addRow();
- $row->class = 'tformaction';
- $cell = $row->addCell($buttons);
- $cell->colspan = 4;
- $container = new TTable;
- $container->style = 'width: 80%';
- $container->addRow()->addCell(new TXMLBreadCrumb('menu.xml', 'CategoriaFormView'));
- $container->addRow()->addCell($this->form);
- // add the form to the page
- parent::add($container);
- }
- function onSave() {
- try {
- TTransaction::open('permission');
- $object = $this->form->getData('Categoria');
- $this->form->validate();
- if ($object->id) {
- $object->respalteracao = TSession::getValue('username');
- $object->dataalteracao = date("Y-m-d");
- } else {
- $object->datacadastro = date("Y-m-d");
- $object->respcadastro = TSession::getValue('username');
- $object->respalteracao = TSession::getValue('username');
- $object->dataalteracao = date("Y-m-d");
- }
- if ($object->programs) {
- foreach ($object->programs as $program) {
- //var_dump($program); die();
- $object->addEstoqueCategoriaSubcategoria($program);
- }
- } else {
- var_dump("Não entrou!");
- die();
- }
- $object->store();
- $this->form->setData($object);
- TTransaction::close();
- new TMessage('info', TAdiantiCoreTranslator::translate('Record saved'));
- } catch (Exception $e) {
- new TMessage('error', '<b>Error</b> ' . $e->getMessage());
- TTransaction::rollback();
- }
- }
- function onEdit($param) {
- try {
- if (isset($param['key'])) {
- $key = $param['key'];
- TTransaction::open('permission');
- $object = new Categoria($key);
- $object->programs = $object->getEstoqueCategoriaSubcategorias();
- $this->form->setData($object);
- TTransaction::close();
- } else {
- $this->form->clear();
- }
- } catch (Exception $e) {
- new TMessage('error', '<b>Error</b> ' . $e->getMessage());
- TTransaction::rollback();
- }
- }
- }
- ?>
Model Categoria:
- <?php
- /**
- * Categoria Active Record
- * @author <Ricelli Carvalho>
- */
- class Categoria extends TRecord
- {
- const TABLENAME = 'estoque_categoria';
- const PRIMARYKEY= 'id';
- const IDPOLICY = 'max'; // {max, serial}
- //private $subcategoria;
- private $estoque_categoria_subcategorias = array();
- //private $subcategorias = array();
- public function __construct(1584 = NULL)
- {
- parent::__construct(1584);
- parent::addAttribute('respcadastro');
- parent::addAttribute('datacadastro');
- parent::addAttribute('respalteracao');
- parent::addAttribute('dataalteracao');
- parent::addAttribute('categoria');
- }
- public function addEstoqueCategoriaSubcategoria(Subcategoria $object)
- {
- //var_dump($object); die();
- $this->estoque_categoria_subcategorias[] = $object;
- //var_dump($this->estoque_categoria_subcategorias); die();
- }
- public function getEstoqueCategoriaSubcategorias()
- {
- return $this->estoque_categoria_subcategorias;
- }
- /**
- * Reset aggregates
- */
- public function clearParts()
- {
- $this->estoque_categoria_subcategorias = array();
- }
- /**
- * Load the object and its aggregates
- * @param 1584 object ID
- */
- public function load(1584)
- {
- // load the related System_user_program objects
- $repository = new TRepository('CategoriaSubcategoria');
- $criteria = new TCriteria;
- $criteria->add(new TFilter('estoque_categoria_id', '=', 1584));
- //$system_user_system_user_programs = $repository->load($criteria);
- $estoque_categoria_estoque_categoria_subcategorias = $repository->load($criteria);
- if ($estoque_categoria_estoque_categoria_subcategorias)
- {
- foreach ($estoque_categoria_estoque_categoria_subcategorias as $estoque_categoria_estoque_categoria_subcategoria)
- {
- $estoque_categoria_subcategoria = new Subcategoria( $estoque_categoria_estoque_categoria_subcategoria->system_program_id );
- $this->addEstoqueCategoriaSubcategoria($estoque_categoria_subcategoria);
- }
- }
- // load the object itself
- return parent::load(1584);
- }
- /**
- * Store the object and its aggregates
- */
- public function store()
- {
- // store the object itself
- parent::store();
- $criteria = new TCriteria;
- $criteria->add(new TFilter('estoque_categoria_id', '=', $this->id));
- $repository = new TRepository('CategoriaSubcategoria');
- $repository->delete($criteria);
- // store the related System_userSystem_user_program objects
- if ($this->estoque_categoria_subcategorias)
- {
- foreach ($this->estoque_categoria_subcategorias as $estoque_categoria_subcategoria)
- {
- $estoque_categoria_estoque_categoria_subcategoria = new CategoriaSubcategoria;
- $estoque_categoria_estoque_categoria_subcategoria->estoque_subcategoria_id = $estoque_categoria_subcategoria->id;
- $estoque_categoria_estoque_categoria_subcategoria->estoque_categoria_id = $this->id;
- $estoque_categoria_estoque_categoria_subcategoria->store();
- }
- }
- }
- /**
- * Delete the object and its aggregates
- * @param 1584 object ID
- */
- public function delete(1584 = NULL)
- {
- // delete the related System_userSystem_user_program objects
- 1584 = isset(1584) ? 1584 : $this->id;
- $repository = new TRepository('CategoriaSubcategoria');
- $criteria = new TCriteria;
- $criteria->add(new TFilter('estoque_categoria_id', '=', 1584));
- $repository->delete($criteria);
- // delete the object itself
- parent::delete(1584);
- }
- /**
- * Return the programs the user has permission to run
- */
- public function getPrograms()
- {
- $subcategorias = array();
- foreach( $this->getEstoqueCategoriaSubcategorias() as $subc )
- {
- $subcategorias[$subc->subcategoria] = true;
- }
- return $subcategorias;
- }
- }
- ?>
Model CategoriaSubcategoria, que faz a relação entre a tabela Categoria e Subcategoria:
- <?php
- /**
- * CategoriaSubcategoria Active Record
- * @author <Ricelli Carvalho>
- */
- class CategoriaSubcategoria extends TRecord
- {
- const TABLENAME = 'estoque_categoria_subcategoria';
- const PRIMARYKEY= 'id';
- const IDPOLICY = 'max'; // {max, serial}
- public function __construct(1584 = NULL)
- {
- parent::__construct(1584);
- parent::addAttribute('estoque_categoria_id');
- parent::addAttribute('estoque_subcategoria_id');
- }
- }
- ?>
no onEdit de um var_dump($object->programs) abaixo dessa linha e veja se está vindo o resultado, senão vier os dados confira a função getEstoqueCategoriaSubcategorias o erro deve estar por ai.
$object->programs = $object->getEstoqueCategoriaSubcategorias();
Testei com o var_dump mas só vem estas informações:
Os nomes dos campos da multifield (program_id, program_name) são diferentes no momento da criação dos objetos e no momento de adicionar eles na multifield. Além disso, não batem com os nomes dos atributos que vem do banco (subcategoria, respcadastro)...
Att,
Olá Pablo, não consegui pegar bem sua idéia... De tanto bater aqui e não sair nada vou postar o meu projeto pra se puderem rodar o mesmo e tentar me ajudar a solucionar esse problema que já bato a 1 semana, rsrs...
Obs: estou usando o banco sqlite e o usuario: ricelli e a senha: ricelli
Link do projeto: https://drive.google.com/folderview?id=0B0fuS6eGJnDwb3VrbXpnclJPX1U&usp=sharing
Socorro gente!!! Alguém me ajuda por favor resolver essa bronca! Ainda estou engatinhando no framework. Não estou conseguindo ver aonde está o erro. Já testei a função getEstoqueCategoriaSubcategorias mas ainda assim não carrega os dados!
Oi Ricelli
Os nomes dos objetos estão diferente por isso está com erro.
Esses objetos estão retornando
0 => string 'subcategoria' (length=12)
1 => string 'respcadastro' (length=12)
2 => string 'datacadastro' (length=12)
3 => string 'respalteracao' (length=13)
4 => string 'dataalteracao' (length=13)
e vc tem os nomes dos campos do multifield diferentes
Ex:
$program_name = new TEntry('program_name');
Altere para
$program_name = new TEntry('respcadastro');
Olá Felipe Cortez e Pablo, muito obrigado pelas informações que vocês passaram, pois consegui fazer com que os dados fossem carregados na datagrid do TMultiField na hora da edição!!!
Só que surgiu um outro probleminha que antes funcionava: Quando eu clico no TDBSeekButton pra trazer a subcategoria o mesmo só preenche o campo ID, o campo subcategoria não preenche...
Como seria a forma correta de utilização dele? Os parâmetros corretos.