2014-11-04 5 views
4

Мне нужно создать 4 новых атрибута клиента в моем магазине magento. Я создал модуль, как показано ниже, чтобы сделать это:Magento - создать новый атрибут клиента

Customerattribute > 
    etc > config.xml 
    Model > Mysql4 > Setup.php 
    sql > customerattribute_setup > mysql4-install-0.0.1.php 

Config.xml

<?xml version="1.0" encoding="UTF-8"?> 
<config> 
    <modules> 
    <Custom_Customerattribute> 
     <version>0.0.1</version> 
    </Custom_Customerattribute> 
    </modules> 
    <global> 
     <resources> 
      <customerattribute_setup> 
       <setup> 
        <module>Custom_Customerattribute</module> 
        <class>Custom_Customerattribute_Model_Mysql4_Setup</class> 
       </setup> 
       .... 
      </customerattribute_setup> 
     </resources> 
    </global> 
</config> 

Setup.php

class Custom_Customerattribute_Model_Mysql4_Setup extends Mage_Eav_Model_Entity_Setup 
{ 
    /** 
    * This method returns true if the attribute exists. 
    * 
    * @param string|int $entityTypeId 
    * @param string|int $attributeId 
    * @return bool 
    */ 
    public function attributeExists($entityTypeId, $attributeId) 
    { 
     try 
     { 
      $entityTypeId = $this->getEntityTypeId($entityTypeId); 
      $attributeId = $this->getAttributeId($entityTypeId, $attributeId); 
      return !empty($attributeId); 
     } 
     catch(Exception $e) 
     { 
      return FALSE; 
     } 
    } 
} 

mysql4-установки-0.0.1.php

$installer = $this; 
$installer->startSetup(); 
$entity = $installer->getEntityTypeId('customer'); 

if(!$installer->attributeExists($entity, 'paypal')) { 
    $installer->removeAttribute($entity, 'paypal'); 
} 

$installer->addAttribute($entity, 'paypal', array(
     'type' => 'text', 
     'label' => 'Paypal', 
     'input' => 'text', 
     'visible' => TRUE, 
     'required' => FALSE, 
     'default_value' => '', 
     'adminhtml_only' => '0' 
)); 

$forms = array(
    'adminhtml_customer', 
    'customer_account_edit' 
); 
$attribute = Mage::getSingleton('eav/config')->getAttribute($installer->getEntityTypeId('customer'), 'paypal'); 
$attribute->setData('used_in_forms', $forms); 
$attribute->save(); 

$installer->endSetup(); 

Это работает для моего первого атрибута клиента paypal, но теперь я хочу иметь возможность добавить 3 других. Я надеялся, что если я изменить файл mysql4-install-0.0.1.php сказать следующее:

$installer = $this; 
$installer->startSetup(); 
$entity = $installer->getEntityTypeId('customer'); 

if(!$installer->attributeExists($entity, 'attribute_2')) { 
    $installer->removeAttribute($entity, 'attribute_2'); 
} 

$installer->addAttribute($entity, 'attribute_2', array(
     'type' => 'text', 
     'label' => 'Attribute 2', 
     'input' => 'text', 
     'visible' => TRUE, 
     'required' => FALSE, 
     'default_value' => '', 
     'adminhtml_only' => '0' 
)); 

$forms = array(
    'adminhtml_customer', 
    'customer_account_edit' 
); 
$attribute = Mage::getSingleton('eav/config')->getAttribute($installer->getEntityTypeId('customer'), 'attribute_2'); 
$attribute->setData('used_in_forms', $forms); 
$attribute->save(); 

$installer->endSetup(); 

и загрузил новый файл и вернулся на сайте attribute_2 будет добавлено, но это не так.

Почему это работает один раз, но не снова?

ответ

10

Вам нужно добавить новый файл (инсталлятор скрипт) и имя файла должно быть,

mysql4-upgrade-0.0.2-0.0.1.php 

Так что теперь в этом вы можете добавить свой установочный скрипт, как,

$installer = $this; 
$installer->startSetup(); 
$entity = $installer->getEntityTypeId('customer'); 

if(!$installer->attributeExists($entity, 'attribute_2')) { 
    $installer->removeAttribute($entity, 'attribute_2'); 
} 

$installer->addAttribute($entity, 'attribute_2', array(
     'type' => 'text', 
     'label' => 'Attribute 2', 
     'input' => 'text', 
     'visible' => TRUE, 
     'required' => FALSE, 
     'default_value' => '', 
     'adminhtml_only' => '0' 
)); 

$forms = array(
    'adminhtml_customer', 
    'customer_account_edit' 
); 
$attribute = Mage::getSingleton('eav/config')->getAttribute($installer->getEntityTypeId('customer'), 'attribute_2'); 
$attribute->setData('used_in_forms', $forms); 
$attribute->save(); 

$installer->endSetup(); 

И вам нужно также обновить файл config.xml. Так оно и должно быть,

<?xml version="1.0" encoding="UTF-8"?> 
<config> 
    <modules> 
    <Custom_Customerattribute> 
     <version>0.0.2</version> 
    </Custom_Customerattribute> 
    </modules> 
    <global> 
     <resources> 
      <customerattribute_setup> 
       <setup> 
        <module>Custom_Customerattribute</module> 
        <class>Custom_Customerattribute_Model_Mysql4_Setup</class> 
       </setup> 
       .... 
      </customerattribute_setup> 
     </resources> 
    </global> 
</config> 

Для получения дополнительной информации посетите here. Если у вас есть сомнения, прокомментируйте здесь.

Обновление: Извините. Имя файла должно быть таким,

mysql4-upgrade-0.0.2-0.0.1.php 

Таблица core_resource содержит записи модуля. Теперь обновляется 0.0.2. Поэтому magento не будет искать ваши модули (обновленные) xml-файлы для загрузки. так что вам нужно снова изменить имя файла mysql4-upgrade-0.0.3-0.0.2.php или удалить эту запись в базе данных и переименуйте версию модуля к свежей, как mysql4-upgrade-0.0.0.php

Update-2:

Здесь я приложил новые коды, я проверил в моем местном его работает отлично,

приложение/код/​​местный/пакет/MODULENAME/и т.д./config.xml

<?xml version="1.0"?> 
<config> 
    <modules> 
    <Packagename_Modulename> 
     <version>0.0.0</version> 
    </Packagename_Modulename> 
    </modules> 
    <global> 
    <helpers> 
     <modulename> 
     <class>Packagename_Modulename_Helper</class> 
     </modulename> 
    </helpers> 
    <models> 
     <modulename> 
     <class>Packagename_Modulename_Model</class> 
     <resourceModel>modulename_mysql4</resourceModel> 
     </modulename> 
    </models> 
    <resources> 
     <customerattribute1415104755_setup> 
     <setup> 
      <module>Packagename_Modulename</module> 
      <class>Mage_Customer_Model_Entity_Setup</class> 
     </setup> 
     <connection> 
      <use>core_setup</use> 
     </connection> 
     </customerattribute1415104755_setup> 
     <customerattribute1415104755_write> 
     <connection> 
      <use>core_write</use> 
     </connection> 
     </customerattribute1415104755_write> 
     <customerattribute1415104755_read> 
     <connection> 
      <use>core_read</use> 
     </connection> 
     </customerattribute1415104755_read> 
    </resources> 
    </global> 
</config> 

приложение/код/​​местный/пакет/MODULENAME/Helper /Data.php

<?php 
class Packagename_Modulename_Helper_Data extends Mage_Core_Helper_Abstract 
{ 
} 

приложения/код/​​местный/пакет/MODULENAME/SQL/customerattribute1415104755_setup/mysql4-установка-0.0.0.PHP

<?php 
$installer = $this; 
$installer->startSetup(); 


$installer->addAttribute("customer", "myattrbute1", array(
    "type"  => "varchar", 
    "backend" => "", 
    "label" => "My attribute-1", 
    "input" => "text", 
    "source" => "", 
    "visible" => true, 
    "required" => false, 
    "default" => "", 
    "frontend" => "", 
    "unique"  => false, 
    "note"  => "" 

    )); 

     $attribute = Mage::getSingleton("eav/config")->getAttribute("customer", "myattrbute1"); 


$used_in_forms=array(); 

$used_in_forms[]="adminhtml_customer"; 
$used_in_forms[]="checkout_register"; 
$used_in_forms[]="customer_account_create"; 
$used_in_forms[]="customer_account_edit"; 
$used_in_forms[]="adminhtml_checkout"; 
     $attribute->setData("used_in_forms", $used_in_forms) 
     ->setData("is_used_for_customer_segment", true) 
     ->setData("is_system", 0) 
     ->setData("is_user_defined", 1) 
     ->setData("is_visible", 1) 
     ->setData("sort_order", 100) 
     ; 
     $attribute->save(); 




$installer->addAttribute("customer", "myattrbute2", array(
    "type"  => "varchar", 
    "backend" => "", 
    "label" => "My attribute-2", 
    "input" => "text", 
    "source" => "", 
    "visible" => true, 
    "required" => false, 
    "default" => "", 
    "frontend" => "", 
    "unique"  => false, 
    "note"  => "" 

    )); 

     $attribute = Mage::getSingleton("eav/config")->getAttribute("customer", "myattrbute2"); 


$used_in_forms=array(); 

$used_in_forms[]="adminhtml_customer"; 
$used_in_forms[]="checkout_register"; 
$used_in_forms[]="customer_account_create"; 
$used_in_forms[]="customer_account_edit"; 
$used_in_forms[]="adminhtml_checkout"; 
     $attribute->setData("used_in_forms", $used_in_forms) 
     ->setData("is_used_for_customer_segment", true) 
     ->setData("is_system", 0) 
     ->setData("is_user_defined", 1) 
     ->setData("is_visible", 1) 
     ->setData("sort_order", 100) 
     ; 
     $attribute->save(); 




$installer->addAttribute("customer", "myattrbute3", array(
    "type"  => "varchar", 
    "backend" => "", 
    "label" => "My attribute-3", 
    "input" => "text", 
    "source" => "", 
    "visible" => true, 
    "required" => false, 
    "default" => "", 
    "frontend" => "", 
    "unique"  => false, 
    "note"  => "" 

    )); 

     $attribute = Mage::getSingleton("eav/config")->getAttribute("customer", "myattrbute3"); 


$used_in_forms=array(); 

$used_in_forms[]="adminhtml_customer"; 
$used_in_forms[]="checkout_register"; 
$used_in_forms[]="customer_account_create"; 
$used_in_forms[]="customer_account_edit"; 
$used_in_forms[]="adminhtml_checkout"; 
     $attribute->setData("used_in_forms", $used_in_forms) 
     ->setData("is_used_for_customer_segment", true) 
     ->setData("is_system", 0) 
     ->setData("is_user_defined", 1) 
     ->setData("is_visible", 1) 
     ->setData("sort_order", 100) 
     ; 
     $attribute->save(); 




$installer->addAttribute("customer", "myattrbute4", array(
    "type"  => "varchar", 
    "backend" => "", 
    "label" => "My attribute-4", 
    "input" => "text", 
    "source" => "", 
    "visible" => true, 
    "required" => false, 
    "default" => "", 
    "frontend" => "", 
    "unique"  => false, 
    "note"  => "" 

    )); 

     $attribute = Mage::getSingleton("eav/config")->getAttribute("customer", "myattrbute4"); 


$used_in_forms=array(); 

$used_in_forms[]="adminhtml_customer"; 
$used_in_forms[]="checkout_register"; 
$used_in_forms[]="customer_account_create"; 
$used_in_forms[]="customer_account_edit"; 
$used_in_forms[]="adminhtml_checkout"; 
     $attribute->setData("used_in_forms", $used_in_forms) 
     ->setData("is_used_for_customer_segment", true) 
     ->setData("is_system", 0) 
     ->setData("is_user_defined", 1) 
     ->setData("is_visible", 1) 
     ->setData("sort_order", 100) 
     ; 
     $attribute->save(); 



$installer->endSetup(); 

И, наконец, включить ваш модуль в, приложение/и т.д./модули/Packagename_Modulename.xml

<?xml version="1.0"?> 
<config> 
    <modules> 
    <Packagename_Modulename> 
     <active>true</active> 
     <codePool>local</codePool> 
     <version>0.0.0</version> 
    </Packagename_Modulename> 
    </modules> 
</config> 
+0

Спасибо, но это все еще не работает. Я обновил весь кеш до и после, очистил кеш и кеш-память. Также называется установочным файлом, как вы сказали, 'mysql4-install-0.0.1-0.0.2.php', а также' mysql4-install-0.0.2.php' без везения –

+0

Прошу прощения. Имя файла должно быть таким, как mysql4-install-0.0.2-0.0.1.php. Я обновляю свой ответ, пожалуйста, проверьте его. – Elavarasan

+0

Обновлено имя файла, но оно все еще не работает. Я просмотрел таблицу базы данных «core_resource» и смог увидеть обновленную версию 0.0.2 для этого модуля. Глядя в другое место в Интернете, это выглядело как удаление этого, а затем бег снова решился, и это произошло, не уверен, почему ?! –

0

Я думаю, Theres ошибка в коде представлен ранее:

if(!$installer->attributeExists($entity, 'attribute_2')) { 
    $installer->removeAttribute($entity, 'attribute_2'); 
} 

... кажется, говорит «если новый атрибут не существует - удалите его»

Вы, вероятно, захотите:

if ($installer->attributeExists($entity, 'attribute_2')) { 
    $installer->removeAttribute($entity, 'attribute_2'); 
} 
Смежные вопросы