is_salableはどこから来たのですか?


27

注:PHPコードを使用して製品を編集している場合は、管理者でインデックスを再作成し、以下のように表示されない理由を考えて時間を節約してください...

私はis_salable、製品にどのように設定されているかを理解しようとしているので、私の製品が現在表示されている理由を理解しようとしています。

私が見つけることができるコードには、それを設定する場所が1つしかありません:

$salable = $this->isAvailable();

しかし、私は方法や場所、この私が続く場合など、から取得して動作することはできませんisAvailable....それだけで戻って周りにループに思えます

/app/code/core/Mage/Catalog/Model/Product.php

    public function isSalable()
    {
        Mage::dispatchEvent('catalog_product_is_salable_before', array(
            'product'   => $this
        ));

        $salable = $this->isAvailable();

    $object = new Varien_Object(array(
        'product'    => $this,
        'is_salable' => $salable
    ));
    Mage::dispatchEvent('catalog_product_is_salable_after', array(
        'product'   => $this,
        'salable'   => $object
    ));
    return $object->getIsSalable();
}

ここから$ this-> isAvailable()に続いて、数行進みます:

**public function isAvailable()
{ 
    return $this->getTypeInstance(true)->isSalable($this);
}**

次に、app / code / core / Mage / Catalog / Model / Product / Type / Configurable.phpのisSalableを呼び出します

public function isSalable($product = null)
{
    $salable = parent::isSalable($product);

    if ($salable !== false) {
        $salable = false;
        if (!is_null($product)) {
            $this->setStoreFilter($product->getStoreId(), $product);
        }
        foreach ($this->getUsedProducts(null, $product) as $child) {
            if ($child->isSalable()) {
                $salable = true;
                break;
            }
        }
    }

    return $salable;
}

親を呼び出します:/app/code/core/Mage/Catalog/Model/Product/Type/Abstract.php's isSalable:

public function isSalable($product = null)
{
    $salable = $this->getProduct($product)->getStatus() == Mage_Catalog_Model_Product_Status::STATUS_ENABLED;
    if ($salable && $this->getProduct($product)->hasData('is_salable')) {
        $salable = $this->getProduct($product)->getData('is_salable');
    }
    elseif ($salable && $this->isComposite()) {
        $salable = null;
    }

    return (boolean) (int) $salable;
}

is_saleable値でhas / get dataを呼び出すだけですか?!?私はそれを正しく追跡しましたか?この価値はどこから来たのですか?

is_salableのインストールで再帰grepを発行しました。これは設定されている行を表示するはずですが、すぐには表示されません。

grep -r is_salable *
app/code/core/Mage/CatalogInventory/Model/Stock/Status.php:            $object = new Varien_Object(array('is_in_stock' => $product->getData('is_salable')));
app/code/core/Mage/XmlConnect/Block/Wishlist.php:                $itemXmlObj->addChild('is_salable', (int)$item->getProduct()->isSalable());
app/code/core/Mage/XmlConnect/Block/Catalog/Product.php:            $item->addChild('is_salable', (int)$product->isSalable());
app/code/core/Mage/XmlConnect/Block/Cart/Crosssell.php:                $itemXmlObj->addChild('is_salable', 0);
app/code/core/Mage/XmlConnect/Block/Cart/Crosssell.php:                $itemXmlObj->addChild('is_salable', (int)$product->isSalable());
app/code/core/Mage/Catalog/Model/Product.php:        Mage::dispatchEvent('catalog_product_is_salable_before', array(
app/code/core/Mage/Catalog/Model/Product.php:            'is_salable' => $salable
app/code/core/Mage/Catalog/Model/Product.php:        Mage::dispatchEvent('catalog_product_is_salable_after', array(
app/code/core/Mage/Catalog/Model/Product.php:        if ($this->hasData('is_salable')) {
app/code/core/Mage/Catalog/Model/Product.php:            return $this->getData('is_salable');
app/code/core/Mage/Catalog/Model/Product/Type/Abstract.php:        if ($salable && $this->getProduct($product)->hasData('is_salable')) {
app/code/core/Mage/Catalog/Model/Product/Type/Abstract.php:            $salable = $this->getProduct($product)->getData('is_salable');

見つかりました:

grep -r setIsSalable *
app/code/core/Mage/CatalogInventory/Model/Stock/Status.php:        $product->setIsSalable($stockStatus);
app/code/core/Mage/CatalogInventory/Model/Stock/Status.php:                    $product->setIsSalable($status);

setIsSalableだけでなく、探すことを考えたり知らなかったりしたのはsetIsSalableでした

回答:


18

isAvailable() 次のようになります。

public function isAvailable()
{
    return $this->getTypeInstance(true)->isSalable($this)
        || Mage::helper('catalog/product')->getSkipSaleableCheck();
}

これは、メソッドの結果が製品タイプに依存することを意味します。
各製品タイプにはisSalable()メソッドがあります:

  • Mage_Catalog_Model_Product_Type_Grouped::isSalable() -グループ化された製品の場合
  • Mage_Catalog_Model_Product_Type_Configurable::isSalable() -構成可能な製品の場合
  • Mage_Catalog_Model_Product_Type_Abstract::isSalable()-すべての製品タイプが拡張されるため、残りの製品タイプについてMage_Catalog_Model_Product_Type_Abstract
    呼び出し$this->getTypeInstance(true)はあなたを混乱させると思います。このメソッドgetTypeInstance()は、製品モデルのインスタンスではなく、製品タイプのインスタンスを返します。

[編集]
シンプルな製品の場合、これはと呼ばれMage_Catalog_Model_Product_Type_Grouped::isSalable()ます。このメソッドは、製品が有効になっているかどうかを確認します。そうでない場合falseは返されます。有効になっている場合is_salableは、オブザーバーの1人が設定できるプロパティがあるかどうかを確認します。
そのようなプロパティがない場合、製品タイプのインスタンスかどうかをチェックします$this->isComposite()。その場合、販売できません。
構成可能製品の場合、上記の条件が満たされているかどうか、および販売可能な構成可能な製品に関連付けられた単純な製品があるかどうかを確認します(上記の条件と同様)
。グループ化された製品についても同じ方法で行われます。

結論としてis_salable、存在する必要はありません。ただし、そのプロパティを設定するオブザーバーがある場合は、製品を販売できるかどうかを確認するときに考慮されます。
ここではコアからの例です。この方法は、Mage_CatalogInventory_Model_Stock_Status::assignProduct()CALS $product->setIsSalable()
のために同じ行きますMage_CatalogInventory_Model_Stock_Status::addStockStatusToProducts
最後のイベントはイベントによって呼び出されcatalog_product_collection_load_afterます。


再びあなたの助けに感謝します、私はisAvailableをisSalableにトレースしました、そして、単にAbstract.phpのisSalableを呼び出すConfigurable.phpのisSalableにトレースしましたが、それは「is_salable」をチェックするだけですが、それの設定が見つかりませんか?上記にコードトレイルを追加します。
ヘイデンスリング

私の質問に追加
ヘイデンスリング

2
はいあります。答えで言及しましたcatalog_product_collection_load_after。しかし、これはほんの一例です。あり、cataloginventory/observer::addInventoryDataそのコールのassignProductセットというis_salable。他の人もいるかもしれませんが、私はすべてを探していませんでした。
マリウス

1
これを行うための信頼できる方法はありません。おそらく、すべてのイベントを取得しcatalog_product_、それらのイベントでオブザーバーによって呼び出されたメソッドをデバッグします。そしてsetIsSalablesetData('is_salable')
マリウス

1
XmlConnectを使用すると、モバイルアプリケーションをWebサイトに接続できます。それを無視します。
マリウス


0

インデックスの再作成とデバッグを行ってis_salableをno endに設定しても、構成可能な製品が在庫切れとして表示される場合は、すべてのストアビューですべてのシンプルのステータスが有効に設定されていることを確認してください。すべてのストアビューを確認し、一部のボディでステータスが無効になっていることが判明するまで、構成可能なアイテムがどうして在庫切れになったのかと疑問に思って2時間無駄にしただけです。

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