So löschen Sie ein eav-Produktattribut programmgesteuert

7

Ich möchte ein Produktattribut pragmatisch aus jeder Tabelle löschen. Ich habe einen Code erhalten, der das Kundenattribut löscht.

Ich möchte genau wie dieser Code, der Produktattribut löschen war.

<?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());
    }

?>

Bitte hilf mir.

Amit Bera
quelle

Antworten:

23

Ich bin der Meinung, dass dies über ein Setup-Skript oder, wenn dies nicht möglich ist, über den Admin-Bereich erfolgen sollte. Ich kann mir keine Situation vorstellen, in der Sie dafür ein Skript schreiben müssen, aber vielleicht gibt es eines.

Für ein Setup-Skript ist es unglaublich einfach:

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

Wenn Sie etwas Komplexeres benötigen, z. B. das Entfernen von Gruppen oder Attributgruppen, können Sie dies auch über ein Skript tun.

David Manners
quelle
David, ich möchte Kunden eav Attribut entfernen
Amit Bera
1
@AmitBera Ich habe auch den Kundenentfernungscode hinzugefügt, aber Ihre Frage muss möglicherweise aktualisiert werden, um diesen Anforderungen zu entsprechen.
David Manners
Wenn Sie sich in einem benutzerdefinierten Modell befinden und nicht aus dem Katalog erweitert werden, ist es besser, wenn das Ressourcen-Setup definiert ist :) $ installer = new Mage_Eav_Model_Entity_Setup ('eav_setup');
Beto Castillo
@DavidManners sollten Sie nicht verwenden startSetup, da dadurch Fremdschlüsselprüfungen deaktiviert werden. Daher wird das Attribut gelöscht, aber alle zugehörigen Attributwerte werden in der Datenbank gespeichert.
Simon
7

Sie können den folgenden Code ausprobieren

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

Es werden nur Attribute aus dem Attributsatz entfernt, aber ich bin nicht sicher, ob es auch dauerhaft entfernt wird.
Um ein Attribut dauerhaft zu entfernen, können Sie es unten versuchen.

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


Eine andere Methode ist:
Erstellen Sie zuerst eine test.php im Magento-Stammverzeichnis.
Platzieren Sie dort den Code

<?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 Mishra
quelle
Anshu, wird eine Attributsatz-ID benötigt ???
Amit Bera
Ja, sonst wird es dazwischen brechen und Fehler geben.
Anshu Mishra
Ich würde startSetup()(und endSetup()) nicht verwenden, da dies die Überprüfung von Fremdschlüsseln deaktivieren und grundsätzlich das kaskadierende Löschen in verwandten Tabellen verhindern würde. Sie würden am Ende viele Einträge in Ihren verschiedenen EAV-Tabellen haben, die nicht mehr mit einem Attribut übereinstimmen. Dies würde Ihre Datenbank überladen.
Giel Berkers
1

Mit dem folgenden Code wird das Produktattribut dauerhaft gelöscht.

$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);          
                }
        }
Rani Das
quelle
Könnten Sie bitte Ihren Code erklären und erklären, wie dies zur Lösung des Problems / der Frage des OP beitragen kann?
7ochem
Sicher. Ich habe viele Attributcodes im Array angezeigt. Sie müssen lediglich sicherstellen, dass $ entityType = 'catalog_product'; die den product_attributes nicht die Kundenattribute mitteilen. Gehen Sie in der foreach-Schleife nacheinander durch und ermitteln Sie die Attribut-ID mithilfe des Ressourcenmodells. Wenn das Attribut nicht vorhanden ist, wird false zurückgegeben. Wenn vorhanden, rufen Sie einfach die Methode remove mit der Attribut-ID für das Modell catalog / product_attribute_api auf.
Rani Das
1

Sie können dies mit direktem SQL tun.

Der erste Schritt besteht darin, die ID Ihres Attributs zu ermitteln. Sie können dies tun, indem Sie durch CatalogAttributes→ navigieren Manage Attributes, dann nach Ihrem Attribut suchen und darauf klicken, um es zu bearbeiten.

Sobald Sie sich auf dem Bearbeitungsbildschirm befinden, können Sie Ihre Attribut-ID in der URL der Seite sehen

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

Sie müssen auch wissen, um welche Art von Attribut es sich handelt, damit Sie die richtige Tabelle auswählen können. Die EAV-Tabellen lauten wie folgt:

  • catalog_product_entity_varchar
  • catalog_product_entity_datetime
  • catalog_product_entity_int
  • catalog_product_entity_decimal, usw.

Möglicherweise möchten Sie dies überprüfen, indem Sie beispielsweise PHPMyAdmin verwenden und das Attribut selbst zuerst in einer dieser Tabellen suchen.

Richten Sie vor diesem Hintergrund in Ihrem HTML-Stammverzeichnis ein Skript mit dem Namen "delete_my_attribute.php" oder ähnlichem ein:

$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!";

Und voila, du bist fertig. Die erste Anweisung löscht alle Werte für alle Produkte, für die sie möglicherweise festgelegt wurde, und die zweite Anweisung löscht das Attribut aus der Tabelle selbst.

Sie müssen Ihren Browser nur auf das Skript verweisen, damit es ausgeführt werden kann.

www.yourwebsitename.com/delete_my_attribute.php

Wenn Sie das Gelöscht erfolgreich erhalten! Nachricht du solltest fertig sein ;-)

Elch
quelle
0

Sie können Attribute über ein Skript löschen, das im Browser ausgeführt wird, z. B.: Removeeattributes.php .

Sie können es in Ihren Magento- Stammordner legen .

Beispiel für die Ausführung: https://www.yourwebsite.com/removeattributes.php

Der Inhalt des Skripts lautet wie folgt:

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

oder es kann durch MySQL-Upgrade sein

Beispiel:

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

$installer->startSetup();

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

$installer->endSetup();
?>

im

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

Beispiel:

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

Hinweis: Überprüfen Sie Ihre Modul-XML auf Ihre Modulversion

in diesem Beispiel:

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

Getestet und funktioniert gut in Magento 1.9.2.2 und Magento 1.9.3.8

Andhi Irawan
quelle
0

Ich verwende dieses Skript, um Attribute bestimmter Entitätstypen in der URL zu entfernen. Dieses Skript stellt sicher, dass ein Administrator angemeldet sein muss, bevor Anforderungen zum Entfernen von Attributen ausgeführt werden.

URL-Beispiel:

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

Code:

<?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>');
}
rbncha
quelle