我使用新操作Mage_Adminhtml_CustomerController
扩展了loginAction
,以便能够从管理界面以客户身份登录。
我呼叫loginById
上的customer/session
,但重定向后客户的会话未被修改。
有人可以解释原因吗?这应该是一个简单的操作。
Here's a gist包含loginAction
我感谢任何帮助。
谢谢!
我创建了一个包含该模块所有代码的github-repo:https://github.com/KATT/Magento-CustomerLogin。
一旦这个问题得到解决,它也可能对其他人有用。
答案 0 :(得分:9)
您好我创建了一种以客户身份登录的方式。通过以下解决方案,您可以在后端的客户网格管理视图中为每个客户获取一个操作:
你必须为前端创建一个控制器并对一个管理块进行类重写,请适应你的情况,不要忘记在app / etc / modules / Yourmodule_Customer创建一个激活模块的xml文件。 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中创建一个块类,其中包含以下内容: 请注意,如果激活了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');
}
}
答案 1 :(得分:1)
我意识到这个问题已经得到了回答,但是对于那些寻找不同(不是说更好)方法的人来说,这里是我编写的https://github.com/ajzele/Inchoo_LoginAsCustomer的Magento扩展。它不会重写任何块,它使用事件/观察器在客户编辑屏幕上注入Login as Customer按钮。它进一步使用管理员和前端控制器的组合来传递加密的客户信息,以便知道要登录的客户。
答案 2 :(得分:0)
你不应该通过客户模式登录吗?
$customer = Mage::getModel('customer/customer');
$customer->setWebsiteId(Mage::app()->getWebsite()->getId());
$customer->loadByEmail($email);
OR
Mage::getSingleton('customer/session')->loginById($customer->getId());
答案 3 :(得分:0)
对于那些不想调试解决方案的人,可以通过magento connect安装扩展: http://www.magentocommerce.com/magento-connect/login-as-customer-9893.html 它允许从管理员的客户视图和订单视图页面登录。扩展是稳定的,并且在所有情况下都能正常工作