RM
Função Recursiva Com método ->setTransformer não funciona.
Criei uma função recursiva sob o conceito de árvore binária (id é o pai e parent_id é o filho) ao coloca-la em uma página comum e invoca-la stand-alone os procedimentos em questão funcionam perfeitamente. Tive que adaptar minhas rotinas para faze-lo funcionar no padrão do framework.
Eu ia até criar um artigo sobre o assunto entretanto não consegui faze-lo funcionar junto ao grid e não queria usar um recurso work around como armazenar o resultado da montagem no caminho em um campo no banco de dados.
Se alguém quiser me dar uma luz vou postar os códigos e os sql para que reproduzam o mesmo em seu ambiente.
Primeiramente as tabelas e registros de exemplo:
Agora o model (CrmCategory.class.php):
Agora a page controller de teste (teste.class.php):
Qualquer grid padrão gerado pelo IDE ou mesmo estanque não consigo fazer funcionar os métodos usando o settransformer aplicando a formatação desejada dentro do grid. Entretanto, funciona perfeitamente como vocês poderão checar por si caso testem em sua cópia local no framework usando a página o código da página de teste que postei acima. Copio os dois métodos para dentro do controller que contém os formulários e o grid e mesmo o código estando funcional e sem erros não obtenho o resultado desejado.
Não sei se é um bug do framework ou algum conflito ou por alguma razão existe algum conflito na conexão de dados impedindo o código de funcionar. Agradeço qualquer luz sob o assunto preciso disto para um projeto e acredito que estas funções podem ser de utilidade para outros.
Eu ia até criar um artigo sobre o assunto entretanto não consegui faze-lo funcionar junto ao grid e não queria usar um recurso work around como armazenar o resultado da montagem no caminho em um campo no banco de dados.
Se alguém quiser me dar uma luz vou postar os códigos e os sql para que reproduzam o mesmo em seu ambiente.
Primeiramente as tabelas e registros de exemplo:
--
-- Estrutura da tabela `crm_category`
--
CREATE TABLE IF NOT EXISTS `crm_category` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`image` varchar(255) DEFAULT NULL,
`parent_id` int(11) NOT NULL DEFAULT '0',
`name_br` varchar(255) NOT NULL,
`description_br` text NOT NULL,
`meta_description_br` varchar(255) NOT NULL,
`meta_keyword_br` varchar(255) NOT NULL,
`top` tinyint(1) NOT NULL,
`column` int(3) NOT NULL,
`sort_order` int(3) NOT NULL,
`status` tinyint(1) NOT NULL,
`date_added` datetime NOT NULL,
`date_modified` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=19 ;
INSERT INTO `crm_category` (`id`, `image`, `parent_id`, `name_br`, `description_br`, `meta_description_br`, `meta_keyword_br`, `top`, `column`, `sort_order`, `status`, `date_added`, `date_modified`) VALUES
(1, NULL, 0, 'Produtos', 'produtos', 'produtos', 'produtos', 0, 0, 0, 1, '2015-09-17 00:00:00', '2015-09-17 00:00:00'),
(16, NULL, 1, 'Almofadas', 'desc', 'meta', 'keys', 1, 1, 2, 1, '0000-00-00 00:00:00', '0000-00-00 00:00:00'),
(18, NULL, 16, 'Namorados', 'Almofadas de Namorados
', 'almofadas de namorados', 'namorados, almofadas', 0, 1, 1, 1, '2015-09-27 11:29:55', '2015-09-27 11:29:55');
', 'almofadas de namorados', 'namorados, almofadas', 0, 1, 1, 1, '2015-09-27 11:29:55', '2015-09-27 11:29:55');
Agora o model (CrmCategory.class.php):
- <?php
- /**
- * CrmCategory Active Record
- * @author <your-name-here>
- */
- class CrmCategory extends TRecord
- {
- const TABLENAME = 'crm_category';
- const PRIMARYKEY= 'id';
- const IDPOLICY = 'serial'; // {max, serial}
- /**
- * Constructor method
- */
- public function __construct($id = NULL, $callObjectLoad = TRUE)
- {
- parent::__construct($id, $callObjectLoad);
- parent::addAttribute('image');
- parent::addAttribute('parent_id');
- parent::addAttribute('name_br');
- parent::addAttribute('description_br');
- parent::addAttribute('meta_description_br');
- parent::addAttribute('meta_keyword_br');
- parent::addAttribute('top');
- parent::addAttribute('column');
- parent::addAttribute('sort_order');
- parent::addAttribute('status');
- parent::addAttribute('date_added');
- parent::addAttribute('date_modified');
- }
- }
- ?>
Agora a page controller de teste (teste.class.php):
- <?php
- class teste extends TPage
- {
- public $cat_path;
- function __construct()
- {
- parent::__construct();
- parent::add(new TLabel('Página de Testes'));
- try
- {
- echo "<pre>Teste 1:\n";
- TTransaction::open('crm');
- $object= new CrmCategory(18);
- TTransaction::close();
- $retorno = $this->formatCategoryPath($object);
- echo "Retorno: || $retorno ||\n ";
- echo '</pre>';
- echo "<pre>Teste 2:\n";
- TTransaction::open('crm');
- $object= new CrmCategory(16);
- TTransaction::close();
- $retorno = $this->formatCategoryPath($object);
- echo "Retorno: || $retorno ||\n ";
- echo '</pre>';
- }
- catch (Exception $e) // in case of exception
- {
- new TMessage('error', '<b>Error</b> ' . $e->getMessage()); // shows the exception error message
- TTransaction::rollback(); // undo all pending operations
- }
- }
- function formatCategoryPath($object)
- {
- $this->buildCategoryPath($object);
- return $this->cat_path;
- }
- public function buildCategoryPath($object)
- {
- static $function_loaded=1;
- static $cat_path='';
- ($function_loaded == 1)?($cat_path=''):("");
- ($function_loaded == 1)?($this->cat_path=''):("");
- echo "Cargas da Função Build: $function_loaded\n";
- try
- {
- TTransaction::open('crm'); // open transaction
- ($function_loaded != 1)?($separator=' :: '):("");
- $cat_path = $object->name_br.$separator.$cat_path;
- $parent = new CrmCategory($object->parent_id);
- TTransaction::close(); // closes transaction
- if($object->parent_id != 0)
- {
- $function_loaded++;
- $this->formatCategoryPath($parent);
- }
- else
- {
- $function_loaded=1;
- $this->cat_path = $cat_path;
- }
- }
- catch (Exception $e)
- {
- new TMessage('error', $e->getMessage());
- }
- }
- }
- ?>
Qualquer grid padrão gerado pelo IDE ou mesmo estanque não consigo fazer funcionar os métodos usando o settransformer aplicando a formatação desejada dentro do grid. Entretanto, funciona perfeitamente como vocês poderão checar por si caso testem em sua cópia local no framework usando a página o código da página de teste que postei acima. Copio os dois métodos para dentro do controller que contém os formulários e o grid e mesmo o código estando funcional e sem erros não obtenho o resultado desejado.
- <?php
- $name_br->setTransformer(array($this, 'formatCategoryPath'));
- ?>
Não sei se é um bug do framework ou algum conflito ou por alguma razão existe algum conflito na conexão de dados impedindo o código de funcionar. Agradeço qualquer luz sob o assunto preciso disto para um projeto e acredito que estas funções podem ser de utilidade para outros.
Resultado do Teste:
imagizer.imageshack.com/img661/7926/MgdXlB.png
Retorno do setTransformer:
imagizer.imageshack.com/img538/5515/zoZV7q.png