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).
2 answers
Я полагаю, что Magento использует контроллер по умолчанию (т.Е. Mage_Customer_AccountController
) сам для обработки создания клиента в этом случае.
Есть некоторые проблемы/предложения, которые мне нужно выдвинуть.
Ваше местоположение контроллера неверно. Это должно быть
/app/code/local/Company/CoreModifications/controllers/Customer/AccountController.php
вместо/app/code/local/company/CoreModifications/Controllers/AccountController.php
-
Ваше определение контроллера должно выглядеть следующим образом.
<?php require_once(Mage::getModuleDir('controllers','Mage_Customer').DS.'AccountController.php'); class Company_CoreModifications_Customer_AccountController extends Mage_Customer_AccountController { // some code }
Для получения дополнительной информации о том, как перезаписать контроллер, вы можете обратиться это ссылка
-
Не редактируйте основной файл. т.е. не редактируйте
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 это заявление вовсе не обязательно для достижения того, что вы пытаетесь сделать. Таким образом, вы можете пропустить этот шаг.
-
Ваш код внутри метода
_getCustomer()
выглядит для меня нормально. Однако вы можете улучшить свой код таким образом.if($this->getRequest()->getPost('group_id', false)){ $groupId = (int)$this->getRequest()->getPost('group_id'); $this->setData('group_id', $groupId); } else { $customer->getGroupId(); }
В конечном счете, дважды проверьте имена ваших папок и места. Расположение папки вашего модуля
app/code/local/Company/CoreModifications/
И последнее, но не менее важное: убедитесь, что вы очистили кэш.
Вы пытаетесь извлечь данные с помощью метода 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));
}