ti-enxame.com

Controlando o redirecionamento de componente (usando JControllerForm)

Estou criando um componente de contato simples no Joomla 3.3 (chamado de Pagamento por contato).

Criei uma exibição de 'mensagem' e 'mensagens' no back-end, com modelos e controladores associados. 'message' é um formulário JForm e 'messages' é a exibição da lista. Tudo funciona bem lá.

No entanto, no front-end, tenho apenas uma exibição de mensagem para os visitantes do site enviarem mensagem. Eu uso o mesmo modelo de back-end no front-end, usando

$controller->addModelPath( JPATH_ADMINISTRATOR.DS.'components'.DS.'com_contactpay'.DS.'models' );

no arquivo de entrada do componente.

Simplesmente copiei o arquivo XML do formulário (message.xml) do back-end, removi alguns campos e o usei para o front-end. Saída o formulário com o seguinte arquivo de layout:

<form action="<?php echo JRoute::_( 'index.php?option=com_contactpay&task=message.save'); ?>"
      method="post" id="contactpay-message-form" class="form-validate form-horizontal" enctype="multipart/form-data">

    <fieldset>

        <?php foreach( $this->form->getFieldset('message_fields') as $field ) : ?>
            <div class="control-group">
                <div class="control-label">
                    <?php echo $field->label; ?>
                </div>
                <div class="controls">
                    <?php echo $field->input; ?>
                </div>
            </div>
        <?php endforeach; ?>

    </fieldset>

    <div class="form-actions">
        <button type="submit" class="btn btn-primary validate"><?php echo JText::_('JSUBMIT');?></button>
        <a class="btn" href="<?php echo JRoute::_('');?>" title="<?php echo JText::_('JCANCEL');?>"><?php echo JText::_('JCANCEL');?></a>
        <input type="hidden" name="option" value="com_contactpay" />
        <input type="hidden" name="task" value="message.save" />
        <?php echo JHtml::_('form.token');?>
    </div>
</form>

Quando um uso preenche o formulário no front-end, ele é salvo no banco de dados como deveria.

O problema

O problema é que, após o envio do formulário, ele é redirecionado para uma exibição de 'mensagens' que não existe no front-end; portanto, recebo o seguinte erro:

500 View not found [name, type, prefix]: messages, html, contactpayView 

Tentei controlar o redirecionamento no controlador de mensagem que estende o JControllerForm usando o seguinte código no construtor:

$this->setRedirect( JRoute::_( 'index.php?option=com_contactpay&view=message' ));

No entanto, isso produz os mesmos resultados.

Como controlar o redirecionamento de componente?

3
Ron

O redirecionamento provavelmente está sendo substituído pela função de salvamento no seu controlador. Você deve substituir o redirecionamento pelo método que você listou, só precisamos colocá-lo no lugar certo.

Parece que você deve ter um controlador message no front-end. Se você não possui uma função de salvar neste controlador, adicione uma como esta:

public function save($key = null, $urlVar = null)
{
    $return = parent::save($key, $urlVar);
    $this->setRedirect( JRoute::_( 'index.php?option=com_contactpay&view=message' ));
    return $return;
}

Isso utiliza o método de salvamento existente em JControllerForm que carrega o modelo e salva o formulário, mas garante que seu redirecionamento substitua o redirecionamento padrão na exibição de lista.

3
David Fritsch

Você deve ter um arquivo chamado components/com_contactpay/controller.php Este é o controlador principal do seu componente. A classe dentro do arquivo deve ser chamada ContactPayController.

Adicione a seguinte função de construção. Deve ser algo como isto.

class ContactPayController extends JControllerLegacy {

    public function __construct(){
        if (JFactory::getApplication()->input->get('view') == "messages"){
            JFactory::getApplication()->redirect('index.php?option=com_contactpay&view=message');
        } else {
            parent::__construct();
        }
    }
    ...

Isso deve lidar com o redirecionamento antes que o controlador procure a exibição de mensagens.

2
John Pitchers

Apenas declare um $view_list variável no seu JControllerForm igual ao seu nome de exibição preferido (consulte a pasta normalmente)

protected $view_list = 'message';

e todo o evento do formulário será redirecionado para ele, a menos que você declare especificamente funções equivalentes, como sugere David Fritsch! As melhores soluções são as mais simples! :)

0
Lazaros Kosmidis