Magento - включить HTML-ссылки в сообщениях об ошибках/пользовательских сообщениях

Я хочу знать, возможно ли включить HTML-ссылки в пользовательских сообщениях (например, в сообщениях об ошибках).

Вот мой пример: я сделал переопределение для своих нужд Mage_CatalogInventory_Model_Stock_Item/Item.php

Функция checkQuoteItemQty:

if (!$this->checkQty($summaryQty) || !$this->checkQty($qty)) {
     //$message = Mage::helper('cataloginventory')->__('The requested quantity for "%s" is not available.', $this->getProductName());
     $message = Mage::helper('cataloginventory')->__('The requested quantity for "%s" is not available (max:%s).', $this->getProductName(), ($this->getQty() * 1));
     $cat_id = $this->getProduct()->getCategoryIds();
     if($cat_id){
         $url = Mage::getModel('catalog/category')->load($cat_id[0])->getUrl();
         $message .= Mage::helper('cataloginventory')->__('You might be interested in <a href="%s">those products</a>.', $url);
      }
      $result->setHasError(true)
           ->setMessage($message)
           ->setQuoteMessage($message)
           ->setQuoteMessageIndex('qty');
     return $result;
}

Но HTML-ссылка, которую я создал в $message, не активна и считается текстом (думаю, из-за перевода...). Можно ли изменить это поведение?

С уважением.


person F3L1X79    schedule 03.09.2014    source источник


Ответы (2)


Для тех, кто хотел бы знать, мне пришлось переопределить Mage_Core_Block_Messages, строку 249:

public function getGroupedHtml()
    {
        $types = array(
            Mage_Core_Model_Message::ERROR,
            Mage_Core_Model_Message::WARNING,
            Mage_Core_Model_Message::NOTICE,
            Mage_Core_Model_Message::SUCCESS
        );
        $html = '';
        foreach ($types as $type) {
            if ( $messages = $this->getMessages($type) ) {
                if ( !$html ) {
                    $html .= '<' . $this->_messagesFirstLevelTagName . ' class="messages">';
                }
                $html .= '<' . $this->_messagesSecondLevelTagName . ' class="' . $type . '-msg">';
                $html .= '<' . $this->_messagesFirstLevelTagName . '>';

                foreach ( $messages as $message ) {
                    $html.= '<' . $this->_messagesSecondLevelTagName . '>';
                    $html.= '<' . $this->_messagesContentWrapperTagName . '>';
                    $html.= ($this->_escapeMessageFlag) ? $this->escapeHtml($message->getText()) : html_entity_decode($message->getText());
                    $html.= '</' . $this->_messagesContentWrapperTagName . '>';
                    $html.= '</' . $this->_messagesSecondLevelTagName . '>';
                }
                $html .= '</' . $this->_messagesFirstLevelTagName . '>';
                $html .= '</' . $this->_messagesSecondLevelTagName . '>';
            }
        }
        if ( $html) {
            $html .= '</' . $this->_messagesFirstLevelTagName . '>';
        }
        return $html;
    }

Добавление html_entity_decode в эту строку:

$html.= ($this->_escapeMessageFlag) ? $this->escapeHtml($message->getText()) : html_entity_decode($message->getText());

Просто дайте мне знать, если вы найдете лучшее решение.

person F3L1X79    schedule 23.09.2014

Не знаю почему, но в моем случае вызов устаревшего метода без "Сообщения" решает проблему со ссылкой. Вместо addNoticeMessage я поменял на addNotice, и ссылки появились. В моем случае:

$noticeMsg = __('You must be <a href="%1">logged in</a> or <a href="%2">registered</a> to purchase these products.',
                        $this->_storeManager->getStore()->getUrl('customer/account/login'),
                        $this->_storeManager->getStore()->getUrl('customer/account/create')
                    );
$this->_messageManager->addNotice($noticeMsg);
person Ricardo Martins    schedule 25.09.2017