Làm thế nào để xóa một thuộc tính sản phẩm eav theo chương trình


7

tôi muốn xóa một thuộc tính sản phẩm từ bảng eav một cách thực tế. Tôi đã nhận được một mã đã xóa thuộc tính khách hàng.

Tôi muốn giống như mã này, đó là xóa thuộc tính sản phẩm.

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

?>

làm ơn giúp tôi.

Câu trả lời:


23

Theo quan điểm của tôi, loại điều này nên được thực hiện thông qua tập lệnh thiết lập hoặc nếu điều đó là không thể thì thông qua phần quản trị. Tôi không thể nghĩ về một tình huống mà bạn cần phải viết một kịch bản cho việc này, nhưng có lẽ có một kịch bản.

Đối với một tập lệnh thiết lập, nó cực kỳ đơn giản:

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

Nếu bạn cần một cái gì đó phức tạp hơn như loại bỏ các nhóm hoặc bộ thuộc tính cũng có thể được thực hiện thông qua một tập lệnh.


david, tôi muốn xóa thuộc tính eav của khách hàng
Amit Bera

1
@AmitBera Tôi cũng đã thêm mã loại bỏ khách hàng, nhưng câu hỏi của bạn có thể cần cập nhật để phù hợp với các yêu cầu này.
Phong tục David

Nếu bạn đang ở trong một mô hình tùy chỉnh và không mở rộng từ danh mục, sẽ tốt hơn nếu thiết lập tài nguyên được xác định :) $ Installer = new Mage_Eav_Model_Entity_Setup ('eav_setup');
Beto Castillo

@DavidManners bạn không nên sử dụng startSetup, vì điều này sẽ vô hiệu hóa kiểm tra khóa ngoại. Do đó, thuộc tính sẽ bị xóa, nhưng tất cả các giá trị thuộc tính được liên kết sẽ được giữ trong cơ sở dữ liệu.
Simon

7

Bạn có thể thử mã dưới đây

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

Nó sẽ chỉ xóa thuộc tính khỏi tập thuộc tính nhưng tôi không chắc liệu nó cũng sẽ xóa thuộc tính đó vĩnh viễn.
Để xóa thuộc tính vĩnh viễn, bạn có thể thử bên dưới.

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


Phương pháp khác là:
Đầu tiên tạo test.php trong thư mục gốc magento
Đặt mã bên dưới vào đó

<?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, là id thiết lập thuộc tính cần thiết ???
Amit Bera

Có, nếu không nó sẽ phá vỡ ở giữa và đưa ra lỗi.
Anshu Mishra

Tôi sẽ không sử dụng startSetup()(và endSetup()) bởi vì nó sẽ vô hiệu hóa kiểm tra khóa ngoại và về cơ bản ngăn chặn việc xóa tầng trong các bảng liên quan. Bạn sẽ kết thúc với rất nhiều mục trong các bảng EAV khác nhau không còn phù hợp với một thuộc tính. Điều này sẽ làm lộn xộn cơ sở dữ liệu của bạn.
Giel Berkers

1

Với mã sau, nó sẽ xóa vĩnh viễn thuộc tính sản phẩm.

$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);          
                }
        }

Bạn có thể vui lòng giải thích mã của mình và giải thích cách này sẽ giúp giải quyết vấn đề / câu hỏi của OP không?
7ochem

Chắc chắn rồi. Tôi đã chỉ ra nhiều mã thuộc tính trong mảng. những gì bạn phải làm là đảm bảo $ entityType = 'catalog_product'; thông báo cho sản phẩm không phải là thuộc tính của khách hàng. Trong vòng lặp foreach đi qua từng cái một và nhận ID thuộc tính bằng mô hình tài nguyên. Nếu thuộc tính không tồn tại, nó sẽ trả về false. Nếu tồn tại thì chỉ cần gọi phương thức remove với thuộc tínhID cho mô hình catalog / sản phẩm_attribution_api.
Rani Das

1

Bạn có thể làm điều này bằng cách sử dụng SQL trực tiếp.

Bước đầu tiên sẽ là xác định id thuộc tính của bạn là gì, bạn có thể làm điều này bằng cách điều hướng qua CatalogAttributesManage Attributes, sau đó tìm kiếm thuộc tính của bạn và nhấp vào nó để chỉnh sửa.

Khi bạn ở trên màn hình chỉnh sửa, bạn sẽ có thể thấy id thuộc tính của mình trong URL của trang, đại loại như

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

Bạn cũng cần biết nó thuộc loại gì, để bạn có thể chọn đúng bảng. Các bảng EAV sẽ nằm dọc theo dòng:

  • catalog_product_entity_varchar
  • catalog_product_entity_datetime
  • catalog_product_entity_int
  • catalog_product_entity_decimal, Vân vân.

Bạn có thể muốn kiểm tra lại bằng cách sử dụng cái gì đó như PHPMyAdmin và tự tìm thuộc tính trong một trong các bảng đó trước.

Với tất cả những điều đó, hãy thiết lập một tập lệnh trong thư mục html gốc của bạn, được gọi là 'xóa_my_attribution.php' hoặc một cái gì đó dọc theo các dòng đó:

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

Và thì đấy, bạn sẽ ổn cả thôi. Câu lệnh đầu tiên xóa tất cả các giá trị cho bất kỳ sản phẩm nào có thể được đặt và câu lệnh thứ hai đã xóa thuộc tính khỏi chính bảng.

Bạn sẽ chỉ cần trỏ trình duyệt của bạn tới tập lệnh để nó chạy.

www.yourwebsitename.com/delete_my_attribute.php

Nếu bạn đã xóa thành công! tin nhắn bạn nên được thiết lập tất cả ;-)


0

Bạn có thể xóa các thuộc tính thông qua một tập lệnh được chạy trong trình duyệt, ví dụ: removeeattribut.php .

Bạn có thể đặt nó trong thư mục gốc Magento của bạn .

Ví dụ về việc chạy nó: https://www.yourwebsite.com/removeattribut.php

Nội dung của kịch bản như sau:

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

hoặc có thể thông qua nâng cấp mysql

Thí dụ :

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

$installer->startSetup();

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

$installer->endSetup();
?>

trong

app \ code \ local \ YourModuleNamespace \ YourModuleName \ sql \ yourmodulenamespace_yourmodulename_setup \ mysql4-nâng cấp-yourmoduleversion.php

thí dụ :

app \ code \ local \ Andi \ Productattribut \ sql \ andhi_productattribut_setup \ mysql4-nâng cấp-1.1.4-1.1.5.php

Lưu ý: kiểm tra xml mô-đun của bạn cho phiên bản mô-đun của bạn

trong ví dụ này:

ứng dụng \ code \ local \ Andi \ Productattribut \ etc \ config.xml

Đã thử nghiệm và hoạt động tốt trong Magento 1.9.2.2 và Magento 1.9.3.8


0

Tôi sử dụng tập lệnh này để loại bỏ các thuộc tính của các loại thực thể nhất định trong url. Kịch bản này đảm bảo quản trị viên phải đăng nhập trước khi thực hiện bất kỳ yêu cầu xóa thuộc tính nào.

ví dụ url:

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

Mã số:

<?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>');
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.