Magento-Indexer fügt der flachen Tabelle im benutzerdefinierten Attribut kein Attribut hinzu

9

Magento Keine benutzerdefinierten Attribute zum flachen Tisch hinzufügen ..... Ich habe eine Marktplatzerweiterung ... die einige Attribute hat, aber einige Attribute, die nicht zum flachen Tisch hinzugefügt werden ... weil meine Erweiterung nicht funktioniert ....

Attributeinstellung ist ...

$catalogEavSetup->addAttribute(Mage_Catalog_Model_Product::ENTITY, 'approval', array(
    'group' => 'General',
    'sort_order' => 21,
    'type' => 'int',
    'backend' => '',
    'frontend' => '',
    'label' => 'Approval',
    'note' => '',
    'input' => 'select',
    'class' => '',
    'source' => 'vendorsproduct/source_approval',
    'global' => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL,
    'visible' => true,
    'required' => false,
    'user_defined' => false,
    'default' => '1',
    'visible_on_front' => false,
    'unique' => false,
    'is_configurable' => false,
    'used_for_promo_rules' => false,
    'used_in_product_listing'  => true,
));

Die gesamte Einstellung ist korrekt. Aber aufgrund des MySQL-Limits 65536 ... werden einige Attribute nicht zu flachen Tabellen hinzugefügt. Ich muss wissen, wie diese Attribute in flachen Tabellen hinzugefügt werden.

Deepak Rai
quelle

Antworten:

19

Sie müssen aktivieren visible_on_front, um in die Catalog Flat-Tabellen zu pushen. Kategorie flache Tische sind betroffen von used_in_product_listing.

Was das Limit in MySQL betrifft, glaube ich, dass dies eine separate Frage ist und als separate Frage und Antwort heraus migriert werden sollte.

philwinkle
quelle
Es kommt nicht in einer flachen Tabelle ... gibt es eine gute Möglichkeit, den Wert eines Attributs zu indizieren oder zu ermitteln
Deepak Rai
7
Total falsch. Sie müssen nur "used_in_product_listing" aktivieren, damit es in der Tabelle catalog_product_flat angezeigt wird.
Kingshuk Deb
Mit @KingshukDeb einverstanden, habe ich gerade getestet und "used_in_product_listing" aktiviert, wird das Attribut in der Tabelle catalog_product_flat angezeigt
Long MK Nguyễn
Ich habe immer noch das gleiche Problem. Das Attribut funktioniert gut, Produkte haben Werte, eigentlich viel. Aber keine Daten im flachen Katalog :(
Keenora Fluffball
Wenn Sie sich im selben Fall wie @DeepakRai befinden, haben Sie Ihr eigenes Quellmodell definiert. In diesem Fall müssen Sie zwei Methoden implementieren, um das Attribut "flache Tabelle" hinzuzufügen. Ich habe eine Antwort hinzugefügt, um zu erklären, wie.
Cladiuss
5

Eine andere Möglichkeit, Attribute zu flachen Tabellen hinzuzufügen, besteht darin, sie in Ihrem config.xmlFrontend-Bereich festzulegen ...

<product>
    <collection>
        <attributes>
            <attribute_code/>
        </attributes>
    </collection>
</product>
sv3n
quelle
2

Für mich war es genug, nur "used_in_product_listing" => true zu setzen

'attribute_code' => array(
    'type'                          => 'int',
    'input'                         => 'select',
    'global'                        => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_STORE,
    'required'                      => 0,
    'is_configurable'               => 0,
    'visible_in_advanced_search'    => 0,
    'comparable'                    => 0,
    'is_html_allowed_on_front'      => 0,
    'user_defined'                  => 1,
    'used_in_product_listing'       => 1,
    'source'                        => 'eav/entity_attribute_source_boolean',
)

Führen Sie catalog_product_flat reindex aus, um das Produktattribut in der flachen Tabelle abzurufen:

php shell/indexer.php --reindex catalog_product_flat
vpodorozh
quelle
Funktioniert es auch mit Kern-Magento-Attributen ( quantity_and_stock_statusspeziell)?
Mateusz Serotiuk
Nein. Stock ist eine separate Einheit in Magento und nicht in flachen Tabellen von catalog_product_flat enthalten. Sie müssen also ein separates Magento-Modell verwenden, um die Menge zu erhalten.
Vpodorozh
1

Wie bereits in anderen Antworten erwähnt, müssen Sie used_in_product_listingauf einstellen 1.

Da Sie jedoch ein Quellmodell ( 'source' => 'vendorsproduct/source_approval',) definiert haben, benötigen Sie möglicherweise einen zusätzlichen Schritt:

In Ihrem Quellmodell haben Sie höchstwahrscheinlich erweitert Mage_Eav_Model_Entity_Attribute_Source_Abstractund bereits implementiert getAllOptions.

Sie müssen jedoch auch zwei weitere Methoden implementieren:

  • getFlatColums (Dies ist kein Tippfehler, es gibt kein "n")
  • getFlatUpdateSelect

Nehmen Sie zum Implementieren ein Beispiel aus dem nativen Magento-Quellmodell Mage_Eav_Model_Entity_Attribute_Source_Boolean.

Hier ist ein Beispiel dafür, was Sie am Ende haben sollten:

class Vendor_Products_Model_Source_Approval
    extends Mage_Eav_Model_Entity_Attribute_Source_Abstract
{
    /**
     * Option values
     */
    const VALUE_APPROVED = 1;
    const VALUE_NOT_APPROVED = 0;


    /**
     * Retrieve all options array
     *
     * @return array
     */
    public function getAllOptions()
    {
        if (is_null($this->_options)) {
            $this->_options = array(
                array(
                    'label' => Mage::helper('vendorsproduct')->__('Yes'),
                    'value' => self::VALUE_APPROVED
                ),
                array(
                    'label' => Mage::helper('vendorsproduct')->__('No'),
                    'value' => self::VALUE_NOT_APPROVED
                ),
            );
        }
        return $this->_options;
    }

    /**
     * Retrieve option array
     *
     * @return array
     */
    public function getOptionArray()
    {
        $_options = array();
        foreach ($this->getAllOptions() as $option) {
            $_options[$option['value']] = $option['label'];
        }
        return $_options;
    }

    /**
     * Get a text for option value
     *
     * @param string|integer $value
     * @return string
     */
    public function getOptionText($value)
    {
        $options = $this->getAllOptions();
        foreach ($options as $option) {
            if ($option['value'] == $value) {
                return $option['label'];
            }
        }
        return false;
    }

    /**
     * Retrieve flat column definition
     *
     * @return array
     */
    public function getFlatColums()
    {
        $attributeCode = $this->getAttribute()->getAttributeCode();
        $column = array(
            'unsigned'  => false,
            'default'   => null,
            'extra'     => null
        );

        if (Mage::helper('core')->useDbCompatibleMode()) {
            $column['type']     = 'tinyint(1)';
            $column['is_null']  = true;
        } else {
            $column['type']     = Varien_Db_Ddl_Table::TYPE_SMALLINT;
            $column['length']   = 1;
            $column['nullable'] = true;
            $column['comment']  = $attributeCode . ' column';
        }

        return array($attributeCode => $column);
    }

    /**
     * Retrieve Select For Flat Attribute update
     *
     * @param int $store
     * @return Varien_Db_Select|null
     */
    public function getFlatUpdateSelect($store)
    {
        return Mage::getResourceModel('eav/entity_attribute')
            ->getFlatUpdateSelect($this->getAttribute(), $store);
    }
}
Cladiuss
quelle