Alterar valor de um campo no Datagrid - TStandardList Pessoal, minha primeira postagem no fórum. Comecei a utilizar recentemente o Framework, inclusive comprei dois livros do Pablo. O livro do Adianti e o livro de PHP Programando com Orientação a objetos. Programo em outras linguagens, mas com o conceito ainda procedural. Estou engatinhando a orientação a objetos. Achei o framework fantástico, pois mesmo nunca tendo trabalhado 100% com orie...
MC
Alterar valor de um campo no Datagrid - TStandardList  
Pessoal, minha primeira postagem no fórum.
Comecei a utilizar recentemente o Framework, inclusive comprei dois livros do Pablo. O livro do Adianti e o livro de PHP Programando com Orientação a objetos.

Programo em outras linguagens, mas com o conceito ainda procedural. Estou engatinhando a orientação a objetos. Achei o framework fantástico, pois mesmo nunca tendo trabalhado 100% com orientação a objetos e nenhuma linguagem para Web, já consegui desenvolver muita coisa.

Minha dúvida é a seguinte...

Criei um form List e um form de cadastro, semelhante ao padrão utilizado nos apps de exemplo.
No form List, tenho um datagrid que busca informações do Banco de Dados com ID, Nome e "Função Liderança?". Neste último eu armazeno "S" para sim e "N" para não.

Porém, na listagem eu não gostaria de exibir "S" ou "N", mas "SIM" ou "NÃO". Pode parecer algo simples, mas não consegui imaginar como fazer sem alguma gambiarra.
Desculpem pela pergunta de iniciante...

Segue classe model e control:

 
  1. <?php
  2. /**
  3. * Funcao Active Record
  4. * @author <your-name-here>
  5. */
  6. class Funcao extends TRecord
  7. {
  8. const TABLENAME = 'funcao';
  9. const PRIMARYKEY= 'id';
  10. const IDPOLICY = 'max'; // {max, serial}
  11. /**
  12. * Constructor method
  13. */
  14. public function __construct($id = NULL, $callObjectLoad = TRUE)
  15. {
  16. parent::__construct($id, $callObjectLoad);
  17. parent::addAttribute('descricao');
  18. parent::addAttribute('lideranca');
  19. }
  20. }
  21. ?>


Control:

 
  1. <?php
  2. /**
  3. * FuncaoList Listing
  4. * @author <your name here>
  5. */
  6. class FuncaoList extends TStandardList
  7. {
  8. protected $form; // registration form
  9. protected $datagrid; // listing
  10. protected $pageNavigation;
  11. protected $formgrid;
  12. protected $deleteButton;
  13. protected $transformCallback;
  14. /**
  15. * Page constructor
  16. */
  17. public function __construct()
  18. {
  19. parent::__construct();
  20. parent::setDatabase('mvadmin'); // defines the database
  21. parent::setActiveRecord('Funcao'); // defines the active record
  22. parent::setDefaultOrder('id', 'asc'); // defines the default order
  23. // parent::setCriteria($criteria) // define a standard filter
  24. parent::addFilterField('id', '=', 'id'); // filterField, operator, formField
  25. parent::addFilterField('descricao', 'like', 'descricao'); // filterField, operator, formField
  26. parent::addFilterField('lideranca', '=', 'lideranca'); // filterField, operator, formField
  27. // creates the form
  28. $this->form = new TQuickForm('form_search_Funcao');
  29. $this->form->class = 'tform'; // change CSS class
  30. $this->form->style = 'display: table;width:100%'; // change style
  31. $this->form->setFormTitle('Funcao');
  32. // create the form fields
  33. $id = new TEntry('id');
  34. $descricao = new TEntry('descricao');
  35. $lideranca = new TEntry('lideranca');
  36. // add the fields
  37. $this->form->addQuickField('Código', $id, 200 );
  38. $this->form->addQuickField('Descrição', $descricao, 200 );
  39. $this->form->addQuickField('Função de Liderança?', $lideranca, 200 );
  40. // keep the form filled during navigation with session data
  41. $this->form->setData( TSession::getValue('Funcao_filter_data') );
  42. // add the search form actions
  43. $this->form->addQuickAction(_t('Find'), new TAction(array($this, 'onSearch')), 'fa:search');
  44. $this->form->addQuickAction(_t('New'), new TAction(array('FuncaoForm', 'onEdit')), 'bs:plus-sign green');
  45. // creates a DataGrid
  46. $this->datagrid = new TDataGrid;
  47. $this->datagrid->style = 'width: 100%';
  48. $this->datagrid->datatable = 'true';
  49. // $this->datagrid->enablePopover('Popover', 'Hi <b> {name} </b>');
  50. // creates the datagrid columns
  51. $column_id = new TDataGridColumn('id', 'Código', 'right');
  52. $column_descricao = new TDataGridColumn('descricao', 'Descrição', 'left');
  53. $column_lideranca = new TDataGridColumn('lideranca', 'Função de Liderança?', 'left');
  54. // add the columns to the DataGrid
  55. $this->datagrid->addColumn($column_id);
  56. $this->datagrid->addColumn($column_descricao);
  57. $this->datagrid->addColumn($column_lideranca);
  58. // creates the datagrid column actions
  59. $order_id = new TAction(array($this, 'onReload'));
  60. $order_id->setParameter('order', 'id');
  61. $column_id->setAction($order_id);
  62. $order_descricao = new TAction(array($this, 'onReload'));
  63. $order_descricao->setParameter('order', 'descricao');
  64. $column_descricao->setAction($order_descricao);
  65. // create EDIT action
  66. $action_edit = new TDataGridAction(array('FuncaoForm', 'onEdit'));
  67. $action_edit->setUseButton(TRUE);
  68. $action_edit->setButtonClass('btn btn-default');
  69. $action_edit->setLabel(_t('Edit'));
  70. $action_edit->setImage('fa:pencil-square-o blue fa-lg');
  71. $action_edit->setField('id');
  72. $this->datagrid->addAction($action_edit);
  73. // create DELETE action
  74. $action_del = new TDataGridAction(array($this, 'onDelete'));
  75. $action_del->setUseButton(TRUE);
  76. $action_del->setButtonClass('btn btn-default');
  77. $action_del->setLabel(_t('Delete'));
  78. $action_del->setImage('fa:trash-o red fa-lg');
  79. $action_del->setField('id');
  80. $this->datagrid->addAction($action_del);
  81. // create the datagrid model
  82. $this->datagrid->createModel();
  83. // create the page navigation
  84. $this->pageNavigation = new TPageNavigation;
  85. $this->pageNavigation->setAction(new TAction(array($this, 'onReload')));
  86. $this->pageNavigation->setWidth($this->datagrid->getWidth());
  87. // vertical box container
  88. $container = new TVBox;
  89. $container->style = 'width: 90%';
  90. // $container->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
  91. $container->add($this->form);
  92. $container->add($this->datagrid);
  93. $container->add($this->pageNavigation);
  94. parent::add($container);
  95. }
  96. }
  97. ?>

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)


AC

Boa noite Marcelo,

Testa o seguinte no teu control:

 
  1. <?php
  2. $lideranca->setTransformer(function($value,$object,$row))
  3. {
  4. if($value)
  5. {
  6. if($value == 'S')
  7. {
  8. return 'Sim';
  9. }
  10. else
  11. {
  12. return 'Não';
  13. }
  14. }
  15. }
  16. ?>
AC

Boa noite Marcelo,

Testa o seguinte no teu control:

 
  1. <?php
  2. $lideranca->setTransformer(function($value,$object,$row))
  3. {
  4. if($value)
  5. {
  6. if($value == 'S')
  7. {
  8. return 'Sim';
  9. }
  10. else
  11. {
  12. return 'Não';
  13. }
  14. }
  15. }
  16. ?>
MC

Muito obrigado Alexandre.
Ajustei apenas um detalhe de sintaxe no comando que você me passou, e funcionou perfeitamente.

Substitui $lideranca por $column_lideranca, que é a coluna do Datagrid, e ajustei a sintaxe do setTransformer().

Ficou assim:

 
  1. <?php
  2. $column_lideranca->setTransformer(function($value,$object,$row)
  3. {
  4. if($value)
  5. {
  6. if($value == 'S')
  7. {
  8. return 'Sim';
  9. }
  10. else
  11. {
  12. return 'Não';
  13. }
  14. }
  15. });
  16. ?>
VV

Boa tarde, outra forma de fazer poderia ser adicionar a seguinte função no Model
 
  1. <?php
  2. public function get_lideranca()
  3. {
  4. return ($this->data['lideranca'] === 'S') ? 'Sim' : 'Não';
  5. }
  6. ?>


Esta função é chamada automaticamente toda vez que o Model retornar a propriedade lideranca.

O único problema que tive e não sei como resolver, é que quando uso o model em uma função onEdit e uso a função "$this->form->setData($object);" para popular uma combobox no meu form na edição, recebo no formulário o valor retornado pela função get que escrevi pra propriedade no Model e não o id do combo.

Alguém sabe como posso diferenciar no model quando quero apresentar os dados na grid (que dai quero que seja executada a função get do meu model) e quando quero editar os dados (preciso do id do objeto não mais o valor)?

Função onEdit
 
  1. <?php
  2. //Por padrao todos os metodos do framework recebem uma lista de parametros da URL em forma de array
  3. public function onEdit($params)
  4. {
  5. try {
  6. TTransaction::open('teste');
  7. $key = $params['key'];
  8. //Carrega o resgistro com a chave especifica para dentro da variavel $object
  9. $object = new Filme( $key );
  10. //Aqui meu object precisa ter um id no atributo id_suporte, para mostrar o option correto no combobox
  11. //porem não tem pq o atributo chama a funcao get_id_suporte que retorna uma string para quando apresentar os dados na grid
  12. $this->form->setData($object);
  13. TTransaction::close();
  14. } catch (Exception $e) {
  15. new TMessage("Erro: " . $e->getMessage());
  16. }
  17. }
  18. ?>


Função que modifica o atributo id_suporte dentro do model Filme

 
  1. <?php
  2. public function get_id_suporte()
  3. {
  4. return Suporte::get_suporte($this->data['id_suporte']);
  5. }
  6. ?>




VV

Pessoal resolvi meu problema escrevendo um transformer para mostrar os dados na grid e removendo a função get_id_suporte do model

 
  1. <?php
  2. $idSuporte->setTransformer(function($value,$object,$row) {
  3. return Suporte::get_suporte($value);
  4. });
VV

Pessoal resolvi meu problema escrevendo um transformer para mostrar os dados na grid e removendo a função get_id_suporte do model

 
  1. <?php
  2. $idSuporte->setTransformer(function($value,$object,$row) {
  3. return Suporte::get_suporte($value);
  4. });