Tüm Özel Fiyat ürünlerini gösteren Kategori sayfası oluştur


12

Temel olarak, kataloğumda kendilerine Özel Fiyat uygulanmış tüm ürünleri otomatik olarak dahil etmek istediğim bir 'Satıştaki Ürünler' kategorisi oluşturdum (Katalog> Ürünleri Yönet). Sayfanın, standart Magento Kategori sayfasının içerdiği katmanlı gezinme ve sıralama özelliklerini korumasını istiyorum .

Bu, Magento kullanıcılarının çoğunluğu için değerli olacak bir şey gibi görünüyor ve çekirdek işlevselliğin bir parçası olarak dahil edilmediğine şaşırdım.

Bir düzineden fazla Stack Exchange cevaplarını, blog gönderilerini ve forumları denedim ve şimdiye kadar hiçbir şey işe yaramadı. Bunun için programlı bir çözümü olan var mı?

=== DÜZENLE ===

@ Pspahn'ın aşağıdaki yorumlardaki eleştirisine dayanarak, benzer işlevsellik elde etmek için alternatif bir yöntem izlemeye karar verdim. Bununla birlikte, bu çizgiyi takip etmekle ilgileniyorsanız, @ sander-mangel tamamen uygulanabilir gibi görünen bir yöntemi açıklar.


Bana öyle geliyor ki, "tüm özel fiyat ürünlerini otomatik olarak içerme" gereksinimi biraz fazla. Sonuçta, üzerinde özel fiyat ürünleri olan bir sayfa istediğiniz ve bir kategori sayfası gibi görünmesini istediğinizi varsayalım. Bunun yerine kendi modelinizi / koleksiyonunuzu (özel bir fiyata sahip ürünlere dayalı olarak) oluşturabileceğiniz ve bu koleksiyonu kategori görünümü sayfalarına göre şablonlarda kullanabileceğiniz anlaşılıyor. Otomatik olarak doldurulmuş bir kategoriyi iyi bir çözüm olarak görmüyorum, örneğin bir kullanıcının değiştirmesini nasıl önlersiniz?
pspahn

@pspahn Yanıtınız için teşekkür ederiz. Eleştirinizi anlıyorum ve muhakemenize katılıyorum. Sander Mangel tarafından açıklanan yöntemi iyi bir ölçüm için ek bir category_save_after gözlemcisi ile kullanabilirim, ancak bu aşırıya kaçmış gibi görünüyor. Alternatif bir çözümle ilerleyeceğim.
rokkor

@pspahn - 'Bir kullanıcının değiştirmesini nasıl önlersiniz' ile ne demek istediğinizi anlamıyorum - biraz daha açıklayabilir misiniz?
ProxiBlue

@ProxiBlue Temel olarak, bir kategori oluşturup ürünlerle otomatik olarak doldurursanız, bir yönetici kullanıcı arka uçta bu kategoriye girebilir ve ürünleri manuel olarak ekleyebilir / kaldırabilir.
pspahn

@pspahn ok, kullanıcı ile ön uç kullanıcı olarak yanlış anladım.
ProxiBlue

Yanıtlar:


8

Bunu yapmanın en kolay yolu, bir Gözlemci ve Cronjob ile çalışan özel bir uzantı oluşturmaktır.

Satış ürünleri için bir kategori oluşturun. Bu şekilde, ön uçta katmanlı gezinme vb. Gibi normal Magento işlevlerini kullanabilirsiniz.

Bu kategorideki ürünleri otomatik olarak almak için gözlemci ve cronjob kullanacağız. Gözlemci, catalog_product_save_afterbir ürün arka uca kaydedildiğinde tetiklenen olayı gözlemleyecektir . Bu kontrol edebilirsiniz durum oluştuğunda special_price, special_price_fromtarih ve special_date_tosatış kategorisinde ürün koymak veya oradan çıkarmak gerekiyorsa tarih belirlemek için.

Cronjob özel ve tarihleri ​​için orada. Gece yarısından sonra her gece önce tüm ürünlerin satış kategorisini boşaltın. Daha sonra, özel bir fiyatı olan ve özel olandan bugüne kadar olan tüm ürünleri almak için bir koleksiyon kullanın. Öyleyse, bunları bu satış kategorisine taşıyın.


7

@SanderMangel tarafından sunulan çözüm birinci sınıftır. Şu anda modülün Otomatik / Dinamik Kategori ürünlerimde kullandığım bazı kodlarla bunun genişlemesine yardımcı olabilirim - özel olarak ürünlerin Kategori kurallarını yapabilme

Kod, kodun çalıştığı gün özel fiyat ayarlı tüm ürünleri almak için standart bir ürün koleksiyonunu ayarlar. Kategorileri saat 00: 00'da yeniden doldurmak ve güncel kaldıklarından emin olmak için bunu cronda kullanabilirsiniz.

Kodun daha büyük bir modülden çıkarıldığını unutmayın, bu yüzden burada sizin için ilgili parçaları sıkıştırmıştım. Bu özette temsil edilmeyen bir veya iki değişken olabilir, ancak çıkarılması veya sadece sorması kolay olur :)

$ Category nesnesi, ürünleri içerecek gerçek kategoridir. Aşağıdaki kod, indirimi% değerinde de belirtmenize izin verecektir :)

$collection = $category->getProductCollection();

$todayDate = Mage::app()->getLocale()->date()->toString(Varien_Date::DATE_INTERNAL_FORMAT);
$collection->addAttributeToFilter(array(
    array(
        'attribute' => "special_to_date",
        'null' => true
    ),
    array(
        'attribute' => "special_to_date",
        'from' => $todayDate,
        //'to'      => $todayDate,
        'date' => true
    )
));
$collection->addAttributeToFilter(array(
    array(
        'attribute' => "special_from_date",
        'null' => true
    ),
    array(
        'attribute' => "special_from_date",
        //'from'    => $todayDate,
        'to' => $todayDate,
        'date' => true
    )
));

$collection->addAttributeToSelect('special_price','left');
$collection->addAttributeToSelect('price','left');
$select = $collection->getSelect();

if (strpos($value, '%') > 0) {
    $value = str_replace('%', '', $value);
    $select->where('( 100 - (( at_special_price.value * 100 ) / at_price.value ) )  ' . $operator . ' ' . $value);
} else {
    $select->where('((at_price.value - at_special_price.value)) ' . $operator . ' ' . $value);
}

Şimdi, koleksiyonun normal katalog <-> ürün bağlantı tablolarına bağlantılar içerdiği için koleksiyonun ürünleri iade etmeyeceğine dikkat edin. Mevcut bağlantılı ürünlerle ilgilenmediğiniz için, tablo ilişkisini koleksiyondan temizlemeniz gerekir.

Bunu yapmak için aşağıdaki kodu kullanın:

/**
 * Remove Catalog Product Link elements from collection
 * 
 * @param type $collection
 * @return type
 */
public function removeCatProPart($collection)
{
    $select = $collection->getSelect();
    $fromPart = $select->getPart(Zend_Db_Select::FROM);
    $select->reset(Zend_Db_Select::FROM);

    if (array_key_exists('cat_pro', $fromPart)) {
        unset($fromPart['cat_pro']);
        // also remove any reference to the table in the rest of the query
        $columns = $select->getPart(Zend_Db_Select::COLUMNS);
        $columnRemoved = false;
        foreach ($columns as $columnKey => $column) {
            if ($column[0] == 'cat_pro') {
                unset($columns[$columnKey]);
                $columnRemoved = true;
            }
        }

        if ($columnRemoved) {
            $select->setPart(Zend_Db_Select::COLUMNS, $columns);
        }

        $orderPart = $select->getPart(Zend_Db_Select::ORDER);
        $orderRemoved = false;
        foreach ($orderPart as $orderKey => $order) {
            if ($order[0] == 'cat_pro') {
                unset($orderPart[$orderKey]);
                $orderRemoved = true;
            }
        }

        if ($orderRemoved) {
            $select->setPart(Zend_Db_Select::ORDER, $orderPart);
        }
    }
    $select->setPart(Zend_Db_Select::FROM, $fromPart);
    return $collection;
}

ek bir bonus olarak, katalog ürün koleksiyonunu ayarlamak için aynı tikniği kullanabilir ve katalog kuralları nedeniyle özel modda olan ürünleri bulabilirsiniz:

$storeDate = Mage::app()->getLocale()->storeTimeStamp($this->getStoreId());
$value = $this->getValue();
$conditions = 'price_rule.product_id = e.entity_id AND ';
$conditions .= "(from_time = 0
    OR from_time <= " . $storeDate . ")
    AND (to_time = 0
    OR to_time >= " . $storeDate . ") AND ";
$conditions .= "price_rule.rule_id IN (" . $value . ")";
$collection->getSelect()->joinInner(
        array('price_rule' => $collection->getTable('catalogrule/rule_product')), $conditions);
$collection->setFlag('applied_catalog_rule_id', true);
$collection->setFlag('applied_rule', true);

Bir kez çalışma koleksiyonu var, tek yapmanız gereken koleksiyondan tüm kimlikleri almak, dizi çevirin ve kullanın $category->setPostedProducts($products);ve bir $ category-> save () l; güncellemeyi tamamlamak için.

Tamlık için, dinamik kategorileri güncel tutan günlük cronum. (yine, burada bulunmayan yöntemlere atıfta bulunur, ancak eminim sizi doğru yöne götürecektir)

İyi eğlenceler :)

public static function rebuildAllDynamic($schedule)
{
    try {
        $tempDir = sys_get_temp_dir() . "/";
        $fp = fopen($tempDir . "dyncatprod_rebuild.lock", "w+");
        if (flock($fp, LOCK_EX | LOCK_NB)) {
            if (Mage::getStoreConfig('dyncatprod/debug/enabled')) {
                   mage::log("DynCatProd - rebuildAllDynamic");
            }
            if (!Mage::getStoreConfig('dyncatprod/rebuild/max_exec')) {
                ini_set('max_execution_time', 3600); // 1 hour
            }
            $categories = Mage::getModel('catalog/category')
                ->getCollection()
                ->addAttributeToSelect('*')
                ->addIsActiveFilter()
                ->addAttributeToFilter('dynamic_attributes', array('notnull' => true));

            foreach ($categories as $category) {
                $products = Mage::helper('dyncatprod')->getDynamicProductIds($category);
                if (is_array($products)) {
                    if (Mage::getStoreConfig('dyncatprod/debug/enabled')) {
                        mage::log("rebuilding :" . $category->getName() . ' ' . $category->getPath() );
                    }
                    $products = array_flip($products);
                    $category->setPostedProducts($products);
                    $category->setIsDynamic(true);
                    $category->save();
                }
            }
            flock($fp, LOCK_UN); 
            unlink($tempDir . "dyncatprod_rebuild.lock");
        } else {
            mage::log('Could not execute cron for rebuildAllDynamic -file lock is in place, job may be running');
        }
    } catch (Exception $e) {
        flock($fp, LOCK_UN); 
        unlink($tempDir . "dyncatprod_rebuild.lock");
        mage::logException($e);
        return $e->getMessage();
    }
}

ref: http://www.proxiblue.com.au/magento-dynamic-category-products.html


5

Kataloğunuzdaki tek bir sayfada görüntüleyebileceğiniz tüm özel fiyat ürünlerinin sonuçlarını size vermesi gereken koleksiyon

$collection = Mage::getResourceModel('catalog/product_collection')
    ->addAttributeToSelect('price')
    ->setStoreId($this->getStoreId());

$date = strtotime(date('Y-m-d')); $current_date = date("Y-m-d hh:mm:ss",$date);

$collection = $collection
    ->addAttributeToFilter('price',
        array('gt'=>0))
    ->addAttributeToFilter('visibility',
        array('neq'=>Mage_Catalog_Model_Product_Visibility::VISIBILITY_NOT_VISIBLE));

if (Mage::getStoreConfigFlag(Mage_Catalog_Helper_Product_Flat::XML_PATH_USE_PRODUCT_FLAT, $this->getStoreId())){
    $collection = $collection->addAttributeToFilter('special_price',array('lt'=>new Zend_Db_Expr('e.price')));
}
else{
    $collection = $collection->addAttributeToFilter(array(
        array('attribute'=>'special_price','lt'=>new Zend_Db_Expr('at_price.value'))
    ));
}

$collection = $collection->addAttributeToFilter(array(
        array('attribute'=>'special_from_date','lteq'=>$current_date),
        array('attribute'=>'special_from_date','eq'=>''),
        array('attribute'=>'special_from_date','null'=>true)
    ),'','left')
    ->addAttributeToFilter(array(
        array('attribute'=>'special_to_date','gteq'=>$current_date),
        array('attribute'=>'special_to_date','eq'=>''),
        array('attribute'=>'special_to_date','null'=>true)
            ),'','left');

$collection->getSelect()->group('e.entity_id');

return $collection;

Bunu yapmanın birkaç yolu vardır, kendi denetleyicisine, bloğuna ve modeline Mage kategori modülüne çok benzeyen yeni bir modül oluşturun veya Mage kategori modülünü yalnızca müşteri tarafından özel kategori seçildiğinde çalıştırmak için geçersiz kılın. Bu, modülünüzün sistem -> yapılandırmasında kolayca yapılandırılabilir.

Birkaç sterlin harcayabilirseniz, Magento connect'de aşağıdaki uzantıyı tavsiye ederim

Magento 1 için -:

http://www.magentocommerce.com/magento-connect/dynamic-sale-category.html ( http://www.scommerce-mage.co.uk/magento-dynamic-sale-category.html )

Magento 2 için -:

https://www.scommerce-mage.com/magento2-dynamic-sale-category.html

Umarım yardımcı olur!

Şerefe S


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.