Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”
Вывод количества объектов в категории. XSLT

Автор idu.kuruРаздел Шаблоны XSLT

Ответов: 6
Просмотров: 4719
Последний ответ 18 Октября 2014, 17:39:24
от idu.kuru
Вывод разных валют в разных доменах у каталога

Автор ivan23Раздел Настройка системы и модулей

Ответов: 3
Просмотров: 4535
Последний ответ 04 Апреля 2013, 22:05:40
от admin
Как добавить вывод информации и редактирование информации в профиль

Автор rellaiРаздел Шаблоны XSLT

Ответов: 7
Просмотров: 5495
Последний ответ 28 Апреля 2014, 08:13:27
от rellai
Вывод объектов каталога с отдельными характеристиками объектов в таблице

Автор AxiomateriaРаздел Шаблоны XSLT

Ответов: 19
Просмотров: 13056
Последний ответ 16 Июля 2013, 16:53:58
от thecoder
Вывод ссылками названия тем "Входит в сюжеты" на главной странице новостей

Автор AxiomateriaРаздел Шаблоны XSLT

Ответов: 4
Просмотров: 4122
Последний ответ 01 Ноября 2013, 22:41:58
от Axiomateria

0 Пользователей и 1 Гость просматривают эту тему.

*

shoto

  • ***
  • 235
  • +4/-0
    • Просмотр профиля
Добрый день.
нужно вывести дополнительные, т.е. рекомендованные товары к товару, при этом не выбирая их из списка при редактировании товара, а из поля, где перечислены через запятую, ну или через любой другой разделитель артикулы этих товаров.
как можно подобное реализовать?

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
то есть в админке есть текстовая строчка в которой вы задаете артикулы через запятую и вам нужно вывести товары с такими артикулами, так?

Если да? то пишите кастом который преобразует значение данной строки в массив (php функция explode думаю самое то будет для этой цели), дальше selector который ищет товары с данными id

*

shoto

  • ***
  • 235
  • +4/-0
    • Просмотр профиля
Цитировать
пишите кастом
это для меня такая страшная фраза:) что просто словами не передать.

да, у меня текстовая строка в которой через запятую написаны артикулы товаров.

*

shoto

  • ***
  • 235
  • +4/-0
    • Просмотр профиля
как мне передать в макрос значения взятое из строки? если я вообще выведу эту строку:)

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

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

как увязать тот же самый selector
$variant = new selector('pages');
опять же, объекты или страницы...

*

shoto

  • ***
  • 235
  • +4/-0
    • Просмотр профиля
и тут тишина:(

*

Iolanta

  • *
  • 13
  • +2/-0
    • Просмотр профиля
Я так понимаю надо кастом, который берет строку из 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>
конец))

*

shoto

  • ***
  • 235
  • +4/-0
    • Просмотр профиля
Цитировать
Я так понимаю надо кастом, который берет строку из id товаров и возвращает объекты каталога с такими id,
берем строку, содержащую артикулы товара и да, возвращает объекты каталога, с таким артикулом (который не совпадает ни каким образом с id)

*

shoto

  • ***
  • 235
  • +4/-0
    • Просмотр профиля
артикул товара хранится в:
<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"/>

*

Iolanta

  • *
  • 13
  • +2/-0
    • Просмотр профиля
Тогда надо использовать выборки из 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);
    }

*

shoto

  • ***
  • 235
  • +4/-0
    • Просмотр профиля
Доброе утро.
1)из всего вышеперечисленного у меня осталось непонятно, как передаются данные в переменную
Цитировать
(это $myStr)
.
есть шаблон object-view.xsl, в котором получаются из строки, тот перечень артикулов, которые надо отобрать и отобразить по ним товары.
2) как просмотреть полученные результаты, точнее как мне получить их что бы использовать для вывода уже реально выборки товаров.

*

Iolanta

  • *
  • 13
  • +2/-0
    • Просмотр профиля
ну елки-палки, предположим у вас имеется шаблон
<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

*

shoto

  • ***
  • 235
  • +4/-0
    • Просмотр профиля
я потому и спросила, потому что все точно так же самостоятельно попыталась вывести и результатов было пустота.
ладно, будем дальше ковыряться. спасибо за помощь.

*

Iolanta

  • *
  • 13
  • +2/-0
    • Просмотр профиля
Даже не знаю попробуйте посмотреть, что возвращает вашсайт.ru/udata/catalog/getList/(11,12,12) если в /catalog/_custom размещали может права в permission не установили, как вариант выводит этим макросом какие-то промежуточные результаты, у меня ведь нет возможности его протестировать, так как "на глаз" все писалось

*

shoto

  • ***
  • 235
  • +4/-0
    • Просмотр профиля
гм... странно, вчера подобной строчки не появлялось:
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);

*

Iolanta

  • *
  • 13
  • +2/-0
    • Просмотр профиля
Замените 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