is_salable nereden geliyor?


27

Not: Ürünleri PHP koduyla düzenliyorsanız, daha sonra yönetici olarak tekrar dizinleyin, neden benim gibi göstermediklerini hesaplamaya çalışarak kendi saatlerinizi kaydedin ...

is_salableBir ürün için nasıl ayarlandığını bulmaya çalışan ve böylece ürünlerimin neden gösterildiğini hesaplamaya çalışan daireler çiziyorum.

Kodda onu ayarlayan bulabileceğim tek bir yer var:

$salable = $this->isAvailable();

ama bunu nasıl ve nereden aldığını çözemiyorum, takip ettiğimde isAvailablegeri dönüp dönüyor gibi ...

/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 () buradan itibaren birkaç satır gider:

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

bu daha sonra app / code / core / Mage / Catalogue / Model / Product / Type / Configurable.php's isSalable komutunu çağırır.

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;
}

ebeveyn çağırır: /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;
}

sadece is_saleable değerinde veri alma / veri çağırma özelliği nedir?!? Bunu doğru izledim mi? Bu değer nereden geliyor?

İs_salable için kurulumumda özyinelemeli bir grep yayınladım, kesinlikle bu, ayarlandığı satırları göstermelidir, ancak hemen bir şey göremiyorum:

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

BULUNDU:

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

SetSallable ayarlandı, sadece SetSallable yerine aramayı düşünmeyi / bilmemiştim .

Yanıtlar:


18

isAvailable() buna benzer:

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

Bu, yöntemin sonucunun ürün türüne bağlı olduğu anlamına gelir.
Her ürün türünün bir isSalable()yöntemi vardır:

  • Mage_Catalog_Model_Product_Type_Grouped::isSalable() - gruplandırılmış ürünler için
  • Mage_Catalog_Model_Product_Type_Configurable::isSalable() - yapılandırılabilir ürünler için
  • Mage_Catalog_Model_Product_Type_Abstract::isSalable()- tüm ürün tipleri uzadığından, diğer ürün tipleri için Mage_Catalog_Model_Product_Type_Abstract.
    Sanırım aramanın $this->getTypeInstance(true)kafanı karıştıracağını düşünüyorum. Bu yöntem getTypeInstance(), ürün modelinin bir örneğini değil, bir ürün türünün örneğini döndürür.

[EDIT]
Basit bir ürün için buna denir Mage_Catalog_Model_Product_Type_Grouped::isSalable(). Bu yöntem, ürünün etkin olup olmadığını kontrol eder. Değilse falseiade edilir. Etkinleştirilmişse, is_salablegözlemcilerinizden birinin ayarlayabileceği bir özelliği olup olmadığını kontrol eder .
Böyle bir özelliğe sahip değilse, ürün tipi örneği olup olmadığını kontrol eder $this->isComposite(). Öyleyse satılamaz.
Yapılandırılabilir ürünler için yukarıdaki koşulların karşılanıp karşılanmadığını ve satılabilir olan ile yapılandırılabilir ürünle ilişkili basit bir ürün olup olmadığını kontrol eder (Yukarıdaki koşullarla tekrar)
Aynı gruplanmış ürün için ancak farklı bir şekilde yapılır.

Sonuç is_salableolarak var olmak zorunda değildir. Ancak, ürünün satılıp satılamayacağını kontrol ederken bu özelliği belirleyen bir gözlemciniz varsa, dikkate alınmalıdır.
İşte çekirdekten bir örnek: Aynı yöntem için geçerli olan yöntem Mage_CatalogInventory_Model_Stock_Status::assignProduct()cals . Sonuncusu etkinlik tarafından çağrılır .$product->setIsSalable()
Mage_CatalogInventory_Model_Stock_Status::addStockStatusToProducts
catalog_product_collection_load_after


tekrar yardımınız için çok teşekkür ederim, izledim, isAllabilir ve Configurable.php's isAala var, sadece Abstract.php's isAlable çağırıyor ama yapabileceği tek şey 'is_salable' olup olmadığını kontrol etmektir ama hiçbir ayarını bulamıyorum? yukarıdaki kod izimi ekleyeceğim.
Hayden Thring

sorumu ekledi
Hayden Thring 11

2
Evet var. Cevabımda bahsettim catalog_product_collection_load_after. Ancak bu sadece bir örnek. Ayrıca ayarlamalar cataloginventory/observer::addInventoryDatayapan aramalar assignProductvar is_salable. Başkaları da olabilirdi ama ben hepsini aradım
Marius

1
Bunu yapmak için güvenilir bir yöntem yok. Belki de başlangıçta olan tüm olayları catalog_product_alıp gözlemcilerin bu olaylara çağırdığı yöntemleri ayıklayın. ve eğer biri ararsa bakın setIsSalableya dasetData('is_salable')
Marius

1
XmlConnect, mobil uygulamanızı web sitenize bağlamanızı sağlar. Boşver.
Marius


0

Yeniden boyutlandırma ve hata ayıklama işleminden sonra is_sala sonu gelmiyorsa ve yapılandırılabilir ürününüz hala stokta olarak gösteriliyorsa, tüm basit öğelerin TÜM mağaza görünümlerinde Enabled (Etkin) olarak ayarlandığından emin olun. Sadece iki saatimi boşa harcadım, ne yaptığımdan bağımsız olarak neden bir konfigürasyon yapmanın stokta olmadığını merak ediyorum, tüm mağazaların görüşlerini kontrol edip bir bedenin durumu engellediğini öğrenene kadar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.