Buat halaman Kategori yang menampilkan semua produk Harga Khusus

12

Pada dasarnya, saya telah membuat kategori 'Produk yang Dijual', yang saya ingin secara otomatis memuat semua produk dalam katalog saya yang telah menerapkan Harga Khusus untuknya (melalui Katalog> Kelola Produk). Saya ingin halaman mempertahankan navigasi berlapis dan kemampuan menyortir yang berisi halaman Kategori Magento standar.

Sepertinya ini adalah sesuatu yang akan berharga bagi sebagian besar pengguna Magento, dan saya terkejut itu tidak dimasukkan sebagai bagian dari fungsionalitas inti.

Saya telah mencoba lebih dari selusin jawaban Stack Exchange, posting blog, dan forum, dan sejauh ini belum ada yang berhasil. Adakah yang punya solusi terprogram untuk ini?

=== EDIT ===

Berdasarkan kritik @ pspahn dalam komentar di bawah, saya telah memutuskan untuk mengejar metode alternatif untuk mencapai fungsi serupa. Dengan itu, jika Anda tertarik untuk mengejar baris ini, @ sander-mangel menjelaskan metode yang tampaknya sepenuhnya layak.

rokkor
sumber
Sepertinya saya bahwa persyaratan "secara otomatis mengandung semua produk harga khusus" agak berlebihan. Saya berasumsi bahwa hasil akhirnya adalah Anda menginginkan halaman dengan produk dengan harga khusus dan membuatnya seperti halaman kategori. Tampaknya Anda malah bisa membuat model / koleksi Anda sendiri (berdasarkan produk dengan harga khusus) dan menggunakan koleksi itu dalam templat (s) berdasarkan halaman tampilan kategori. Saya hanya tidak melihat kategori yang terisi secara otomatis sebagai solusi yang baik, misalnya, bagaimana Anda mencegah pengguna memodifikasinya?
pspahn
@ pspahn Terima kasih atas tanggapan Anda. Saya memahami kritik Anda dan setuju dengan alasan Anda. Saya bisa menggunakan metode yang dijelaskan oleh Sander Mangel dengan pengamat category_save_after tambahan untuk ukuran yang baik, tapi itu sepertinya berlebihan. Saya akan maju dengan solusi alternatif.
rokkor
@ pspahn - Saya tidak mengerti apa yang Anda maksud dengan 'bagaimana Anda mencegah pengguna memodifikasinya' - dapatkah Anda menjelaskan sedikit lebih jauh?
ProxiBlue
@ProxiBlue Pada dasarnya, jika Anda membuat kategori dan mengisi produk secara otomatis, pengguna admin dapat masuk ke kategori itu di backend dan menambah / menghapus produk secara manual.
pspahn
@ pspahn ok, dengan pengguna saya salah paham sebagai pengguna front-end.
ProxiBlue

Jawaban:

8

Cara termudah untuk melakukan ini adalah dengan membuat ekstensi kustom yang berfungsi dengan Pengamat dan Cronjob.

Buat kategori untuk produk penjualan. Dengan cara ini Anda dapat menggunakan fungsi Magento normal di frontend seperti navigasi berlapis dll.

Untuk mendapatkan produk dalam kategori ini secara otomatis kami akan menggunakan pengamat dan cronjob. Pengamat akan mengamati catalog_product_save_afterperistiwa yang dipicu ketika suatu produk disimpan di backend. Ketika ini terjadi, Anda dapat memeriksa special_price, special_price_fromtanggal dan special_date_totanggal untuk menentukan apakah Anda perlu memasukkan produk ke dalam kategori penjualan atau menghapusnya dari sana.

Cronjob ada untuk kencan spesial dari dan ke tanggal. Setiap malam setelah tengah malam, pertama-tama kosongkan kategori penjualan semua produk. Kemudian gunakan koleksi untuk mengambil semua produk yang memiliki harga khusus dan termasuk dalam harga khusus dari dan hingga saat ini. Jika demikian pindahkan mereka ke kategori penjualan ini.

Sander Mangel
sumber
7

Solusi yang ditawarkan oleh @SanderMangel adalah yang terbaik. Saya dapat membantu mengembangkan ini dengan beberapa kode, yang saat ini saya gunakan dalam modul saya Otomatis / Produk Kategori Dinamis - yang memiliki kemampuan untuk melakukan aturan Kategori produk pada khusus

Kode menyesuaikan kumpulan produk standar untuk mendapatkan semua produk dengan harga khusus yang ditetapkan, pada hari kode berjalan. Anda dapat menggunakan ini di cron untuk mengisi kembali kategori pada pukul 00:00, dan memastikan mereka tetap diperbarui.

Perhatikan bahwa kode diekstraksi dari modul yang lebih besar, jadi saya telah memadatkan bagian yang relevan di sini untuk Anda. Mungkin ada satu atau dua variabel yang tidak terwakili dalam ekstrak ini, tetapi mereka akan mudah untuk menyimpulkan, atau hanya bertanya :)

Objek $ kategori adalah kategori aktual yang berisi produk. Kode di bawah ini juga akan memungkinkan Anda untuk menentukan diskon dalam nilai% juga :)

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

Sekarang, yang perlu diperhatikan adalah bahwa koleksi tidak akan mengembalikan produk, karena berisi tautan ke katalog normal <-> tabel tautan produk. Karena Anda tidak tertarik dengan produk tertaut saat ini, Anda perlu menghapus relasi tabel yang keluar dari koleksi.

Saya menggunakan kode berikut untuk menyelesaikannya:

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

sebagai bonus tambahan, Anda dapat menggunakan teknik yang sama dalam menyesuaikan koleksi produk katalog, dan menemukan produk yang berada dalam mode khusus karena aturan katalog:

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

Setelah Anda memiliki koleksi yang berfungsi, yang perlu Anda lakukan adalah mendapatkan semua id dari koleksi, membalikkan array, dan menggunakan $category->setPostedProducts($products);dan $ kategori-> save () l; untuk menyelesaikan pembaruan.

Untuk kelengkapan, berikut adalah cron harian saya yang membuat kategori dinamis tetap mutakhir. (Sekali lagi, ini mengacu pada metode yang tidak termasuk di sini, tapi saya yakin itu akan membuat Anda ke arah yang benar

Selamat bersenang-senang :)

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

ProxiBlue
sumber
5

Ini adalah koleksi yang akan memberi Anda resultset dari semua produk harga khusus dalam katalog Anda yang dapat Anda tampilkan dalam satu halaman

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

Ada beberapa cara Anda dapat melakukan ini, baik membuat modul baru yang memiliki controller sendiri, blok dan model yang sangat mirip dengan modul kategori Mage atau Anda menimpa modul kategori Mage untuk hanya menjalankan koleksi di atas ketika kategori khusus dipilih oleh pelanggan. Ini dapat dengan mudah dikonfigurasikan dalam sistem -> konfigurasi modul Anda.

Jika Anda dapat menghabiskan beberapa pound maka saya akan merekomendasikan ekstensi berikut pada koneksi Magento

Untuk Magento 1 -:

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

Untuk Magento 2 -:

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

Semoga ini bisa membantu!

Cheers S

stevensagaar
sumber
0

Saya membuat ekstensi untuk Magento 2 yang menampilkan produk khusus di bawah pengontrolnya sendiri dengan navigasi berlapis. Jadi tidak perlu untuk kategori atau cron.

https://github.com/DominicWatts/Special

Semoga ini bisa membantu seseorang

Dominic Xigen
sumber