Фильтр по интернет-магазину

#
Фильтр по интернет-магазину
Скажите как откорректировать PHP-код, чтобы фильтр велся по всему магазину или по всем подгруппам?
Модератор
#
Re: Фильтр по интернет-магазину
в случае применения фильтра подменяйте ID группы на false
#
Re: Фильтр по интернет-магазину
Скажите, где в типовой динамической странице интернет магазина, подменить ID группы на false?

Привожу код:

/* Динамическая страница */
<?
$xsl_catalog = to_str($GLOBALS['LA']['xsl_catalog']);
$xsl_item = to_str($GLOBALS['LA']['xsl_item']);

$param = array();

if($GLOBALS['shop_item_path'] != false)
{
   if (class_exists("SiteUsers"))
   {
      /* Получаем id текущего пользователя сайта */
      $SiteUsers = new SiteUsers();
      $param['user_id'] = $SiteUsers->GetCurrentSiteUser();
   }

   $external_propertys = array();

   if (isset($_POST['submit_comment']))
   {
      /* Проверяем CAPCHA*/
      $Captcha = new Captcha();
      if (isset($_POST['captcha_key']) && isset($_POST['captcha_keystring']))
      {
         $cpt = $Captcha->ValidCaptcha($_POST['captcha_key'], $_POST['captcha_keystring']);
      }
      else
      {
         $cpt = false;
      }

      if ($cpt)
      {
         $param['shop_items_catalog_item_id'] = to_int($_REQUEST['shop_items_catalog_item_id']);
         $param['shop_comment_user_name'] = to_str($_REQUEST['shop_comment_user_name']);
         $param['shop_comment_subject'] = to_str($_REQUEST['shop_comment_subject']);
         $param['shop_comment_text'] = to_str($_REQUEST['shop_comment_text']);
         $param['shop_comment_grade'] = to_int($_REQUEST['shop_comment_grade']);
         $param['shop_comment_date_time'] = date("Y-m-d H:i:s");

         /* Активность/неактивность комментария */
         $shop_row = $GLOBALS['shops']->GetShop($GLOBALS['current_shop_id']);
         if ($shop_row)
         {
            $param['shop_comment_active'] = to_int($shop_row['shop_comment_active']);
         }
         else
         {
            $param['shop_comment_active'] = false;
         }
         $external_propertys['comment_is_active'] = $param['shop_comment_active'];

         $GLOBALS['shops']->InsertComment($param);
      }
      else
      {
         /* Неправильно введен код изображенный на картинке */
         $external_propertys['error'] = 1;

         /* Запиминаем значения */
         $external_propertys['shop_comment_user_name'] = to_str($_REQUEST['shop_comment_user_name']);
         $external_propertys['shop_comment_subject'] = to_str($_REQUEST['shop_comment_subject']);
         $external_propertys['shop_comment_text'] = to_str($_REQUEST['shop_comment_text']);
         $external_propertys['shop_comment_grade'] = to_int($_REQUEST['shop_comment_grade']);
         $external_propertys['shop_comment_date_time'] = date("Y-m-d H:i:s");
      }
   }

   /* Вывод списка */
   if(!$GLOBALS['shop_item_path']['item'])
   {
      $param['current_group_id'] = $GLOBALS['shop_item_path']['group']; # корневая группа

      /* Определяем номер элемента, с которого начинается показ в текущей группе */
      $page = end($GLOBALS['URL_ARRAY']);
      $page = to_str($page);

      $shop_row = $GLOBALS['shops']->GetShop($GLOBALS['current_shop_id']);
      if ($shop_row)
      {
         $items_on_page = $shop_row['shop_items_on_page'];
      }
      else
      {
         $items_on_page = 10;
      }

      /*
      Порядок сортировки ('Asc' - по возрастанию, 'Desc' - по убыванию, 'Rand' - произвольный порядок)
      $param['items_order']='Asc';
      Поле, по которому сортируем (наименование элемента)
      $param['items_field_order']='shop_items_catalog_name';
      */

      /* Ограничиваем по производителю */
      if (to_int($_GET['producer_id']) > 0)
      {
         $element['type'] = 0; // 0 - основное св-во, 1 - дополнительное
         $element['name'] = 'shop_producers_list_id';
         $element['prefix'] = 'AND'; // префикс
         $element['if'] = '='; // Условие
         $element['value'] = to_int($_GET['producer_id']);
         $element['sufix'] = '';
         $param['select'][] = $element;

         $external_propertys['producer_id'] = to_int($_GET['producer_id']);

         /* Применять фильтр */
         $external_propertys['apply_filter'] = true;
      }

      /* Ограничиваем по продавцу */
      if (to_int($_GET['saller_id']) > 0)
      {
         $element['type'] = 0; // 0 - основное св-во, 1 - дополнительное
         $element['name'] = 'shop_sallers_id';
         $element['prefix'] = 'AND'; // префикс
         $element['if'] = '='; // Условие
         $element['value'] = to_int($_GET['saller_id']);
         $element['sufix'] = '';
         $param['select'][] = $element;

         $external_propertys['saller_id'] = to_int($_GET['saller_id']);

         /* Применять фильтр */
         $external_propertys['apply_filter'] = true;
      }

      /* Ограничиваем по цене ОТ */
      if (to_float($_GET['price_from']) > 0)
      {
         $element['type'] = 0; // 0 - основное св-во, 1 - дополнительное
         $element['name'] = 'shop_items_catalog_price';
         $element['prefix'] = 'AND'; // префикс
         $element['if'] = '>'; // Условие
         $element['value'] = to_float($_GET['price_from']);
         $element['sufix'] = '';
         $param['select'][] = $element;

         $external_propertys['price_from'] = to_float($_GET['price_from']);

         /* Применять фильтр */
         $external_propertys['apply_filter'] = true;
      }

      /* Ограничиваем по цене ДО */
      if (to_float($_GET['price_to']) > 0)
      {
         $element['type'] = 0; // 0 - основное св-во, 1 - дополнительное
         $element['name'] = 'shop_items_catalog_price';
         $element['prefix'] = 'AND'; // префикс
         $element['if'] = '<'; // Условие
         $element['value'] = to_float($_GET['price_to']);
         $element['sufix'] = '';
         $param['select'][] = $element;

         $external_propertys['price_to'] = to_float($_GET['price_to']);

         /* Применять фильтр */
         $external_propertys['apply_filter'] = true;
      }
      
      /* Число элементов на странице */
      $on_page = to_int($_GET['on_page']);
      if ($on_page > 0 && $on_page < 150)
      {
         $param['items_on_page'] = $on_page;
         $external_propertys['on_page'] = $on_page;

         /* Применять фильтр */
         $external_propertys['apply_filter'] = true;
      }
      
      // Определяем номер страницы.
      if ($on_page)
      {
         $items_on_page = $on_page;
      }
      if (ereg("^page-([0-9]*)$", $page, $regs) && to_int($regs[1]) > 1)
      {
         /* Страница умножается на кол-во элементов, выводимых на страницу */
         $items_begin = ($regs[1] - 1) * $items_on_page;
      }
      else
      {
         $items_begin = 0;
      }

      $param['items_begin'] = $items_begin;

      /* Направление сортировки, 0 - по-возрастанию, 1 - по-убыванию */
      $order_direction = to_int($_GET['order_direction']);
      switch ($order_direction)
      {
         case 0: /* По-возрастанию */
         {
            $order_direction = 'ASC';
            break;
         }
         case 1: /* По-убыванию */
         {
            $order_direction = 'DESC';
            break;
         }
         default: /* По-умолчанию */
         {
            $order_direction = 'ASC';
            break;
         }
      }

      /* Поле сортировки */
      $sort_field = to_int($_GET['sort_by_field']);
      switch ($sort_field)
      {
         case 1: /* По имени */
         {
            $param['items_field_order'] = 'shop_items_catalog_name';
            $param['items_order'] = $order_direction;
            $external_propertys['sort_by_field'] = $sort_field;
            $external_propertys['order_direction'] = $order_direction;
            break;
         }
         case 2: /* По цене */
         {
            $param['items_field_order'] = 'shop_items_catalog_price';
            $param['items_order'] = $order_direction;
            $external_propertys['sort_by_field'] = $sort_field;
            $external_propertys['order_direction'] = $order_direction;
            break;
         }
      }

      /* Обработка дополнительных свойств.
      Получаем список свойств, разрешенных для отображения в данной группе и в фильтре */
      $shop = new shop();
      $resource_properties = $shop->GetPropertiesOfGroupForXml($param['current_group_id']);
      if ($resource_properties)
      {
         $element['type'] = 0; /* 0 - основное св-во, 1 - дополнительное */

         /* Префикс, если нужен. */
         $element['prefix'] = ' and ('; // префикс

         /* ОСТАВЛЯЕТЕ БЕЗ ИЗМЕНЕНИЙ, ЭТО НУЖНО ДЛЯ СОРТИРОВКИ */
         $element['name'] = ''; // Имя


         /* поля для основного св-ва, если тип = 1, то не указывается */
         $element['if'] = ''; // Условие

         /* Вот здесь передается ID доп. св-ва, по которому производится сортировка.
         ID ВАШЕГО ПОЛЯ УКАЗЫВАЕТЕ ЗДЕСЬ */
         $element['value'] = ''; /* Значение поля (или параметра) */
         $element['sufix']=' ';

         /* Добавляем в общий список условий */
         $param['select'][] = $element;

         $count_condition = 0;
         $property_xml = '';

         $count_properties = mysql_num_rows($resource_properties);
         for ($i = 0; $i < $count_properties; $i++)
         {
            $row = mysql_fetch_assoc($resource_properties);

            $element['value'] = 0;

            foreach ($_GET as $key => $value)
            {
               if (preg_match("/property_id_{$row['shop_list_of_properties_id']}_item_id_(\d*)/", $key, $matches))
               {
                  $get_param = 'property_id_'.$row['shop_list_of_properties_id'].'_item_id_'.$matches[1];
                  if (isset($_GET[$get_param]) > 0 && to_int($matches[1]) > 0)
                  {
                     $element['value'] = to_int($matches[1]);
                     $external_propertys['property_id_'.to_int($row['shop_list_of_properties_id']).'_item_id_'.$element['value']] = $element['value'];
                     $property_xml .= '&property_id_'.to_int($row['shop_list_of_properties_id']).'_item_id_'.$element['value'].'='.$element['value'];
                  }
               }
            }

            /* Выбираем режим отображения */
            $get_param = 'property_id_'.$row['shop_list_of_properties_id'];
            if (isset($_GET[$get_param]))
            {
               if ($row['shop_list_of_properties_type'] == 0 || $row['shop_list_of_properties_show_kind'] == 1)
               {
                  if (to_str($_GET[$get_param]) ==! "")
                  {
                     $element['value'] = quote_smart(to_str($_GET[$get_param]));
                     $external_propertys['property_id_'.to_int($row['shop_list_of_properties_id'])] = $element['value'];
                     $property_xml .= '&property_id_'.to_int($row['shop_list_of_properties_id']).'='.$element['value'];
                  }
               }
               else
               {
                  if (to_int($_GET[$get_param]) > 0)
                  {
                     $element['value'] = to_int(($_GET[$get_param]));
                     $external_propertys['property_id_'.to_int($row['shop_list_of_properties_id'])] = $element['value'];
                     $property_xml .= '&property_id_'.to_int($row['shop_list_of_properties_id']).'='.$element['value'];
                  }
               }
            }
            if ($element['value'])
            {
               /* Применять фильтр */
               $external_propertys['apply_filter'] = true;

               $element['property_id'] = to_int($row['shop_list_of_properties_id']);
               $element['type'] = 1; /* 0 - основное св-во, 1 - дополнительное */
               //$element['prefix'] = 'AND'; /* префикс */
               $element['if'] = '='; /* Условие */
               $element['sufix'] = '';
               if ($count_condition)
               {
                  $element['prefix'] = ' or '; /* префикс */
               }
               else
               {
                  $element['prefix'] = ' '; /* префикс */
               }

               ++$count_condition;
               $param['select'][] = $element;
            }
         }
         if (!$count_condition)
         {
            $element['prefix'] = ' 1'; /* префикс */
         }
         else
         {
            $element['prefix'] = ''; // префикс
         }
         /* добавляем конечный элемент, содержащий HAVING */
         $element['type'] = 0; /* 0 - основное св-во, 1 - дополнительное */

         /* ОСТАВЛЯЕТЕ БЕЗ ИЗМЕНЕНИЙ, ЭТО НУЖНО ДЛЯ СОРТИРОВКИ */
         $element['name'] = ''; /* Имя */

         /* поля для основного св-ва, если тип = 1, то не указывается */
         $element['if'] = ''; /* Условие */


         /* Вот здесь передается ID доп. св-ва, по которому производится сортировка.
         ID ВАШЕГО ПОЛЯ УКАЗЫВАЕТЕ ЗДЕСЬ */
         $element['value'] = ''; // Значение поля (или параметра)
         $having_count = '';
         if ($count_condition != 0)
         {
            $having_count = ' HAVING COUNT(shop_properties_items_table.shop_properties_items_id)= '.$count_condition.'  ';
         }
         $element['sufix'] = ' ) GROUP BY shop_items_catalog_table.shop_items_catalog_item_id '.$having_count;

         /* Добавляем в общий список условий */
         $param['select'][] = $element;
      }
      if (!empty($property_xml))
      {
         $external_propertys['property_xml'] = $property_xml;
      }
      $GLOBALS['shops']->ShowShop($GLOBALS['current_shop_id'], $xsl_catalog, $param, $external_propertys);
   }
   else
   {
      /* Вывод конкретного элемент */
      $GLOBALS['shops']->ShowItem($GLOBALS['shop_item_path']['item'], $xsl_item, $param, $external_propertys);
   }
}
?>











/* Настройки страницы */

<?
/* Создаем экземпляр класса магазина (при создании устанавливаем флаг необходимости очистки cookie) */
$shops = new shop(true);

$current_shop_id = to_int($GLOBALS['LA']['shop_id']);




# получаем для пути ассоциативный массив с id группы и id/url элемента
$GLOBALS['shop_item_path'] = $shops->GetItemPath($current_shop_id);

/* Если путь существует */
if($GLOBALS['shop_item_path'])
{
   $group_path='';

   # получаем массив с деревом от текущей группы до корня
   $mas_groups_to_root = $shops->GetShopGroupsToRoot($GLOBALS['shop_item_path']['group'], $current_shop_id);

   # получаем данные о группе
   $row_group=$shops->GetGroup($GLOBALS['shop_item_path']['group']);

   # получаем данные из seo - полей для групп
   $seo_title = trim($row_group['shop_groups_seo_title']);
   $seo_description = trim($row_group['shop_groups_seo_description']);
   $seo_keywords = trim($row_group['shop_groups_seo_keywords']);

   # цикл по массиву с деревом для формирования пути по группам
   $count_groups=count($mas_groups_to_root);

   for ($i = $count_groups - 1; $i >= 0; $i--)
   {
      if($i < $count_groups-1)
      {
         $group_path.=' / ';
      }
      if(trim($mas_groups_to_root[$i]['shop_groups_seo_title'])=='')
      {
         $group_path .= $mas_groups_to_root[$i]['shop_groups_name'];
      }
      else
      {
         $group_path .= $mas_groups_to_root[$i]['shop_groups_seo_title'];
      }
   }

   $item_name='';

   /* Если вывод информационного элемента */
   if($GLOBALS['shop_item_path']['item'])
   {
      # получаем данные о товаре
      $row_item = $shops->GetItem($GLOBALS['shop_item_path']['item']);

      # имя элемента
      $item_name=$row_item['shop_items_catalog_name'];

      # проверяем если seo_title непустой, то в заголовок страницы подставляем его
      if(trim($row_item['shop_items_catalog_seo_title'])!='')
      {
         $item_name=trim($row_item['shop_items_catalog_seo_title']);
      }

      if($group_path!='')
      {
         $item_name = ' / '. $item_name;
      }
   }

   /* форимируем заголовок страницы */
   $new_title = $group_path.$item_name;
}

if(!empty($new_title))
{
   # отображаем группу
   if(!isset($row_item))
   {
      # Заголовок для группы задан
      if(!empty($seo_title))
      {
         $GLOBALS['kernel']->set_title($seo_title);
      }
      else # Описание для группы не задано
      {
         $GLOBALS['kernel']->set_title($new_title);
      }

      # Описание для группы задано
      if(!empty($seo_description))
      {
         $GLOBALS['kernel']->set_description($seo_description);
      }
      else # Описание для группы не задано
      {
         $GLOBALS['kernel']->set_description($new_title);
      }
      # Ключевые слова для группы заданы
      if(!empty($seo_keywords))
      {
         $GLOBALS['kernel']->set_keywords($seo_keywords);
      }
      else # Ключевые слова для группы не заданы
      {
         $GLOBALS['kernel']->set_keywords($new_title);
      }
   }
   else # отображаем элемент
   {
      # Описание для элемента задано
      if(!empty($row_item['shop_items_catalog_seo_title']))
      {
         $GLOBALS['kernel']->set_title(trim($row_item['shop_items_catalog_seo_title']));
      }
      else  # Описание для элемента не задано
      {
         $GLOBALS['kernel']->set_title($new_title);
      }

      # Описание для элемента задано
      if(!empty($row_item['shop_items_catalog_seo_description']))
      {
         $GLOBALS['kernel']->set_description(trim($row_item['shop_items_catalog_seo_description']));
      }
      else  # Описание для элемента не задано
      {
         $GLOBALS['kernel']->set_description($new_title);
      }

      # Ключевые слова для элемента заданы
      if(!empty($row_item['shop_items_catalog_seo_keywords']))
      {
         $GLOBALS['kernel']->set_keywords(trim($row_item['shop_items_catalog_seo_keywords']));
      }
      else # Ключевые слова для элемента не заданы
      {
         $GLOBALS['kernel']->set_keywords($new_title);
      }
   }
}

/* Обработка сравнения товаров */
/* Десерилизуем массив */
if (isset($_COOKIE['SHOPCOMPARE']))
{
   $serialized = to_str($_COOKIE['SHOPCOMPARE']);
   $compare_items = unserialize($serialized);
   $compare_items = to_array($compare_items);
}
else
{
   $compare_items = array();
}
/* Добавление элементов */
foreach ($_GET as $key => $value)
{
   /* Выбираем из запроса товары, которые нужно добавить в список для сравнения */
   if (preg_match("/compare_id_(\d*)/", $key, $matches))
   {
      $compare_id = to_int($matches[1]);
      /* Проверяем, есть ли этот товар в кукисах для сравнения */
      if (!in_array($compare_id, $compare_items))
      {
         /*Добавляем в массив кукисов*/
         $compare_items[] = $compare_id;
      }
   }
}

/* Удаление выбранного товара из сравнения */
if (isset($_GET['delete_compare']))
{
   foreach ($_GET as $key => $value)
   {
      /* Извлекаем индекс товара, который нужно удалить из сравнения и кукиса */
      if (preg_match("/del_compare_id_(\d*)/", $key, $matches))
      {
         $compare_id = to_int($matches[1]);
         $i = array_search($compare_id, $compare_items);
         if ($i !== false)
         {
            unset($compare_items[$i]);
         }
      }
   }
}

/* Удаление всех сравнений */
if (isset($_GET['delete_all_compare']))
{
   $compare_items = array();
}

/* Устанавливаем кукисы */
if (count($compare_items) > 0)
{
   $serialized = serialize($compare_items);
   setcookie("SHOPCOMPARE", $serialized, time() + 31536000, '/');
   /* Вручную добавляем в массив, т.к. далее будем обрабатывать его в классе магазина */
   $_COOKIE['SHOPCOMPARE'] = $serialized;
}
else
{
   setcookie("SHOPCOMPARE", '', 0, '/');
   unset($_COOKIE['SHOPCOMPARE']);
}
?>

Модератор
#
Re: Фильтр по интернет-магазину
$GLOBALS['shops']->ShowShop($GLOBALS['current_shop_id'], $xsl_catalog, $param, $external_propertys);

заменяем на

if ($external_propertys['apply_filter'] == true)
{
/* ВЫвод из всех групп */
$param['current_group_id'] = false;
}

$GLOBALS['shops']->ShowShop($GLOBALS['current_shop_id'], $xsl_catalog, $param, $external_propertys);
#
Re: Фильтр по интернет-магазину
Добрый день.
Я что то вообще не понял что и где надо менять.
Можно по подробнее где нужно поменять на false

Заранее благодарен
Medeo
#
Re: Фильтр по интернет-магазину
У меня еще один вопросик по фильтру.
Поиск по названию возможен если да то как?
Medeo
#
Re: Фильтр по интернет-магазину
По поводу того, где же все-таки осуществить замену: в коде самой динамической страницы в конце найдите метод показа товаров магазина:
$GLOBALS['shops']->ShowShop($GLOBALS['current_shop_id'], $xsl_catalog, $param, $external_propertys);

Перед ним следует добавить условие, позволяющее в случае использования фильтра осуществлять поиск по всем группам магазина:
if ($external_propertys['apply_filter'] == true)
{
/* ВЫвод из всех групп */
$param['current_group_id'] = false;
}
Поиск по названию товара, конечно, возможен. Во-первых, необходимо внести изменения в XSL-шаблон, отображающий список товаров. К форме фильтра необходимо добавить поле ввода этого самого названия. А в типовой динамической странице необходимо добавить блок, аналогичный блоку фильтрации по продавцу, используя в качестве $element['name'] значение 'shop_items_catalog_name'
#
Re: Фильтр по интернет-магазину
Добрый день.
В общем у меня получилось вот такое чудо по Фильтрации по названию только вот правильно ли.

Порядок сортировки ('Asc' - по возрастанию, 'Desc' - по убыванию, 'Rand' - произвольный порядок)
      $param['items_order']='Asc';
      Поле, по которому сортируем (наименование элемента)
      $param['items_field_order']='shop_items_catalog_name';
      */
      
      /* Ограничиваем по названию */
      if (to_int($_GET['name']) > 0)
      {
         $element['type'] = 0; // 0 - основное св-во, 1 - дополнительное
         $element['name'] = 'shop_items_catalog_name';
         $element['prefix'] = 'AND'; // префикс
         $element['if'] = '='; // Условие
         $element['value'] = to_int($_GET['name']);
         $element['sufix'] = '';
         $param['select'][] = $element;

         $external_propertys['name'] = to_int($_GET['name']);

         /* Применять фильтр */
         $external_propertys['apply_filter'] = true;
      }
Medeo
#
Re: Фильтр по интернет-магазину
Ну, на первый взгляд правильно. А в XSL-шаблон для списка товаров добавили поле формы с именем "name"? И еще: в результат такой выборки попадут только те товары, название которых точно соответствует введенному значению для "name"
#
Re: Фильтр по интернет-магазину
В XSL-шаблоне прописано так

<input name="name" size="60" type="text">
         <xsl:if test="/shop/name != 0">
            <xsl:attribute name="value">
               <xsl:value-of disable-output-escaping="yes" select="/shop/name"/>
            </xsl:attribute>
         </xsl:if>   
      </input>
Medeo
Авторизация