Lançado Adianti Framework 7.6!
Clique aqui para saber mais
Dificuldade em carregar dados no TFieldList Olá, pessoal Estou utilizando TFieldList em um forma para carregar dados de um array, porém sem sucesso. Alguém pode me ajudar ? segue trecho de código ...
RB
Dificuldade em carregar dados no TFieldList  
Olá, pessoal
Estou utilizando TFieldList em um forma para carregar dados de um array, porém sem sucesso.

Alguém pode me ajudar ?

segue trecho de código

  1. <?php
  2.  
  3. class JuridicaForm extends TPage
  4. {
  5.     protected static $form;
  6.     protected static $formName 'form_juridica';
  7.     protected static $obj_atividade;  
  8. public function __construct($param)
  9.     { 
  10.     $atividade_secundaria_code = new TEntry('atividade_secundaria_code[]');
  11.           $atividade_secundaria_text = new TEntry('atividade_secundaria_text[]');
  12.           $atividade_secundaria_code->setSize('100%');
  13.           $atividade_secundaria_text->setSize('100%');
  14.           self::$obj_atividade = new TFieldList;
  15.           self::$obj_atividade->width '100%';
  16.           self::$obj_atividade->class .= ' dashed'// important
  17.       
  18.           self::$obj_atividade->addField('<b>Código</b>',  $atividade_secundaria_code,['width' => '10%']);
  19.           self::$obj_atividade->addField('<b>Descrição</b>',$atividade_secundaria_text,['width' => '90%']);
  20.           self::$form->addField($atividade_secundaria_code);
  21.           self::$form->addField($atividade_secundaria_text);
  22.     }
  23. public static function buscaCnpjWeb($param)
  24.     {
  25.       try
  26.       {
  27.     if (isset($param['cnpj']) and (!empty($param['cnpj'])))
  28.         {
  29.           $cnpj preg_replace('/[^0-9]/','',$param['cnpj']);
  30.           $retorno = @file_get_contents('https://www.receitaws.com.br/v1/cnpj/'.urlencode($cnpj));  
  31.           $objeto  json_decode($retorno);
  32.           if (!empty($objeto)) 
  33.             {
  34.               $object = new stdClass();
  35.            //.... outros campos
  36.           if ($objeto->atividades_secundarias)
  37.         {
  38.           self::$obj_atividade->addHeader();
  39.                 
  40.            foreach ($objeto->atividades_secundarias as $atividade)
  41.            {
  42.              $atividade_detail = new stdClass;
  43.              $atividade_detail->atividade_secundaria_code $atividade->code;
  44.              $atividade_detail->atividade_secundaria_text $atividade->text;
  45.                   
  46.              self::$obj_atividade->addDetail($atividade_detail);
  47.             }            
  48.                 self::$obj_atividade->addCloneAction();
  49.          }
  50.          else
  51.          {
  52.            self::onClear($param);
  53.          }
  54.         }
  55.     }
  56.       }
  57.       catch (Exception $e)
  58.       {
  59.         new TMessage('error'$e->getMessage());
  60.       }
  61.     }
  62. }
  63. ?>

Curso completo Meu Negócio Pronto
Use para si, ou transforme em um negócio: Inclui aulas e códigos-fontes
Gestor de conteúdo (SITE) + Loja Virtual (E-Commerce) + Emissor de Notas para infoprodutos


Meu negócio pronto Quero me inscrever agora!

Comentários (11)


NR

adianti.com.br/framework_files/tutor/index.php?class=FormFieldListVi
RB

Já li, e refiz varias vezes o exemplo, e não conseguiu obter sucesso.

Não consegui identificar onde estou falhando.
RB

Então, alterei com base no exemplo, porém sem sucesso
veja :
  1. <?php
  2.     if (!empty($objeto->atividades_secundarias))
  3.             {               
  4.               self::$atividade_list->addHeader()->style='background:whitesmoke';
  5.               $count count($objeto->atividades_secundariasCOUNT_RECURSIVE);
  6.               TFieldList::clear('atividade_list');
  7.               TFieldList::addRows('atividade_list',$count);
  8.                  
  9.                 $atividade_detail = new stdClass;
  10.                 $atividade_detail->atividade_secundaria_code $objeto->atividades_secundarias['qual'];
  11.                 $atividade_detail->atividade_secundaria_text $objeto->atividades_secundarias['nome'];
  12.               
  13.                 self::$atividade_list->addCloneAction();
  14.                TForm::sendData(sef::$formName$atividade_detail);           
  15.             }
  16.             else
  17.             {
  18.               self::$atividade_list->addHeader()->style='background:whitesmoke';
  19.               self::$atividade_list->addDetail( new stdClass );
  20.               self::$atividade_list->addCloneAction();
  21.             }
  22. ?>
RB

Tentei desta outra forma, mas também não deu.

Help, Help...

  1. <?php
  2.     if (!empty($objeto->atividades_secundarias))
  3.             {         
  4.               $count count($objeto->atividades_secundarias);
  5.            
  6.               TFieldList::clear('atividade_list');
  7.               TFieldList::addRows('atividade_list',$count);                
  8.               
  9.               $object->atividade_secundaria_code = (object)$objeto->atividades_secundarias['qual'];
  10.               $object->atividade_secundaria_text = (object)$objeto->atividades_secundarias['nome']; 
  11.                          
  12.             }
  13.             else
  14.             {
  15.               self::$atividade_list->addHeader()->style='background:whitesmoke';
  16.               self::$atividade_list->addDetail( new stdClass );
  17.               self::$atividade_list->addCloneAction();
  18.             }
  19. ?>
NR

As funções addHeader, addDetail e addCloneAction não devem ser usadas em funções estáticas. Você precisa trabalhar com a função TForm::sendData, passando um array nos campos do fieldlist, conforme consta no exemplo:
  1. <?php
  2. public static function onClearFill($param)
  3.     {
  4.     
  5.         TFieldList::clear('my_field_list');
  6.         TFieldList::addRows('my_field_list'4);
  7.         
  8.         $data = new stdClass;
  9.         $data->combo  = [ 1,2,3,4,];
  10.         $data->text   = [ 'Part. One''Part. Two''Part. Three''Part. Four''Part. Five' ];
  11.         $data->number = [ '10,10','20,20''30,30''40,40''50,50' ];
  12.         $data->date   = [ date('Y-m-d'),
  13.                           date('Y-m-d'strtotime("+1 days")),
  14.                           date('Y-m-d'strtotime("+2 days")),
  15.                           date('Y-m-d'strtotime("+3 days")),
  16.                           date('Y-m-d'strtotime("+4 days")) ];
  17.         
  18.         TForm::sendData('my_form'$datafalsetrue200); // 200 ms of timeout after recreate rows!
  19.     }
  20. ?>
RB

  1. <?php
  2.         if (!empty($objeto->atividades_secundarias))
  3.                 {         
  4.                   $count count($objeto->atividades_secundarias);
  5.                
  6.                   TFieldList::clear('atividade_list');
  7.                   TFieldList::addRows('atividade_list',$count);                
  8.                   
  9.                   $object->atividade_secundaria_code = (object)$objeto->atividades_secundarias['code'];
  10.                   $object->atividade_secundaria_text = (object)$objeto->atividades_secundarias['text']; 
  11.                              
  12.                 }
  13.                 else
  14.                 {
  15.                   self::$atividade_list->addHeader()->style='background:whitesmoke';
  16.                   self::$atividade_list->addDetail( new stdClass );
  17.                   self::$atividade_list->addCloneAction();
  18.                 }
  19.     ?>
RB

Novamente, eu aqui,

Na tentativa e erro, criei um método separado

  1. <?php
  2. //outros códigos
  3.     if (!empty($objeto->atividades_secundarias))
  4.             {               
  5.               self::onAtividadeSecundaria($objeto->atividades_secundarias);       
  6.             }
  7.             else
  8.             {
  9.               TFieldList::clear('atividade_list');
  10.               TFieldList::addRows('atividade_list',1);
  11.             }
  12. ?>
RB

Continuação,
  1. <?php
  2. public static function onAtividadeSecundaria($param)
  3.     {
  4.       if (!empty($param) And is_array($param)) 
  5.       {
  6.         $count count($param);
  7.         //echo $count;
  8.         TFieldList::clear('atividade_list');
  9.         TFieldList::addRows('atividade_list',$count);
  10.         $object = new stdClass;
  11.         foreach ($param as $key => $value
  12.         {          
  13.           $object->atividade_secundaria_code $value->code;
  14.           $object->atividade_secundaria_text FuncoesUteis::tratarNome($value->text);
  15.         }
  16.         TForm::sendData(self::$formName$objectfalsetrue,200);
  17.       }  
  18.     }
  19. ?>


Só que agora só preenche a primeiro linha

<a href='https://ibb.co/txfBzdW'>Link</a>
NR

O atributo correspondente ao nome do campo precisa ser um array.

No seu foreach está atribuindo os valores a uma variável string comum, dessa forma somente o último item é considerado, pois substitui os valores anteriores. Use um array:
  1. <?php
  2. foreach ($param as $key => $value
  3. {          
  4.       //$object->atividade_secundaria_code = $value->code;
  5.       $object->atividade_secundaria_code[] = $value->code//precisa ser um array
  6. ?>
RB

Nataniel Rabaioli,

muito obrigado mais uma vez, salvou meu dia.
RI


$this->form->appendPage('Vacinas');
....



//notebook
$this->form->appendPage('Fabricantes');


// create detail fields
$fabricante_id = new TDBUniqueSearch('fabricante_id[]', 'cedipi', 'TbFabricantes', 'id', 'descricao');
$fabricante_id->setMinLength(1);
$fabricante_id->setSize('100%');
$fabricante_id->setMask('{descricao} ({id})');

$cod_barras = new TEntry('cod_barras');
$cod_barras->setSize('100%');

$registro_ans = new TEntry('registro_ans');
$registro_ans->setSize('100%');


$this->form->addField($fabricante_id) ;
$this->form->addField($cod_barras) ;
$this->form->addField($registro_ans);

// detail
$this->fabvacinas_list = new TFieldList;
$this->fabvacinas_list->addField( 'Fabricante', $fabricante_id, ['width' => '50%']);
$this->fabvacinas_list->addField( 'Cód. Barras', $cod_barras, ['width' => '25%']);
$this->fabvacinas_list->addField( 'Registro ANS', $registro_ans, ['width' => '25%']);

$this->fabvacinas_list-> width = '100%';
$this->fabvacinas_list->enableSorting();

$this->form->addFields( [new TFormSeparator('Itens') ] );

// $this->form->addAction( _t('Save'), new TAction( [$this, 'onSave'] ), 'fa:save green' ); onSalvarFab
$btn3 = $this->form->addAction( 'Salvar Fabricantes', new TAction( [$this, 'onSalvarFab']), 'fa:save green' );


$this->fabvacinas_list->addHeader();
$this->fabvacinas_list->addDetail( new stdClass);
$this->fabvacinas_list->addCloneAction();
$this->form->addContent( [$this->fabvacinas_list] );



public static function onSalvarFab( $param )
{
try
{

TTransaction::open('cedipi'); // open a transaction with database

$id = (int) $param['id'];
$object = new TbVacinas($id); // instantiates the Active Record
$fabri_items = TbVacFabricantes::where('vacinas_id', '=', $object->id)->delete();


if( !empty($param['fabricante_id']) AND is_array($param['fabricante_id']) )
{

foreach( $param['fabricante_id'] as $key => $value)
{
// new TMessage('info', 'barras: '.$param['fabricante_id'].' ans: '.$param['registro_ans']);

$data = new TbVacFabricantes;

$data->vacinas_id = $object->id;
$data->fabricantes_id = $param['fabricante_id'][$key];
$data->cod_barras = $param['cod_barras'];
$data->registro_ans = $param['registro_ans'];

$data->store();

}
}

TForm::sendData('form_TbVacinas', (object) ['id' => $object->id]);

TTransaction::close(); // close the transaction

new TMessage('info', AdiantiCoreTranslator::translate('Record saved')); // success message

}

catch (Exception $e) // in case of exception
{
new TMessage('error', $e->getMessage()); // shows the exception error message
$this->form->setData( $this->form->getData() ); // keep form data
TTransaction::rollback(); // undo all pending operations
}
}

ERRO: ao salvar na tabela, está ocorrendo a seguinte situação.

salva os códigos certinhos do fabricante, só que está repetindo o valor da última
linha incluída nos 2 registros incluídos na tabela (campos com valores repetidos
ultimo cód.barras e registro ans.)

id vacinas_id fabricantes_id registro_ans cod_barras ativo created_at
34 2 1 44444 3333 S 2021-05-06 17:38:16
35 2 2 44444 3333 S 2021-05-06 17:38:16


Alguém pode identificar o problema? Olhei os exemplo do tutor, li o livro,
pesquisei no Fórum e não consegui descobrir o erro. Help!