Cómo saber si el cliente ha iniciado sesión o no en Magento 2.
Si el cliente ha iniciado sesión, ¿cómo obtener los datos del cliente de la sesión?
magento2
customer
login
customer-account
customer-session
Rakesh Jesadiya
fuente
fuente
text/x-magento-init
inicio de sesión desde un módulo Magento JS ( ), puede ahorrar un poco de sobrecarga evitando la creación de instancias de ObjectManager y pasando el estado al objeto de configuración del módulo, y en su lugar consulte el enlace de inicio de sesión desde dentro del módulo JS, por ejemplo:var isLoggedIn = $('.authorization-link > a').attr('href').indexOf('/login')<0;
Respuestas:
El siguiente código puede verificar el inicio de sesión del cliente o no en ningún lugar
Desde el controlador
fuente
Recordatorio importante: nunca se debe llamar al Administrador de objetos directamente
Así, aquí está cómo hacerlo de manera limpia
En cualquier clase excepto plantillas
Primero debe inyectar la siguiente clase en su constructor
/Magento/Customer/Model/Session
:Luego, en su clase, puede llamar a lo siguiente:
En una plantilla
Requiere un poco más de trabajo en una plantilla, ya que tendrá que configurar una preferencia para el bloque que hace que la plantilla lo haga de manera limpia:
Luego, en su contrusctor de bloque personalizado, debe seguir la misma inyección de dependencia que para cualquier clase (explicada anteriormente).
El paso adicional aquí es crear un método público que pueda usarse en su plantilla para verificar si un cliente ha iniciado sesión o no.
Luego, en su plantilla puede llamar:
Alternativa si la sesión del cliente aún no se ha inicializado
Hay otra forma de hacerlo que implica usar en
Magento\Framework\App\Http\Context
lugar deMagento/Customer/Model/Session
Luego puede llamar en
$this->_context->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH)
lugar de$this->_session->isLoggedIn()
verificar si el cliente ha iniciado sesión o no.Sin embargo, este método puede brindarle resultados diferentes , le sugiero que lea esta excelente respuesta para obtener más información: https://magento.stackexchange.com/a/92133/2380
fuente
<preference ... />
etiqueta dentro de un tema personalizado? ¿Qué son exactamenteBlock\That\Renders\The\Template
yVendor\Module\Block\Your\Custom\Block
?class Html extends \Magento\Framework\View\Element\Template
donde puedo inyectar el objeto de sesión en el constructor. Yo uso este bloque dentro de mi tema personalizado de esta manera (de archivos de diseño xml):<block class="Vendor\ThemeName\Block\Html" template="Vendor_ModuleName::html/my-custom-template.phtml"/>
. Me gustaría verificar el usuario registrado dentro del archivo de plantillamy-custom-template.phtml
. ¿Cómo debo usar la etiqueta `<preferencia ... />?Es posible vía
Magento\Framework\App\Http\Context
o víaMagento\Customer\Model\Session
. Sin embargo, el resultado puede ser diferente:PageCache
módulo está encendido (probablemente siempre en producción), tenga en cuenta que tan pronto como comience la generación del diseño, la sesión del cliente se borrará\Magento\PageCache\Model\Layout\DepersonalizePlugin::afterGenerateXml
en todas las páginas almacenables en caché. Significa que si ahora verifica si el cliente ha iniciado sesión a través del contexto HTTP, seguirá diciendo 'sí', pero los datos del cliente ya no estarán disponibles en la sesión del cliente. Por lo tanto, es necesario verificar dos veces antes de intentar acceder a los datos en la sesión del cliente. Esto puede suceder fácilmente en bloque, aunque es poco probable en el controlador de acción, ya que no se espera que genere el diseño manualmente allí, se generará después de que el controlador de acción devuelva la instancia deResultInterface
Para eliminar cualquier riesgo de inconsistencias descritas cuando PageCache está activado, considere usar la sesión del cliente, si ya está inicializada (cierto para los controladores de acción). De lo contrario, use el contexto HTTP.
fuente
fuente
Ninguna de estas soluciones funcionó para mí. Algunas páginas parecerían estar conectadas pero otras no. Parece que este es el error:
https://github.com/magento/magento2/issues/3294
Terminé creando un ayudante al que podría llamar en mis plantillas:
Entonces podría usar el ayudante en mis plantillas así:
fuente
->getCustomer()->getName()
usando el contexto, porque si uso la sesión no funciona para todas las páginas?Para que el usuario inicie sesión en la plantilla, simplemente puede llamar al ayudante en una sola línea:
fuente
Ninguna de las soluciones aquí funcionó para mí de manera confiable en Magento v2.1 con Full Page Cache and Varnish habilitado en modo Producción. Finalmente encontré una solución que funcionó el 100% del tiempo con todo el almacenamiento en caché habilitado después de obtener la idea
vendor/magento/module-theme/view/frontend/templates/html/header.phtml
. Aquí está mi solución, que muestra un enlace "Iniciar sesión" cuando el usuario cierra sesión y un enlace "Cerrar sesión" cuando el usuario inicia sesión:ACTUALIZACIÓN: desde v2.1.5 esta solución ya no es confiable. Vea el problema 9156 para una solución.
fuente
cachable="false"
diseño XML para este bloque, pero aparentemente el barniz todavía lo está almacenando en caché. No estoy seguro de si esto es un error o no, pero Knockout es una buena manera de sortear esto. El único inconveniente es que hay un pequeño retraso antes de que aparezca el enlace Iniciar / Cerrar sesión debido al enlace KO.Hay muchas respuestas por ahí que van más o menos así ...
OBTENGA EL GERENTE DE OBJETOS MODELO DE CLASE DE CARGA
Esta es la metodología INCORRECTA para usar en Magento2.0. En 2.0, las fábricas de objetos autogenerados son el camino a seguir. Puede inyectarlos en su constructor en casi cualquier clase y usarlos. Ejemplo:
fuente
\Magento\Customer\Model\SessionFactory $sessionFactory
.Hola tengo respuesta aquí:
Fuente .
Reemplazar get con create ahora funciona bien:
fuente
ObjectManager
directamenteEsta también es una de las soluciones "Compruebe si el cliente ha iniciado sesión o no en Magento2"
Pruebe el siguiente código:
fuente
Pruebe el siguiente código:
Para usar el código anterior en el archivo phtml, puede llamar a la función isLoggedIn () como:
Espero que esta ayuda, gracias.
fuente
Tengo la mejor solución. Se basa en la autenticación del cliente . Algunas de las sesiones de clientes no funcionaban, pero cada vez que mi solución funcionara Vamos a ver.
Gracias.
fuente
Solución actual trabajada (en mi humilde opinión)
fuente
Si desea verificar si el cliente inició sesión o no, use este código en archivos phtml,
fuente
ObjectManager
directamente y nunca debe usar este tipo de código en una plantilla. Debe crear funcionalidades en su clase de bloque para gestionar esto.fuente
Otra respuesta:
¿Qué piensas?
fuente
Obtener el estado registrado del modelo de sesión no funcionará en caso de que desee usarlo después de habilitar el caché FPC predeterminado de Magento, en ese caso, debe usar SessionFactory en su lugar.
La sesión no se inicia si el almacenamiento en caché FPC está habilitado, detalles: https://github.com/magento/magento2/issues/3294#issuecomment-328464943
Para resolver esto, debe usar
SessionFactory
, por ejemplo:fuente
Intenté muchas formas encontradas en google pero ninguna de las soluciones funciona. Entonces, verifiqué la funcionalidad principal y creé un archivo php para verificar que un cliente haya iniciado sesión o no sin usar Object Manager.
Para obtener más información, compruébelo aquí http://blog.webtechnologycodes.com/customer-loggedin-check-magento2
fuente