@ স্যান্ডারম্যাঞ্জেল প্রদত্ত সমাধানটি শীর্ষস্থানীয়। আমি কিছু কোড দিয়ে এটিকে প্রসারিত করতে সাহায্য করতে পারি, যা আমি বর্তমানে আমার মডিউলটিতে স্বয়ংক্রিয় / গতিশীল বিভাগের পণ্যগুলিতে ব্যবহার করি - যা বিশেষে পণ্যগুলির বিভাগের নিয়মগুলি করার ক্ষমতা রাখে
কোডটি যেদিন চালিত হয়, বিশেষ মূল্য সেট সহ সমস্ত পণ্য পেতে কোডটি একটি মানক পণ্য সংগ্রহকে সামঞ্জস্য করে। আপনি 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);
এবং একটি $ বিভাগ-> সেভ () এল ব্যবহার করুন; আপডেট সম্পূর্ণ করতে।
সম্পূর্ণতার জন্য, এখানে আমার দৈনিক ক্রোন যা গতিশীল বিভাগগুলি আপ-টু-ডেট রাখে। (আবার, এটি এখানে অন্তর্ভুক্ত না করা পদ্ধতিগুলি বোঝায়, তবে আমি নিশ্চিত যে এটি আপনাকে সঠিক দিকে নিয়ে যাবে)
আনন্দ কর :)
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