php - spanish - magento 2 admin español
Magento: Detecta si el administrador está conectado en las páginas frontales (12)
¡Las soluciones anteriores no funcionan!
Aquí hay una solución que funciona (¡no está tan limpia! ¡Pero esto funcionará en cualquier lugar de tu aplicación en la vista phtml o modelo o controlador o ayudante!)
$sesId = isset($_COOKIE[''adminhtml'']) ? $_COOKIE[''adminhtml''] : false ;
$session = false;
if($sesId){
$session = Mage::getSingleton(''core/resource_session'')->read($sesId);
}
$loggedIn = false;
if($session)
{
if(stristr($session,''Mage_Admin_Model_User''))
{
$loggedIn = true;
}
}
var_dump($loggedIn);// this will be true if admin logged in and false if not
He creado una extensión magento. Quiero implementar el acceso a la extensión. La extensión crea una página en el frontend y solo quiero que el administrador acceda a esa página. Entonces, básicamente, necesito algo que detecte si el administrador está conectado en las páginas frontales.
He intentado varias soluciones, pero parece que funcionan.
if(Mage::getSingleton(''admin/session'', array(''name'' => ''adminhtml''))->isLoggedIn()) echo ''logged in''; else echo ''not logged in'';
Compruebe en la interfaz si el administrador está conectado
Mage::getSingleton(''core/session'', array(''name''=>''adminhtml''));
$adminSession = Mage::getSingleton(''admin/session'');
$adminSession->start();
if ($adminSession->isLoggedIn()) {
echo ''logged in'';
}
Además de tratar de extraer el ID de sesión de la cookie de adminhtml, que puede o no funcionar en mi humilde opinión, es mejor "desollar" la página que necesita mostrar para que se vea como en frontend y usar el controlador de administración para que se ejecute en la sesión de administrador.
Otra solución es "copiar" al cliente del administrador al frontend e iniciar sesión antes de acceder a su página, y luego se trata solo de verificar si el cliente registrado es miembro de algún grupo.
Aquí hay una solución que funciona con Magento 1.7.0.2 (probado) y en cada sitio frontend, utilizo esto en un controlador que no se extiende desde Mage_Adminhtml_Controller_Action.
https://peters-christoph.de/tutorials/magento-pruefe-admin-session-logi-im-frontend/
Christoph Peters publicó un enlace que resolvió mi problema (Detecta si el administrador está conectado en las páginas frontales):
//check if adminhtml cookie is set
if(array_key_exists(''adminhtml'', $_COOKIE)){
//get session path and add dir seperator and content field of cookie as data name with magento "sess_" prefix
$sessionFilePath = Mage::getBaseDir(''session'').DS.''sess_''.$_COOKIE[''adminhtml''];
//write content of file in var
$sessionFile = file_get_contents($sessionFilePath);
//save old session
$oldSession = $_SESSION;
//decode adminhtml session
session_decode($sessionFile);
//save session data from $_SESSION
$adminSessionData = $_SESSION;
//set old session back to current session
$_SESSION = $oldSession;
if(array_key_exists(''user'', $adminSessionData[''admin''])){
//save Mage_Admin_Model_User object in var
$adminUserObj = $adminSessionData[''admin''][''user''];
echo ''ADMIN USER IS LOGGED IN'';
}
else
{
echo ''ADMIN USER IS NOT LOGGED IN''
}
}
¡Muchas gracias Christoph Peters!
Es bastante simple, pero no es una solución recomendada. Yo mismo gasto horas para hacer esto. Para, el servidor basado en Windows pruebe la siguiente solución:
$sessionFilePath = Mage::getBaseDir(''session'').DS.''sess_''.$_COOKIE[''adminhtml''];
$sessionFile = file_get_contents($sessionFilePath);
$exp_cookie = explode('';'',$sessionFile);
if(count($exp_cookie) > 100)
{
return "login";
}
return "expire";
Para, el servidor basado en Linux pruebe la siguiente solución:
$sessionFilePath = Mage::getBaseDir(''session'').DS.''sess_''.$_COOKIE[''adminhtml''];
$sessionFile = file_get_contents($sessionFilePath);
$exp_cookie = explode(''--'',$sessionFile)
if(count($exp_cookie) > 10)
{
return "login";
}
return "expire";
Gracias, Kashif
Este código funcionará
//get the admin session
Mage::getSingleton(''core/session'', array(''name''=>''adminhtml''));
//verify if the user is logged in to the backend
if(Mage::getSingleton(''admin/session'')->isLoggedIn()) {
//do stuff
}
else
{
echo "404 page not found";
}
O
$adminsession = Mage::getSingleton(''admin/session'', array(''name''=>''adminhtml''));
if($adminsession->isLoggedIn()) {
//do stuff
} else {
echo "404 page not found";
}
¿ $_SESSION
volcar la variable $_SESSION
? Tal vez te ayude a ir por el camino correcto.
La clave para poder usar:
// Ensure we''re in the admin session namespace for checking the admin user..
Mage::getSingleton(''core/session'', array(''name'' => ''adminhtml''))->start();
$admin_logged_in = Mage::getSingleton(''admin/session'', array(''name'' => ''adminhtml''))->isLoggedIn();
// ..get back to the original.
Mage::getSingleton(''core/session'', array(''name'' => $this->_sessionNamespace))->start();
es que el controller
debe extends Mage_Adminhtml_Controller_Action
de lo que puede usar este código en la función preDispatch
.
Y configure los routers
para este controlador en la sección de admin
de su config.xml
.
Si está utilizando la sesión de cm redis intente esto: (funcionó para mí)
$sesId = isset($_COOKIE[''adminhtml'']) ? $_COOKIE[''adminhtml''] : false ;
if($sesId){
$session = Mage::getSingleton(''core_mysql4/session'')->read($sesId);
}
$loggedIn = false;
if($session)
{
if(stristr($session,''Mage_Admin_Model_User''))
{
$loggedIn = true;
}
}
var_dump($loggedIn);
porque si usa cm redis, reescribe el módulo de sesión de db con su propio modelo.
Si intenta hacer que funcione dentro de la plantilla / archivos phtml, y / o dentro de la clase del Bloque, va a ser difícil. Principalmente porque magento (agresivamente) almacena en caché tus bloques de PHTML para fines de rendimiento, deshaciendo así cualquier declaración de control de flujo de programa que tengas especialmente relacionada con la comprobación de cookies. No tengo una explicación directa / larga / profunda por qué, pero así es como lo he encontrado una y otra vez.
Sin embargo, su solución debe ser correcta, pero debe verificarla con el método preDispatch de un controlador, como para evitar los cachés agresivos ya mencionados, ya que los controladores nunca se almacenan en caché. (se muestra en Nick''s solución Nick''s en la pregunta que vinculó):
// Ensure we''re in the admin session namespace for checking the admin user..
Mage::getSingleton(''core/session'', array(''name'' => ''adminhtml''))->start();
$admin_logged_in = Mage::getSingleton(''admin/session'', array(''name'' => ''adminhtml''))->isLoggedIn();
// ..get back to the original.
Mage::getSingleton(''core/session'', array(''name'' => $this->_sessionNamespace))->start();
Si realmente necesita realizar las comprobaciones anteriores dentro de archivos PHTML o bloques con nombre, consulte el siguiente código sobre cómo desactivar el almacenamiento en caché a nivel de bloque y posiblemente hacerlo funcionar. Lo que hice antes fue deshabilitar el almacenamiento en caché para el bloque de pie de página (en el que el bloque secundario, no phtml, contiene código para verificar
para una cookie específica)
Primero, la llamada al bloque (que se encuentra en su archivo local.xml, o la actualización del diseño del módulo xml, o en cualquier lugar donde pueda hacer actualizaciones de diseño. Prefiero dividir mis personalizaciones en módulos, así que definitivamente la actualización del diseño del módulo xml es el camino a seguir) :
<reference name="footer">
<action method="unsetData"><key>cache_lifetime</key></action>
<action method="unsetData"><key>cache_tags</key></action>
<block type="newsletterpopup/popup" name="newsletterpopup_footer" template="newsletterpopup/popup.phtml"/>
</reference>
Y esta es la clase de bloques de newsletterpopup:
<?php
class Launchpad_Newsletterpopup_Block_Popup extends Mage_Core_Block_Template {
public function canRender() {
// Check if cookie exists here
}
public function afterRender() { // if block has rendered, this is called.
// Set cookie, if it doesn''t exist here.
}
}
Y el phtml sería algo así como:
<?php if($this->canRender()): ?>
// stuff
<?php endif; ?>
¡Buena suerte!
Verifique este blog , creo que no necesita verificar con start()
antes de verificar con isLoggedIn()
.
Mage::getSingleton(''core/session'', array(''name''=>''adminhtml'')); // get sessions
$check = Mage::getSingleton(''admin/session'', array(''name''=>''adminhtml'')); //get admin sessions
if($check->isLoggedIn()) { //check is admin logged in
echo "Admin is logged in";
} else {
echo "Admin is offline";
}
hay un nuevo módulo de magento, escrito por alan storm: https://github.com/astorm/Magento_CrossAreaSessions
$adminhtml = Mage::getModel(''pulsestorm_crossareasession/manager'')->getSessionData(''adminhtml'');
$adminUser = $dataAdminhtml[''admin''][''user''];
$loggedIn = $adminUser->getId() && $adminUser->getIsActive();
require_once $dir.''app/Mage.php'';
umask(0);
$apps = Mage::app(''default'');
Mage ::getSingleton(''core/session'', array(''name''=>''adminhtml''));
$adminSession = Mage::getSingleton(''admin/session'');
$adminSession->start();
if ($adminSession->isLoggedIn()) {
//echo "logged in";
}
else {
//echo "Not logged in";
exit();
}?>