Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”
Добавление уже имеющихся объектов каталога в другие категории через дополнительн

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

Ответов: 14
Просмотров: 5256
Последний ответ 09 Июня 2015, 12:43:53
от admin
Вывод в фильтрах по каталогу значение справочника для конкретной категории

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

Ответов: 1
Просмотров: 1278
Последний ответ 29 Мая 2015, 12:51:38
от admin
Как вывести в карточке товара название категории и ссылку на нее

Автор koroganРаздел Шаблоны TPL

Ответов: 1
Просмотров: 3279
Последний ответ 20 Июня 2013, 08:21:10
от admin
запрос SQL, как выбрать товары в заданной категории

Автор KTIРаздел Макросы UMI.CMS

Ответов: 1
Просмотров: 5457
Последний ответ 23 Апреля 2012, 15:33:34
от KTI
Определить виртуальную копию категории?

Автор muldyРаздел Custom макросы

Ответов: 1
Просмотров: 1875
Последний ответ 30 Октября 2013, 22:15:08
от admin

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

*

aghigay

  • *****
  • 611
  • +28/-3
  • Просто пытаюсь помочь. Иногда пинком
    • Просмотр профиля
    • umicms.me
Re: Беспл. доставка для определенной категории
« Ответ #15 : 16 Октября 2016, 00:31:55 »
Чтобы поправить ваш код так, чтобы работало необходимо:
1. знать на какой странице/в каком макросе вы вызываете ваш код (чтобы понимать, с какими исходными данными можно работать)
2. знать как выглядит текущий <xsl:template, что он принимает в match и что может отдавать
3. какие глобальные переменные у вас объявлены
4. как выглядит структура вашего каталога

Это все данные, которые нужно проанализировать. К XSLT они имеют лишь косвенное отношение.
Если дадите хоть что-то из указанного - задачу можно попробовать решить гарантировано.

Без гарантии - пробуйте
<xsl:when test="(document(concat('udata://emarket/price/', page/@id,'//0'))/udata/price/actual &gt;= 50000) or (//parents/page[@id='5106'])">
Мой блог http://umicms.me

*

sam

  • ***
  • 216
  • +3/-1
  • "Век живи - век учись!"
    • Просмотр профиля
Re: Беспл. доставка для определенной категории
« Ответ #16 : 16 Октября 2016, 12:38:23 »
1. /modules/catalog/object-view.xsl (исходный файл)
2. почти стандартный файл (match без изменений)
3. спросили бы что попроще
4. раздел каталога (диктофоны (id=5106)) -> подразделы (диктофоны L (id=5107), M (id=5108), N (id=5109)) - раздел каталога выводит все объекты всех подразделов, а каждый подраздел выводит только свои объекты. как вы уже поняли, родителем всех подразделов и их объектов является 5106.

Ваш код ещё не пробовал. По данным от меня выше, возможно его еще поменяем.

P.S. Все подразделы и вроде объекты этих подразделов содержат в себе upage://5106 (кроме самого раздела "Диктофоны" (у него upage://36)) - может пробовать через этот upage://5106 сделать проверку?! Исходя из upage://5106, можете продемонстрировать код проверки?

P.P.S. Скриншот одного из подразделов "Диктофоны" прилагаю (XML), чтобы, может он Вам о чем-то скажет, как правильно сделать код проверки (см. вложение).
« Последнее редактирование: 16 Октября 2016, 22:02:32 от sam »
Жизнь слишком коротка, чтобы выучить и знать всё на свете. Тем более, что мир быстро меняется, и технологии за ним тоже. Но это не повод, чтобы перестать учиться к чему-то новому. "Век живи - век учись!" Иначе жизнь будет прожита без пользы, как для себя, так и для окружающих.

*

sam

  • ***
  • 216
  • +3/-1
  • "Век живи - век учись!"
    • Просмотр профиля
Re: Беспл. доставка для определенной категории
« Ответ #17 : 17 Октября 2016, 19:58:23 »
Методом "проб и ошибок" нашёл рабочие коды для каждого из подразделов по-отдельности:
page/@parentId = '5107' //диктофоны "L"
page/@parentId = '5108' //диктофоны "M"
page/@parentId = '5109' //диктофоны "N"
Я так понимаю, что объявляется, что если у объекта родителем является 'ХХХХ', то "доставка - бесплатно".

У этих подразделов родителем является '5106' - надо, чтобы проверка была именно по этому @parentId.

Согласно логике трёх рабочих кодов выше (для их родителя '5106') должен работать код ниже, но не работает:
parents/page/@id = '5106'
Почему?! Что не так в моих действиях?!
« Последнее редактирование: 17 Октября 2016, 21:05:50 от sam »
Жизнь слишком коротка, чтобы выучить и знать всё на свете. Тем более, что мир быстро меняется, и технологии за ним тоже. Но это не повод, чтобы перестать учиться к чему-то новому. "Век живи - век учись!" Иначе жизнь будет прожита без пользы, как для себя, так и для окружающих.

*

aghigay

  • *****
  • 611
  • +28/-3
  • Просто пытаюсь помочь. Иногда пинком
    • Просмотр профиля
    • umicms.me
Re: Беспл. доставка для определенной категории
« Ответ #18 : 17 Октября 2016, 21:21:06 »
Потом что ваш "стандартный match" содержит какой-то элемент. И если этот элемент result и если в этом резалте есть parents - то тогда, возможно, это будет работать.

А если этот элемент, например, page, то вы ищите сочетание page/parents/page/@id. А есть такое сочетание в ваших данных?
Мой блог http://umicms.me

*

sam

  • ***
  • 216
  • +3/-1
  • "Век живи - век учись!"
    • Просмотр профиля
Re: Беспл. доставка для определенной категории
« Ответ #19 : 17 Октября 2016, 21:48:02 »
result объектов содержит meta, user, parents и page (см. XML выше). Согласно рабочим кодам выше, обращение к parentId из page. А надо, чтобы обращение было к parents (содержит три page - второй page с id='5106'; первый page первый уровень каталога, а третий page подразделы раздела диктофоны) - именно ко второму page с id 5106 и хочу я обратиться. Логика моего кода верна, но он не работает. Там нет порядка page/parents/page/@id (parents содержит три page (см. чуть выше), а page который за пределами parents НЕ содержит в себе parents с page). Пожалуйста, см скриншот XML/его код выше. То, что я описал выше, Вы там и увидете. Помогите добить эту проверку, пожалуйста.

P.S. Интересно, логичный это код - parents/page[last()]/@parentId='5106'?! Просто parents ведь содержит три page, а у третьего последнего page (подраздел) родитель и есть parentId '5106' (раздел диктофоны)?! Поправьте меня, если я не прав.
« Последнее редактирование: 17 Октября 2016, 22:18:29 от sam »
Жизнь слишком коротка, чтобы выучить и знать всё на свете. Тем более, что мир быстро меняется, и технологии за ним тоже. Но это не повод, чтобы перестать учиться к чему-то новому. "Век живи - век учись!" Иначе жизнь будет прожита без пользы, как для себя, так и для окружающих.

*

aghigay

  • *****
  • 611
  • +28/-3
  • Просто пытаюсь помочь. Иногда пинком
    • Просмотр профиля
    • umicms.me
Re: Беспл. доставка для определенной категории
« Ответ #20 : 17 Октября 2016, 22:05:51 »
Утверждение "Логика верна" противоречит утверждению "код не работает". Подумайте об этом
Мой блог http://umicms.me

*

aghigay

  • *****
  • 611
  • +28/-3
  • Просто пытаюсь помочь. Иногда пинком
    • Просмотр профиля
    • umicms.me
Re: Беспл. доставка для определенной категории
« Ответ #21 : 17 Октября 2016, 22:32:13 »
К сожалению, вам придется сломать себе мозг, чтобы понять как устроена логика работы XSLT. А потом придется взять, и собрать этот мозг обратно. Так было у всех, будет и у вас.

Условие проверяет не то, что какой-то конкретный page имеет какой-то конкретный атрибут @id, а то, что существует page с атрибутом @id, равном тому, что нужно вам. В этом разница.

Если вы поймете это, то поймете, что под ваше условие подойдет любой объект, как угодно вложенный в ваш раздел: хоть на 3 уровня, хоть на 10 вглубь.

Ну и еще вам следует понять, что "parents/page/@id" - это относительный "адрес"  вашего объекта. А /result/parents/page/@id - абсолютный. И вы упорно пользуетесь относительным, не зная в каком именно контексте в данный момент вы находитесь. А относительный делает что? Берет ваш math и прибавляет то, что у вас есть.
Мой блог http://umicms.me

*

sam

  • ***
  • 216
  • +3/-1
  • "Век живи - век учись!"
    • Просмотр профиля
Re: Беспл. доставка для определенной категории
« Ответ #22 : 18 Октября 2016, 01:01:37 »
В object-view.xsl в самом начале match = /result[@module = 'catalog' and @method = 'object'] - примерно так (сейчас я не могу исходник посмотреть, так как файла под рукой нет (не за компом уже)). Последующий match = 'udata://' (вроде так, если память мне не изменяет).

Относительно того, что в начале надо result прописать, возможно Вы правы (не люблю спорить, тем более с асами/профи своего дела).

Резюмируя все Ваши и мои сообщения (особенно самые последние из них), я пока остановлюсь на таком варианте кода (его следует ещё протестировать):
/result/parents/page[last()]/@parentId='5106'
Могу обосновать этот код - result содержит в себе parents, а у parents есть три page, последний из которых (page[last()]) как раз таки и содержит parentId='5106', который говорит о том, что у объекта родителем является именно этот последний page с таким-то id. Теперь главное, чтобы такой код сработал для моей проверки.

P.S. Возможно, когда в коде не было last(), система думала о том, к какому из page обратиться, и это не смотря на то, что я явно указывал @id (а их там целых три - у каждого уровня page свой id)?! Впрочем тестирование расставит все точки над И, я так думаю. Посмотрим.
Жизнь слишком коротка, чтобы выучить и знать всё на свете. Тем более, что мир быстро меняется, и технологии за ним тоже. Но это не повод, чтобы перестать учиться к чему-то новому. "Век живи - век учись!" Иначе жизнь будет прожита без пользы, как для себя, так и для окружающих.

*

aghigay

  • *****
  • 611
  • +28/-3
  • Просто пытаюсь помочь. Иногда пинком
    • Просмотр профиля
    • umicms.me
Re: Беспл. доставка для определенной категории
« Ответ #23 : 18 Октября 2016, 01:20:22 »
Господи, ну почему вы не видите очевидных вещей? Что за теории заговоров "возможно, система думала". Система ничего не думает. Система берет ваше выражение и пробует его воткнуть в ваши данные. Если может найти соответствие - то выражение истинное. Если нет - выражение ложное.

Вы исправили 2 момента:
1. сделали обращение от корня (наконец-то)
2. дописали хрень (что за бред написан в выражении?) Вы хоть пробовали сами логически прочитать что там написано?
/result/parents/page[last()]/@parentId='5106'
найти все страницы (page) которые являются последними в наборе страниц ([last()]), лежат внутри только внутри тега parents, который, в свою очередь лежит внутри тега result. Затем взять у этой найденной страницы атрибут родителяИд (@parentId) и сравнить его с 5106. Результат - true/false. Нахрена такая сложность?

При структуре:
каталог (id = 3, parentId = 0)
-- диктофоны (id = 5106, parentId = 3)
---- диктофоны касетные (id = 112255, parentId = 5106)
------ диктофон 1 (id = 11225512, parentId = 112255)
Такое сработает.
А при структуре
каталог (id = 3, parentId = 0)
-- диктофоны (id = 5106, parentId = 3)
---- диктофон 1 (id = 11225512, parentId = 5106)
Вы пролетите как фанера над Парижем.

Вот правильный результат:
/result/parents/page/@id='5106'
Мой блог http://umicms.me

*

sam

  • ***
  • 216
  • +3/-1
  • "Век живи - век учись!"
    • Просмотр профиля
Re: Беспл. доставка для определенной категории
« Ответ #24 : 18 Октября 2016, 02:07:39 »
Я надеюсь, мой скриншот XML Вы смотрели (прикреплял к одному из последних сообщений). Там есть структура нашего каталога.
Жизнь слишком коротка, чтобы выучить и знать всё на свете. Тем более, что мир быстро меняется, и технологии за ним тоже. Но это не повод, чтобы перестать учиться к чему-то новому. "Век живи - век учись!" Иначе жизнь будет прожита без пользы, как для себя, так и для окружающих.

*

aghigay

  • *****
  • 611
  • +28/-3
  • Просто пытаюсь помочь. Иногда пинком
    • Просмотр профиля
    • umicms.me
Re: Беспл. доставка для определенной категории
« Ответ #25 : 18 Октября 2016, 02:20:02 »
Ага, смотрю. Ну и какой же page внутри вашего тега parents имеет атрибут parentId равный 5106?
Мой блог http://umicms.me

*

aghigay

  • *****
  • 611
  • +28/-3
  • Просто пытаюсь помочь. Иногда пинком
    • Просмотр профиля
    • umicms.me
Re: Беспл. доставка для определенной категории
« Ответ #26 : 18 Октября 2016, 02:21:09 »
Если что, это был риторический вопрос. Правильный ответ - никакой. И вы огребли ровно то, что я описал в своем примере.
Мой блог http://umicms.me

*

sam

  • ***
  • 216
  • +3/-1
  • "Век живи - век учись!"
    • Просмотр профиля
Re: Беспл. доставка для определенной категории
« Ответ #27 : 18 Октября 2016, 02:36:30 »
Последовательность (result/):
1. parents page id=36 parentId=0 (каталог)
2. parents page id=5106 parentId=36 (раздел каталога)
3. parents page id=5109 parentId=5106 (подраздел каталога)
4. page id=5110 parentId=5109 (объект каталога - этот page за пределами parents (вспомните рабочий код - page/@parentId='5109'))
К третьей строке, подразделу каталога я и хочу достучаться (parentId=5106), точнее ко второму page/@id, через @parentId третьего.

P.S. Предыдущий XML был не из страницы объекта каталога, а из подраздела. Это моя ошибка. Извиняюсь!

P.P.S. /result/parents/page[last()]/@parentId='5106' - увы и такой код при структуре ниже тоже не работает!
XML из страницы объекта, где и должна работать сама проверка:
<result module="catalog" method="object" pageId="5110">
<meta>
<keywords>...</keywords>
<description>...</description>
</meta>
<user .../>
<parents>
<page id="36" parentId="0" type-id="77">
<basetype id="54" module="catalog" method="category">Разделы каталога</basetype>
<name>Каталог</name>
</page>
<page id="5106" parentId="36" type-id="77">
<basetype id="54" module="catalog" method="category">Разделы каталога</basetype>
<name>Диктофоны</name>
</page>
<page id="5109" parentId="5106" type-id="77">
<basetype id="54" module="catalog" method="category">Разделы каталога</basetype>
<name>Диктофоны L</name>
</page>
</parents>
<page id="5110" parentId="5109" type-id="177">
<basetype id="55" module="catalog" method="object">Объекты каталога</basetype>
<name>Диктофон L - название диктофона</name>
...
</page>
</result>
Эта загадка для меня так и остаётся не разгаданной. Я в тупике - как быть не знаю уже?!
« Последнее редактирование: 18 Октября 2016, 13:54:55 от sam »
Жизнь слишком коротка, чтобы выучить и знать всё на свете. Тем более, что мир быстро меняется, и технологии за ним тоже. Но это не повод, чтобы перестать учиться к чему-то новому. "Век живи - век учись!" Иначе жизнь будет прожита без пользы, как для себя, так и для окружающих.

*

sam

  • ***
  • 216
  • +3/-1
  • "Век живи - век учись!"
    • Просмотр профиля
Re: Беспл. доставка для определенной категории
« Ответ #28 : 18 Октября 2016, 13:50:04 »
Я вспомнил, почему не использую абсолютный "адрес" (/result/parents/page/@...) - потому что такой "адрес" не работает - пытался по всячески, но все мои попытки увенчались неудачей. По этому, в рабочих кодах выше относительные "адреса" (page/@...).

Так как мне никак не удаётся достучаться до прародителя объекта каталога, исходя из логики рабочих кодов, я решил посмотреть, какой же @type-id у объекта каталога /result/page. И выяснил, что @type-id = '177' у объекта каталога (/result/page/@type-id). Проверил, что в других разделах этот @type-id другой - только у "Диктофонов" он '177'. Решил сделать проверку, и она сработала, только не при абсолютном "адресе" (/result/page/@type-id), а при "относительном" (page/@type-id). Рабочий код ниже:
Код проверки раздела "Диктофоны":
page/@type-id = '177'

Код проверки полный - рабочий:
<xsl:when test="(document(concat('udata://emarket/price/', page/@id,'//0'))/udata/price/actual &gt;= 50000) or (page/@type-id = '177')">
Буду проверять дальше, нет ли никаких изъянов у такого кода проверки. Буду крайне признателен за опровержение такого когда. Возможно, исходя из логики последнего рабочего кода, Вы предложите что-то своё (именно так, код не сработал /result/page/@type-id='177').

P.S. aghigay, изначально Вы так и предлагали мне сделать (см. первое своё сообщение), только я никак @type-id не мог находить для раздела "Диктофоны". И еще, обратите там внимание на то, что и Вы мне там писали код с относительным "адресом", а не абсолютным. Если бы изначально я нашел, что @type-id у раздела "Диктофоны" 177, за пору сообщений решилась бы задача. Так что, Ваша помощь и подсказки подтолкнули меня искать, найти и сделать правильный код проверки.
« Последнее редактирование: 18 Октября 2016, 15:37:58 от sam »
Жизнь слишком коротка, чтобы выучить и знать всё на свете. Тем более, что мир быстро меняется, и технологии за ним тоже. Но это не повод, чтобы перестать учиться к чему-то новому. "Век живи - век учись!" Иначе жизнь будет прожита без пользы, как для себя, так и для окружающих.

*

aghigay

  • *****
  • 611
  • +28/-3
  • Просто пытаюсь помочь. Иногда пинком
    • Просмотр профиля
    • umicms.me
Re: Беспл. доставка для определенной категории
« Ответ #29 : 18 Октября 2016, 15:45:43 »
Гыгыгы :-) Мне вот интересно, сколько еще нужно времени чтобы вы наконец нашли в моих ответах правильный вариант, который я уже дважды написал?
Мой блог http://umicms.me