Створіть сторінку категорії, на якій відображаються всі товари спеціальних цін


12

В основному я створив категорію "Продукція у продажу", в якій я хотів би автоматично містити всі товари в своєму каталозі, на які було застосовано спеціальну ціну (через Каталог> Управління продуктами). Я хотів би, щоб сторінка зберегла багатошарові можливості навігації та сортування, які містить стандартна сторінка категорії Magento.

Здається, що це щось, що було б цінним для більшості користувачів Magento, і я дивуюсь, що воно не входить до складу основних функціональних можливостей.

Я спробував понад десяток відповідей на обмін стеками, повідомлення в блогах та форуми, і поки нічого не працювало. Хтось має для цього програмне рішення?

=== EDIT ===

Грунтуючись на критиці @ pspahn у коментарях нижче, я вирішив застосувати альтернативний метод досягнення аналогічних функцій. З урахуванням сказаного, якщо ви зацікавлені в проведенні цієї лінії, @ sander-mangel описує метод, який видається цілком здійсненним.


Мені здається, що вимога "автоматично містити всі спеціальні цінові товари" є трохи надмірною. Я припускаю, що кінцевим результатом є те, що ви хочете, щоб сторінка зі спеціальними ціновими продуктами на ній була і вона була схожа на сторінку категорії. Здається, ви можете замість цього просто створити власну модель / колекцію (на основі продуктів із спеціальною ціною) та використовувати цю колекцію у шаблонах (их) на основі сторінок перегляду категорій. Я просто не бачу категорію, яка автоматично заповнюється як хороше рішення, наприклад, як ви заважаєте користувачеві її змінювати?
pspahn

@pspahn Дякую за вашу відповідь. Я розумію вашу критику і згоден з вашими міркуваннями. Я міг би використати метод, описаний Сандером Мангелом, для додаткового спостерігача категорії_save_after для гарної міри, але це здається непосильним. Я піду вперед із альтернативним рішенням.
rokkor

@pspahn - я не розумію, що ви маєте на увазі під поняттям "як ви заважаєте користувачеві його змінювати" - ви можете пояснити трохи далі?
ProxiBlue

@ProxiBlue В основному, якщо ви створюєте категорію і автоматично заповнюєте продукти, користувач адміністратора може просто перейти в цю категорію в заднім часі і додавати / видаляти продукти вручну.
pspahn

@pspahn добре, з користувачем я неправильно зрозумів як передовий користувач.
ProxiBlue

Відповіді:


8

Найпростіший спосіб зробити це - створити користувацьке розширення, яке працює з спостерігачем і Cronjob.

Створіть категорію для продуктів продажу. Таким чином, ви можете використовувати нормальні функції Magento у передній частині, як багатошарова навігація тощо.

Для автоматичного отримання продуктів у цій категорії ми використовуємо спостерігач та кронштейн. Спостерігач спостерігатиме за catalog_product_save_afterподією, яка починається під час збереження продукту в запасному середовищі. Коли це станеться , ви можете перевірити special_price, special_price_fromдату і special_date_toдату , щоб визначити , якщо вам потрібно помістити продукт в категорію продажів або видалити його звідти.

Cronjob є для особливих від та до дат. Щовечора після півночі спочатку спорожніть категорію продажів усіх продуктів. Потім використовуйте колекцію, щоб отримати всі продукти, які мають особливу ціну і підпадають під спеціальну з сьогоднішнього дня. Якщо так, перемістіть їх до цієї категорії продажів.


7

Рішення, яке пропонує @SanderMangel, є першокласним. Я можу допомогти розширити цю проблему за допомогою деякого коду, який я зараз використовую у своєму модулі «Автоматизована / динамічна категорія продуктів» - який має можливість робити правила категорії щодо спеціальних

Код налаштовує стандартну колекцію продуктів, щоб отримати всі товари зі спеціальною ціною, встановленої в день запуску коду. Ви можете використовувати це в кроні для повторного заповнення категорій о 00:00 та переконайтесь, що вони постійно оновлюються.

Зауважте, що код витягується з більшого модуля, тому я тут ущільнив відповідні частини. Може бути змінна чи дві, які не представлені в цьому витязі, але їх було б легко вивести або просто запитати :)

Об'єкт категорії $ - це фактична категорія, яка повинна містити продукти. Приведений нижче код також дозволить вам вказати знижку у% -му значенні :)

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

Тепер зауважимо, що колекція не повертає продукти, оскільки містить посилання на звичайні таблиці <-> таблиці посилань на товар. Оскільки вас не цікавлять поточні пов'язані продукти, вам потрібно очистити цю таблицю із колекції.

Для цього я використовую такий код:

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

як додатковий бонус, ви можете використовувати ту саму техніку для коригування колекції каталогічного продукту та знаходити товари, які перебувають у спеціальному режимі за правилами каталогу:

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

Щойно у вас є робоча колекція, все, що вам потрібно зробити, це отримати всі ідентифікатори з колекції, перегорнути масив і використовувати $category->setPostedProducts($products); і $ category-> save () l; щоб завершити оновлення.

Для повноти ось мій щоденний cron, який постійно оновлює динамічні категорії. (знову ж таки, це стосується методів, не включених сюди, але я впевнений, що це допоможе вам у правильному напрямку

Приємно :)

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

посилання: http://www.proxiblue.com.au/magento-dynamic-category-products.html


5

Ось колекція, яка повинна дати вам результат усіх спеціальних цінових товарів у вашому каталозі, які ви можете відображати на одній сторінці

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

Ви можете зробити це декількома способами: створити новий модуль, у якого є власний контролер, блок і модель, дуже схожа на модуль категорії Mage, або ви перекриєте модуль категорії Mage, щоб запустити вищевказану колекцію лише тоді, коли спеціальна категорія обрана замовником. Це можна легко налаштувати в системній конфігурації модуля.

Якщо ви можете витратити кілька фунтів, я б рекомендував наступне розширення на Magento connect

Для Magento 1 -:

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

Для Magento 2 -:

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

Сподіваюся, це допомагає!

Привіт S


0

Я створив розширення для Magento 2, яке відображає продукти на спеціальних під власним контролером з багатошаровою навігацією. Тож не потрібно ні категорії, ні крона.

https://github.com/DominicWatts/Special

Сподіваюся, що це комусь допоможе

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.