У меня есть веб-сервер с Magento 1.4.0.1. У меня есть другой веб-сайт, который делится с ним учетными данными. Мне удалось проверить, зарегистрирован ли клиент или нет (после изменения местоположения файлов cookie в Magento), но все осложнилось, когда я также попытался выяснить, был ли администратор включен. Я могу получить правильный ответ для первого сеанса я попросил (либо клиент ИЛИ администратор, второй НИКОГДА не вошел в систему).
Как я могу получить оба ответа?
Вот код, который я использую, чтобы проверить это:
require_once '../app/Mage.php'; umask(0) ; Mage::app(); // Checking for customer session Mage::getSingleton('core/session', array('name'=>'frontend') ); $session=Mage::getSingleton('customer/session', array('name'=>'frontend') ); if ($session->isLoggedIn()) { echo "Customer is logged in"; } else { echo "Customer is not logged in"; } // Checking for admin session Mage::getSingleton('core/session', array('name'=>'adminhtml') ); $adminsession = Mage::getSingleton('admin/session', array('name'=>'adminhtml')); if($adminsession->isLoggedIn()) { echo "Admin Logged in"; } else { echo "Admin NOT logged in"; }
Таким образом, с таким кодом, администратор никогда не войдет в систему. Если вы сначала поместите часть об администраторе, клиент никогда не войдет в систему. Кажется, мне не хватает строки между двумя запросами.
Это может быть та же проблема, что и этот неотвеченный вопрос: Magento, как проверить, зарегистрирован ли администратор внутри модуля контроллера
Это похоже на популярную проблему, но я не смог найти правильное решение …
Спасибо за вашу помощь!
Что вам нужно сделать, это переключить данные сеанса. Вы можете сделать это со следующим кодом:
$switchSessionName = 'adminhtml'; $currentSessionId = Mage::getSingleton('core/session')->getSessionId(); $currentSessionName = Mage::getSingleton('core/session')->getSessionName(); if ($currentSessionId && $currentSessionName && isset($_COOKIE[$currentSessionName])) { $switchSessionId = $_COOKIE[$switchSessionName]; $this->_switchSession($switchSessionName, $switchSessionId); $whateverData = Mage::getModel('mymodule/session')->getWhateverData(); $this->_switchSession($currentSessionName, $currentSessionId); } protected function _switchSession($namespace, $id = null) { session_write_close(); $GLOBALS['_SESSION'] = null; $session = Mage::getSingleton('core/session'); if ($id) { $session->setSessionId($id); } $session->start($namespace); }
Я обнаружил, что «функция ошибок» с другого угла зрения (попытка входа в систему с админсайда), но все же нашла причину.
Проблема заключается в функции session_name (). Если вы перейдете в Mage_Core_Model_Session_Abstract_Varien, вы увидите, что объект сеанса использует стандартные функции сеанса PHP, и PHP не может одновременно обрабатывать два сеанса.
Идентификатор сеанса для adminside хранится в файле cookie adminhtml, тогда как для клиентов ваш идентификатор сеанса находится в файле cookie frontend. Затем в adminside у вас есть идентификатор сеанса, инициализированный adminhtml cookie. Когда в adminside ваш объект client / session хранится внутри чего-то вроде $ _SESSION ['customer'] (не проверял точный ключ) внутри сеанса PHP для идентификатора, хранящегося в файле adminhtml cookie. Это означает, что объект customer / session ссылается на разные сеансы, когда внутри admin и клиентских частей magento.
Вот что я использую.
Mage::getSingleton('core/session', array('name'=>'adminhtml')); $session = Mage::getSingleton('admin/session');; if (!$session->getUser()) { die("You aren't an admin!"); }
Это довольно простое, но не рекомендуемое решение. Я сам потратил несколько часов, чтобы сделать это. Для Windows-сервера попробуйте выполнить следующее решение:
$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";
Для Linux-сервера попробуйте выполнить следующее решение:
$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";
Спасибо, Кашиф
Вот простой скрипт, чтобы проверить, что администратор зарегистрирован или нет, и если вы зашли в систему, получите данные администратора Magento. Вы можете позвонить на сеанс и вызвать функцию пользователя, чтобы получить все подробности.
$userDetails = Mage::getSingleton('admin/session'); // Get data from the session $userID = $userDetails->getUser()->getUserId(); // Get user ID $userID = $userDetails->getUser()->getEmail(); // Get user Email
Подробнее см. http://webexplorar.com/magento-admin-details/ .