Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”

Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - Seintero

Страницы: [1] 2
1
Шаблоны XSLT / Re: Selector order по полю цены
« : 24 Марта 2016, 16:27:27 »
Надо писать select="'id'"
Поясняю подробнее с лишними пробелами:
select = " ' id ' "
Итоговый вариант будет
<xsl:param name="sort" select="'id'"/>

Просто select="id" означает "выбрать значение из тега id"
А select="'id'" означает "выбрать текстовый литерал 'id' "
Благодарю за пояснение, теперь взглянул иначе на происходящее :)

2
Шаблоны XSLT / Re: Selector order по полю цены
« : 23 Марта 2016, 16:18:01 »
Ну я бы предположил, что бессмысленно сортировать udata - он один :-)

apply-templates - означает буквально "применить шаблон к какому-то тегу". sort - говорит о том, что сотрировать нужно тот тег, к которому применяется шаблон. Выберите что вы хотите сортировать и это сортируйте. Но для этого и делайте apply-templates
Огромное спасибо за пояснение, наконец-то мы победили сортировку!!! Даже немного обидно, когда решение такой длительной проблемы занимает две строчки! :)  Вот так заработало:
 <xsl:if test="$sort='price'">	 
<xsl:apply-templates select="item" mode="catalog_item">   
<xsl:sort order="ascending" select="document(concat('upage://',@id))//property[@name = 'price']/value" data-type="number"/>
  </xsl:apply-templates>
Но вы будете смеяться... у меня ещё один ступор возник здесь же. Воодушевившись сразу начал клеить фильтр в зависимости от параметра. А именно в index.xsl, создал переменную <xsl:param name="sort" select="id"/> .... если верить документации таким образом переменной сразу задаётся значение же? Но у меня, когда я проверяю случай, что переменная sort не задана пользователем..... ничего не происходит, переменной этой будто не существует, значений нет. Но если переменная задана пользователем(/?sort=price), тогда всё работает... странно, опять что-то не так делаю?  :((
Попробовал отловить её в переменную другую и если пусто выводить ноль, но тоже не отловилось значение...
	<xsl:variable name="filparam" select="$sort"/>
<xsl:if test="$filparam=''">  <xsl:variable name="filparam" select="0"/>  </xsl:if>
<xsl:value-of select="$filparam"/>
Возникла пока идея может через кастом получится отловить переменную.. но терзают сомнения, ведь в документалке то без кастома просто получали... )))

3
Шаблоны XSLT / Re: Selector order по полю цены
« : 22 Марта 2016, 13:17:26 »
Можно воспользоваться сортировкой на уровне xslt, но для этого нужно иметь все товары на выходе.
Немного не понял, что подразумевает "на уровне xslt".  Допустим получать сразу из кастома весь перечень объектов, а потом этот результат передавать в другой макрос для сортировки?
Ну XSLT же позволяет манипулировать данными и решать такие задачи, как сортировка.
Но всё же более правильным было бы разобраться в логике работы сайта, как формируются, забить это всё отдельным полем и по нему отфильтровать.
Речь идет об этом: http://www.w3schools.com/xsl/xsl_sort.asp

В таком случае нет нужды передавать куда-то объекты для сортировки - они будут сортироваться при выводе.
Благодарю, ознакомился со справкой по этому моменту. Попробовал отказаться от кастома и реализовать через стандартный getObjectsList (чтобы как вы сказали получить весь список объектов)... но.. почему-то выдалось точно в таком же неправильном порядке.
Привожу примеры кода, как я делал. Вот так мне выдало идентичный результат с сортировкой кастома:
  <xsl:apply-templates select="document('udata://catalog/getObjectsList/void////100/price/')/udata">			
<xsl:sort order="ascending" select=".//property[@name = 'price']/value" data-type="number"/>
   </xsl:apply-templates>
Тогда я подумал может идёт конфликт с указанным полем для сортировки и убрал его,но выдача стала ещё хаотичнее.
   <xsl:apply-templates select="document('udata://catalog/getObjectsList/void////100//')/udata">				
<xsl:sort order="ascending" select=".//property[@name = 'price']/value" data-type="number"/>
   </xsl:apply-templates>

Я что-то делаю не так? На первый взгляд всё правильно..

4
Шаблоны XSLT / Re: Selector order по полю цены
« : 21 Марта 2016, 13:31:30 »
Можно воспользоваться сортировкой на уровне xslt, но для этого нужно иметь все товары на выходе.
Немного не понял, что подразумевает "на уровне xslt".  Допустим получать сразу из кастома весь перечень объектов, а потом этот результат передавать в другой макрос для сортировки?

5
Шаблоны XSLT / Re: Selector order по полю цены
« : 21 Марта 2016, 12:36:58 »
И смешно и грустно получилось! Оказывается был повешен кастомный метод,который всё таки меняет цены некоторым товарам! Кто бы знал, как говорится... Большое спасибо всем за обсуждение и помощь!  Теперь мучает другой вопрос - можно ли как-то отсортировать товары в таком случае, т.е. как-то всё таки отловить эти цены кастомные для сортировки?

6
Шаблоны XSLT / Re: Selector order по полю цены
« : 14 Марта 2016, 12:41:59 »
Так в поле price попадает правильное значение или неправильное?
Когда в текущий запрос на 5 объектов я указал id price2 ... то выдавались правильные цены. Но не у всех товаров. Т.е. либо цена выводилась правильная, либо NULL..

7
Шаблоны XSLT / Re: Selector order по полю цены
« : 14 Марта 2016, 12:02:18 »
Возможно причина в этом?

http://dev.docs.umi-cms.ru/nastrojka_sistemy/dostupnye_sekcii/sekciya_modules/#sel=30:1,34:27
Хм.. у меня указано exchange.translator.1c_price_type_id  и ещё 6 полей exchange.translator.1c_price.[с индентификатором]..  Получается надо указать поле exchange.translator.1c_price_type_id в запросе? Но тогда через selector опять же не сортирует правильно. Если задать в sql запрос с полем price2.. и вывести..то некоторые значения цен пусты..  психанул, перечислил ещё несколько полей цен из exchange.translator.1c_price - порядок от этого меняется, но не правильно....

8
Шаблоны XSLT / Re: Selector order по полю цены
« : 14 Марта 2016, 10:30:16 »
А что за ошибка выдавалась?

На самом деле можно заменить SELECT DISTINCT SQL_CALC_FOUND_ROWS h.id as id, h.rel as pid, * FROM на SELECT * FROM
Идея в том, чтобы понять, что же реально выводится в результате запроса: не только id, но и все остальные поля, в том числе поле цены
Ошибка синтаксиса. Вообще докопался до довольно странной вещи, кажется.
Если вывести все поля, то видно, что выводят не те цены всё таки. Видимо глаз замылился, когда сверял до этого.. хотя я сверял выборку крупнее, вероятно там могли совпадать некоторые значения.   
SELECT DISTINCT SQL_CALC_FOUND_ROWS h.id as id, h.rel as pid, oc_268_lj.float_val as price FROM cms3_hierarchy h, cms3_permissions p, cms3_objects o LEFT JOIN cms3_object_content oc_268_lj ON oc_268_lj.obj_id=o.id AND oc_268_lj.field_id = '268' WHERE h.type_id IN (55) AND h.domain_id = '1' AND h.lang_id = '1' AND h.is_deleted = '0' AND h.is_active = '1' AND h.id IN('190029', '205049', '191501', '189822', '190388') AND (p.rel_id = h.id AND p.level & 1 AND p.owner_id IN(13)) AND h.obj_id = o.id ORDER BY `oc_268_lj`.`float_val` ASC

Я вывел поле цены в запросе... и когда проверил объект в каталоге,туда падает почему-то оптовая цена. Как такое может быть, если поле price = 268... 268 price i18n::field-type-price..... у оптовых цен совсем другое id..  ??? 
 

9
Шаблоны XSLT / Re: Selector order по полю цены
« : 11 Марта 2016, 17:47:08 »
А можно выложить результат вот этого скрипта:

SELECT DISTINCT SQL_CALC_FOUND_ROWS h.id as id, h.rel as pid, * FROM cms3_hierarchy h, cms3_permissions p, cms3_objects o LEFT JOIN cms3_object_content oc_268_lj ON oc_268_lj.obj_id=o.id AND oc_268_lj.field_id = '268' WHERE h.type_id IN (55) AND h.domain_id = '1' AND h.lang_id = '1' AND h.is_deleted = '0' AND h.is_active = '1' AND h.id IN('190029', '205049', '191501', '189822', '190388') AND (p.rel_id = h.id AND p.level & 1 AND p.owner_id IN(13)) AND h.obj_id = o.id ORDER BY oc_268_lj.float_val ASC, h.ord ASC
Дословно на такой код выдалась ошибка, я поправил так  "SELECT DISTINCT SQL_CALC_FOUND_ROWS h.id as id, h.rel as pid FROM cms3_hierarchy h, cms3_permissions p, cms3_objects o LEFT JOIN cms3_object_content oc_268_lj ON oc_268_lj.obj_id=o.id AND oc_268_lj.field_id = '268' WHERE h.type_id IN (55) AND h.domain_id = '1' AND h.lang_id = '1' AND h.is_deleted = '0' AND h.is_active = '1' AND h.id IN('190029', '205049', '191501', '189822', '190388') AND (p.rel_id = h.id AND p.level & 1 AND p.owner_id IN(13)) AND h.obj_id = o.id ORDER BY oc_268_lj.float_val ASC, h.ord ASC" и выдался такой же порядок.

10
Шаблоны XSLT / Re: Selector order по полю цены
« : 11 Марта 2016, 17:36:25 »
Другие поля всегда пусты - это не проблема. Выдавались идентичные результаты - это значит что выдавались результаты с ценами вразнобой?
Да, именно так. Точно в таком же порядке, что на прямую sql, что через selector.

11
Шаблоны XSLT / Re: Selector order по полю цены
« : 11 Марта 2016, 17:04:42 »
Цитировать
Попробуйте выполнить сформированный в query скрипт просто в phpMyAdmin - нужно посмотреть на результат выполнения и на то, соответствует ли это указанным правилам сортировки или нет.
Да, я пробовал вчера отсылать sql в phpMyAdmin,но к моему удивлению выдавались идентичные результаты.
Цитировать
Если стоит price - то, скорее всего, цена находится в правильном поле и мой вариант не подходит.
Цитировать
Уровень SQL запросов "более низкий", чем уровень админки UMI. Тут имеется в виду, что это поле определённой таблицы
Скриншот для наглядности -
Если смотреть в cms3_object_fields таблице, то у цены field_type_id равен 10 и равен соответсвенно в таблице cms3_object_field_types price. Но так как вы предоставили скриншот другой таблицы, я и там прогнал на всякий случай.. :))) cms3_object_content   указав в field_id id поля цены... float_val или заполнено или нет, но другие поля всегда пусты. 

12
Шаблоны XSLT / Re: Selector order по полю цены
« : 11 Марта 2016, 16:36:26 »
Я бы предположил, что поле цены вдруг неожиданно стало не float_val, а чем-то другим. Например, строкой. В этом случае указанная сортировка работать не будет. Возможно это не во всех объектах, а только в некоторых - рекомендую это проверить. По-умолчанию у price тип данных price
Так... если смотреть в шаблонах данных в разные типы данных,то там у цены написано price. Или это где-то ещё смотреть надо? Другой вопрос...если оно должно быть price,откуда тогда взялось float_val в запросе? или это нормально?

13
Шаблоны XSLT / Re: Selector order по полю цены
« : 10 Марта 2016, 17:06:25 »
Выведите все объектные типы данных http://api.docs.umi-cms.ru/spravochnik_po_klassam_yadra_umicms/model_dannyh/umiobjecttypescollection/gettypesbyhierarchytypeid/ , которые связаны с иерархическим типом данных 'catalog', 'object'. Затем проверьте, чтобы во всех этих типах было поле цена.

Что-то вроде:
public function checkCatalogObjectTypes() {
            $hierarchyTypeId = umiHierarchyTypesCollection::getInstance()->getTypeByName('catalog', 'object')->getId();

            $objectTypesCollection = umiObjectTypesCollection::getInstance();

            $objectTypes = $objectTypesCollection->getTypesByHierarchyTypeId($hierarchyTypeId);

            $errors = array();

            foreach($objectTypes as $id => $name) {
                $type = $objectTypesCollection->getType($id);

                /* @var umiObjectType $type*/

                $field = $type->getFieldId('price');

                if(!$field) {
                    $errors[] = array(
                        'attribute:id' => $id,
                        'attribute:name' => $name
                    );
                }
            }

            return count($errors) ? array('items' => array('nodes:item' => $errors)) : '';
        }

Действительно интересный ход, благодарю за подсказку! После проверки оказалось, что поле цены есть у всех. Мистика какая-то.

А можно query в студию?
Если рассматривать сортировку по 5 товарам,
$sel = new selector('pages');
  $sel->types('hierarchy-type')->name('catalog', 'object');
   $sel->where('id')->equals(array(190029,205049,191501,189822,190388));
 $sel->order('price')->asc();
то query соответсвенно такой
SELECT DISTINCT SQL_CALC_FOUND_ROWS h.id as id, h.rel as pid FROM cms3_hierarchy h, cms3_permissions p, cms3_objects o LEFT JOIN cms3_object_content oc_268_lj ON oc_268_lj.obj_id=o.id AND oc_268_lj.field_id = '268' WHERE h.type_id IN (55) AND h.domain_id = '1' AND h.lang_id = '1' AND h.is_deleted = '0' AND h.is_active = '1' AND h.id IN('190029', '205049', '191501', '189822', '190388') AND (p.rel_id = h.id AND p.level & 1 AND p.owner_id IN(13)) AND h.obj_id = o.id ORDER BY oc_268_lj.float_val ASC, h.ord ASC
Поле 268 совпадает по id, пробегался по базе на наличие может быть каких-нибудь других одноименных полей.. но нет.. 

14
Шаблоны XSLT / Re: Selector order по полю цены
« : 10 Марта 2016, 15:33:37 »
Проверить, отсортирует ли он конкретно эти товары, если принудительно указать страницы для сортировки.

$sel->where('id')->equals(array(666,777,888,999));

Да, выбрал 5 товаров... упростил максимально выборку для теста и... ничего не изменилось, порядка в этом беспорядке цен не нашлось :)
$sel = new selector('pages');
  $sel->types('hierarchy-type')->name('catalog', 'object');
   $sel->where('id')->equals(array(190029,205049,191501,189822,190388));
 $sel->order('price')->asc();

15
Шаблоны XSLT / Re: Selector order по полю цены
« : 10 Марта 2016, 15:11:42 »
А может какая-то проблема с версией ЮМИ? Давно обновлялись?
2.11 , последнее обновление в сентябре того года..

Не могу вспомнить из-за какого именно глюка, но может бы и из-за этого, я делал такую штуку: первая выборка формировала мне все идентификаторы страниц, которые в неё попадают, а вторая - сортировала.
Советую попробовать сделать ещё одну проверку - взять из выборки 3-4-5 товаров, которые явно не могут правильно отсортироваться и добавить в выборку поиск только по этим идентификаторам.
Не совсем понял.. взять на выбор несколько из "не попадающих в строй" товаров и добавить их тип данных? или проверить отсортирует ли он конкретные эти товары?

Страницы: [1] 2