9

オンラインで少し検索しましたが、この質問に対する答えはまだ見つかりません。小数値である製品属性が必要な状況があり、負の数と正の数をサポートする必要があり、並べ替えも可能でなければなりません。何らかの理由で、Magento には「小数」属性タイプがありません。小数値を使用する型は Price だけですが、負の数はサポートされていません。タイプとして「テキスト」を使用すると、必要なものはすべてサポートされますが、値が浮動小数点数ではなく文字列として認識されるため、正しくソートされません。eav_attribute テーブルを手動で編集し、'frontend_input' を 'price' から 'text' に変更することで、他の人が私が見つけた投稿にあるように、私はこの問題を回避することができましたが、'backend_type' はそのままにしておきます。「小数」として。これはうまく機能します...誰かが管理パネルで属性を編集するまで。属性を保存すると、Magento は frontend_input が「text」であることを認識し、「backend_type」を「varchar」に変更します。私が考えることができるこれを回避する唯一の方法は、カスタム属性タイプを作成することですが、どこから始めればよいかわからず、オンラインで詳細を見つけることができません.

他の誰かがこの問題を経験しましたか? もしそうなら、あなたはそれを修正するために何をしましたか? カスタム属性タイプを作成する必要がある場合、何かヒントはありますか、それを行うためのチュートリアルを教えてもらえますか?

ありがとう!

4

1 に答える 1

5

あなたがしたいのは、カスタム属性タイプを作成することです。

これは、最初にインストーラースクリプトを作成することで実行できます(これによりデータベースが更新されます)。

startSetup();

$installer->addAttribute('catalog_product', 'product_type', array(
    'group'             => 'Product Options',
    'label'             => 'Product Type',
    'note'              => '',
    'type'              => 'dec',    //backend_type
    'input'             => 'select', //frontend_input
    'frontend_class'    => '',
    'source'            => 'sourcetype/attribute_source_type',
    'backend'           => '',
    'frontend'          => '',
    'global'            => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_WEBSITE,
    'required'          => true,
    'visible_on_front'  => false,
    'apply_to'          => 'simple',
    'is_configurable'   => false,
    'used_in_product_listing'   => false,
    'sort_order'        => 5,
));

$installer->endSetup();

その後、次の名前のカスタムphpクラスを作成する必要があります。

Whatever_Sourcetype_Model_Attribute_Source_Type

そしてそこにこれを貼り付けます:

class Whatever_Sourcetype_Model_Attribute_Source_Type extends Mage_Eav_Model_Entity_Attribute_Source_Abstract
{
    const MAIN = 1;
    const OTHER = 2;

public function getAllOptions()
{
    if (is_null($this->_options)) {
        $this->_options = array(
            array(
                'label' => Mage::helper('sourcetype')->__('Main Product'),
                'value' =>  self::MAIN
            ),
            array(
                'label' => Mage::helper('sourcetype')->__('Other Product'),
                'value' =>  self::OTHER
            ),
        );
    }
    return $this->_options;
}

public function toOptionArray()
{
    return $this->getAllOptions();
}

public function addValueSortToCollection($collection, $dir = 'asc')
{
    $adminStore  = Mage_Core_Model_App::ADMIN_STORE_ID;
    $valueTable1 = $this->getAttribute()->getAttributeCode() . '_t1';
    $valueTable2 = $this->getAttribute()->getAttributeCode() . '_t2';

    $collection->getSelect()->joinLeft(
        array($valueTable1 => $this->getAttribute()->getBackend()->getTable()),
        "`e`.`entity_id`=`{$valueTable1}`.`entity_id`"
        . " AND `{$valueTable1}`.`attribute_id`='{$this->getAttribute()->getId()}'"
        . " AND `{$valueTable1}`.`store_id`='{$adminStore}'",
        array()
    );

    if ($collection->getStoreId() != $adminStore) {
        $collection->getSelect()->joinLeft(
            array($valueTable2 => $this->getAttribute()->getBackend()->getTable()),
            "`e`.`entity_id`=`{$valueTable2}`.`entity_id`"
            . " AND `{$valueTable2}`.`attribute_id`='{$this->getAttribute()->getId()}'"
            . " AND `{$valueTable2}`.`store_id`='{$collection->getStoreId()}'",
            array()
        );
        $valueExpr = new Zend_Db_Expr("IF(`{$valueTable2}`.`value_id`>0, `{$valueTable2}`.`value`, `{$valueTable1}`.`value`)");

    } else {
        $valueExpr = new Zend_Db_Expr("`{$valueTable1}`.`value`");
    }



    $collection->getSelect()
        ->order($valueExpr, $dir);

    return $this;
}

public function getFlatColums()
{
    $columns = array(
        $this->getAttribute()->getAttributeCode() => array(
            'type'      => 'int',
            'unsigned'  => false,
            'is_null'   => true,
            'default'   => null,
            'extra'     => null
        )
    );
    return $columns;
}


public function getFlatUpdateSelect($store)
{
    return Mage::getResourceModel('eav/entity_attribute')
        ->getFlatUpdateSelect($this->getAttribute(), $store);
}
}

お役に立てれば。

詳細については、こちらをご覧ください。

于 2012-08-20T19:19:24.103 に答える