Уже 8 часов ломаю голову над этим...
У меня есть потребность (точнее, у моей компании, так как она B2B) запрашивать дополнительные атрибуты при регистрации клиента. Конечно, Magento не делает этого изначально, поэтому нам пришлось пойти по дико запутанному пути сборки, чтобы сделать это так. Я купил модуль, чтобы сделать это, но обнаружил, что код не работает (не говоря уже о том, что он просто не работает).
Что бы ни. Думаю, я просто сверну свой собственный.
Поэтому я нашел руководство это казалось ясным и точным. Итак, я трачу несколько минут на сборку. И ничего.
Дальнейшее google-fu приводит меня здесь и здесь для этого дополнительного острого соуса мудрости.
Вот что у меня есть (под управлением Magento Professional v1.11):
Структура файла:
WACI
- Customer
-- etc
--- config.xml
-- Model
--- Resource
---- Eav
----- Mysql4
------ Setup.php
-- sql
--- customer_setup
---- mysql4-install-0.1.0.php
etc/modules/WACI_All.xml
<config>
<modules>
<WACI_Customer>
<active>true</active>
<codePool>local</codePool>
</WACI_Customer>
</modules>
</config>
config.xml
<config>
<modules>
<WACI_Customer>
<version>0.1.0</version>
</WACI_Customer>
</modules>
<global>
<fieldsets>
<customer_account>
<title><create>1</create><update>1</update></title>
<phone><create>1</create><update>1</update></phone>
<agency><create>1</create><update>1</update></agency>
<fed_id><create>1</create><update>1</update></fed_id>
<ubi><create>1</create><update>1</update></ubi>
</customer_account>
</fieldsets>
<!--<models>
<customer>
<class>WACI_Customer_Model</class>
</customer>
</models> -->
<resources>
<customer_setup>
<setup>
<module>WACI_Customer</module>
<class>WACI_Customer_Model_Resource_Eav_Mysql4_Setup</class>
</setup>
<connection>
<use>core_setup</use>
</connection>
</customer_setup>
<customer_write>
<connection>
<use>core_write</use>
</connection>
</customer_write>
<customer_read>
<connection>
<use>core_read</use>
</connection>
</customer_read>
</resources>
</global>
</config>
Setup.php
<?php
class WACI_Customer_Model_Resource_Eav_Mysql4_Setup extends Mage_Eav_Model_Entity_Setup
{
public function getDefaultEntities()
{
return array(
'customer' => array(
'entity_model' => 'customer/customer',
'table' => 'customer/entity',
'increment_model' => 'eav/entity_increment_numeric',
'increment_per_store' => false,
'attribute_model' => 'customer/attribute',
'attributes' => array(
'title' => array(
'type' => 'varchar',
'input' => 'text',
'label' => 'Title / Position',
'visible' => true,
'required' => false,
'position' => 63,
),
'phone' => array(
'type' => 'varchar',
'input' => 'text',
'label' => 'Telephone',
'visible' => true,
'required' => true,
'position' => 64,
),
'agency' => array(
'type' => 'varchar',
'input' => 'text',
'label' => 'Agency / Organization',
'visible' => true,
'required' => false,
'position' => 65,
),
'fed_id' => array(
'type' => 'varchar',
'input' => 'text',
'label' => 'Fed ID',
'visible' => true,
'required' => false,
'position' => 66,
),
'ubi' => array(
'type' => 'varchar',
'input' => 'text',
'label' => 'UBI',
'visible' => true,
'required' => false,
'position' => 67,
),
),
),
);
}
}
?>
mysql4-install-0.1.0.php
<?php
Mage::log('Installing WACI_Customer');
// die ( echo 'Running This Upgrade: '.get_class($this)."\n <br /> \n"; );
$installer = $this;
$installer->installEntities();
$eavConfig = Mage::getSingleton(‘eav/config’);
$attribute_title = $eavConfig->getAttribute(‘customer’, 'title');
$attribute_phone = $eavConfig->getAttribute(‘customer’, 'phone');
$attribute_agency = $eavConfig->getAttribute(‘customer’, 'agency');
$attribute_fedid = $eavConfig->getAttribute(‘customer’, 'fed_id');
$attribute_ubi = $eavConfig->getAttribute(‘customer’, 'ubi');
// put into customer_form_attribute table so field will show in admin.
$attribute_title->setData(‘used_in_forms’, array(‘adminhtml_customer’));
$attribute_phone->setData(‘used_in_forms’, array(‘adminhtml_customer’));
$attribute_agency->setData(‘used_in_forms’, array(‘adminhtml_customer’));
$attribute_fedid->setData(‘used_in_forms’, array(‘adminhtml_customer’));
$attribute_ubi->setData(‘used_in_forms’, array(‘adminhtml_customer’));
?>
Если я правильно понимаю, у меня все на месте... но ничего, ничего и еще раз ничего.
в частности:
- Если я удалю класс установки, я получаю фатальную ошибку, поэтому я думаю, что все на месте.
- модуль отображается в admin/system/configuration/advanced/ (включен); написано
core_config_data
- Я вырвал весь код и просто использовал пустые контейнеры (с отладочными материалами) - скрипт установки никогда не запускается; он никогда не записывается в
core_resource
Вопрос, то состоит из двух частей:
<сильный>1. Что мешает запуску моего сценария установки?
2. Правильна ли логика создания новых атрибутов клиентов?
Предполагая, что это так - я думаю, что получить его на странице регистрации / учетной записи клиента / учетной записи администратора должно быть довольно просто...
... Сейчас пойду пиво пить.
Ваше здоровье.
Обновить
как подумал @AlexeiYerofeyev, проблема заключалась в самом имени customer
. Изменено на CustomerAttr, и скрипт сразу же запустился.
После этого модуль заработал примерно так, как ожидалось, но решение @benmarks кажется чище, поэтому я переписал, чтобы оно соответствовало:
config.xml 0.1.0
<global>
<resources>
<customerattr_setup>
<setup>
<module>WACI_CustomerAttr</module>
<class>Mage_Customer_Model_Entity_Setup</class>
</setup>
<connection>
<use>core_setup</use>
</connection>
</customerattr_setup>
</resources>
<fieldsets>
<customer_account>
<title><create>1</create><update>1</update></title>
<phone><create>1</create><update>1</update></phone>
<agency><create>1</create><update>1</update></agency>
<fed_id><create>1</create><update>1</update></fed_id>
<ubi><create>1</create><update>1</update></ubi>
</customer_account>
</fieldsets>
</global>
</config>
setup.php
<?php
Mage::log('Installing WACI_CustomerAttr');
echo 'Running Upgrade: '.get_class($this)."\n <br /> \n";
//die ( 'its running' );
$installer = $this;
/* @var $installer Mage_Customer_Model_Entity_Setup */
$installer->startSetup();
$installer->addAttribute('customer','agency',
array(
'type' => 'varchar',
'label' => 'Agency / Organization',
'input' => 'text',
'required' => false,
'visible' => true,
'position' => 62,
)
);
$installer->addAttribute('customer','title',
array(
'type' => 'varchar',
'label' => 'Title / Position',
'input' => 'text',
'required' => false,
'visible' => true,
'position' => 63,
)
);
$installer->addAttribute('customer','phone',
array(
'type' => 'varchar',
'label' => 'Telephone',
'input' => 'text',
'required' => false,
'visible' => true,
'position' => 64,
)
);
$installer->addAttribute('customer','fed_id',
array(
'type' => 'varchar',
'label' => 'Fed ID',
'input' => 'text',
'required' => false,
'visible' => true,
'position' => 65,
)
);
$installer->addAttribute('customer','ubi',
array(
'type' => 'varchar',
'label' => 'UBI',
'input' => 'text',
'required' => false,
'visible' => true,
'position' => 66,
)
);
$attrs = array('agency','title','phone','fed_id','ubi');
foreach ($attrs as $item) {
$attr = Mage::getSingleton('eav/config')->getAttribute('customer', $item);
$attr->setIsUsedInForms(array('adminhtml_customer','customer_account_edit','customer_account_create'))->save();
}
$installer->endSetup();
?>
Модуль (и версия) успешно записывается в core_resource
, а атрибуты успешно добавляются в eav_attribute
.
Я могу вызвать поле в
тема/шаблон/клиент/форма/edit.phtml
<div class="input-box">
<label for="agency"><?php echo $this->__('Agency / Organization') ?><span class="required">*</span></label><br />
<input type="text" name="agency" id="agency" value="<?php echo $this->htmlEscape($this->getCustomer()->getAgency()) ?>" title="<?php echo $this->__('Agency') ?>" class="required-entry input-text" />
</div>
Но, к сожалению, значение не записывается в customer_entity_varchar
(что, в конечном счете, и сделал мой первоначальный скрипт.
Итак, у меня есть атрибут в таблице, но он еще не добавлен в объект клиента.
Похоже, как только у меня это заработает, я смогу читать и записывать это значение по желанию, где бы это ни требовалось.
Любые мысли о том, как я могу действовать в этот момент?
финальное обновление
хорошо, разобрался:
$attr->setData('used_in_forms', array('adminhtml_customer','customer_account_edit','customer_account_create'))->save();
вместо
$attr->setIsUsedInForms(array('adminhtml_customer','customer_account_edit','customer_account_create'))->save();
Кому может понадобиться информация...
Оказывается, массив не обновлялся в таблице customer_form_attribute
с предыдущим кодом.