모든 특별 가격 제품을 표시하는 카테고리 작성 페이지


12

기본적으로 '판매중인 제품'범주를 만들었습니다. 여기 에는 특별 가격이 적용된 카탈로그의 모든 제품 (카탈로그> 제품 관리) 이 자동으로 포함 됩니다 . 표준 Magento 카테고리 페이지에 포함 된 계층화 된 탐색정렬 기능 을 유지하기 위해 페이지를 원합니다 .

이것은 대부분의 Magento 사용자에게 귀중한 것으로 보이며 핵심 기능의 일부로 포함되지 않은 것에 놀랐습니다.

나는 12 가지 이상의 스택 교환 답변, 블로그 게시물 및 포럼을 시도했지만 지금까지 아무것도 작동하지 않았습니다. 누구든지 이것을위한 프로그래밍 솔루션을 가지고 있습니까?

=== 편집 ===

아래 의견에서 @pspahn의 비판을 바탕으로 비슷한 기능을 달성하는 다른 방법을 사용하기로 결정했습니다. 그렇기 때문에 @ sander-mangel 은이 라인을 추구하는 데 관심이 있다면 완전히 실현 가능한 것처럼 보이는 방법을 설명합니다.


"모든 특별 가격 제품을 자동으로 포함"하는 요구 사항이 약간 과도하다고 생각됩니다. 최종 결과는 특별한 가격의 제품이있는 페이지를 원하고 카테고리 페이지처럼 보이게하는 것입니다. 대신 특별 가격을 가진 제품을 기반으로 자신의 모델 / 컬렉션을 만들고 범주보기 페이지를 기반으로 템플릿에서 해당 컬렉션을 사용할 수 있습니다. 좋은 솔루션으로 자동으로 채워지는 카테고리가 표시되지 않습니다. 예를 들어, 사용자가 카테고리를 수정하지 못하게하려면 어떻게해야합니까?
pspahn

@pspahn 답변 해 주셔서 감사합니다. 나는 당신의 비판을 이해하고 당신의 추론에 동의합니다. Sander Mangel이 설명 한 방법을 추가 측정을 위해 추가 category_save_after 관찰자와 함께 사용할 수는 있지만 과도한 것으로 보입니다. 대체 솔루션으로 진행하겠습니다.
rokkor December

@pspahn- '사용자가 수정하지 못하게하는 방법'에 대한 의미를 이해하지 못합니다. 조금 더 설명해 주시겠습니까?
ProxiBlue

@ProxiBlue 기본적으로 범주를 만들고 제품을 자동으로 채우면 관리자는 백엔드에서 해당 범주로 이동하여 제품을 수동으로 추가 / 제거 할 수 있습니다.
pspahn

@pspahn ok, 사용자가 프런트 엔드 사용자로 오해했습니다.
ProxiBlue

답변:


8

이를 수행하는 가장 쉬운 방법은 관찰자 및 Cronjob과 작동하는 사용자 정의 확장을 작성하는 것입니다.

판매 제품에 대한 카테고리를 작성하십시오. 이 방법으로 계층 내비게이션 등과 같은 프론트 엔드에서 일반 마 젠토 기능을 사용할 수 있습니다.

이 범주의 제품을 자동으로 가져 오려면 관찰자와 cronjob을 사용합니다. 관찰자는 catalog_product_save_after제품이 백엔드에 저장 될 때 트리거 되는 이벤트를 관찰합니다 . 이 경우 special_price, special_price_from날짜 및 special_date_to날짜를 확인하여 제품을 판매 카테고리에 넣거나 제거해야하는지 판별 할 수 있습니다.

cronjob은 현재까지의 특별한 날을 위해 존재합니다. 자정 이후 매일 밤마다 모든 제품의 판매 카테고리를 비 웁니다. 그런 다음 컬렉션을 사용하여 특별 가격이 적용되어 현재까지의 특별 제품에 속하는 모든 제품을 검색하십시오. 그렇다면이 판매 카테고리로 이동하십시오.


7

@SanderMangel이 제공하는 솔루션은 최고 수준입니다. 나는 현재 모듈 내 자동화 / 동적 카테고리 제품에서 사용하는 일부 코드를 사용하여이를 확장 할 수 있습니다.

이 코드는 표준 제품 모음을 조정하여 코드가 실행되는 날에 특별 가격이 설정된 모든 제품을 얻습니다. cron에서 이것을 사용하여 00:00에 카테고리를 다시 채우고 업데이트 된 상태를 유지할 수 있습니다.

코드는 더 큰 모듈에서 추출되므로 여기에서 관련 부분을 압축했습니다. thsi 추출에 표시되지 않은 변수가있을 수 있지만 추론하거나 쉽게 물어보십시오 :)

$ category 개체는 제품을 포함 할 실제 범주입니다. 아래 코드를 사용하면 할인도 % 값으로 지정할 수 있습니다. :)

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

워킹 컬렉션이 있으면 컬렉션에서 모든 ID를 가져 와서 배열을 뒤집어 사용 $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 카테고리 모듈을 대체하십시오. 모듈의 시스템-> 구성에서 쉽게 구성 할 수 있습니다.

quid를 거의 사용할 수 없다면 Magento connect에서 다음 확장을 권장합니다

마 젠토 1-:

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

마 젠토 2-:

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

그것이 도움이되기를 바랍니다!

건배 S


0

Magento 2의 확장 기능을 만들었습니다.이 탐색 기능은 계층 탐색 기능이있는 자체 컨트롤러 아래에 특별 제품을 표시합니다. 따라서 범주 또는 cron이 필요하지 않습니다.

https://github.com/DominicWatts/Special

이것이 누군가를 돕기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.