Работа с дополнительными свойствами в HostCMS v. 6

Re: Работа с дополнительными свойствами в HostCMS v. 6
Помогите, пожалуйста, не получается вывести доп свойство группы.
Для товара понятно, Цитата:
<xsl:value-of select="property_value[tag_name='name']/value"/>

а вот со свойством для группы не могу разобраться, само свойство типа строка создала, а вот что прописать в xsl шаблоне?
Модератор
Re: Работа с дополнительными свойствами в HostCMS v. 6
T2008 писал(а):
а вот что прописать в xsl шаблоне?

Тоже самое, что и для товара. Проверьте в XML у Вас идут значения свойств групп? Если нет, то передайте параметр:

->groupsProperties(TRUE)
Вы только что начали читать предложение, чтение которого вы уже заканчиваете.
Re: Работа с дополнительными свойствами в HostCMS v. 6
alexander.egorov писал(а):
Тоже самое, что и для товара. Проверьте в XML у Вас идут значения свойств групп? Если нет, то передайте параметр:

->groupsProperties(TRUE)


в xml я вижу текст, который хочу видеть на странице

Цитата:
<property_value id="6779">
         <property_id>117</property_id>
         <entity_id>706</entity_id>
         <value>привет</value>
         <property_dir_id>0</property_dir_id>
         <tag_name>text</tag_name>
      </property_value>


в ТДС интернет магазина

Цитата:
$Shop_Controller_Show
   ->tags(TRUE)
       ->groupsProperties(TRUE)
   ->comments(TRUE)
   ->associatedItems(TRUE)
   ->modifications(TRUE);


но текста "привет" на странице нет..
Модератор
Re: Работа с дополнительными свойствами в HostCMS v. 6
Решено в поддержке.
Вы только что начали читать предложение, чтение которого вы уже заканчиваете.
Re: Работа с дополнительными свойствами в HostCMS v. 6
Совсем не могу понять как сохранить доп.свойство пользователя типа "список" .
   <xsl:template match="properties/property/list/list_item">
      <xsl:variable name="value_closet" select="value"/>
      <xsl:choose>
         <xsl:when test="/siteuser/property_value[tag_name = 'clothes_style' and value=$value_closet]/value != ''">
               <td><p><input type="checkbox" id="c{position()}" name="property_68[]" value="{@id}" checked="checked"/> <label for="c{position()}"><xsl:value-of disable-output-escaping="yes" select="value"/></label></p></td>
         </xsl:when>
         <xsl:otherwise>
               <td><p><input type="checkbox" id="c{position()}" name="property_68[]" value="{@id}"/> <label for="c{position()}"><xsl:value-of disable-output-escaping="yes" select="value"/></label></p></td>
         </xsl:otherwise>
      </xsl:choose>
      <xsl:if test="position() mod 3 = 0 and position() != last()">
         <xsl:text disable-output-escaping="yes">
            &lt;/tr&gt;
            &lt;tr&gt;
         </xsl:text>
      </xsl:if>
   </xsl:template>

Вырезал со стандартной регистрации
   // Дополнительные свойства
   $oSiteuser_Property_List = Core_Entity::factory('Siteuser_Property_List', $oSiteuser->site_id);
        $aProperties = $oSiteuser_Property_List->Properties->findAll();
   foreach ($aProperties as $oProperty)
   {
      // Поле не скрытое
      if ($oProperty->type != 10)
      {
         $aProperty_Values = $oProperty->getValues($oSiteuser->id);
         count($aProperty_Values) == 0 && $aProperty_Values[0] = $oProperty->createNewValue($oSiteuser->id);

         // Дополнительные свойства
         switch ($oProperty->type)
         {
            case 0: // Int
            case 3:
тут как мне кажется что-то нужно добавить

            break;
2) Сразу попутный вопрос. Если второе доп.свойство пользователя типа "список". В форме он выводиться не селектом, а текстовым инпутом. Как можно проверить перед сохранением, что введенное значение в форме есть в списке свойства
Re: Работа с дополнительными свойствами в HostCMS v. 6
Разбрался как сохранить доп.свойства

   $oSiteuser_Property_List = Core_Entity::factory('Siteuser_Property_List', $oSiteuser->site_id);
        $aProperties = $oSiteuser_Property_List->Properties->findAll();
   foreach ($aProperties as $oProperty)
   {
      // Поле не скрытое
      if ($oProperty->type != 10)
      {

         count($aProperty_Values) == 0 && $aProperty_Values[0] = $oProperty->createNewValue($oSiteuser->id);


         // Дополнительные свойства
         switch ($oProperty->type)
         {
            case 0: // Int
            case 3:
               if(is_array(Core_Array::getPost("property_{$oProperty->id}"))){

                  foreach($_POST["property_{$oProperty->id}"] as $prop){
                     $lProperty_Values=$oProperty->createNewValue($oSiteuser->id);
                     $lProperty_Values->value(intval($prop));
$lProperty_Values->save();
                  }
               }
            break;
...

Но все равно не пойму как решить задачу.
У меня открываеться форма с профилем пользователя и выводяться доп.свойства.
После сабмита формы, насколько я понимаю, старые данные пользователя должны очиститься, затем проверить существование элемента в списке формы и если данные верные, тогда сохранить доп. свойство. Пожалуйста, подскажите, как это реализовать?
Вот полный xsl

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:hostcms="http://www.hostcms.ru/"
   exclude-result-prefixes="hostcms">
   <xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="utf-8" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
   
   <!-- Анкетные данные -->
   <xsl:template match="/siteuser">
      <div class="bg_box">
         <div class="logo">
         <p><a href="#"><img src="/images/site2/bg/logo.png" alt="" /></a></p>
         </div>
         <div class="bg_content">
            <p class="title">Дополните свой профайл:</p>
            <form method="POST" action="/users/profile/">
               <table width="100%">
                  <tr>
                     <td>
                        <p><xsl:value-of select="properties/property[@id = 66]/name"/>:</p>
                        <p><input type="text" name="property_66" value="{property_value[tag_name = 'shoes_size']/value}"/></p>
                     </td>
                     <td width="190">
                        <p><xsl:value-of select="properties/property[@id = 67]/name"/>:</p>
                        <p><input type="text" name="property_67" value="{property_value[tag_name = 'size_clothes']/value}"/></p>
                     </td>
                     <tr>
                        <td>
                           <p>Страна:</p>
                           <p><input type="text" name="country" value="{country}"/></p>
                        </td>
                        <td width="190">
                           <p>Город:</p>
                           <p><input type="text" name="city" value="{city}"/></p>
                        </td>
                     </tr>
                     
                  </tr>
               </table>
               <table width="100%">
                  <tr>
                     <td colspan="3">
                        <p>Выберите свой стиль:</p>
                     </td>
                  </tr>
                  <tr>
                     <xsl:apply-templates select="properties/property[@id=68]/list/list_item"/>
                  </tr>
               </table>
         <p align="center"><a href="#">Пропустить этот шаг</a> &#160;&#160; <button name="apply" value="1">Далее</button></p>
            </form>
         </div>
      </div>
   </xsl:template>
   
   <xsl:template match="properties/property/list/list_item">
      <xsl:variable name="value_closet" select="value"/>
      <xsl:choose>
         <xsl:when test="/siteuser/property_value[tag_name = 'clothes_style' and value=$value_closet]/value != ''">
      <td><p><input type="checkbox" id="c{position()}" name="property_68[]" value="{@id}" checked="checked"/> <label for="c{position()}"><xsl:value-of disable-output-escaping="yes" select="value"/></label></p></td>
         </xsl:when>
         <xsl:otherwise>
      <td><p><input type="checkbox" id="c{position()}" name="property_68[]" value="{@id}"/> <label for="c{position()}"><xsl:value-of disable-output-escaping="yes" select="value"/></label></p></td>
         </xsl:otherwise>
      </xsl:choose>
      <xsl:if test="position() mod 3 = 0 and position() != last()">
         <xsl:text disable-output-escaping="yes">
            &lt;/tr&gt;
            &lt;tr&gt;
         </xsl:text>
      </xsl:if>
   </xsl:template>
</xsl:stylesheet>
Re: Работа с дополнительными свойствами в HostCMS v. 6
Собственно вопрос, как оно работает в админке

1. Если изменить поле на текстовое для ввода, как проверить существование значение в списке и если верное, то сохранить
2. Как работает сохранение/удаление
Модератор
Re: Работа с дополнительными свойствами в HostCMS v. 6
1. Не совсем ясна связь поля ввода и списка. Опишите подробнее.
2. khusainov писал(а):
Как работает сохранение/удаление
- Тоже не ясно. Сохранение/удаление чего? Свойства, значения?
Вы только что начали читать предложение, чтение которого вы уже заканчиваете.
Re: Работа с дополнительными свойствами в HostCMS v. 6
1. Есть текстовый инпут. Пользователь вводит значение, проверяем есть ли такое значение в списке. Если есть, сохраняем, если нет, выводим сообщение об ошибке.
2. Ну как я понимаю, перед сохранением множественного списка, данные доп.свойства очищаются, затем только сохраняються. Вот я и спрашиваю как это работает в админке, потому что не могу найти где этот код реализован. Нужен как раз такой же функционал как в админке
Re: Работа с дополнительными свойствами в HostCMS v. 6
Вот почти решил топорным методом,
xsl-шаблон

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:hostcms="http://www.hostcms.ru/"
   exclude-result-prefixes="hostcms">
   <xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="utf-8" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
   
   <!-- Анкетные данные -->
   <xsl:template match="/siteuser">
      <div class="bg_box">
         <div class="logo">
         <p><a href="#"><img src="/images/site2/bg/logo.png" alt="" /></a></p>
         </div>
         <div class="bg_content">
            <xsl:if test="error/node()">
               <SCRIPT type="text/javascript">
               <xsl:comment>
                  <xsl:text disable-output-escaping="yes">
                     <![CDATA[
                        $(function() {
                        $('#error').dialog();
                        });
                     ]]>
                  </xsl:text>
               </xsl:comment>
               </SCRIPT>
               <div id="error">
                  <xsl:value-of disable-output-escaping="yes" select="error"/>
               </div>
            </xsl:if>
            <p class="title">Дополните свой профайл:</p>
            <form method="POST" action="/users/profile/">
               <table width="100%">
                  <tr>
                     <td>
                        <p><xsl:value-of select="properties/property[@id = 66]/name"/>:</p>
                        <p><input type="text" name="property_66" value="{property_value[tag_name = 'shoes_size']/value}"/></p>
                     </td>
                     <td width="190">
                        <p><xsl:value-of select="properties/property[@id = 67]/name"/>:</p>
                        <p><input type="text" name="property_67" value="{property_value[tag_name = 'size_clothes']/value}"/></p>
                     </td>
                     <tr>
                        <td>
                           <p>Страна:</p>
                           <p><input type="text" name="country" value="{country}"/></p>
                        </td>
                        <td width="190">
                           <p>Город:</p>
                           <p><input type="text" name="city" value="{city}"/></p>
                        </td>
                     </tr>
                     
                  </tr>
               </table>
               <table width="100%">
                  <tr>
                     <td colspan="3">
                        <p>Выберите свой стиль:</p>
                     </td>
                  </tr>
                  <tr>
                     <xsl:apply-templates select="properties/property[@id=68]/list/list_item"/>
                  </tr>
               </table>
         <p align="center"><a href="#">Пропустить этот шаг</a>    <button name="apply" value="1">Далее</button></p>
            </form>
         </div>
      </div>
   </xsl:template>
   
   <xsl:template match="properties/property/list/list_item">
      <xsl:variable name="value_closet" select="value"/>
      <xsl:choose>
         <xsl:when test="/siteuser/property_value[tag_name = 'clothes_style' and value=$value_closet]/value != ''">
      <td><p><input type="checkbox" id="c{position()}" name="property_68[]" value="{@id}" checked="checked"/> <label for="c{position()}"><xsl:value-of disable-output-escaping="yes" select="value"/></label></p></td>
         </xsl:when>
         <xsl:otherwise>
      <td><p><input type="checkbox" id="c{position()}" name="property_68[]" value="{@id}"/> <label for="c{position()}"><xsl:value-of disable-output-escaping="yes" select="value"/></label></p></td>
         </xsl:otherwise>
      </xsl:choose>
      <xsl:if test="position() mod 3 = 0 and position() != last()">
         <xsl:text disable-output-escaping="yes">
            </tr>
            <tr>
         </xsl:text>
      </xsl:if>
   </xsl:template>
</xsl:stylesheet>

Код динамической страницы

<?php

$XSLRegistration = Core_Array::get(Core_Page::instance()->libParams, 'XSLRegistration');

$oSiteuser = Core_Entity::factory('Siteuser')->getCurrent();

if(is_null($oSiteuser)){
   header('Location: '.strval('/users/'));
}


$Siteuser_Controller_Show = new Siteuser_Controller_Show(
   $oSiteuser
);

$error=0;

// Обновление данных или регистрация нового пользователя
if (Core_Array::getPost('apply'))
{

   $oSiteuser->city = strval(Core_Array::getPost('city'));
   $oSiteuser->country = strval(Core_Array::getPost('country'));




   Core_QueryBuilder::delete('property_value_ints')
         ->lowPriority()
            ->quick()
            ->ignore()
            ->where('entity_id', '=', $oSiteuser->id)
      ->execute();

   Core_QueryBuilder::delete('property_value_texts')
         ->lowPriority()
            ->quick()
            ->ignore()
            ->where('entity_id', '=', $oSiteuser->id)
      ->execute();

   Core_QueryBuilder::delete('property_value_strings')
         ->lowPriority()
            ->quick()
            ->ignore()
            ->where('entity_id', '=', $oSiteuser->id)
      ->execute();



   // Дополнительные свойства
   $oSiteuser_Property_List = Core_Entity::factory('Siteuser_Property_List', $oSiteuser->site_id);
        $aProperties = $oSiteuser_Property_List->Properties->findAll();


   foreach ($aProperties as $oProperty)
   {
      // Поле не скрытое
      if ($oProperty->type != 10)
      {

         $aProperty_Values = $oProperty->getValues($oSiteuser->id);
         count($aProperty_Values) == 0 && $aProperty_Values[0] = $oProperty->createNewValue($oSiteuser->id);


         // Дополнительные свойства
         switch ($oProperty->type)
         {
            case 0: // Int
            case 3:

               if(($oProperty->id==66 || $oProperty->id==67) && isset($_POST["property_{$oProperty->id}"])){
                  $oList_Item = $aProperty_Values[0]->List_Item;

                  $aList_Item=$oList_Item->findAll();
                  $count=0;
                  foreach($aList_Item as $a){
                     if($a->value==$_POST["property_{$oProperty->id}"]){
                        $id=$a->id;
                        $count=1;
                        break;
                     }
                  }
                  if($count){
                     $aProperty_Values[0]->value(strval($id));
                     $aProperty_Values[0]->save();
                  }
                  else{
                     if($oProperty->id==66){
                        $Siteuser_Controller_Show->addEntity(
                           Core::factory('Core_Xml_Entity')
                              ->name('error')->value('Неверный размер обуви.')
                        );
                     }
                     if($oProperty->id==67){
                        $Siteuser_Controller_Show->addEntity(
                           Core::factory('Core_Xml_Entity')
                              ->name('error')->value('Неверный размер одежды.')
                        );
                     }
                  }
               }
               else {
                  if(isset($_POST["property_{$oProperty->id}"]) && is_array($_POST["property_{$oProperty->id}"])){

                     foreach($_POST["property_{$oProperty->id}"] as $prop){
                        $lProperty_Values=$oProperty->createNewValue($oSiteuser->id);
                        $lProperty_Values->value(intval($prop));
                        $lProperty_Values->save();
                     }
                  }
               }
            break;
            case 5: // Information system
               $aProperty_Values[0]->value(intval(Core_Array::getPost("property_{$oProperty->id}")));
               $aProperty_Values[0]->save();
            break;
            case 1: // String
            case 4: // Textarea
            case 6: // Wysiwyg
               $aProperty_Values[0]->value(strval(Core_Array::getPost("property_{$oProperty->id}")));
               $aProperty_Values[0]->save();
            break;
            case 8: // Date
               $date = strval(Core_Array::getPost("property_{$oProperty->id}"));
               $date = Core_Date::date2sql($date);
               $aProperty_Values[0]->value($date);
               $aProperty_Values[0]->save();
            break;
            case 9: // Datetime
               $datetime = strval(Core_Array::getPost("property_{$oProperty->id}"));
               $datetime = Core_Date::datetime2sql($datetime);
               $aProperty_Values[0]->value($datetime);
               $aProperty_Values[0]->save();
            break;
            case 2: // File
               $aFileData = Core_Array::getFiles("property_{$oProperty->id}");
               if (!is_null($aFileData))
               {
                  $aProperty_Values[0]->setDir(
                     $oSiteuser_Property_List->getDirPath($oSiteuser)
                  );
      
                  if (Core_File::isValidExtension($aFileData['name'], array('JPG', 'JPEG', 'GIF', 'PNG')))
                  {
                     // Удаление файла большого изображения
                     if ($aProperty_Values[0]->file)
                     {
                        $aProperty_Values[0]
                           ->deleteLargeFile()
                           ->deleteSmallFile();
                     }

                     $aProperty_Values[0]->save();
                     $aProperty_Values[0]->file = 'property_' . $aProperty_Values[0]->id . '.' . Core_File::getExtension($aFileData['name']);
                     $aProperty_Values[0]->file_name = $aFileData['name'];

                     try
                     {
                        $oSiteuser_Property_List->createPropertyDir($oSiteuser);

                        // Resize image
                        Core_Image::instance()->resizeImage($aFileData['tmp_name'], $oSiteuser->Site->max_size_load_image, $oSiteuser->Site->max_size_load_image, $aProperty_Values[0]->getLargeFilePath());
         
                        $aProperty_Values[0]->save();
                     }
                     catch (Exception $e) {
                        Core_Message::show($e->getMessage(), 'error');
                     };
                  }
               }
            break;
            case 7: // Checkbox
               $aProperty_Values[0]->value(is_null(Core_Array::getPost("property_{$oProperty->id}")) ? 0 : 1);
                  $aProperty_Values[0]->save();
               break;
         }
      }
   }
   if(!$error)
      $Siteuser_Controller_Show->go('/users/');
}


$Siteuser_Controller_Show->xsl(
   Core_Entity::factory('Xsl')->getByName($XSLRegistration)
)
   ->properties(TRUE)
   ->show();

но, если есть ошибки заполнения данных, открываеться форма, но почему-то нет данных. При повторной загрузке страницы, данные в форме есть верные
Авторизация