2011-11-26 9 views
5

sto ajaxifying il mio negozio Magento, e praticamente tutto sta andando a meraviglia, tranne una cosa:Utilizzando il sistema di messaggi built-in Magento controller + azione personalizzata

Problema: Mi sembra di essere in grado per recuperare e visualizzare il blocco dei messaggi nelle risposte alle richieste AJAX.

Spiegazione: sto parlando del colore rosso (o verde, quando si tratta di un messaggio di successo) barra che appare all'utente dopo aver provato qualcosa che non ha funzionato (ad esempio l'aggiunta di altri elementi al carrello rispetto alla azione permette). Quando si risponde a determinate richieste di ajax che generano errori, voglio visualizzare il markup dei messaggi attraverso un template praticamente vuoto, che viene usato per rendere la risposta per questa richiesta di ajax. Quando non si verifica alcun errore, viene restituita una risposta appropriata diversa.

Le cose che ho provato: Ecco alcune righe di codice PHP che ho provato ad utilizzare:

$_messages = Mage::getSingleton("core/session")->getMessages(); 
echo $this->getLayout()->createBlock("core/messages")->setMessages($_messages)->getGroupedHtml(); 

echo $this->getMessagesBlock()->getGroupedHtml(); 

echo Mage::app()->getLayout()->getMessagesBlock()-> 
     setMessages(Mage::getSingleton('customer/session')->getMessages(true))->getGroupedHtml(); 

Mage::log ging i dati mostrano collezioni Messaggio vuoto.

Ecco il layout XML (sto utilizzando $this->loadLayout('ajax_msg_handle'); dal controller) :.

<ajax_msg_handle> 
    <block type="core/template" name="error.root" output="toHtml" template="page/html/ajax-messages.phtml"> 
    <block type="core/messages" name="global_messages" as="global_messages"/> 
    <block type="core/messages" name="messages" as="messages"/> 
    </block> 
</ajax_msg_handle> 

anche un punto di dettaglio, ho considerato i seguenti:

maggior parte delle azioni, come il carrello "delete", "modifica" e la pagina del prodotto "aggiungi al carrello", in primo luogo il reindirizzamento un posto diverso, quindi viene fatta una seconda richiesta, che mostra l'errore. Forse questi messaggi non vengono mai visualizzati subito, ma solo quando rispondono alla richiesta dopo quella che genera l'errore. Quindi ho cercato di seguire questa possibile convenzione reindirizzando a un'azione che visualizza questi messaggi, ma anche questo non ha funzionato.

Se qualcuno può dirmi come far apparire quei messaggi, sarà la mia giornata.

risposta

4

il blocco di messaggi che si sta tentando di utilizzare non suppone di funzionare per le query AJAX. Come hai sottolineato, appare solo dopo un reindirizzamento, vale a dire:

  • il messaggio è impostato nella sessione attraverso qualcosa di simile: Mage::getSingleton('adminhtml/session')->addError(Mage::helper('modulename')->__('error message'));
  • allora è il reindirizzamento: $this->_redirect('*/*/');
  • che innesca un marchio nuova query, che carica il layout. Come il layout è impostato, in quanto vi è un messaggio, si presenta.

Al fine di dimostrare che questo blocco messaggio direttamente nella chiamata AJAX (vale a dire, senza redirect), è necessario:

  • in azione del controller: impostato il messaggio e caricare il blocco:

    Mage::register('message', Mage::helper('yourmodule')->__('the error message'); 
    $layout = $this->getLayout(); 
    $update = $layout->getUpdate(); 
    $update->load('ajax_msg_handle'); //loading your custom handle, defined in your module's layout .xml file 
    $layout->generateXml(); 
    $layout->generateBlocks(); 
    $output = $layout->getOutput(); 
    $this->getResponse()->setBody(Mage::helper('core')->jsonEncode(array('error' => $output))); 
    
  • nel tuo.phtml echo il messaggio:

    <ul class="messages"> 
        <li class="error-msg"> 
         <ul> 
          <li><?php echo Mage::registry('message'); ?></li> 
         </ul> 
        </li> 
    </ul> 
    
  • uscita la risposta nel codice javascript nella parte onComplete della vostra chiamata AJAX:

    onComplete: function(transport) { 
        $$('.main-col-inner')[0].insert({before:transport.responseText.evalJSON().error}); 
        Element.hide('loading-mask'); 
    } 
    

Nota che sarebbe meglio pratica per rendere il proprio blocco digitare, che estendere Mage_Core_Block_Messages e gestire il messaggio nei metodi di quel blocco, invece di utilizzare il registro.
Hope That Helps

+0

Grazie mille! Ancora non so DOVE è stato deciso che un messaggio non è ancora stato mostrato, ma il tuo metodo risolve efficacemente il mio problema. – pancake

Problemi correlati