@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