UMIhelp

Разработка сайта на UMI.CMS => Шаблоны XSLT => Тема начата: Seintero от 10 Марта 2016, 11:56:28

Название: Selector order по полю цены
Отправлено: Seintero от 10 Марта 2016, 11:56:28
Всем привет! Не могу понять, есть классическая проблема - мне надо отсортировать объекты нескольких каталогов сразу по одному полю (когда например у каталога куча подкаталогов сразу). Соответсвенно пишу кастомную выборку с помощью Selector и свято верю,что это решит проблему ... но она почему-то так же не срабатывает! Всё равно товары идут вразнобой. Может быть я что-то забыл добавить? Пробовал и типы указывать разные и уже с самим запросом Sql играться в базе...ничего не пойму, всё равно не сортирует.
 $sel = new selector('pages');
  $sel->types('hierarchy-type')->name('catalog', 'object');
   //$sel->types('object-type')->id(78); 
  // $sel->types('object-type')->id(1101); $sel->types('object-type')->id(1094);
  $sel->where('hierarchy')->page($cat_id)->childs(100);
 $sel->order('price')->asc();
  foreach ($sel->result as $item){  ..... /*типичная отрисовка эл-ов*/ }
Название: Re: Selector order по полю цены
Отправлено: Rodogor от 10 Марта 2016, 12:02:48
Попробуйте так:

 $sel->order('price')->asc(true);
Название: Re: Selector order по полю цены
Отправлено: aghigay от 10 Марта 2016, 12:19:28
А точно у них заполнено поле price? Есть варианты, когда итоговая цена на товар формируется на лету, с учетом скидок, наценок, курса валют и все такое. Может это как раз тот случай?
Название: Re: Selector order по полю цены
Отправлено: Rodogor от 10 Марта 2016, 12:21:31
А точно у них заполнено поле price? Есть варианты, когда итоговая цена на товар формируется на лету, с учетом скидок, наценок, курса валют и все такое. Может это как раз тот случай?
Здравая идея, но думаю, что в "/*типичная отрисовка эл-ов*/" выводится именно поле price и там оно как зря. :)
Название: Re: Selector order по полю цены
Отправлено: Seintero от 10 Марта 2016, 12:24:24
Попробуйте так:

 $sel->order('price')->asc(true);
К сожалению результат не изменился :( Странно. Совсем недавно у меня уже была проблема с "множеством типов данных", я пытался получить объекты, у которых есть определённое заполненное поле.. Usel не справился с выборкой, именно из-за множества типов... но когда переклеил через Selector всё сработало. Столкнувшись сейчас с сортировкой "по нескольким типам", я думал, что Selector так же справится с задачей...

Цитировать
А точно у них заполнено поле price? Есть варианты, когда итоговая цена на товар формируется на лету, с учетом скидок, наценок, курса валют и все такое. Может это как раз тот случай?
Нет-нет, поле price заполнено, перепроверял. Товар с ценой 1400(к-й почему-то больше) и ценой 1800 (к-й считается меньше), отличаются только типами данных.. 
Название: Re: Selector order по полю цены
Отправлено: Rodogor от 10 Марта 2016, 12:29:05
А случайно поле PRICE не удалялось в шаблонах данных, после чего было отдельно созданным для каждого типа? Идентификатор поля одинаковый для всех типов данных?
Название: Re: Selector order по полю цены
Отправлено: Seintero от 10 Марта 2016, 12:33:31
А случайно поле PRICE не удалялось в шаблонах данных, после чего было отдельно созданным для каждого типа? Идентификатор поля одинаковый для всех типов данных?
Это я проверил в первую очередь - id поля одинаковое.. смотрел запрос,который строит selector в выборке тоже правильный id использует..
Название: Re: Selector order по полю цены
Отправлено: aghigay от 10 Марта 2016, 12:42:02
А точно проверяется итоговая выборка, а не результат вывода на сайт? А то может быть вариант, что результат вывода дополнительно подвергается сортировке и конечно тут первоначальная выборка уже не действует?
Ну или, как вариант, может быть выборка делается несколько раз и после этого собирается воедино? Тогда могут быть любые грабли
Название: Re: Selector order по полю цены
Отправлено: Seintero от 10 Марта 2016, 12:49:42
А точно проверяется итоговая выборка, а не результат вывода на сайт? А то может быть вариант, что результат вывода дополнительно подвергается сортировке и конечно тут первоначальная выборка уже не действует?
Ну или, как вариант, может быть выборка делается несколько раз и после этого собирается воедино? Тогда могут быть любые грабли
Нет, это единственная выборка. В неё передаётся параметр для сортировки, в случае её необходимости. По идее такой вызов должен исключать сторонние сортировки на странице сайта  http://сайт.ru/udata://catalog/кастом/  или я ошибаюсь? Результат одинаков в обоих случаях выходит.. как на сайте,так и по отдельному пути..
Название: Re: Selector order по полю цены
Отправлено: aghigay от 10 Марта 2016, 12:55:09
Предлагаю дополнить результат выводом реального значения поля price и посмотреть на итог
Название: Re: Selector order по полю цены
Отправлено: Seintero от 10 Марта 2016, 13:00:10
Предлагаю дополнить результат выводом реального значения поля price и посмотреть на итог
Немного не понял. Пользователь Rodogor сказал истину, у меня уже выводится поле price в атрибутах, для удобства отладки...или речь о чём-то другом ?:) Предлагаю кусочек кода
<item id="189544" link="/eshop/bra/klassika/04408_luiza/" price="1860" xlink:href="upage://189544" alt_name="04408">04408</item>
<item id="189885" link="/eshop/bra/klassika/12001_1w/" price="1400" xlink:href="upage://189885" alt_name="12001">12001/1W</item>
Название: Re: Selector order по полю цены
Отправлено: Rodogor от 10 Марта 2016, 13:01:29
Кажется у меня подобное бывало - но я не помню как решал проблему.
Думаю, что я бы пошёл по такому пути:
0. Убедиться, что дело не в кэширование - выгрузка меняется, если отфильтровать по какому-нибудь значению/родителю/типу
1. Убедиться, что дело не в конкретном поле - попробовать отсортировать по другому полю.
2. Убедиться, что сортировка вообще работает - отсортировать объекты одного типа данных.
3. Убедиться, что сортировка объектов по нескольким типов данных по общему полю работает. Сначала проверить на других типах данных (или вновь созданных), затем постепенно перемещаться к тем типам, с которым не работает.
4. Воссоздал бы ситуацию на другом сайте

Ну и потом я бы попробовал заменить всё связанное с этим классом файлами из другого, заведомо рабочего проекта
Название: Re: Selector order по полю цены
Отправлено: aghigay от 10 Марта 2016, 13:03:04
Согласен с Rodogor
Название: Re: Selector order по полю цены
Отправлено: Seintero от 10 Марта 2016, 13:47:56
Кажется у меня подобное бывало - но я не помню как решал проблему.
Думаю, что я бы пошёл по такому пути:
0. Убедиться, что дело не в кэширование - выгрузка меняется, если отфильтровать по какому-нибудь значению/родителю/типу
1. Убедиться, что дело не в конкретном поле - попробовать отсортировать по другому полю.
2. Убедиться, что сортировка вообще работает - отсортировать объекты одного типа данных.
3. Убедиться, что сортировка объектов по нескольким типов данных по общему полю работает. Сначала проверить на других типах данных (или вновь созданных), затем постепенно перемещаться к тем типам, с которым не работает.
4. Воссоздал бы ситуацию на другом сайте

Ну и потом я бы попробовал заменить всё связанное с этим классом файлами из другого, заведомо рабочего проекта
Дело в том, что имеется достаточно большое кол-во типов данных,чтобы проверять последовательно каждый.. что может исказить и воссоздание где-либо. Навскидку проверил - в рамках одного типа всё прекрасно. Т.е. сортировка сама по-себе работает. В рамках двух срабатывает.. но когда начинаю прыгать по каталогам, то (видимо эти типы не попадают) сбивается. Странно,что указав например как тип родителя типов (судя по сформированному запросу тогда перечисляются сразу все id типов-детей) тоже не срабатывает.  Кэш так же отключён..
Название: Re: Selector order по полю цены
Отправлено: Rodogor от 10 Марта 2016, 14:16:44
Замена кода ни к чему не привела?
Много типов откуда создаётся - из 1с? Возможность пересоздать их есть?
Название: Re: Selector order по полю цены
Отправлено: aghigay от 10 Марта 2016, 14:18:11
А может какая-то проблема с версией ЮМИ? Давно обновлялись?
Название: Re: Selector order по полю цены
Отправлено: Rodogor от 10 Марта 2016, 14:51:10
Не могу вспомнить из-за какого именно глюка, но может бы и из-за этого, я делал такую штуку: первая выборка формировала мне все идентификаторы страниц, которые в неё попадают, а вторая - сортировала.
Советую попробовать сделать ещё одну проверку - взять из выборки 3-4-5 товаров, которые явно не могут правильно отсортироваться и добавить в выборку поиск только по этим идентификаторам.
Название: Re: Selector order по полю цены
Отправлено: Seintero от 10 Марта 2016, 15:11:42
А может какая-то проблема с версией ЮМИ? Давно обновлялись?
2.11 , последнее обновление в сентябре того года..

Не могу вспомнить из-за какого именно глюка, но может бы и из-за этого, я делал такую штуку: первая выборка формировала мне все идентификаторы страниц, которые в неё попадают, а вторая - сортировала.
Советую попробовать сделать ещё одну проверку - взять из выборки 3-4-5 товаров, которые явно не могут правильно отсортироваться и добавить в выборку поиск только по этим идентификаторам.
Не совсем понял.. взять на выбор несколько из "не попадающих в строй" товаров и добавить их тип данных? или проверить отсортирует ли он конкретные эти товары?
Название: Re: Selector order по полю цены
Отправлено: Rodogor от 10 Марта 2016, 15:14:13
Проверить, отсортирует ли он конкретно эти товары, если принудительно указать страницы для сортировки.

$sel->where('id')->equals(array(666,777,888,999));
Название: Re: Selector order по полю цены
Отправлено: Seintero от 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();
Название: Re: Selector order по полю цены
Отправлено: Rodogor от 10 Марта 2016, 15:41:25
Тогда я бы так действовал:
1. Полностью заменить код SELECTOR-а с другого проекта.
2. Попробовать проанализировать формируемый SQL-запрос через $sel->query() и базу данных.
Пару раз удавалось дать ладу путём сравнения с другим "эталонным" сайтом, на котором всё работало.
Название: Re: Selector order по полю цены
Отправлено: e.ioffe от 10 Марта 2016, 16:25:05
Выведите все объектные типы данных 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)) : '';
        }
Название: Re: Selector order по полю цены
Отправлено: aghigay от 10 Марта 2016, 16:26:27
А можно query в студию?
Название: Re: Selector order по полю цены
Отправлено: Rodogor от 10 Марта 2016, 16:28:09
Выведите все объектные типы данных 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)) : '';
        }
Хороший подход. Профессионально :)
Название: Re: Selector order по полю цены
Отправлено: Seintero от 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, пробегался по базе на наличие может быть каких-нибудь других одноименных полей.. но нет.. 
Название: Re: Selector order по полю цены
Отправлено: aghigay от 10 Марта 2016, 17:25:24
Я бы предположил, что поле цены вдруг неожиданно стало не float_val, а чем-то другим. Например, строкой. В этом случае указанная сортировка работать не будет. Возможно это не во всех объектах, а только в некоторых - рекомендую это проверить. По-умолчанию у price тип данных price
Название: Re: Selector order по полю цены
Отправлено: Seintero от 11 Марта 2016, 16:36:26
Я бы предположил, что поле цены вдруг неожиданно стало не float_val, а чем-то другим. Например, строкой. В этом случае указанная сортировка работать не будет. Возможно это не во всех объектах, а только в некоторых - рекомендую это проверить. По-умолчанию у price тип данных price
Так... если смотреть в шаблонах данных в разные типы данных,то там у цены написано price. Или это где-то ещё смотреть надо? Другой вопрос...если оно должно быть price,откуда тогда взялось float_val в запросе? или это нормально?
Название: Re: Selector order по полю цены
Отправлено: Rodogor от 11 Марта 2016, 16:42:11
Я бы предположил, что поле цены вдруг неожиданно стало не float_val, а чем-то другим. Например, строкой. В этом случае указанная сортировка работать не будет. Возможно это не во всех объектах, а только в некоторых - рекомендую это проверить. По-умолчанию у price тип данных price
Так... если смотреть в шаблонах данных в разные типы данных,то там у цены написано price. Или это где-то ещё смотреть надо? Другой вопрос...если оно должно быть price,откуда тогда взялось float_val в запросе? или это нормально?

Уровень SQL запросов "более низкий", чем уровень админки UMI. Тут имеется в виду, что это поле определённой таблицы
Скриншот для наглядности -
(https://api.monosnap.com/rpc/file/download?id=1xRcpdbdjLhBU3a8XwHf1d1Zhb6cgy)
Название: Re: Selector order по полю цены
Отправлено: aghigay от 11 Марта 2016, 16:49:25
Я бы предположил, что поле цены вдруг неожиданно стало не float_val, а чем-то другим. Например, строкой. В этом случае указанная сортировка работать не будет. Возможно это не во всех объектах, а только в некоторых - рекомендую это проверить. По-умолчанию у price тип данных price
Так... если смотреть в шаблонах данных в разные типы данных,то там у цены написано price. Или это где-то ещё смотреть надо? Другой вопрос...если оно должно быть price,откуда тогда взялось float_val в запросе? или это нормально?


Если стоит price - то, скорее всего, цена находится в правильном поле и мой вариант не подходит.

Попробуйте выполнить сформированный в query скрипт просто в phpMyAdmin - нужно посмотреть на результат выполнения и на то, соответствует ли это указанным правилам сортировки или нет.
Название: Re: Selector order по полю цены
Отправлено: Seintero от 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 или заполнено или нет, но другие поля всегда пусты. 
Название: Re: Selector order по полю цены
Отправлено: aghigay от 11 Марта 2016, 17:20:51
Другие поля всегда пусты - это не проблема. Выдавались идентичные результаты - это значит что выдавались результаты с ценами вразнобой?
Название: Re: Selector order по полю цены
Отправлено: Seintero от 11 Марта 2016, 17:36:25
Другие поля всегда пусты - это не проблема. Выдавались идентичные результаты - это значит что выдавались результаты с ценами вразнобой?
Да, именно так. Точно в таком же порядке, что на прямую sql, что через selector.
Название: Re: Selector order по полю цены
Отправлено: aghigay от 11 Марта 2016, 17:39:17
А можно выложить результат вот этого скрипта:

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
Название: Re: Selector order по полю цены
Отправлено: Seintero от 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" и выдался такой же порядок.
 (http://imglink.ru/pictures/11-03-16/355123396201ca28efe7e659f32c35e1.jpg) (http://imglink.ru)
Название: Re: Selector order по полю цены
Отправлено: aghigay от 11 Марта 2016, 18:07:14
А что за ошибка выдавалась?

На самом деле можно заменить SELECT DISTINCT SQL_CALC_FOUND_ROWS h.id as id, h.rel as pid, * FROM на SELECT * FROM
Идея в том, чтобы понять, что же реально выводится в результате запроса: не только id, но и все остальные поля, в том числе поле цены
Название: Re: Selector order по полю цены
Отправлено: Seintero от 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..  ??? 
 
Название: Re: Selector order по полю цены
Отправлено: aghigay от 14 Марта 2016, 11:25:50
Возможно причина в этом?

http://dev.docs.umi-cms.ru/nastrojka_sistemy/dostupnye_sekcii/sekciya_modules/#sel=30:1,34:27
Название: Re: Selector order по полю цены
Отправлено: Seintero от 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 - порядок от этого меняется, но не правильно....
Название: Re: Selector order по полю цены
Отправлено: aghigay от 14 Марта 2016, 12:18:35
Так в поле price попадает правильное значение или неправильное?
Название: Re: Selector order по полю цены
Отправлено: Seintero от 14 Марта 2016, 12:41:59
Так в поле price попадает правильное значение или неправильное?
Когда в текущий запрос на 5 объектов я указал id price2 ... то выдавались правильные цены. Но не у всех товаров. Т.е. либо цена выводилась правильная, либо NULL..
Название: Re: Selector order по полю цены
Отправлено: aghigay от 14 Марта 2016, 13:29:34
Так в поле price попадает правильное значение или неправильное?
Когда в текущий запрос на 5 объектов я указал id price2 ... то выдавались правильные цены. Но не у всех товаров. Т.е. либо цена выводилась правильная, либо NULL..

Не, я не про это спрашиваю. Я спрашиваю в админке правильные цены стоят в товаре? Или как?
Название: Re: Selector order по полю цены
Отправлено: Rodogor от 14 Марта 2016, 15:32:35
Я когда в такие блудняки попадаю - возвращаются к самому началу и ещё раз проверяю.

Советую сделать следующее: сделать ещё одно поле типа цена и для 5 выбранных товаров задать цены в новом поле.
Убедиться, что отсортировалось как надо - это будет говорить о том, что механизм выборок работает корректно, в базу всё записывается как надо и т.п..

После этого взял бы 5 товаров, которые не сортируются по нужному полю и прописал бы им руками тестовые цены и проверил бы - отсортируются или нет..
Название: Re: Selector order по полю цены
Отправлено: Seintero от 21 Марта 2016, 12:36:58
И смешно и грустно получилось! Оказывается был повешен кастомный метод,который всё таки меняет цены некоторым товарам! Кто бы знал, как говорится... Большое спасибо всем за обсуждение и помощь!  Теперь мучает другой вопрос - можно ли как-то отсортировать товары в таком случае, т.е. как-то всё таки отловить эти цены кастомные для сортировки?
Название: Re: Selector order по полю цены
Отправлено: aghigay от 21 Марта 2016, 12:43:19
Можно воспользоваться сортировкой на уровне xslt, но для этого нужно иметь все товары на выходе.
Название: Re: Selector order по полю цены
Отправлено: Seintero от 21 Марта 2016, 13:31:30
Можно воспользоваться сортировкой на уровне xslt, но для этого нужно иметь все товары на выходе.
Немного не понял, что подразумевает "на уровне xslt".  Допустим получать сразу из кастома весь перечень объектов, а потом этот результат передавать в другой макрос для сортировки?
Название: Re: Selector order по полю цены
Отправлено: Rodogor от 21 Марта 2016, 13:33:47
Можно воспользоваться сортировкой на уровне xslt, но для этого нужно иметь все товары на выходе.
Немного не понял, что подразумевает "на уровне xslt".  Допустим получать сразу из кастома весь перечень объектов, а потом этот результат передавать в другой макрос для сортировки?
Ну XSLT же позволяет манипулировать данными и решать такие задачи, как сортировка.
Но всё же более правильным было бы разобраться в логике работы сайта, как формируются, забить это всё отдельным полем и по нему отфильтровать.
Название: Re: Selector order по полю цены
Отправлено: aghigay от 21 Марта 2016, 13:57:32
Речь идет об этом: http://www.w3schools.com/xsl/xsl_sort.asp

В таком случае нет нужды передавать куда-то объекты для сортировки - они будут сортироваться при выводе.
Название: Re: Selector order по полю цены
Отправлено: Seintero от 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>

Я что-то делаю не так? На первый взгляд всё правильно..
Название: Re: Selector order по полю цены
Отправлено: aghigay от 22 Марта 2016, 14:49:08
Ну я бы предположил, что бессмысленно сортировать udata - он один :-)

apply-templates - означает буквально "применить шаблон к какому-то тегу". sort - говорит о том, что сотрировать нужно тот тег, к которому применяется шаблон. Выберите что вы хотите сортировать и это сортируйте. Но для этого и делайте apply-templates
Название: Re: Selector order по полю цены
Отправлено: Seintero от 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"/>
Возникла пока идея может через кастом получится отловить переменную.. но терзают сомнения, ведь в документалке то без кастома просто получали... )))
Название: Re: Selector order по полю цены
Отправлено: aghigay от 23 Марта 2016, 16:41:17
Надо писать select="'id'"
Поясняю подробнее с лишними пробелами:
select = " ' id ' "
Итоговый вариант будет
<xsl:param name="sort" select="'id'"/>

Просто select="id" означает "выбрать значение из тега id"
А select="'id'" означает "выбрать текстовый литерал 'id' "
Название: Re: Selector order по полю цены
Отправлено: Seintero от 24 Марта 2016, 16:27:27
Надо писать select="'id'"
Поясняю подробнее с лишними пробелами:
select = " ' id ' "
Итоговый вариант будет
<xsl:param name="sort" select="'id'"/>

Просто select="id" означает "выбрать значение из тега id"
А select="'id'" означает "выбрать текстовый литерал 'id' "
Благодарю за пояснение, теперь взглянул иначе на происходящее :)
Название: Re: Selector order по полю цены
Отправлено: aghigay от 25 Марта 2016, 11:13:44
Всегда пожалуйста :-)