6

I want to add link in cart added message

Make shopping Cart as link

In checkout cart add controller i am changing message like this

$message = __(
                    'You added %1 to your <a href ="..">shopping cart</a>.',
                    $product->getName()
                );

but its getting text when i look in console its come from knockout js and they are getting html "html: message.text" of message but its getting like text

How can i change it

3 Answers 3

3

HTML is not allowed by default in flash messages and it's escaped. To change this you can use addSuccess() method instead of addSuccessMessage() to create message.

It can be done by creating plugin forMagento\Checkout\Controller\Cart\Add controller. I would avoid overwriting whole execute() method only for this small change and rather use the following:

public function afterExecute()
{
    $lastAddedMessage = $this->messageManager->getMessages()->getLastAddedMessage();
    if ($lastAddedMessage && $lastAddedMessage->getType() == MessageInterface::TYPE_SUCCESS) {
        $text = $lastAddedMessage->getText();

        /**
         * @var \Magento\Framework\Message\Collection
         */
        $messages = $this->messageManager->getMessages();
        $messages->deleteMessageByIdentifier($lastAddedMessage->getIdentifier());

        $cartUrl = $this->_objectManager->get('Magento\Checkout\Helper\Cart')->getCartUrl();
        $this->messageManager->addSuccess($text . '<a href="'.$cartUrl.'">View cart</a>');
    }

    return $this->goBack();
}
1

etc\frontend\di.xml

<type name="Magento\Framework\View\Element\Message\MessageConfigurationsPool">
    <arguments>
        <argument name="configurationsMap" xsi:type="array">
            <item name="addProductAddSuccessMessage" xsi:type="array">
                <item name="renderer" xsi:type="const">\Magento\Framework\View\Element\Message\Renderer\BlockRenderer::CODE</item>
                <item name="data" xsi:type="array">
                    <item name="template" xsi:type="string">[Namespace_ModuleName]::messages/addProductSuccessMessage.phtml</item>
                </item>
            </item>
        </argument>
    </arguments>
</type>

Override Magento\Checkout\Controller\Cart\Add

Replace this

 $this->messageManager->addSuccessMessage($message);

with

$this->messageManager->addComplexSuccessMessage(
                    'addProductAddSuccessMessage',
                    [
                        'product_name' => $product->getName(),
                        'referer' => $this->_objectManager->get('Magento\Checkout\Helper\Cart')->getCartUrl()
                    ]
                );

messages/addProductSuccessMessage.phtml

<?php /* @escapeVerified */ echo __('You added %1 to your ', $block->escapeHtml($block->getData('product_name'))) ?> <?php /* @escapeNotVerified */ echo __('<a href="%1">shopping cart</a>.', $block->escapeUrl($block->getData('referer')));
0

With the message using in the frontend, it is being processed via function escapeHtml(params $allowedTags = null) in class \Magento\Framework\Escaper, so it is being processed by htmlspecialchars() and we can't change it.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.