Lançado Adianti Framework 7.6!
Clique aqui para saber mais
Referência ao objeto através do $this dentro de uma função Boa tarde pessoal! Gostaria de mais um help! Estou trabalhando com o modal input dialog que possui um form com 3 elementos. Ocorre que quando clicar no botão salvar, chama uma função que possui a ação de pegar os valores do input do form e enviar para o BD. O problema é que na função salvar eu tento validar os campos ou pegar os dados (->getDate()) através da chamada $this. No entanto ...
TN
Referência ao objeto através do $this dentro de uma função  
Boa tarde pessoal!

Gostaria de mais um help! Estou trabalhando com o modal input dialog que possui um form com 3 elementos. Ocorre que quando clicar no botão salvar, chama uma função que possui a ação de pegar os valores do input do form e enviar para o BD. O problema é que na função salvar eu tento validar os campos ou pegar os dados (->getDate()) através da chamada $this. No entanto recebo uma mensagem de erro que "Using $this when not in object context".


Função que chama o Input Dialog ao clicar em outro botão de outra tela
public static function onInputDialog( $param )
{
TScript::create("$('.close').hide();");

$form = new BootstrapFormBuilder('input_form');

$nome = new TEntry('nome');
$ativo = new TRadioGroup ('ativo');;
$convenio_id = new THidden('convenio_id');

// define some properties for the form fields
$nome->setSize('100%');
$convenio_id->setValue($param['convenio_id']);

//configurações do checked ativo
$ativo->setUseButton();
$ativo->addItems( [ '1' => 'Sim', '0' => 'Não' ] );
$ativo->setLayout('horizontal');
$ativo->setValue('1');
$ativo->style = 'width: 20%;';
$ativo->class ='circle-nicelabel';

//
$form->addFields([new TLabel('Nome:')], [$nome] );

$form->addFields([new TLabel('Ativo:')], [$ativo],
[new TLabel('')], [$convenio_id] );

$nome->addValidation( 'Nome:', new TRequiredValidator);

$btn1 = $form->addAction('Salvar', new TAction([__CLASS__, 'onSavePlano']), 'far:save white');
$btn1->class = 'btn btn-salvar';

$btn2 = $form->addAction('Fechar', new TAction([__CLASS__, 'onClosePlano']), 'fa:times white');
$btn2->class = 'btn btn-fechar';

// show the input dialog
new TInputDialog('Novo Plano de Saúde', $form);
}

Função para salvar os dados do form do Input Dialog
public static function onSavePlano( $param )
{
try
{
TTransaction::open('lexushealt_BD'); // open a transaction

$this->form->validate(); // validate form data

$object = new Plano; // create an empty object
$data = $this->form->getData(); // get form data as array

$object->fromArray( (array) $data); // load the object with data
$object->convenio_id = $param['convenio_id'];
$object->nome = $param['nome'];
$object->ativo = $param['ativo'];

$object->store(); // save the object

// get the generated id
$data->id = $object->id;

$this->form->setData($data); // fill form data

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

new TMessage('info', 'Plano de saúde salvo com sucesso');

//new TMessage('info', 'Confirm1 : ' . str_replace(',', '
', json_encode($param)));

}
catch (Exception $e) // in case of exception
{
new TMessage('error', 'Error ' .$e->getCode(). '-' . $e->getMessage()); // shows the exception error message
TTransaction::rollback(); // undo all pending operations
}
//new TMessage('info', 'Confirm1 : ' . str_replace(',', '
', json_encode($param)));
}

Se alguém puder me ajudar de como substituit o $this pelo próprio nome do objetivo form do inputdialog eu agradeço!

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 (3)


TN

Outra coisa neste código que não funciona muito bem no InputDialog é a validação dos campos do form, ele está permitindo o envio de informação mesmo com o campo vazio! Sei que alterando a função "static" para public a função funcionará com $this, mas isso afeta bastante um dalay e outro erro antes de atualizar a tema anterior que chamou a função. Dessa forma, a informação é enviada e a tela é atualizada, mas dá para perceber a ocorrencia de um erro neste intervalo
NR

Como não é possível usar o "$this" em funções estáticas, você pode trabalhar com "$param", que é um array associativo contendo todos os dados do post.
  1. <?php
  2. public static function onSavePlano$param )
  3. {
  4.     ....
  5.     // Os validadores precisam ser declarados aqui, pois o construtor não é chamado em uma função estática
  6.     $validNome = new TRequiredValidator();
  7.     $validNome->validate('Nome'$param['nome']); // vai lançar uma exceção se o campo nao estiver preenchido
  8.     $object->fromArray($param);
  9.     $object->store();
  10. ?>
TN

Muito obrigado Nataniel Rabaioli! Deu hiper certo a sua sugestão! Ficou muito boa a troca de transição entre os dados inserido no input dialog e o retorno para a tela anterior!

thanks