UMIhelp

Разработка сайта на UMI.CMS => Шаблоны XSLT => Тема начата: shoto от 04 Май 2012, 08:01:43

Название: вывод рекомендованных товаров не через выбор из списка (XSLT)
Отправлено: shoto от 04 Май 2012, 08:01:43
Добрый день.
нужно вывести дополнительные, т.е. рекомендованные товары к товару, при этом не выбирая их из списка при редактировании товара, а из поля, где перечислены через запятую, ну или через любой другой разделитель артикулы этих товаров.
как можно подобное реализовать?
Название: Re:вывод рекомендованных товаров не через выбор из списка (XSLT)
Отправлено: admin от 04 Май 2012, 08:13:51
то есть в админке есть текстовая строчка в которой вы задаете артикулы через запятую и вам нужно вывести товары с такими артикулами, так?

Если да? то пишите кастом который преобразует значение данной строки в массив (php функция explode думаю самое то будет для этой цели), дальше selector который ищет товары с данными id
Название: Re:вывод рекомендованных товаров не через выбор из списка (XSLT)
Отправлено: shoto от 04 Май 2012, 09:59:44
Цитировать
пишите кастом
это для меня такая страшная фраза:) что просто словами не передать.

да, у меня текстовая строка в которой через запятую написаны артикулы товаров.
Название: Re:вывод рекомендованных товаров не через выбор из списка (XSLT)
Отправлено: shoto от 05 Май 2012, 10:48:10
как мне передать в макрос значения взятое из строки? если я вообще выведу эту строку:)

public function analog{
$varianty  = "что здесь должно быть? понятно что уже сама строчка с разделителем запятая";
$varianty2 = explode(",", $varianty);

return;  - что возвращать?
}
получу в итоге массив, что дальше с ним делать.

как увязать тот же самый selector
$variant = new selector('pages');
опять же, объекты или страницы...
Название: Re:вывод рекомендованных товаров не через выбор из списка (XSLT)
Отправлено: shoto от 15 Май 2012, 08:28:02
и тут тишина:(
Название: Re:вывод рекомендованных товаров не через выбор из списка (XSLT)
Отправлено: Iolanta от 15 Май 2012, 18:36:35
Я так понимаю надо кастом, который берет строку из id товаров и возвращает объекты каталога с такими id, читаем api.umi (особенно главу №8)
      public function getList($myStr){
      //в $myStr передаете строку id товаров/артикулов из поля (лучше перечислять их без пробельных символов)   
      $varianty = explode(",",$myStr);
      $hierarchy = umiHierarchy::getInstance();
      //возьмем пример задания шаблонов из /catalog/class.php см.функцию getObjectsList
      $template = "default";
      list($template_block, $template_block_empty, $template_block_search_empty, $template_line) = def_module::loadTemplates("catalog/".$template, "objects_block", "objects_block_empty", "objects_block_search_empty", "objects_block_line");
         
         $block_arr = Array();
         $lines = Array();
            foreach($varianty  as $objectId){//пробегаемся по массиву с айдишниками из строки
               $element = $hierarchy->getElement($objectId);
               //Проверим, что мы получили правильный результат
               if(!$element) continue;   
                  $line_arr = Array();//массив где будут аттрибуты товара id ссылка и тд
                  $line_arr['attribute:id'] = $objectId;
                  $line_arr['attribute:alt_name'] = $element->getAltName();
                  $line_arr['attribute:link'] = umiHierarchy::getInstance()->getPathById($objectId);
                  $line_arr['xlink:href'] = "upage://" . $objectId;
                  $line_arr['node:text'] = $element->getName();      
                  $lines[] = self::parseTemplate($template_line, $line_arr, $objectId);   
            }
         
         $block_arr['subnodes:lines'] = $lines;
         return self::parseTemplate($template_block, $block_arr,0);
         }
Вызовем ее гле-нибудь в шаблоне
<xsl:apply-templates select="document(concat('udata://catalog/getList/','11,10,9'))/udata/lines/item" mode="mylist"/>
Вместо '11,10,9' надо получить текст из поля или где там это у вас хранится (с этим справитесь думаю)
 ну и вывести например заголовки рекомендуемых товаров
   <xsl:template match="item" mode="mylist">
      <xsl:value-of select="document(concat('upage://', @id, '.h1'))/udata/property/value" disable-output-escaping="yes"/>
   </xsl:template>
конец))
Название: Re:вывод рекомендованных товаров не через выбор из списка (XSLT)
Отправлено: shoto от 16 Май 2012, 07:53:40
Цитировать
Я так понимаю надо кастом, который берет строку из id товаров и возвращает объекты каталога с такими id,
берем строку, содержащую артикулы товара и да, возвращает объекты каталога, с таким артикулом (который не совпадает ни каким образом с id)
Название: Re:вывод рекомендованных товаров не через выбор из списка (XSLT)
Отправлено: shoto от 16 Май 2012, 10:33:37
артикул товара хранится в:
<group id="2743" name="item_properties">
<property id="408" name="artikul" type="string">
<title>Артикул</title>
<value>2730</value>
</property>
</group>

получить перечень артикулов из строчки и поместить в переменную:
<xsl:variable name="rekom" select="//property[@name='rekomenduem']/value"/>
Название: Re:вывод рекомендованных товаров не через выбор из списка (XSLT)
Отправлено: Iolanta от 16 Май 2012, 22:04:53
Тогда надо использовать выборки из api umi объектов каталога и вложенный цикл для сравнения поля artukul с тем числами, что хранятся в переменной rekom (это $myStr)
 public function getList($myStr){
      //в $myStr передаете строку id товаров/артикулов из поля (лучше перечислять их без пробельных символов)   
      $varianty = explode(",",$myStr);
      $hierarchy = umiHierarchy::getInstance();
    
      //Получаем id иерархического типа
      $hierarchyTypes = umiHierarchyTypesCollection::getInstance();
      $hierarchyType = $hierarchyTypes->getTypeByName("catalog", "object");
      $hierarchyTypeId = $hierarchyType->getId();

      //Создаем и подготавливаем выборку
      $sel = new umiSelection;
      $sel->addElementType($hierarchyTypeId); //Добавляет поиск по иерархическому типу
      $sel->addHierarchyFilter(0); //Устанавливаем поиск по разделу 0 - ищем от корня
      $sel->addPermissions(); //Говорим, что обязательно нужно учитывать права доступа
      //Получаем результаты
      $result = umiSelectionsParser::runSelection($sel); //Массив id объектов
      
       //возьмем пример задания шаблонов из /catalog/class.php см.функцию getObjectsList 
        $template = "default";
        list($template_block, $template_block_empty, $template_block_search_empty, $template_line) = def_module::loadTemplates("catalog/".$template, "objects_block", "objects_block_empty", "objects_block_search_empty", "objects_block_line"); 
        $block_arr = Array();
        $lines = Array();
      
      foreach($result  as $objectId){//пробегаемся по массиву с айдишниками из строки
          $element = $hierarchy->getElement($objectId);
            //Проверим, что мы получили правильный результат
            if(!$element) continue;
         foreach($varianty  as $articulId){//пробегаемся по массиву с айдишниками из строки
            if($articulId==$element->getValue("artikul")){
               $line_arr = Array();//массив где будут аттрибуты товара id ссылка и тд
               $line_arr['attribute:id'] = $objectId;
               $line_arr['attribute:alt_name'] = $element->getAltName();
               $line_arr['attribute:link'] = umiHierarchy::getInstance()->getPathById($objectId);
               $line_arr['xlink:href'] = "upage://" . $objectId;
               $line_arr['node:text'] = $element->getName();     
               $lines[] = self::parseTemplate($template_line, $line_arr, $objectId);   
            }
            }
        }
        $block_arr['subnodes:lines'] = $lines;
        return self::parseTemplate($template_block, $block_arr,0);
    }
Название: Re:вывод рекомендованных товаров не через выбор из списка (XSLT)
Отправлено: shoto от 17 Май 2012, 08:58:41
Доброе утро.
1)из всего вышеперечисленного у меня осталось непонятно, как передаются данные в переменную
Цитировать
(это $myStr)
.
есть шаблон object-view.xsl, в котором получаются из строки, тот перечень артикулов, которые надо отобрать и отобразить по ним товары.
2) как просмотреть полученные результаты, точнее как мне получить их что бы использовать для вывода уже реально выборки товаров.
Название: Re:вывод рекомендованных товаров не через выбор из списка (XSLT)
Отправлено: Iolanta от 17 Май 2012, 17:06:48
ну елки-палки, предположим у вас имеется шаблон
<xsl:template match="udata" mode="object-view">
//тут получили переменную-строку mystr, в которой хранятся артикулы //"22,23,24" или по-другому как-то вы ее получаете, не важно
<xsl:variable name="mystr" select="document(concat('upage://', page/@id, '.rekomenduem'))/udata/property/value" disable-output-escaping="yes"/>
//тут вывели наши несчатные "22,23,24" а то мало ли)
<xsl:value-of  select="$mystr" disable-output-escaping="yes"/>
//если php функцию положили в /classes/modules/catalog/_custom.php
//например,  вызываем ее вот так
<xsl:apply-templates select="document(concat('udata://catalog/getList/',$mystr))/udata/lines/item" mode="mylist"/>
</xsl:template>

а это шаблон mylist, который выводит например заголовок рекомендованного товара

   <xsl:template match="item" mode="mylist">
      <xsl:value-of select="document(concat('upage://', @id, '.h1'))/udata/property/value" disable-output-escaping="yes"/>
   </xsl:template>

да и еще, если у вас в артикуле содержатся не только цифры, но и еще какие-то символы то   if($articulId==$element->getValue("artikul") ) вам не подойдет и придется почитать про сравнение строк в php
Название: Re:вывод рекомендованных товаров не через выбор из списка (XSLT)
Отправлено: shoto от 17 Май 2012, 23:07:01
я потому и спросила, потому что все точно так же самостоятельно попыталась вывести и результатов было пустота.
ладно, будем дальше ковыряться. спасибо за помощь.
Название: Re:вывод рекомендованных товаров не через выбор из списка (XSLT)
Отправлено: Iolanta от 18 Май 2012, 11:02:30
Даже не знаю попробуйте посмотреть, что возвращает вашсайт.ru/udata/catalog/getList/(11,12,12) если в /catalog/_custom размещали может права в permission не установили, как вариант выводит этим макросом какие-то промежуточные результаты, у меня ведь нет возможности его протестировать, так как "на глаз" все писалось
Название: Re:вывод рекомендованных товаров не через выбор из списка (XSLT)
Отправлено: shoto от 18 Май 2012, 13:32:08
гм... странно, вчера подобной строчки не появлялось:
Fatal error: Call to undefined method __custom_catalog::parseTemplate() in /home/begemoshas/domains/begemosha-shop.com/public_html/umi/classes/modules/catalog/__custom.php on line 46

46 строчка соответственно:
return self::parseTemplate($template_block, $block_arr,0);
Название: Re:вывод рекомендованных товаров не через выбор из списка (XSLT)
Отправлено: Iolanta от 18 Май 2012, 14:01:30
Замените return self::parseTemplate($template_block, $block_arr,0); на

return $this->parseTemplate($template_block, $block_arr,0);

а название класса поменяйте с abstract class __custom_catalog на
abstract class __custom_catalog extends def_module
Название: Re:вывод рекомендованных товаров не через выбор из списка (XSLT)
Отправлено: shoto от 18 Май 2012, 14:20:56
Цитировать
попробуйте посмотреть, что возвращает вашсайт.ru/udata/catalog/getList/(11,12,12) если в /catalog/_custom

результат:
<udata xmlns:xlink="http://www.w3.org/TR/xlink" module="catalog" method="getList" generation-time="0.032455">
<lines/>
</udata>
Название: Re:вывод рекомендованных товаров не через выбор из списка (XSLT)
Отправлено: Iolanta от 18 Май 2012, 16:36:14
хмм, может выборку упростить? замените
     //Создаем и подготавливаем выборку
      $sel = new umiSelection;
      $sel->addElementType($hierarchyTypeId); //Добавляет поиск по иерархическому типу
      $sel->addHierarchyFilter(0); //Устанавливаем поиск по разделу 0 - ищем от корня
      $sel->addPermissions(); //Говорим, что обязательно нужно учитывать права доступа
      //Получаем результаты
на
      $sel = new umiSelection;
      $sel->addElementType($hierarchyTypeId);
      $this->autoDetectFilters($sel,72);
вместо 72 подставьте, тот id типа данных объекта каталога, который у вас в шаблонах данных отвечает за вывод товара
Название: Re:вывод рекомендованных товаров не через выбор из списка (XSLT)
Отправлено: shoto от 18 Май 2012, 21:28:08
результат такой же.
Название: Re:вывод рекомендованных товаров не через выбор из списка (XSLT)
Отправлено: Iolanta от 19 Май 2012, 12:12:57
Не, ну надо было добить уже этот макрос)), поэтому я протестировала его у себя, он вполне себе правильно работает, а
<udata xmlns:xlink="http://www.w3.org/TR/xlink" module="catalog" method="getList" generation-time="0.032455">
<lines/>
</udata>
возвращает, когда вообще не находит среди объектов каталога, объекты, в поле "артикул" которых содержалось бы либо 10 либо 11 или 12 например. Так что продолжайте тестировать на разных вариантах $myStr, макрос рабочий.
Название: Re:вывод рекомендованных товаров не через в&#
Отправлено: shoto от 21 Май 2012, 11:04:25
тогда начнем с начала.
в Шаблоне данных : объект каталога - id 72, подтип Игрушки: id 314.

Поле в котором хранятся записанные артикулы товаров через запятую:
<property id="443" name="rekomenduem" type="string">
<title>Рекомендуем</title>
<value>2750,2770,2686</value>
</property>

Значение артикула товара хранится в:
<group id="2743" name="item_properties">
<title>Характеристики товара</title>
<property id="408" name="artikul" type="string">
<title>Артикул</title>
<value>2730</value>
</property>
</group>

в шаблоне object-view.xsl где надо вывести рекомендованные товары передаем значение из строки Рекомендуем в переменную:
<xsl:variable name="rekom" select="//property[@name='rekomenduem']/value"/>
на всякий случай проверяем есть ли значение в этой переменной:
<xsl:value-of select="$rekom"/>
ниже вызываем макрос:
<xsl:apply-templates select="document(concat('udata://catalog/getList/',$rekom))/udata/lines/item" mode="mylist"/>
данные которого обрабатываются по указанному шаблону:
<xsl:template match="item" mode="mylist">
      <xsl:value-of select="document(concat('upage://', @id, '.h1'))/udata/property/value" disable-output-escaping="yes"/>
   </xsl:template>
Макрос размещаем в файле classes/modules/catalog/__custom.php
Код макроса:
public function getList($rekom){
      //в $myStr передаете строку id товаров/артикулов из поля (лучше перечислять их без пробельных символов)   
      $varianty = explode(",",$rekom);
      $hierarchy = umiHierarchy::getInstance();
     
      //Получаем id иерархического типа
      $hierarchyTypes = umiHierarchyTypesCollection::getInstance();
      $hierarchyType = $hierarchyTypes->getTypeByName("catalog", "object");
      $hierarchyTypeId = $hierarchyType->getId();

      //Создаем и подготавливаем выборку
      $sel = new umiSelection;
      $sel->addElementType($hierarchyTypeId);
      $this->autoDetectFilters($sel,72);
 
//Получаем результаты
      $result = umiSelectionsParser::runSelection($sel); //Массив id объектов
     
       //возьмем пример задания шаблонов из /catalog/class.php см.функцию getObjectsList 
        $template = "default";
        list($template_block, $template_block_empty, $template_block_search_empty, $template_line) = def_module::loadTemplates("catalog/".$template, "objects_block", "objects_block_empty", "objects_block_search_empty", "objects_block_line"); 
        $block_arr = Array();
        $lines = Array();
     
      foreach($result  as $objectId){//пробегаемся по массиву с айдишниками из строки
          $element = $hierarchy->getElement($objectId);
            //Проверим, что мы получили правильный результат
            if(!$element) continue;
         foreach($varianty  as $articulId){//пробегаемся по массиву с айдишниками из строки
            if($articulId==$element->getValue("artikul")){
               $line_arr = Array();//массив где будут аттрибуты товара id ссылка и тд
               $line_arr['attribute:id'] = $objectId;
               $line_arr['attribute:alt_name'] = $element->getAltName();
               $line_arr['attribute:link'] = umiHierarchy::getInstance()->getPathById($objectId);
               $line_arr['xlink:href'] = "upage://" . $objectId;
               $line_arr['node:text'] = $element->getName();     
               $lines[] = self::parseTemplate($template_line, $line_arr, $objectId);   
            }
            }
        }
        $block_arr['subnodes:lines'] = $lines;
        return $this->parseTemplate($template_block, $block_arr,0);
    }
Проверка в адресной строке:
http://umi.site.com/udata://catalog/getList/2750,2770,2686/udata/lines/item
получаем:
<udata xmlns:xlink="http://www.w3.org/TR/xlink" module="catalog" method="getList" generation-time="1.861841">
<lines>
<item id="16100" alt_name="dom_so_svetom" link="/shop/toys/sylvanian_families/domiki_sylvanian_families/dom_so_svetom/" xlink:href="upage://16100">Дом со светом</item>
<item id="16103" alt_name="nabor_minimarket" link="/shop/toys/sylvanian_families/domiki_sylvanian_families/nabor_minimarket/" xlink:href="upage://16103">Набор Минимаркет</item>
<item id="16093" alt_name="nabor_shkola" link="/shop/toys/sylvanian_families/domiki_sylvanian_families/nabor_shkola/" xlink:href="upage://16093">Набор Школа</item>
</lines>
</udata>

таки образом:) только сейчас, когда я вот так стала последовательно все прописывать сюда:) все заработало
Название: Re:вывод рекомендованных товаров не через выбор из списка (XSLT)
Отправлено: shoto от 21 Май 2012, 11:18:32
осталось разобраться с правами доступа:) что бы не только мне показывались этьи товары но и не зарегистрированному пользователю....
Название: Re:вывод рекомендованных товаров не через выбор из списка (XSLT)
Отправлено: Iolanta от 21 Май 2012, 12:17:58
О правах доступа у umi много статей, например, http://www.digitalart.by/articles/custom_macros/ 
Можно добавить проверку, чтобы в итоговый список не попадал объект каталога, на странице которого собственно и происходит вывод, во общем экспериментируйте)
Название: Re:вывод рекомендованных товаров не через выбор из списка (XSLT)
Отправлено: shoto от 21 Май 2012, 13:27:35
данной статьей не удалось воспользоваться.
зато внеся в массив в файле classes/modules/catalog/permissions.custom.php
$permissions = array(
'view' => array('getList')
);