Magento 1.9: Выберите группу клиентов при регистрации


Это сводит меня с ума. Я следил за каждым учебником, который я нашел, и он не работает. Я просто пытаюсь включить радиогруппу на экране регистрации, чтобы клиент мог выбрать "Корпоративный" или "Индивидуальный".

Я создал свой модуль на

/app/code/local/company/CoreModifications/Controllers/AccountController.php

Это переопределяет основную функцию по умолчанию с помощью:

     class Company_CoreModifications_Customer_AccountController extends  Mage_Customer_AccountController {


    /**
     * Get Customer Model. Overrides Magento function to setup group depending on customer selection.
     *
     * @return Mage_Customer_Model_Customer
     */
    protected function _getCustomer()
    {
        $customer = $this->_getFromRegistry('current_customer');
        if (!$customer) {
            $customer = $this->_getModel('customer/customer')->setId(null);
        }
        if ($this->getRequest()->getParam('is_subscribed', false)) {
            $customer->setIsSubscribed(1);
        }
        /**
         * Initialize customer group id
         */

        if($this->getRequest()->getPost('group_id')){
            $customer->setGroupId($this->getRequest()->getPost('group_id'));
        } else {
            $customer->getGroupId();
        }        

        return $customer;
    }
}

Я настроил файл конфигурации своего модуля с помощью:

 <frontend>
  <routers>
  <customer>
    <args>
      <modules>
        <Company_CoreModifications before="Mage_Customer">Company_CoreModifications_Customer</Company_CoreModifications>
      </modules>
    </args>
  </customer>
 </routers>
</frontend>

Я изменил клиента config.xml на /app/code/core/Mage/Customer/etc/config.xml с помощью:

 <global>
   <fieldsets>
     <customer_account>
        ...  //rest of config fieldsets
       <group_id>
         <create>1</create>
         <update>1</update>
       </group_id>
     <customer_account>
   <fieldsets>
 <global>

И, конечно, я изменил свой шаблон, включив в него радиогруппу:

        <div class="radiogroup">
            <input name="group_id" class="user_type" value="4" type="radio" tabindex="1">
            <label for="group_id_1">Corporate</label>
            <input name="group_id" class="user_type" value="1" checked="checked" type="radio" tabindex="2">
            <label for="group_id_2">Individual</label>
        </div>

Но значение не сохраняется в базе данных Примеры, которые я нашел, сделаны на версиях до Magento 1.9, которую я использую.

Я пытался следить за процессом сохранения в Magento, и кажется, что он сохраняет объект клиента с правильными данными, но это еще не сохранено в базе данных, затем он сохраняет два объекта адреса, а затем снова другой объект клиента если сведения о клиенте верны, но идентификатор group_id изменен на значение по умолчанию, в моем случае 1. После этого объект сохраняется, поэтому идентификатор group_id неверен (в моих тестах я хочу получить 4).

Author: dh47, 2015-10-06

2 answers

Я полагаю, что Magento использует контроллер по умолчанию (т.Е. Mage_Customer_AccountController) сам для обработки создания клиента в этом случае.

Есть некоторые проблемы/предложения, которые мне нужно выдвинуть.

  1. Ваше местоположение контроллера неверно. Это должно быть /app/code/local/Company/CoreModifications/controllers/Customer/AccountController.php вместо /app/code/local/company/CoreModifications/Controllers/AccountController.php

  2. Ваше определение контроллера должно выглядеть следующим образом.

    <?php
    require_once(Mage::getModuleDir('controllers','Mage_Customer').DS.'AccountController.php');
    
    class Company_CoreModifications_Customer_AccountController
        extends  Mage_Customer_AccountController
    {
        // some code
    }
    

    Для получения дополнительной информации о том, как перезаписать контроллер, вы можете обратиться это ссылка

  3. Не редактируйте основной файл. т.е. не редактируйте app/code/core/Mage/Customer/etc/config.xml. Это неправильно. Вы можете сделать то же самое в файле вашего модуля config.xml

    <config>
        ...
        <default>
            <customer>
                <create_account>
                    <group_id>
                        <create>1</create>
                        <update>1</update>
                    </group_id>
                </create_account>
            </customer>
        </default>
    </config>
    

    На самом деле, AFAIK это заявление вовсе не обязательно для достижения того, что вы пытаетесь сделать. Таким образом, вы можете пропустить этот шаг.

  4. Ваш код внутри метода _getCustomer() выглядит для меня нормально. Однако вы можете улучшить свой код таким образом.

    if($this->getRequest()->getPost('group_id', false)){
        $groupId = (int)$this->getRequest()->getPost('group_id');
        $this->setData('group_id', $groupId);
    } else {
        $customer->getGroupId();
    }  
    
  5. В конечном счете, дважды проверьте имена ваших папок и места. Расположение папки вашего модуля app/code/local/Company/CoreModifications/

  6. И последнее, но не менее важное: убедитесь, что вы очистили кэш.

 0
Author: Rajeev K Tomy, 2015-10-07 05:04:07

Вы пытаетесь извлечь данные с помощью метода POST. Мое предложение - использовать метод запроса для выборки group_id в вашем контроллере. Также проверка с помощью $this->getRequest()->getParam('group_id', false) вернет правильное значение в вашем контроллере

 if($this->getRequest()->getPost('group_id')) {
     $customer->setGroupId($this->getRequest()->getPost('group_id'));
 } else {
     $customer->getGroupId();
 } 

ЧТОБЫ

if ($this->getRequest()->getParam('group_id', false)) {      
    $customer->setGroupId($this->getRequest()->getParam('group_id', false)); 
}
 1
Author: Amit Bera, 2015-10-07 05:00:45