is_salable มาจากไหน


27

หมายเหตุ: หากคุณได้รับการแก้ไขผลิตภัณฑ์ด้วยรหัส PHP จากนั้นทำดัชนีอีกครั้งในผู้ดูแลระบบหลังจากบันทึกชั่วโมงการทำงานของคุณเองเพื่อพยายามหาสาเหตุที่ไม่แสดงเช่นฉันด้านล่าง ...

ฉันจะวนไปวนมาเพื่อหาวิธีการis_salableตั้งค่าสำหรับผลิตภัณฑ์และลองคิดดูว่าทำไมผลิตภัณฑ์ของฉันถึงแสดงตอนนี้

มีเพียงที่เดียวในรหัสที่ฉันสามารถหาได้

$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);
}**

สิ่งนี้จึงเรียกแอป / รหัส / คอร์ / ผู้วิเศษ / แคตตาล็อก / รุ่น / ผลิตภัณฑ์ / ประเภท / Configurable.php's 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?!? ฉันติดตามใช่มั้ย คุณค่านี้มาจากไหน

ฉันออก grep แบบเรียกซ้ำในการติดตั้งของฉันสำหรับ is_salable แน่นอนว่าสิ่งนี้ควรแสดงบรรทัดใด ๆ ที่ตั้งค่าไว้ แต่ฉันไม่เห็นเลยทันที:

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ที่สามารถตั้งค่าได้โดยผู้สังเกตการณ์คนใดคนหนึ่งของคุณ ถ้ามันไม่ได้มีคุณสมบัติดังกล่าวแล้วก็ตรวจสอบว่าเช่นประเภทของผลิตภัณฑ์
$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 และ isSalable ของ Configurable.php ซึ่งเพิ่งเรียก isSalable ของ Abstract.php แต่สิ่งที่มันทำคือ 'is_salable' แต่ฉันไม่พบการตั้งค่าใด ๆ ฉันจะเพิ่มรหัสเส้นทางของฉันด้านบน
Hayden Thring

เพิ่มลงในคำถามของฉัน
Hayden Thring

2
ใช่แล้ว catalog_product_collection_load_afterที่ผมกล่าวถึงในคำตอบของฉัน แต่นี่เป็นเพียงตัวอย่าง นอกจากนี้ยังมีcataloginventory/observer::addInventoryDataว่าสายที่ชุดassignProduct is_salableอาจมีคนอื่น แต่ฉันไม่ได้มองหาทั้งหมด
Marius

1
ฉันไม่มีวิธีที่เชื่อถือได้สำหรับการทำเช่นนี้ อาจได้รับเหตุการณ์ทั้งหมดที่เริ่มต้นด้วยcatalog_product_และดีบั๊กวิธีที่ผู้สังเกตการณ์เรียกเหตุการณ์เหล่านั้น และดูว่ามีใครโทรsetIsSalableหรือsetData('is_salable')
Marius

1
XmlConnect อนุญาตให้คุณเชื่อมต่อแอปพลิเคชันมือถือของคุณกับเว็บไซต์ของคุณ ไม่ต้องสนใจมัน
Marius


0

หากหลังจากการทำดัชนีใหม่และการดีบัก is_salable เป็นไม่สิ้นสุดและผลิตภัณฑ์ที่กำหนดค่าได้ของคุณยังคงแสดงว่าหมดโปรดตรวจสอบให้แน่ใจว่าการตั้งค่าสถานะทั้งหมดของผู้เรียบง่ายเป็น Enabled ในมุมมองร้านค้าทั้งหมด ฉันเพิ่งสูญเสียสองชั่วโมงสงสัยว่าทำไมการกำหนดค่าได้หมดไม่ว่าฉันจะทำอะไรจนกว่าฉันจะตรวจสอบทุกมุมมองร้านค้าและพบว่าร่างกายบางส่วนได้ปิดการใช้งานสถานะ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.