2013-04-08 50 views
1

我對Magento項目的要求是賬戶分層。這是一個賬戶可以「擁有」多個其他賬戶。如果一個帳戶擁有另一個帳戶,則可以模擬該帳戶:創建訂單,查看帳戶信息和查看以前的訂單。Magento冒充用戶子賬戶

我不確定從哪裏開始。如果您有任何想法,可否請您指出正確的方向?

回答

0

一個解決方案是設置Multiple Select屬性並使用允許模擬的用戶的用戶ID來填充它。然後,您可以創建一個單獨的php文件,該文件運行magento並根據用戶選擇的日誌記錄用戶,或者將其集成到cms中。

這是我的自定義「登錄」代碼,可以讓我的用戶從我的Microsoft數據庫登錄到magento。

您調用此函數並將它傳遞給您想要登錄的「用戶」。似乎工作得很好,但是您需要根據需要進行修改。不要期望它能夠開箱即用!如果你沒有通過magento需要的關於dispatchevents()的所有垃圾,那麼用戶將不能正確登錄。我不得不逆向工程這整個事情鄧恩,所以不要指望看到它任何地方,除了在這裏和位和Magento的核心:)

$userId = 5; 
$user = Mage::getModel('customer/customer')->load($userId)->setWebsiteId(1); 
$this->LoginToMagento($user, null); 

function LoginToMagento($user, $noAddress) { 

     // Must include this file in order to use the object 
     include ('/var/www/app/code/core/Mage/Customer/controllers/AccountController.php'); 

     // Configure Magento to think its using the frontend 
     Mage::getSingleton("core/session", array("name" => "frontend")); 
     Mage::getConfig()->init(); 
     Mage::getConfig()->loadEventObservers('frontend'); 
     Mage::app()->addEventArea('frontend'); 
     Mage::app()->loadArea(Mage_Core_Model_App_Area::AREA_FRONTEND); 

     // Grab the request and modify it with my emulated controller's information 
     $request = Mage::app()->getRequest(); 
     $request->setRouteName('customer'); 
     $request->setControllerModule('Mage_Customer'); 
     $request->setRoutingInfo(''); 
     $request->setModuleName('customer'); 
     $request->setControllerName('account'); 
     $request->setModuleKey('module'); 
     $request->setControllerKey('account'); 
     $request->setActionName('loginPost'); 
     $request->setActionKey('action'); 

     // Grab the response 
     $response = Mage::app()->getResponse(); 

     // Feed the request and response into a new accountcontroller object 
     $accountControl = new Mage_Customer_AccountController($request, $response); 

     // Dispatch events related to the controller actions for predispatch 
     Mage::dispatchEvent('controller_action_predispatch', array('controller_action' => $accountControl)); 
     Mage::dispatchEvent('controller_action_predispatch_customer', array('controller_action' => $accountControl)); 
     Mage::dispatchEvent('controller_action_predispatch_customer_account_loginPost', array('controller_action' => $accountControl)); 

     // Grab an instance of the customer session model 
     $session = Mage::getSingleton('customer/session'); 

     try{ 
      // Attempt to login the user 
      $session->setCustomerAsLoggedIn($user); 
      $session->renewSession(); 

     } catch (Mage_Core_Exception $e) { 
      // Lets hope to never get here 
      $message = $e->getMessage(); 
      error_log($message); 
      Mage::getSingleton('core/session')->addError($message); 
     } 

// Perform the postdispatch events for 'after emulation of the controller' 
     Mage::dispatchEvent('controller_action_postdispatch_customer_account_loginPost', array('controller_action'=>$accountControl)); 
     Mage::dispatchEvent('controller_action_postdispatch_customer', array('controller_action'=>$accountControl)); 
     Mage::dispatchEvent('controller_action_postdispatch', array('controller_action'=>$accountControl)); 

     $customer = Mage::getModel('customer/customer') 
      ->getCollection() 
      ->addAttributeToSelect('*') 
      ->addAttributeToFilter('entity_id', array('eq' => $user->getId())) 
      ->getFirstItem(); 

     try 
     { 
      // Prepare a collection of required values that the customer *should* have been set from netforum 
      $collection = Mage::getModel('eav/entity_attribute')->getCollection(); 
      $collection->addFieldToFilter('entity_type_id', Mage::getModel('eav/entity')->setType('customer')->getTypeId()); 

      // The var representing if validation has failed 
      $failedReq = false; 

      // Loop through each user defined required attribute and if we find one 
      // on the customer that is not set, forward the user to their account config page 
      foreach ($collection as $attribute) 
      { 
       if ($attribute['is_required'] && $attribute['is_user_defined']) 
       { 
        $attrCode = $attribute['attribute_code']; 
        if (!isset($customer[$attrCode])) 
        { 
         $failedReq = true; 
        } 
       } 
      } 

      // Try to determine where we logged in from (URL) 
      Mage::getSingleton("core/session", array("name" => "frontend")); 
      $session = Mage::getSingleton("customer/session"); 
      $outputMessage = $session->getData('before_auth_url'); 


      // Proceeed differently based on the existence of addresses 
      if ($noAddress == true) 
      { 
       if ($failedReq) 
       { 
        // Customer failed login. To be expected if they are signing in with SSO and never have before 
        $redirect_to = 'https://' . $_SERVER['HTTP_HOST'] . '/customer/account/edit/'; 
        Mage::getSingleton('core/session')->addError('<b>Please fill in the required fields marked with * and click "Save"</b>'); 
        header("Location: $redirect_to"); 
       } 
       else 
       { 
        // Customer checks out ok, but has no addresses. Send them to the address setup screen 
        Mage::getSingleton('core/session')->addError('<b>Please fill in your address and phone number, then click "Save"</b>'); 
        $redirect_to = 'https://' . $_SERVER['HTTP_HOST'] . '/customer/address/edit/'; 
        header("Location: $redirect_to"); 
       } 

      } 
      else 
{ 
       // Customer has addresses being passed from SSO 
       $defaultBillingId = $customer->getDefaultBillingAddress()->getId(); 

       $hasPhoneNumber = false; 

       foreach ($customer->getAddresses() as $address) 
       { 
        $addrs = Mage::getModel('customer/address')->load($address->getId()); 
        $magePhone = $addrs->getTelephone(); 
        if ($magePhone) 
        { 
         $hasPhoneNumber = true; 
        } 
       } 

       if ($failedReq) 
       { 
        // Customer failed login. To be expected if they are signing in with SSO and never have before 
        $redirect_to = 'https://' . $_SERVER['HTTP_HOST'] . '/customer/account/edit/'; 
        Mage::getSingleton('core/session')->addError('<b>Please fill in the required fields marked with * and click "Save"</b>'); 
        header("Location: $redirect_to"); 

       } 
       else 
       { 
        // Customer is has default values filled out 
        if (!$hasPhoneNumber) 
        { 
         // Phone number is missing for an address so redirect there and force em to enter it. 
         Mage::getSingleton('core/session')->addError('<b>Please fill in the required fields marked with * and click "Save Address"</b>'); 
         $redirect_to = 'https://' . $_SERVER['HTTP_HOST'] . '/customer/address/edit/id/' . $defaultBillingId; 
         header("Location: $redirect_to"); 

        } 
        else 
        { 
         // Everything is ok, so just try to send them back to where they came from, or the account screen 
         if ($outputMessage) 
         { 
          $redirect_to = $outputMessage; 
         } 
         else 
         { 
          $redirect_to = 'https://' . $_SERVER['HTTP_HOST'] . '/customer/account/'; 
         } 
         header("Location: $redirect_to"); 
        } 
       } 
      } 
     } 
     catch (Exception $e) 
     { 
      if ($outputMessage) 
      { 
       $redirect_to = $outputMessage; 
      } 
      else 
      { 
       $redirect_to = 'https://' . $_SERVER['HTTP_HOST'] . '/customer/account/'; 
      } 
      header("Location: $redirect_to"); 
     } 
    } 
0

的作品,我知道我遲到了,但

http://amasty.com/sales-reps-and-dealers.html

此擴展可以幫助您實現您正在尋找的內容。它將允許創建分層賬戶並將銷售代表/子管理員分配給訂單並提供訪問級別。

希望這會有所幫助。