2013-03-20 24 views
7

Mam atrybut istniejący dla kodu do umieszczenia na stronie. Muszę powiązać ten atrybut z ponad 120 istniejącymi zestawami atrybutów.Dodawanie istniejącego atrybutu do wszystkich zestawów atrybutów

Jeśli znam identyfikator zestawu atrybutów, w jaki sposób mogę programowo dodać atrybut do wszystkich zestawów atrybutów?

+0

czy masz wspólną grupę zestawów atrybutów (np. General/meta/etc), do której chcesz dodać atrybut? – Meabed

+0

@Meabed Robimy, jednak wszystkie produkty są przypisane do określonych (i różnych) zestawów atrybutów. Jednak wszystkie zestawy atrybutów muszą mieć ten konkretny atrybut. Więc muszę znaleźć sposób na masową aktualizację. –

Odpowiedz

21

Znalazłem interesujący napisać kod dla tej kwestii, tak tutaj jest rozwiązanie, które działa :)

uruchomić ten kod w skrypt php tym mage.php i daj mi znać, jeśli to działa dobrze.

replace (firstname) with the attribute code that you want to mass add to all attribute sets

$attSet = Mage::getModel('eav/entity_type')->getCollection()->addFieldToFilter('entity_type_code','catalog_product')->getFirstItem(); // This is because the you adding the attribute to catalog_products entity (there is different entities in magento ex : catalog_category, order,invoice... etc) 
    $attSetCollection = Mage::getModel('eav/entity_type')->load($attSet->getId())->getAttributeSetCollection(); // this is the attribute sets associated with this entity 
    $attributeInfo = Mage::getResourceModel('eav/entity_attribute_collection') 
     ->setCodeFilter('firstname') 
     ->getFirstItem(); 
    $attCode = $attributeInfo->getAttributeCode(); 
    $attId = $attributeInfo->getId(); 
    foreach ($attSetCollection as $a) 
    { 
     $set = Mage::getModel('eav/entity_attribute_set')->load($a->getId()); 
     $setId = $set->getId(); 
     $group = Mage::getModel('eav/entity_attribute_group')->getCollection()->addFieldToFilter('attribute_set_id',$setId)->setOrder('attribute_group_id',"ASC")->getFirstItem(); 
     $groupId = $group->getId(); 
     $newItem = Mage::getModel('eav/entity_attribute'); 
     $newItem->setEntityTypeId($attSet->getId()) // catalog_product eav_entity_type id (usually 10) 
        ->setAttributeSetId($setId) // Attribute Set ID 
        ->setAttributeGroupId($groupId) // Attribute Group ID (usually general or whatever based on the query i automate to get the first attribute group in each attribute set) 
        ->setAttributeId($attId) // Attribute ID that need to be added manually 
        ->setSortOrder(10) // Sort Order for the attribute in the tab form edit 
        ->save() 
     ; 
     echo "Attribute ".$attCode." Added to Attribute Set ".$set->getAttributeSetName()." in Attribute Group ".$group->getAttributeGroupName()."<br>\n"; 
    } 
+0

Pracowałem jak urok, ale mam nadzieję (zastanawia się), czy istnieje sposób, aby ustawić pozycję. Najlepiej byłoby, gdyby był ostatnim elementem sekcji ogólnej. czy to możliwe? Zrzut ekranu: http://cl.ly/image/0O0H0x0E2h05. Dzięki wielkie! –

+1

zmienić pozycję w zakładce -> setSortOrder (10) // zmienić ten 10 na wyższy numer! – Meabed

+0

Im wyższa liczba zostanie ustawiona kolejność sortowania, więc mogę zapewnić, że jest na dole. Nie ma jednak jasnego sposobu na wybranie grupy ogólnej. W tej chwili wygląda na to, że używasz -> getFirstItem(), co wymagałoby, aby grupa Ogólna była zawsze pierwsza. Czy istnieje sposób, aby wybrać tylko grupę General? Dzięki jeszcze raz! –

2

dla osób mających problemy z powyższym kodzie

jak: Zadzwoń do getModelInstance funkcji członka() na non-object

trzeba dodać następujące do góra pliku:

include 'app/Mage.php'; 
Mage::app(); 

edit:

im przy Magento 1.8.1.0 i kod nadal nie działa

musiałem dodać następującą linię do $ newItem, tędy przechodzi walidację

->setAttributeCode($attCode) 
2

Funkcja Mage_Catalog_Model_Resource_Setup::addAttribute() mogą być wykorzystane zaktualizować, a także dodać atrybuty. Inną rzeczą, którą uważam za przydatną, jest to, że jeśli określisz grupę z tą funkcją, zostanie ona automatycznie przypisana do wszystkich zestawów.

$attributeCode = 'name'; // choose your attribute here 
$setup = Mage::getResourceSingleton('catalog/setup'); 
$setup->addAttribute('catalog_product', $attributeCode, array(
    // no need to specify fields already used like 'label' or 'type' 
    'group'  => 'General', 
    'sort_order' => 10 
)); 
+0

Podczas wypróbowywania tej metody w wersji 1.9.3.1 otrzymuję komunikat" Błąd krytyczny PHP: wywołanie funkcji funkcji select() w obiekcie niebędącym obiektem w aplikacji/code/core/Mage/Core/Model/Resource/Setup.php on line 733 " – Eric

0

Nie używaj

Mage::getResourceSingleton('catalog/setup'); 

Ale używać

Mage::getResourceModel('catalog/setup', 'catalog_setup'); 
1

Jeśli używasz skryptu zewnętrznego (nie magento Nastawienia skrypt) tworzą mi ta praca

<?php 
/// run in magento root 
require_once 'app/Mage.php'; 
ini_set('display_errors', 1); 
error_reporting(E_ALL); 
Mage::app(); 

$attributeCode = 'my_attr_code'; 
$group = 'MyGroup'; 
$sortOrder = 10; 

//this way you config the setup connections 
$setup = new Mage_Catalog_Model_Resource_Setup('catalog_setup'); 

$setup->startSetup(); 
$setup->addAttribute('catalog_product', $attributeCode, array(
    'group'  => $group, 
    'sort_order' => $sortOrder 
)); 

(jako odpowiedź do @Eric)

Powiązane problemy