プログラムでeav製品属性を削除する方法


7

実用的にeavテーブルから商品属性を削除したい。顧客属性を削除するコードを取得していました。

このコードのように、商品属性を削除します。

<?php
error_reporting(E_ALL | E_STRICT);
$mageFilename = 'app/Mage.php';
require_once $mageFilename;
Mage::setIsDeveloperMode(true);
umask(0);
Mage::app();
Mage::app()->setCurrentStore(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID));

$setup = new Mage_Eav_Model_Entity_Setup('core_setup');

    try {
        $custAttr = 'user_name';  // here enter your attribute name which you want to remove

        $setup->removeAttribute('customer', $custAttr);
        echo $custAttr." attribute is removed";
    }
        catch (Mage_Core_Exception $e) {
        $this->_fault('data_invalid', $e->getMessage());
    }

?>

私を助けてください。

回答:


23

この種のことはセットアップスクリプトを介して、またはそれが不可能な場合は管理セクションを介して行う必要があると私は考えています。このためのスクリプトを書く必要がある状況は考えられませんが、多分あるでしょう。

セットアップスクリプトの場合、それは信じられないほど簡単です。

$this->startSetup();
// Remove Product Attribute
$this->removeAttribute('catalog_product', 'product_attribute_code');
// Remove Customer Attribute
$this->removeAttribute('customer', 'customer_attribute_code');
$this->endSetup();

グループや属性セットの削除など、より複雑なものが必要な場合は、スクリプトでも実行できます。


david、お客様のeav属性を削除したい
Amit Bera

1
@AmitBera顧客削除コードも追加しましたが、これらの要件に合わせて質問を更新する必要がある場合があります。
David Manners、2014年

カスタムモデルを使用していて、カタログから拡張していない場合は、リソースセットアップが定義されている方がよいです。
Beto Castillo

@DavidMannersを使用しないでくださいstartSetup。これにより、外部キーのチェックが無効になります。したがって、属性は削除されますが、関連するすべての属性値はデータベースに保持されます。
Simon

7

以下のコードを試すことができます

Mage::getModel('catalog/product_attribute_set_api')->attributeRemove($attributeId, $attributeSetId);

属性セットからのみ属性を削除しますが、完全に削除するかどうかはわかりません。
属性を完全に削除するには、以下をお試しください。

Mage::getModel('catalog/product_attribute_api')->remove($attributeId);


その他の方法は
次の
とおりです。最初にmagentoルートディレクトリにtest.phpを作成します。コードの下に配置します

<?php
error_reporting(E_ALL | E_STRICT);

require_once './app/Mage.php';
umask(0);
Mage::app();

$attr = 'test_remove'; //attribute code to remove

$setup = Mage::getResourceModel('catalog/setup', 'core_setup');
try {
    $setup->startSetup();
    $setup->removeAttribute('catalog_product', $attr);
    $setup->endSetup();
    echo $attr . " attribute is removed";
} catch (Mage_Core_Exception $e) {
    print_r($e->getMessage());
}

Anshu、属性セットIDが必要ですか???
Amit Bera

はい、それ以外の場合は、途中で中断してエラーになります。
Anshu Mishra 14

外部キーチェックを無効にし、基本的に関連するテーブルでのカスケード削除を防ぐためstartSetup()、私は(およびendSetup())は使用しません。さまざまなEAVテーブルに、属性と一致しなくなった多くのエントリが含まれることになります。これにより、データベースが乱雑になります。
Giel Berkers 2017年

1

次のコードを使用すると、製品属性が完全に削除されます。

$Attributes = array('accessories_size','accessories_type','apparel_type','author_artist','bag_luggage_type','bedding_pattern','bed_bath_type','books_music_type','camera_megapixels',
    'camera_type','coater','color','colors','cost','decor_type','ebizmarts_mark_visited','electronic_type','featured','fit','format','frame_style','gender','gendered','genre','homeware_style',
    'home_decor_type','impressions','is_sold','jewelry_type','length','lens_type','luggage_size','luggage_style','luggage_travel_style','make','manufacturer','material','model','necklace_length',
    'occasion','perfector','sample_item_1','sheet_size','shoe_size','shoe_type','size','sleeve_length','style',);

        $entityType = 'catalog_product';

        foreach($Attributes as $index => $attrCode){

                $attributeId = Mage::getResourceModel('eav/entity_attribute')->getIdByCode($entityType,$attrCode);   // it return false when attribute not exist.

                if($attributeId)){
                    Mage::getModel('catalog/product_attribute_api')->remove($attributeId);          
                }
        }

コードを説明し、これがOPの問題/質問の解決にどのように役立つか説明していただけませんか?
2016

承知しました。配列に多くの属性コードを示しました。あなたがしなければならないことは、$ entityType = 'catalog_product'; これは、顧客の属性ではなくproduct_attributesに通知します。foreachループでは、1つずつ処理を行い、リソースモデルを使用して属性IDを取得します。属性が存在しない場合はfalseを返します。存在する場合は、catalog / product_attribute_apiモデルのattributeIDでremoveメソッドを呼び出します。
Rani Das

1

直接SQLを使用してこれを行うことができます。

最初のステップは、あなたの属性のidが何であるかを識別するだろう、あなたを介してナビゲートすることによってこれを行うことができますCatalogAttributesManage Attributes、その後、あなたの属性を検索し、編集に上にクリックします。

編集画面に入ると、次のようなページのURLに属性IDが表示されます。

www.yourwebsitename.com/index.php/admin/catalog_product_attribute/edit/attribute_id/533/

また、正しいテーブルを選択できるように、それがどのような属性であるかを知る必要もあります。EAVテーブルは次のようになります。

  • catalog_product_entity_varchar
  • catalog_product_entity_datetime
  • catalog_product_entity_int
  • catalog_product_entity_decimal、など

PHPMyAdminのようなものを使用して、最初にそれらのテーブルの1つで属性自体を見つけることにより、ダブルチェックすることができます。

これらすべてを念頭に置いて、ルートのhtmlディレクトリに「delete_my_attribute.php」などのスクリプトを設定します。

$mageFilename = 'app/Mage.php';
require_once $mageFilename;
Mage::setIsDeveloperMode(true);
ini_set('display_errors', 1);
umask(0);
Mage::app('admin');
Mage::register('isSecureArea', 1);
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);

$attribute_id = x;
$table_name = y;
$connection = Mage::getSingletonore/resource')->getConnection('core_write');
$sql = 'DELETE FROM ' . $table_name . ' WHERE `attribute_id` = ?';
$connection->query($sql, $attribute_id);
$sql = 'DELETE FROM `catalog_eav_attribute` WHERE `attribute_id` = ?';
$connection->query($sql, $attribute_id);
echo "Deleted successfully!";

出来上がりです。これで準備は完了です。最初のステートメントは、それが設定されている可能性のある製品のすべての値をクリアし、2番目のステートメントは、テーブル自体から属性を削除しました。

実行するには、ブラウザでスクリプトを指定する必要があります。

www.yourwebsitename.com/delete_my_attribute.php

正常に削除された場合!あなたはすべて設定する必要がありますメッセージ;-)


0

ブラウザで実行されるスクリプトを介して属性を削除できます。例:removeattributes.php

Magentoのルートフォルダーに置くことができます

実行例:https : //www.yourwebsite.com/removeattributes.php

スクリプトの内容は次のとおりです。

<?php
include 'app/Mage.php';
Mage::app();
$setup = Mage::getResourceModel('catalog/setup','catalog_setup');
$setup->removeAttribute('catalog_product','attribute_code'); //attribute to be deleted 

またはそれはmysqlのアップグレードを介してすることができます

例:

<?php
$installer = new Mage_Eav_Model_Entity_Setup('core_setup');

$installer->startSetup();

$installer->removeAttribute('catalog_product', 'attribute_code'); //attribute to be deleted

$installer->endSetup();
?>

app \ code \ local \ YourModuleNamespace \ YourModuleName \ sql \ yourmodulenamespace_yourmodulename_setup \ mysql4-upgrade-yourmoduleversion.php

例:

app \ code \ local \ Andi \ Productattributes \ sql \ andhi_productattributes_setup \ mysql4-upgrade-1.1.4-1.1.5.php

注:モジュールのバージョンについては、モジュールのxmlを確認してください

この例では:

app \ code \ local \ Andi \ Productattributes \ etc \ config.xml

Magento 1.9.2.2およびMagento 1.9.3.8でテストされ、正常に動作


0

このスクリプトを使用して、URL内の特定のエンティティタイプの属性を削除します。このスクリプトは、属性の削除要求を実行する前に管理者がログインする必要があることを確認します。

URLの例:

http://example.com/removeAttributes.php?entity_type=catalog_category&attributes=category_name,is_active

コード:

<?php
error_reporting(E_ALL | E_STRICT);

require_once './app/Mage.php';
umask(0);
Mage::app();
Mage::app()->setCurrentStore(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID));

try{
    Mage::getSingleton('core/session', array('name'=>'adminhtml'));
    if(!Mage::getSingleton('admin/session')->isLoggedIn()){
        exit('Please login as admin before processing further');
    }

    $msg = null;
    $entityType = Mage::app()->getRequest()->getParam('entity_type');
    $attributes = explode(',', Mage::app()->getRequest()->getParam('attributes'));

    if(empty($entityType)) throw new Exception('Please provide valid <u>entity_type</u> param');

    foreach($attributes as $attrCode){
        if(empty($attrCode)) throw new Exception('Please provide valid <u>attributes</u> param');

        $attribute = Mage::getModel('eav/entity_attribute')->loadByCode($entityType, $attrCode);

        if($attribute->getId()){
            $attribute->delete();
            $msg .= 'Attribute <u>' . $attribute->getAttributeCode().'</u> was removed<br>';
        }
    }
}catch(Exception $e){
    exit('<span style="color:#ff0000">There is an exception: ' . $e->getMessage().'</span>');
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.