web-dev-qa-db-fra.com

Contrôle de la redirection de composant (à l'aide de JControllerForm)

Je crée un composant de contact simple dans Joomla 3.3 (appelé Contact Pay).

J'ai créé une vue "message" et une vue "messages" dans le back-end, avec les modèles et les contrôleurs associés. 'message' est un formulaire JForm et 'messages' est la vue liste. Tout fonctionne bien là-bas.

Cependant, dans le front-end, je n'ai qu'une vue de message pour que les visiteurs du site puissent envoyer un message. J'utilise le même modèle de back-end dans le front-end, en utilisant

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

dans le fichier d'entrée du composant.

J'ai simplement copié le fichier XML de formulaire (message.xml) à partir du back-end, enlevé quelques champs et utilisé celui-ci pour le front-end. Je produis le formulaire avec le fichier de mise en page suivant:

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

Lorsqu'une utilisation remplit le formulaire sur le front-end, il est enregistré dans la base de données comme il se doit.

Le problème

Le problème est qu'après que le formulaire est soumis, il redirige vers une vue "messages" qui n'existe pas sur le front-end, donc j'obtiens l'erreur suivante:

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

J'ai essayé de contrôler la redirection dans le contrôleur de messages, ce qui étend JControllerForm à l'aide du code suivant dans le constructeur:

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

Cependant, cela produit les mêmes résultats.

Comment contrôler la redirection du composant?

3
Ron

La redirection sera probablement remplacée par la fonction de sauvegarde de votre contrôleur. Vous devriez être capable de remplacer la redirection avec la méthode que vous avez listée, nous avons juste besoin de la placer au bon endroit.

Il semble que vous devriez avoir un contrôleur message au début. Si vous n'avez pas de fonction de sauvegarde dans ce contrôleur, ajoutez-en une comme ceci:

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

Ceci utilise la méthode de sauvegarde existante dans JControllerForm qui charge le modèle et enregistre le formulaire, mais veille à ce que votre redirection remplace la redirection par défaut vers la vue liste.

3
David Fritsch

Vous devriez avoir un fichier appelé components/com_contactpay/controller.php. C'est le contrôleur principal de votre composant. La classe dans le fichier doit s'appeler ContactPayController.

Ajoutez la fonction de construction suivante. Ça devrait ressembler a quelque chose comme ca.

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

Cela devrait gérer la redirection pour vous avant que le contrôleur ne recherche la vue des messages.

2
John Pitchers

Il suffit de déclarer un $view_list variable à votre JControllerForm égale à votre nom de vue préféré (dossier de vue normalement)

protected $view_list = 'message';

et tous vos événements de formulaire y seront redirigés, à moins que vous ne déclariez spécifiquement des fonctions équivalentes à celles suggérées par David Fritsch! Les meilleures solutions sont les plus simples! :)

0