it-swarm-es.tech

Control de redireccionamiento de componentes (usando JControllerForm)

Estoy creando un componente de contacto simple en Joomla 3.3 (que se llama Contact Pay).

Creé una vista de 'mensaje' y una 'mensajes' en el back-end, con modelos y controladores asociados. 'mensaje' es un formulario JForm y 'mensajes' es la vista de lista. Todo funciona bien allí.

Sin embargo, en el front-end solo tengo una vista de mensaje, para que los visitantes del sitio envíen mensajes. Yo uso el mismo modelo de back-end en el front-end, usando

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

en el archivo de entrada del componente.

Simplemente copié el archivo XML del formulario (message.xml) del back-end, eliminé algunos campos y lo usé para el front-end. Saco el formulario con el siguiente archivo de diseño:

<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>

Cuando un uso completa el formulario en el front-end, se guarda en la base de datos como debería ser.

El problema

El problema es que después de enviar el formulario, se redirige a una vista de 'mensajes' que no existe en el front-end, por lo que aparece el siguiente error:

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

Intenté controlar la redirección en el controlador de mensajes que extiende JControllerForm usando el siguiente código en el constructor:

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

Sin embargo, esto produce los mismos resultados.

¿Cómo se controla el redireccionamiento del componente?

3
Ron

Es probable que la función de guardar en su controlador anule la redirección. Debería poder anular la redirección con el método que enumeró, solo necesitamos obtenerla en el lugar correcto.

Parece que debería tener un controlador message en la parte frontal. Si no tiene una función de guardar dentro de este controlador, agregue una 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;
}

Esto utiliza el método de guardar existente en JControllerForm que carga el modelo y guarda el formulario, pero se asegura de que su redirección anule la redirección predeterminada a la vista de lista.

3
David Fritsch

Debería tener un archivo llamado components/com_contactpay/controller.php. Este es el controlador principal para su componente. La clase dentro del archivo debe llamarse ContactPayController.

Agregue la siguiente función de construcción. Debería verse más o menos así.

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();
        }
    }
    ...

Eso debería manejar la redirección por usted antes de que el controlador busque la vista de mensajes.

2
John Pitchers

Solo declara un $view_list variable en su JControllerForm igual a su nombre de vista preferido (ver carpeta normalmente)

protected $view_list = 'message';

¡y todo su evento de formulario se redirigirá a él, a menos que declare específicamente funciones equivalentes como sugiere David Fritsch! ¡Las mejores soluciones son las más simples! :)

0
Lazaros Kosmidis