it-swarm-eu.dev

Controllo del reindirizzamento dei componenti (utilizzando JControllerForm)

Sto creando un semplice componente di contatto in Joomla 3.3 (che si chiama Contact Pay).

Ho creato un "messaggio" e una vista "messaggi" nel back-end, con modelli e controller associati. 'message' è un modulo JForm e 'messaggi' è la vista elenco. Tutto funziona bene lì.

Tuttavia, nel front-end ho solo una vista messaggi, per consentire ai visitatori del sito di inviare messaggi. Uso lo stesso modello di back-end nel front-end, usando

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

nel file di voci del componente.

Ho semplicemente copiato il file XML del modulo (message.xml) dal back-end, rimosso alcuni campi e usato per il front-end. Ho prodotto il modulo con il seguente file di 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 un uso compila il modulo sul front-end, viene salvato nel database come dovrebbe essere.

Il problema

Il problema è che dopo l'invio del modulo viene reindirizzato a una vista "messaggi" che non esiste sul front-end, quindi viene visualizzato il seguente errore:

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

Ho provato a controllare il reindirizzamento nel controller dei messaggi che estende JControllerForm utilizzando il seguente codice nel costruttore:

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

Tuttavia, questo produce gli stessi risultati.

Come si controlla il reindirizzamento dei componenti?

3
Ron

È probabile che il reindirizzamento venga sovrascritto dalla funzione di salvataggio nel controller. Dovresti essere in grado di sovrascrivere il reindirizzamento con il metodo che hai elencato, dobbiamo solo farlo nel posto giusto.

Sembra che dovresti avere un controller message sul front-end. Se non hai una funzione di salvataggio all'interno di questo controller, aggiungine una in questo modo:

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

Questo utilizza il metodo di salvataggio esistente in JControllerForm che carica il modello e salva il modulo, ma si assicura che il reindirizzamento sovrascriva il reindirizzamento predefinito alla visualizzazione elenco.

3
David Fritsch

Dovresti avere un file chiamato components/com_contactpay/controller.php Questo è il controller principale per il tuo componente. La classe all'interno del file dovrebbe essere chiamata ContactPayController.

Aggiungi la seguente funzione di costruzione. Dovrebbe assomigliare a qualcosa di simile a questo.

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

Ciò dovrebbe gestire il reindirizzamento per te prima che il controller cerchi la visualizzazione dei messaggi.

2
John Pitchers

Dichiara solo un $view_list variabile al tuo JControllerForm uguale al tuo nome di visualizzazione preferito (visualizza la cartella normalmente)

protected $view_list = 'message';

e tutto il tuo evento form verrà reindirizzato ad esso, a meno che tu non dichiari specificatamente funzioni equivalenti come suggerisce David Fritsch! Le migliori soluzioni sono le più semplici! :)

0