Magentoインデクサーがカスタム属性のフラットテーブルに属性を追加しない


9

Magentoフラットテーブルにカスタム属性を追加しない.....マーケットプレイスの拡張機能があります。いくつかの属性がありますが、一部の属性はフラットテーブルに追加されていません...私の拡張機能が機能しないため...

属性設定は...

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

全体の設定は正しいですが、mysqlの制限65536により、一部の属性がフラットテーブルに追加されません...これらの属性をフラットテーブルに追加する方法を知っている必要があります...

回答:


19

visible_on_frontカタログフラットテーブルにプッシュできるようにする必要があります。カテゴリフラットテーブルはの影響を受けused_in_product_listingます。

MySQLの制限については、これは別の質問であり、別のQ&Aとして移行する必要があると思います。


そのは、平らなテーブルに来ていない....インデックスまたは属性の取得値に何か良いの方法があります
ディーパック・ライ

7
完全に間違っています。"used_in_product_listing"を有効にして、catalog_product_flatテーブルに表示させるだけです。
Kingshuk Deb

テストした@KingshukDebに同意し、「used_in_product_listing」を有効にすると、属性がcatalog_product_flatテーブルに表示されます
Long

私はまだ同じ問題を抱えています。属性は問題なく機能し、製品には実際に多くの値があります。ただし、フラットカタログにはデータがありません:(
Keenora Fluffball

@DeepakRaiと同じケースの場合は、独自のソースモデルを定義しています。その場合、2つのメソッドを実装して、属性をフラットテーブルにする必要があります。方法を説明する回答を追加しました。
Cladiuss

5

フラットテーブルに属性を追加する別の方法は、config.xmlフロントエンドセクションで属性を設定することです...

<product>
    <collection>
        <attributes>
            <attribute_code/>
        </attributes>
    </collection>
</product>

2

私にとっては、「used_in_product_listing」のみを設定するだけで十分でした=> true

'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',
)

そして、catalog_product_flat reindexを実行して、フラットテーブルの製品属性を取得します。

php shell/indexer.php --reindex catalog_product_flat

それはコアMagento属性(quantity_and_stock_status特に)でも機能しますか?
Mateusz Serotiuk 2017年

いいえ。StockはMagentoの個別のエンティティであり、catalog_product_flatのフラットテーブルには含まれません。したがって、数量を取得するには、別のMagentoモデルを使用する必要があります。
vpodorozh 2018年

1

他の回答ですでに述べたように、used_in_product_listingに設定する必要があります1

ただし、ソースモデル('source' => 'vendorsproduct/source_approval',)を定義したので、追加の手順が必要になる場合があります。

ソースモデルでは、おそらく拡張されMage_Eav_Model_Entity_Attribute_Source_Abstract、すでに実装されていますgetAllOptions

ただし、さらに2つのメソッドを実装する必要があります。

  • getFlatColums (これはタイプミスではなく、「n」はありません)
  • getFlatUpdateSelect

それらを実装するには、Magentoネイティブソースモデルの例をご覧くださいMage_Eav_Model_Entity_Attribute_Source_Boolean

これはあなたが最終的に何をすべきかの例です:

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);
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.