Вопрос по доп свойствам

#
Вопрос по доп свойствам
Реально ли вывести все свойства элемента ИС по группам свойств элемента?
Roman_che
#
Re: Вопрос по доп свойствам
Для этого надо написать соответствующий XSL шаблон.

Я такое делал, правда для товаров интернет-магазина и в пятой версии. Но для элемента ИС в 6-ке принцип абсолютно тот же, просто структура XML немного другая.

Вот вам для примера кусок моего шаблона:


<xsl:template match="/shop">      
      <xsl:apply-templates select="item"/>      
   </xsl:template>
   
   <xsl:template match="item">      
   ...
               <!-- Выводим доп. свойства из корня отдельно -->
               <xsl:if test="count(property) > 0">
                  <h3>Основные характеристики</h3>
                  <xsl:if test="count(property[@dir_id = 0])">
                     <div class="item_info">
                        <xsl:apply-templates select="property[@dir_id = 0]"/>
                     </div>
                  </xsl:if>
                  <!-- И отдельно - доп. свойства по разделам-->
                  <xsl:apply-templates select="/shop/properties_items_dir"/>
               </xsl:if>      
   
   </xsl:template>
   
   <!-- Вывод раздела для свойств товара -->
   <xsl:template match="properties_items_dir">      
      <xsl:variable name="dir_id" select="@id"/>
      
      <xsl:if test="count(/shop/item/property[@dir_id = $dir_id])">
         <!-- Название группы свойств -->
         <h3><xsl:value-of select="shop_properties_items_dir_name"/></h3>
         
         <div class="item_info">
            <xsl:apply-templates select="/shop/item/property[@dir_id = $dir_id]"/>
         </div>
      </xsl:if>
      
      <xsl:if test="count(properties_items_dir) > 0">
         <p>
            <xsl:apply-templates select="properties_items_dir"/>
         </p>
      </xsl:if>
   </xsl:template>
   
   <!-- Вывод строки со значением свойства -->
   <xsl:template match="property">
      <xsl:if test="value != '' or (type = 1 and file_path != '')">
         <p>
            <span class="left">
               <xsl:value-of select="name"/>
            </span>
         </p>
      </xsl:if>
   </xsl:template>
#
Re: Вопрос по доп свойствам
Leevoth,
а как сделать через php это? вот читал в теме http://www.hostcms.ru/forums/2/7143/ , но что то вообще никак не получилось. через xsl - впринципе то понятно...
Roman_che
#
Re: Вопрос по доп свойствам
Непонятно, что именно вы хотите.

Непосредственно за визуальное представление тех или иных блоков отвечает XSLT. "Через PHP" мы вызываем контролер, который отдает XML-документ для XSL-шаблонизатора.

Что именно вы собрались через PHP делать? Если вас в XML свойства элементов ИС не выводятся, то надо для контроллера Informationsystem_Controller_Show включить режим itemsProperties('true'):
http://www.hostcms.ru/api6/classes/Informationsystem_Controller_Show.html
Модератор
#
Re: Вопрос по доп свойствам
1. Получаете массив значений объекта через getPropertyValues()
2. в foreach для каждого значения получаете объект св-ва, а от него уже и объект раздела св-ва, если нужно.

Либо от обратного, получаете список разделов, для каждого их них список св-в и уже для каждого св-ва значения для требуемого элемента.
#
Re: Вопрос по доп свойствам
я собирался сделать форму поиска по группам свойств, по самим свойствам  и по группам элеметов
тоесть мне нудны id'ы групп свойств их названия.
думал можно это все вывести в массиве через php не создавая xsl шаблона. Но уже чую не получится...
Roman_che
Модератор
#
Re: Вопрос по доп свойствам
Romano_che, готовый пример на Ваш же запрос http://www.hostcms.ru/forums/2/7143/page-12/
#
Re: Вопрос по доп свойствам
а вот кстати еще 1 вопрос.
   $Informationsystem_Controller_Show = new Informationsystem_Controller_Show(
         Core_Entity::factory('Informationsystem', 17)
      );
      $Informationsystem_Controller_Show
         ->xsl(
            Core_Entity::factory('Xsl')->getByName('СписокЭлементов')
         )
         ->groupsMode('all')
         ->itemsForbiddenTags(array('text'))
         ->group(9)
         ->limit(1000)
         ;
      $Informationsystem_Controller_Show
         ->informationsystemItems()
         
         ->queryBuilder()
         ->leftJoin('informationsystem_item_properties', 'informationsystem_items.informationsystem_id', '=', 'informationsystem_item_properties.informationsystem_id')
         ->leftJoin('property_value_ints', 'informationsystem_items.id', '=', 'property_value_ints.entity_id',
            array(
               array('AND' => array('informationsystem_item_properties.property_id', '=', Core_QueryBuilder::expression('`property_value_ints`.`property_id`')))
            )
         )
         
         ->where('informationsystem_item_properties.property_id', '=', 73)
         ->where('property_value_ints.value', '=', 1)
         
         ->open()
         ->where('informationsystem_item_properties.property_id', '=', 76)
         ->where('property_value_ints.value', '<=', 88888888)
        
         ->setAnd()
         ->where('informationsystem_item_properties.property_id', '=', 76)
         ->where('property_value_ints.value', '>=', 10)
        
        
         ->close();

        $Informationsystem_Controller_Show
      ->itemsProperties(TRUE)
      ->show();


не выводятся нужные элементы,
а если убрать

         ->where('informationsystem_item_properties.property_id', '=', 73)
         ->where('property_value_ints.value', '=', 1)


то выводятся.

мне нужно что бы учитывалось эти несколько условий при выборе элементов...
Roman_che
Модератор
#
Re: Вопрос по доп свойствам
Romano_che,
не совсем понятно зачем кое-где Вы используете ->setAnd(), он и так будет по умолчанию между ->where(), а пот ->setOr() нужно использовать там, где надо. Что касается нескольких св-в, то готовый ответ в соседней теме: http://www.hostcms.ru/forums/2/7121/page-2/
#
Re: Вопрос по доп свойствам
$Informationsystem_Controller_Show
         ->informationsystemItems()
         
         ->queryBuilder()
         ->leftJoin('informationsystem_item_properties', 'informationsystem_items.informationsystem_id', '=', 'informationsystem_item_properties.informationsystem_id')
         ->leftJoin('property_value_ints', 'informationsystem_items.id', '=', 'property_value_ints.entity_id',
            array(
               array('AND' => array('informationsystem_item_properties.property_id', '=', Core_QueryBuilder::expression('`property_value_ints`.`property_id`')))
            )
         )
         // Свойство 1
         
         ->where('informationsystem_item_properties.property_id', '=', 73)
         // Значание дополнительного свойства
         ->where('property_value_ints.value', '=', 1)
         
         ->open()
         // Идентификатор дополнительного свойства
         ->where('informationsystem_item_properties.property_id', '=', 76)
         // Значание дополнительного свойства
         ->where('property_value_ints.value', '<=', $largeCost)
        
         ->where('informationsystem_item_properties.property_id', '=', 76)
         // Значание дополнительного свойства
         ->where('property_value_ints.value', '>=', $smallCost)
        
        
         ->close();



Цитата:
Блоки с указанием св-ва и значения идут через OR!
// Идентификатор дополнительного свойства
         ->where('informationsystem_item_properties.property_id', '=', 19)
         // Значание дополнительного свойства
         ->where('property_value_ints.value', '=', '123')

с этим не понялЦитата:


далее используете having с count, где значение равно количеству задействованных свойств, пример в соседней теме

добавил
         ->having('COUNT(informationsystem_item_properties.informationsystem_id)', '=', 1)
опять ничего
Попробовал Core_DataBase::instance()->getLastQuery();
вывело
SELECT
*
FROM `informationsystem_groups`
WHERE  `informationsystem_groups`.`informationsystem_id` = '17' AND `parent_id` = 0 AND `informationsystem_groups`.`deleted` = 0

явно что то не то(((
Roman_che
Авторизация