Оцените пожалуйста код
Добрый день. Делаю ТДС интернет-магазина, чтобы были и нормальные фильтры (по ярлыкам) и снижена нагрузка в моментах, когда не надо передавать некоторые параметры. Поэтому, сходя из логики работы разделил на 4 части вывод если мы не в товаре
1) корень - выводим список групп
2) второй уровень - выводим подгруппы
3) в группе третьего уровня с подгруппами - выводим товары и не выводим подгруппы (выводим товары из всех подгрупп)
4) в группе третьего уровня, которая не имеет подгрупп - выводим только товары
Ну и так получилось, что мне сказали, что этот код полная неадекватная бредятина. Согласен, есть очень топорные места, ну да я и не программист. Но разве в целом это не правильно? Если считаете, что можно сделать иначе то же самое - буду раз совету. Выкладываю часть кода до фильтра по цене (далее все как в обычной ТДС)
1) корень - выводим список групп
2) второй уровень - выводим подгруппы
3) в группе третьего уровня с подгруппами - выводим товары и не выводим подгруппы (выводим товары из всех подгрупп)
4) в группе третьего уровня, которая не имеет подгрупп - выводим только товары
Ну и так получилось, что мне сказали, что этот код полная неадекватная бредятина. Согласен, есть очень топорные места, ну да я и не программист. Но разве в целом это не правильно? Если считаете, что можно сделать иначе то же самое - буду раз совету. Выкладываю часть кода до фильтра по цене (далее все как в обычной ТДС)
<?php
$shortprice=0;
$Shop_Controller_Show = Core_Page::instance()->object;
$xslName = $Shop_Controller_Show->item
? Core_Array::get(Core_Page::instance()->libParams, 'shopItemXsl')
: Core_Array::get(Core_Page::instance()->libParams, 'shopXsl');
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('ТекущаяГруппа')->value($Shop_Controller_Show->group)
)->addEntity(
Core::factory('Core_Xml_Entity')
->name('show_comments')->value(Core_Array::get(Core_Page::instance()->libParams, 'showComments', 1))
)->addEntity(
Core::factory('Core_Xml_Entity')
->name('show_add_comments')->value(Core_Array::get(Core_Page::instance()->libParams, 'showAddComment', 2))
);
$pages_cat=array(612,613,614,615,616,617,618,619,620,621,622,673,676,678,682,685,626); //надо как то понять, что мы в группах 3го уровня с подгруппами, которые не надо выводить
$pages_level2=array(610,611,631); //надо понять, что мы в группах второго уровня
$Shop_Controller_Show
->tags(TRUE)
->comments(TRUE)
->associatedItems(TRUE)
->modifications(TRUE);
if ($Shop_Controller_Show->item == 0) //если мы НЕ В ТОВАРЕ
{
//Считаем максимальную цену для фильтра
$max_price=1000000;
if(in_array($Shop_Controller_Show->group,$pages_cat)){
//Если мы в страницах, гед выводятся товары из подгрупп, а сами подгруппы не выводятся
$oCore_QueryBuilder_Select2 = Core_QueryBuilder::select('id')->from('shop_groups')
->where('parent_id', '=', $Shop_Controller_Show->group);
$oCore_QueryBuilder_Select = Core_QueryBuilder::select('MAX(price)')->from('shop_items')
->where('shop_group_id', 'IN', $oCore_QueryBuilder_Select2);
//Проверяем ярлыки и определяем максимлаьную цену товара (включая ярлыки, который отображается на странице)
$oCore_QueryBuilder_Select3 = Core_QueryBuilder::select('shortcut_id')->from('shop_items')
->where('shop_group_id', 'IN',$oCore_QueryBuilder_Select2);
$oCore_QueryBuilder_Select4 = Core_QueryBuilder::select('MAX(price)')->from('shop_items')
->where('id', 'IN', $oCore_QueryBuilder_Select3);
$row = $oCore_QueryBuilder_Select4->execute()->asAssoc()->current();
$shortprice=$row["MAX(`price`)"];
}
else{ //Если мы на страницах внутри группы (например аксессуары - велозамки)
$oCore_QueryBuilder_Select = Core_QueryBuilder::select('MAX(price)')->from('shop_items')
->where('shop_group_id', '=', $Shop_Controller_Show->group);
}
$row = $oCore_QueryBuilder_Select->execute()->asAssoc()->current();
//Смотрим цену товара и сравниваем что больше - товар или модификация
if($row["MAX(`price`)"]!='')
$max_price=$row["MAX(`price`)"] ;
$max_price=substr($max_price,0,-3);
if($shortprice>$max_price){
$shortprice=substr($shortprice,0,-3);
$max_price=$shortprice;
}
//Дописываем максимальную цену товара
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('max_price')->value($max_price));
if($Shop_Controller_Show->group == 0) //если мы не в группе, но можем быть в продавцах или корне
{
$Shop_Controller_Show->itemsForbiddenTags(array('text'));
$Shop_Controller_Show
->tags(FALSE)
->comments(FALSE)
->associatedItems(FALSE)
->modifications(FALSE)
->itemsProperties(FALSE)
->itemsPropertiesList(FALSE)
->groupsForbiddenTags(array('description'))
->siteuser(FALSE)
->comparing(FALSE)
->favorite(FALSE)
->viewed(FALSE)
// ->itemsProperties(true)
->groupsMode('all');
if($_SERVER['REQUEST_URI']=='/shop/'){
$Shop_Controller_Show->limit(0);
}
else{
$Shop_Controller_Show->groupsMode('none')
->groupsForbiddenTags(array('description','name'));
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('producers_showing')->value('1'));
}
} //конец мы не в группе, но можем быть в продавцах или корне
elseif(in_array($Shop_Controller_Show->group, $pages_level2)){ //если мы в группах велосипеды, аксессуары, запчати - то есть там, где не надо товары, а надо только выводить группы
$Shop_Controller_Show->itemsForbiddenTags(array('text'));
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('id_group_to_show')->value($Shop_Controller_Show->group));
$Shop_Controller_Show
->group(0)
->tags(FALSE)
->comments(FALSE)
->associatedItems(FALSE)
->modifications(FALSE)
->itemsProperties(FALSE)
->itemsPropertiesList(FALSE)
->groupsForbiddenTags(array())
->siteuser(FALSE)
->comparing(FALSE)
->favorite(FALSE)
->viewed(FALSE)
// ->itemsProperties(true)
->groupsMode('all')
->limit(0);
}// конец где не надо товары, а надо только выводить группы
elseif(in_array($Shop_Controller_Show->group, $pages_cat)){ //если мы в группе, у которой есть подгруппы, но надо выводить только товары без подгрупп
$Shop_Controller_Show
->groupsPropertiesList(FALSE)
->groupsMode('none')
->groupsProperties(FALSE)
->tags(FALSE)
->comments(FALSE)
->associatedItems(FALSE)
->modifications(FALSE)
->itemsProperties(TRUE)
->itemsPropertiesList(FALSE)
->groupsForbiddenTags(array('name'))
->siteuser(FALSE)
->comparing(FALSE)
->favorite(FALSE)
->itemsProperties(true)
->groupsMode('tree')
->viewed(FALSE); //просмотренные
}//если мы в группе, у которой есть подгруппы, но надо выводить только товары без подгрупп
else{ //если мы в группе у которой нет подгрупп и нам надо выводить товары
$Shop_Controller_Show->itemsForbiddenTags(array('text','description'));
$Shop_Controller_Show
->tags(FALSE)
->comments(FALSE)
->associatedItems(FALSE)
->modifications(FALSE)
->itemsProperties(TRUE)
->groupsForbiddenTags(array('description','name'))
->siteuser(FALSE)
->comparing(FALSE)
->favorite(FALSE)
->viewed(FALSE);
}
//-------------------------------------------------------количество товаров на странице----------------------------------------
$on_page = intval(Core_Array::getGet('on_page'));
if ($on_page > 0 && $on_page < 150)
{
$Shop_Controller_Show->limit = $on_page;
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('on_page')->value($on_page)
);
}
//--------------------------------------------------------если фильтр или сортировка--------------------------------------------------
if (Core_Array::getGet('filter') || Core_Array::getGet('sorting')|| Core_Array::getGet('nalich')) //если нам надо что-то сортировать, а не просто ссылка с параметрами без значений
{
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('filter')->value(1)
);
$oShop = $Shop_Controller_Show->getEntity();
$sorting = intval(Core_Array::getGet('sorting'));
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('sorting')->value($sorting)
);
$Shop_Controller_Show->addCacheSignature('sorting=' . $sorting);
//запоминаем значение года для фильтра
$year= intval(Core_Array::getGet('property_114'));
$Shop_Controller_Show->addCacheSignature('property_114=' . $year);
//если показывать только товары в наличии или под заказ
if(Core_Array::getGet('nalich')){
$nalich= intval(Core_Array::getGet('nalich'));
if($nalich==1) //тут берем значения из фильтра и топорно переделываем, чтобы потом просто подставить в фактическое наличие
$nal_status = -1;
if($nalich==2)
$nal_status = 0;
if($nalich==3)
$nal_status = 1;
if($nalich==1||$nalich==2||$nalich==3){
$Shop_Controller_Show->addCacheSignature('nalich=' . $nalich);
$Shop_Controller_Show->shopItems()
->queryBuilder()
->leftJoin('shop_warehouse_items', 'shop_warehouse_items.shop_item_id', '=', 'shop_items.id')
->having('SUM(shop_warehouse_items.count)', '>=', $nal_status)
->groupBy('shop_items.id');
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('nalich')->value($nalich));
}
}//закончили показ товаров в наличии или под заказ
//---------------------------------------------------если фильтруем по производителям--------------------------------------------
if (Core_Array::getGet('producer_id'))
{
$iProducerId = intval(Core_Array::getGet('producer_id'));
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('producer_id')->value($iProducerId)
);
//пытаемся вывести ярлыки для товаров этого же производителя, показанных до применения фильтра по производителю
$oCore_QueryBuilder_Select5 = Core_QueryBuilder::select('id')->from('shop_items')
->where('shop_producer_id', '=',$iProducerId);
$Shop_Controller_Show->shopItems()
->queryBuilder()
->select('shop_items.*')
->open()
->where('shop_items.shop_producer_id', '=', $iProducerId)
->setOr()
->where('shop_items.shortcut_id', 'IN',$oCore_QueryBuilder_Select5 )
->close();
$Shop_Controller_Show->addCacheSignature('producer_id=' . $iProducerId); //запоминаем производителя для сохранения в фильтре
}
$shortprice=0;
$Shop_Controller_Show = Core_Page::instance()->object;
$xslName = $Shop_Controller_Show->item
? Core_Array::get(Core_Page::instance()->libParams, 'shopItemXsl')
: Core_Array::get(Core_Page::instance()->libParams, 'shopXsl');
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('ТекущаяГруппа')->value($Shop_Controller_Show->group)
)->addEntity(
Core::factory('Core_Xml_Entity')
->name('show_comments')->value(Core_Array::get(Core_Page::instance()->libParams, 'showComments', 1))
)->addEntity(
Core::factory('Core_Xml_Entity')
->name('show_add_comments')->value(Core_Array::get(Core_Page::instance()->libParams, 'showAddComment', 2))
);
$pages_cat=array(612,613,614,615,616,617,618,619,620,621,622,673,676,678,682,685,626); //надо как то понять, что мы в группах 3го уровня с подгруппами, которые не надо выводить
$pages_level2=array(610,611,631); //надо понять, что мы в группах второго уровня
$Shop_Controller_Show
->tags(TRUE)
->comments(TRUE)
->associatedItems(TRUE)
->modifications(TRUE);
if ($Shop_Controller_Show->item == 0) //если мы НЕ В ТОВАРЕ
{
//Считаем максимальную цену для фильтра
$max_price=1000000;
if(in_array($Shop_Controller_Show->group,$pages_cat)){
//Если мы в страницах, гед выводятся товары из подгрупп, а сами подгруппы не выводятся
$oCore_QueryBuilder_Select2 = Core_QueryBuilder::select('id')->from('shop_groups')
->where('parent_id', '=', $Shop_Controller_Show->group);
$oCore_QueryBuilder_Select = Core_QueryBuilder::select('MAX(price)')->from('shop_items')
->where('shop_group_id', 'IN', $oCore_QueryBuilder_Select2);
//Проверяем ярлыки и определяем максимлаьную цену товара (включая ярлыки, который отображается на странице)
$oCore_QueryBuilder_Select3 = Core_QueryBuilder::select('shortcut_id')->from('shop_items')
->where('shop_group_id', 'IN',$oCore_QueryBuilder_Select2);
$oCore_QueryBuilder_Select4 = Core_QueryBuilder::select('MAX(price)')->from('shop_items')
->where('id', 'IN', $oCore_QueryBuilder_Select3);
$row = $oCore_QueryBuilder_Select4->execute()->asAssoc()->current();
$shortprice=$row["MAX(`price`)"];
}
else{ //Если мы на страницах внутри группы (например аксессуары - велозамки)
$oCore_QueryBuilder_Select = Core_QueryBuilder::select('MAX(price)')->from('shop_items')
->where('shop_group_id', '=', $Shop_Controller_Show->group);
}
$row = $oCore_QueryBuilder_Select->execute()->asAssoc()->current();
//Смотрим цену товара и сравниваем что больше - товар или модификация
if($row["MAX(`price`)"]!='')
$max_price=$row["MAX(`price`)"] ;
$max_price=substr($max_price,0,-3);
if($shortprice>$max_price){
$shortprice=substr($shortprice,0,-3);
$max_price=$shortprice;
}
//Дописываем максимальную цену товара
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('max_price')->value($max_price));
if($Shop_Controller_Show->group == 0) //если мы не в группе, но можем быть в продавцах или корне
{
$Shop_Controller_Show->itemsForbiddenTags(array('text'));
$Shop_Controller_Show
->tags(FALSE)
->comments(FALSE)
->associatedItems(FALSE)
->modifications(FALSE)
->itemsProperties(FALSE)
->itemsPropertiesList(FALSE)
->groupsForbiddenTags(array('description'))
->siteuser(FALSE)
->comparing(FALSE)
->favorite(FALSE)
->viewed(FALSE)
// ->itemsProperties(true)
->groupsMode('all');
if($_SERVER['REQUEST_URI']=='/shop/'){
$Shop_Controller_Show->limit(0);
}
else{
$Shop_Controller_Show->groupsMode('none')
->groupsForbiddenTags(array('description','name'));
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('producers_showing')->value('1'));
}
} //конец мы не в группе, но можем быть в продавцах или корне
elseif(in_array($Shop_Controller_Show->group, $pages_level2)){ //если мы в группах велосипеды, аксессуары, запчати - то есть там, где не надо товары, а надо только выводить группы
$Shop_Controller_Show->itemsForbiddenTags(array('text'));
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('id_group_to_show')->value($Shop_Controller_Show->group));
$Shop_Controller_Show
->group(0)
->tags(FALSE)
->comments(FALSE)
->associatedItems(FALSE)
->modifications(FALSE)
->itemsProperties(FALSE)
->itemsPropertiesList(FALSE)
->groupsForbiddenTags(array())
->siteuser(FALSE)
->comparing(FALSE)
->favorite(FALSE)
->viewed(FALSE)
// ->itemsProperties(true)
->groupsMode('all')
->limit(0);
}// конец где не надо товары, а надо только выводить группы
elseif(in_array($Shop_Controller_Show->group, $pages_cat)){ //если мы в группе, у которой есть подгруппы, но надо выводить только товары без подгрупп
$Shop_Controller_Show
->groupsPropertiesList(FALSE)
->groupsMode('none')
->groupsProperties(FALSE)
->tags(FALSE)
->comments(FALSE)
->associatedItems(FALSE)
->modifications(FALSE)
->itemsProperties(TRUE)
->itemsPropertiesList(FALSE)
->groupsForbiddenTags(array('name'))
->siteuser(FALSE)
->comparing(FALSE)
->favorite(FALSE)
->itemsProperties(true)
->groupsMode('tree')
->viewed(FALSE); //просмотренные
}//если мы в группе, у которой есть подгруппы, но надо выводить только товары без подгрупп
else{ //если мы в группе у которой нет подгрупп и нам надо выводить товары
$Shop_Controller_Show->itemsForbiddenTags(array('text','description'));
$Shop_Controller_Show
->tags(FALSE)
->comments(FALSE)
->associatedItems(FALSE)
->modifications(FALSE)
->itemsProperties(TRUE)
->groupsForbiddenTags(array('description','name'))
->siteuser(FALSE)
->comparing(FALSE)
->favorite(FALSE)
->viewed(FALSE);
}
//-------------------------------------------------------количество товаров на странице----------------------------------------
$on_page = intval(Core_Array::getGet('on_page'));
if ($on_page > 0 && $on_page < 150)
{
$Shop_Controller_Show->limit = $on_page;
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('on_page')->value($on_page)
);
}
//--------------------------------------------------------если фильтр или сортировка--------------------------------------------------
if (Core_Array::getGet('filter') || Core_Array::getGet('sorting')|| Core_Array::getGet('nalich')) //если нам надо что-то сортировать, а не просто ссылка с параметрами без значений
{
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('filter')->value(1)
);
$oShop = $Shop_Controller_Show->getEntity();
$sorting = intval(Core_Array::getGet('sorting'));
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('sorting')->value($sorting)
);
$Shop_Controller_Show->addCacheSignature('sorting=' . $sorting);
//запоминаем значение года для фильтра
$year= intval(Core_Array::getGet('property_114'));
$Shop_Controller_Show->addCacheSignature('property_114=' . $year);
//если показывать только товары в наличии или под заказ
if(Core_Array::getGet('nalich')){
$nalich= intval(Core_Array::getGet('nalich'));
if($nalich==1) //тут берем значения из фильтра и топорно переделываем, чтобы потом просто подставить в фактическое наличие
$nal_status = -1;
if($nalich==2)
$nal_status = 0;
if($nalich==3)
$nal_status = 1;
if($nalich==1||$nalich==2||$nalich==3){
$Shop_Controller_Show->addCacheSignature('nalich=' . $nalich);
$Shop_Controller_Show->shopItems()
->queryBuilder()
->leftJoin('shop_warehouse_items', 'shop_warehouse_items.shop_item_id', '=', 'shop_items.id')
->having('SUM(shop_warehouse_items.count)', '>=', $nal_status)
->groupBy('shop_items.id');
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('nalich')->value($nalich));
}
}//закончили показ товаров в наличии или под заказ
//---------------------------------------------------если фильтруем по производителям--------------------------------------------
if (Core_Array::getGet('producer_id'))
{
$iProducerId = intval(Core_Array::getGet('producer_id'));
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('producer_id')->value($iProducerId)
);
//пытаемся вывести ярлыки для товаров этого же производителя, показанных до применения фильтра по производителю
$oCore_QueryBuilder_Select5 = Core_QueryBuilder::select('id')->from('shop_items')
->where('shop_producer_id', '=',$iProducerId);
$Shop_Controller_Show->shopItems()
->queryBuilder()
->select('shop_items.*')
->open()
->where('shop_items.shop_producer_id', '=', $iProducerId)
->setOr()
->where('shop_items.shortcut_id', 'IN',$oCore_QueryBuilder_Select5 )
->close();
$Shop_Controller_Show->addCacheSignature('producer_id=' . $iProducerId); //запоминаем производителя для сохранения в фильтре
}
веломагазин и велотуры: http://www.velootpusk.ru
Авторизация