Comment ajouter Cookie Magento 2?


16

Je veux ajouter un COOKIE avec de la valeur et une certaine durée, comment le faire dans magento 2.

Merci

Réponses:


25

OMI, la meilleure approche serait de créer une classe pour envelopper la création de cookies et ensuite l'utiliser simplement où vous le souhaitez.

La classe des cookies

{Vendor} / {Module} /Cookie/Example.php

<?php 

namespace Vendor\Module\Cookie;

use Magento\Framework\Stdlib\CookieManagerInterface;
use Magento\Framework\Stdlib\Cookie\CookieMetadataFactory;
use Magento\Framework\Session\SessionManagerInterface;

class Example
{
    /**
     * Name of cookie that holds private content version
     */
    const COOKIE_NAME = 'example';

    /**
     * CookieManager
     *
     * @var CookieManagerInterface
     */
    private $cookieManager;

    /**
     * @var CookieMetadataFactory
     */
    private $cookieMetadataFactory;

    /**
     * @var SessionManagerInterface
     */
    private $sessionManager;

    /**
     * @param CookieManagerInterface $cookieManager
     * @param CookieMetadataFactory $cookieMetadataFactory
     * @param SessionManagerInterface $sessionManager
     */
    public function __construct(
        CookieManagerInterface $cookieManager,
        CookieMetadataFactory $cookieMetadataFactory,
        SessionManagerInterface $sessionManager
    ) {
        $this->cookieManager = $cookieManager;
        $this->cookieMetadataFactory = $cookieMetadataFactory;
        $this->sessionManager = $sessionManager;
    }

    /**
     * Get form key cookie
     *
     * @return string
     */
    public function get()
    {
        return $this->cookieManager->getCookie(self::COOKIE_NAME);
    }

    /**
     * @param string $value
     * @param int $duration
     * @return void
     */
    public function set($value, $duration = 86400)
    {
        $metadata = $this->cookieMetadataFactory
            ->createPublicCookieMetadata()
            ->setDuration($duration)
            ->setPath($this->sessionManager->getCookiePath())
            ->setDomain($this->sessionManager->getCookieDomain());

        $this->cookieManager->setPublicCookie(
            self::COOKIE_NAME,
            $value,
            $metadata
        );
    }

    /**
     * @return void
     */
    public function delete()
    {
        $metadata = $this->cookieMetadataFactory
            ->createPublicCookieMetadata()
            ->setDuration($duration)
            ->setPath($this->sessionManager->getCookiePath())
            ->setDomain($this->sessionManager->getCookieDomain());

        $this->cookieManager->deleteCookie(
            self::COOKIE_NAME,
            $metadata
        );
    }
}

Cet exemple était basé sur Magento \ Framework \ App \ PageCache \ FormKey et représente un seul cookie avec le nom "exemple"

Si vous souhaitez ajouter des propriétés personnalisées aux métadonnées $ ( PublicCookieMetadata ) en changeant le chemin, http_only, etc., vous devez refactoriser les méthodes set()et / ou delete().

Comment l'utiliser

Vous pouvez accéder à cette classe en utilisant simplement le gestionnaire d'objets dans presque n'importe où (approche laide):

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$objectManager->get('Vendor\Module\Cookie\Example')
    ->set('value', 3600);

Selon "où" vous devez créer le cookie, vous pouvez jeter un œil au constructeur de votre classe peut-être que vous avez déjà un gestionnaire d'objets là-bas, sinon vous pouvez également l'injecter dans le constructeur.


@J. John, hé! i juts a vu que vous acceptiez la réponse pendant que je l'ai éditée, jetez un coup d'œil maintenant, car j'ai apporté plusieurs modifications afin de simplifier la mise en œuvre.
MauroNigrele

3
J'ai à modifier createCookieMetaData()à createPublicCookieMetadata()en setméthode pour résoudre l'erreur (erreur fatale). Une approche intelligente!
RT

Quelle est la différence entre Magento\Framework\Session\SessionManagerInterfaceutilisé par vous et Magento\Framework\Session\Config\ConfigInterfaceutilisé dans Magento\Framework\Session\SessionManager?
LucScu

L'appel de fonction @MauroNigrele dans la méthode set et delete doit être createPublicCookieMetadata au lieu de createCookieMetadata
Shivam

1
Les gars. J'ai proposé des changements car il $this->createPublicCookieMetadata()n'existe pas dans cette classe. Ce devrait être $this->cookieMetadataFactory->createPublicCookieMetadata() See in magento repo . Mais j'ai 2 rejets. LOL ...
spiil

-1

Vous pouvez définir et obtenir des cookies en utilisant la fonction de base php comme ceci:

//set cookie
$cookie_name = "magento";
$cookie_value = "How to Cookie";
setcookie($cookie_name, $cookie_value, time()+3600); /* expire in 1 hour */

//get cookie
if(!isset($_COOKIE[$cookie_name])) {
    echo "Cookie named '" . $cookie_name . "' is not set!";
} else {
    echo "Cookie '" . $cookie_name . "' is set!<br>";
    echo "Value is: " . $_COOKIE[$cookie_name];
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.