Magento, войти как клиент от администратора

Я расширил Mage_Adminhtml_CustomerController с помощью нового действия loginAction, чтобы иметь возможность входа в систему как клиент из интерфейса администратора.

Я вызываю loginById в customer/session, но после перенаправления клиентский сеанс не изменяется.

Может кто-нибудь объяснить, почему? Это должна быть простая операция.

Здесь представлен текст, содержащий loginAction

Я ценю любую помощь.

Спасибо!


Обновление:

Я создал github-repo, содержащий весь код для модуля: https://github.com/KATT/Magento-CustomerLogin.

Как только эта проблема будет решена, она может быть полезна и для кого-то другого.

Ответ 1

Привет, я создал способ входа в систему как клиент. Следуя приведенному ниже решению, вы можете получить действие в представлении управления сетью клиента в бэкэнд для каждого клиента:

Вам нужно создать контроллер для интерфейса и выполнить переписывание класса блока администратора, адаптироваться к вашей ситуации и не забудьте создать xml файл, который активирует ваш модуль в приложении /etc/modules/Yourmodule _Customer. XML Вот config.xml модуля, который вам нужно будет создать:

<?xml version="1.0"?>
<config>
<modules>
    <Yourmodule_Customer>
        <version>0.1.0</version>
    </Yourmodule_Customer>
</modules>
<global>
    <blocks>
      <adminhtml>
        <rewrite>
          <customer_grid>Yourmodule_Customer_Block_Adminhtml_Overwrite_Grid</customer_grid>
         </rewrite>
       </adminhtml>
</global>
<frontend>
    <routers>
        <customer>
            <args>
                <modules>
                    <customer before="Mage_Customer">Yourmodule_Customer_Overwrite</customer>
                </modules>
            </args>
        </customer>
    </routers>
</frontend>

Затем вам нужно создать класс блоков в папке Youmodule/Customer/Block/Adminhtml/Overwrite/Grid.php со следующим содержимым: Имейте в виду, что если у вас есть код Store в URL-адресе, вам необходимо указать код хранилища по умолчанию.

<?php
class Yourmodule_Customer_Block_Adminhtml_Overwrite_Grid extends Mage_Adminhtml_Block_Customer_Grid
{
    protected function _prepareColumns()
    {
        parent::_prepareColumns();

        $column = $this->getColumn('action');
        $actions = $column->getActions();
        $actions[] = array(
            'caption' => 'Log in',
            'popup' => true,
            'url' => array(
                'base' => 'customer/support/autologin',
                'params' => array('_store' => 'de', '_secure' => true)),
                'field' => 'customerid'
        );
        $column->setActions( $actions );

        return $this;
    }
}

Затем вам нужно создать новый внешний контроллер, в этом случае он ограничивается разрешенным IP-адресом, определенным в конфигурации бэкэнд:

<?php
class Yourmodule_Customer_Overwrite_SupportController extends Mage_Core_Controller_Front_Action
{
    public function preDispatch(){

        parent::preDispatch();

        if (!$this->getRequest()->isDispatched()) {
            return;
        }

        $action = $this->getRequest()->getActionName();
        $pattern = '/^(autologin)/i';
        if (!preg_match($pattern, $action) && Mage::helper('core')->isDevAllowed(Mage::app()->getStore()->getId())) {
            if (!$this->_getSession()->authenticate($this)) {
                $this->setFlag('', 'no-dispatch', true);
            }
        } else {
            $this->_getSession()->setNoReferer(true);
        }
    }

    public function autologinAction(){
        $session = $this->_getSession();

        $id = (int) trim($this->getRequest()->getParam('customerid'));
        try{
            if($id){
                $customer = Mage::getModel('customer/customer')->load($id);
                $session->setCustomerAsLoggedIn($customer);
                $message = $this->__('You are now logged in as %s', $customer->getName());
                $session->addNotice($message);
                Mage::log($message);
            }else{
                throw new Exception ($this->__('Auto Loggin didn\'t worked. Some parameter are missing'));
            }
        }catch (Exception $e){
            $session->addError($e->getMessage());
        }
        $this->_redirect('customer/account');       
    }

    public function _getSession(){
        return Mage::getSingleton('customer/session');
    }
}

Ответ 2

Разве вы не судимы для входа через модель клиента?

$customer = Mage::getModel('customer/customer');
$customer->setWebsiteId(Mage::app()->getWebsite()->getId());
$customer->loadByEmail($email);
OR
Mage::getSingleton('customer/session')->loginById($customer->getId());

Ответ 3

Я понимаю, что этот вопрос уже был дан, но для тех, кто ищет несколько иной (не говорящий лучше) подход, вот расширение Magento, которое я написал https://github.com/ajzele/Inchoo_LoginAsCustomer. Он не переписывает какие-либо блоки, он использует event/observer для ввода кнопки "Вход в систему как клиента" на экране редактирования клиента. Он также использует комбинацию администратора и внешнего контроллера для передачи зашифрованной информации о клиентах, чтобы он знал, к какому клиенту войти.

Ответ 4

Для тех, кто не хочет отлаживать решение, вы можете установить расширение через magento connect: http://www.magentocommerce.com/magento-connect/login-as-customer-9893.html Он позволяет входить в систему с пользовательского вида и просматривать страницы просмотра от администратора. Расширение стабильно и отлично работает во всех случаях.