Мадженто. Сценарий установки не будет запускаться, а тем более создавать атрибуты клиента.

Уже 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 с предыдущим кодом.





person Bosworth99    schedule 29.08.2012    source источник
comment
Информация об отладке сценария ресурса установки находится здесь: stackoverflow.com/questions/4717535/   -  person Alan Storm    schedule 29.08.2012
comment
спасибо, алан - я определенно просмотрел это, но не пытался. Кстати, когда я пошел вносить изменения, которые вы подробно описали, класс, по-видимому, был переписан, и больше не было ясно, где должны быть размещены ваши отладки. Я не тратил время, чтобы понять это, но подумал, что вы хотели бы знать. (может разница между community/pro/enterprise? ).   -  person Bosworth99    schedule 29.08.2012
comment
Ваша электронная книга по верстке была находкой, кстати.   -  person Bosworth99    schedule 29.08.2012
comment
Спасибо за внимание, похоже, что этот код был переработан за полтора года с тех пор, как я его опубликовал. Метод _modifyResourceDb по-прежнему тот, который вам нужен. Было бы полезно выгрузить переменную $files, а также $fileName внутри блока case 'php':. (Кроме того, будьте осторожны, используя термин «переписанный», когда говорите о Magento. Он имеет очень специфическое значение и может запутать людей)   -  person Alan Storm    schedule 29.08.2012


Ответы (3)


Возможно, ваш сценарий установки не запустится из-за имени ресурса установки (customer_setup). Поскольку основное расширение Mage_Customer имеет такое же имя ресурса установки и уже установлено в таблице core_resource с версией 1.6.2.0 или чем-то подобным, ваш скрипт установки с версией 0.1.0 может считаться слишком старым и игнорируется. Поэтому вы можете попробовать переименовать свой ресурс во что-то уникальное.

person Alexei Yerofeyev    schedule 29.08.2012
comment
Понятия не имею, почему вас минусуют. customer_setup определенно причина. - person ivantedja; 29.08.2012
comment
Здесь вы выиграли — я изменил имя модуля, и мой скрипт сразу же запустился. Ваше здоровье - person Bosworth99; 29.08.2012

Если я что-то упустил:

В вашем сценарии установки, чтобы установить эти атрибуты, вы должны просто использовать класс customer/setup Mage_Customer_Model_Resource_Setup и вызывать addAttribute() с каждой из ваших конфигураций атрибутов (к сожалению), следуя логике настройки формы.

<?php

$installer = Mage::getResourceModel('customer/setup', 'default_setup');
/* @var $installer Mage_Customer_Model_Resource_Setup */

$installer->startSetup();

$installer->addAttribute(
    'customer',
    'title',
    array(
        'type'          => 'varchar',
        'input'         => 'text',
        'label'         => 'Title / Position',
        'visible'       => true,
        'required'      => false,
        'position'      => 63,
    )
);

/**
  the same for others, then individually or in loop:
 */
$attr = Mage::getSingleton('eav/config')->getAttribute('customer_address', 'title');
$attr->setIsUsedInForms(array('adminhtml_customer'))->save();

//NB: that save() call is fairly important ;-)

$installer->endSetup();
person benmarks    schedule 29.08.2012
comment
Это определенно лучший метод, хотя мой оригинальный скрипт тоже работал. - person Bosworth99; 29.08.2012
comment
Да, но если вы не вызовете save() для этих экземпляров атрибутов, я совершенно уверен, что данные used_in_forms не будут записаны. - person benmarks; 29.08.2012
comment
Итак - полное предположение здесь - но я нашел в основном два разных метода для этого: первый - это ваш метод, который напрямую вызывает addAttribute(), и метод отправки (тот, который я впервые использовал), который просто добавляет дополнительные значения в поведение magento по умолчанию (и, возможно, сам вызывает addattribute())... Как бы то ни было, обе версии тоже работали. (см. мое обновление). - person Bosworth99; 29.08.2012

Я не знаю, действительно ли Magento правильно запускает сценарии установки, если вы время от времени не увеличиваете номер версии.

Подумайте о том, чтобы вывести версию вашего модуля и использовать сценарий обновления. Поместите простой Mage::log в сценарий обновления, и вы увидите, вызывается ли он на самом деле.

Версия находится в app/etc/module/blah_Blah.xml и в etc/config.xml, плюс есть запись в core_Config, говорящая о том, что, по ее мнению, она включена.

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

В статье Алана есть все, что вам нужно для сценариев обновления: http://www.magentocommerce.com/knowledge-base/entry/magento-for-dev-part-6-magento-setup-resources

person Theodores    schedule 29.08.2012
comment
Пара моментов: 1) Номер версии не оценивается приложением до тех пор, пока config.xml каждого активного модуля не будет объединен, поэтому наличие его в файле объявления модуля не является необходимым и несколько нетрадиционным 2) Непосредственное манипулирование таблицами конфигурации EAV, вероятно, больше подвержены ошибкам, чем работать с ними в определенном рабочем процессе через их соответствующие классы. - person benmarks; 29.08.2012