Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”
Кастомные макрос не справляется с обработкой

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

Ответов: 6
Просмотров: 2573
Последний ответ 23 Мая 2016, 20:38:16
от Vladimir

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

*

AllaVK

  • **
  • 64
  • +0/-0
    • Просмотр профиля
Кастомные getNext и getPrevious
« : 11 Октября 2011, 16:39:10 »
Добрый день!
Требуется небольшая подсказка:
в структуре сайта имеется несколько фотоальбомов с фотографиями.
Хотелось бы, чтобы при выводе конкретной фотографии (например с помощью %photoalbum photo('/album1/photo1', 'sample')%)  была возможность пролистывания фотографий вперед и назад (аналог %system getNext()% и %system getPrevious()%) не только в пределах альбома, но и с переходом на фотографии следующего и предыдущего альбомов. Может как-то можно настроить стандартные макросы?
или на что обратить внимание при написании кастомного макроса?
заранее большое спасибо всем откликнувшимся!

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Кастомные getNext и getPrevious
« Ответ #1 : 11 Октября 2011, 17:51:44 »
только неделю назад писал такой для одной компании, только там переходили по страницам фотоальбомов , а фотографии подгружались галерей и листались

самый простой вариант делать так, делаешь клоны этих макросов %system getNext()% и %system getPrevious()% и добавляешь им условие что если не найден последующий или предыдущий элемент перейти на родительский уровень и попробовать там (будет много тонкостей, но это уже зависит от того как конкретно ты будешь это внедрять и для каких целей)


*

AllaVK

  • **
  • 64
  • +0/-0
    • Просмотр профиля
Re:Кастомные getNext и getPrevious
« Ответ #2 : 12 Октября 2011, 10:04:56 »
делаешь клоны этих макросов %system getNext()% и %system getPrevious()%

я что-то не нашла в системе исходный код этих макросов  ((( в файле system.php код этих макросов в каком-то другом формате написан....

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Кастомные getNext и getPrevious
« Ответ #3 : 12 Октября 2011, 16:33:45 »
тогда на словах,
-берем id текущего элемента
-берем id родительского элемента
-берем все дочерние страницы на 1 уровень вниз ,
-ищем среди массива id дочерних элементов id текущей страницы и выводим последующий или предыдущий

*

AllaVK

  • **
  • 64
  • +0/-0
    • Просмотр профиля
Re:Кастомные getNext и getPrevious
« Ответ #4 : 12 Октября 2011, 16:44:55 »
Спасибо большое, попробую так...

*

AllaVK

  • **
  • 64
  • +0/-0
    • Просмотр профиля
Re:Кастомные getNext и getPrevious
« Ответ #5 : 26 Октября 2011, 17:01:33 »
Для реализации этой задачи придумала 2 алгоритма... выбираю, какой более правильный...
1. тк мы работаем только с фотографиями, находящимися в альбомах, а альбомы - в фотогалерее, то можно: сделать выборку по типу "Фотография" сразу из всей галереи (из всех альбомов сразу) и к полученному массиву id страниц-фотографий применить стандартный umi-алгоритм получения предыдущего и следующего элементов.
2. у галереи получить все child'ы-альбомы и в цикле по этим child'ам-альбомам - получить у них child'ы-фотографии. Везде проверять typeId ) и в цикле эти полученные child'ы-фотографии - взять их id и сложить в один массив. и к полученному массиву всех фотографий в фотогалерее применить стандартный umi-алгоритм получения следующего и предыдущего элементов.

*

AllaVK

  • **
  • 64
  • +0/-0
    • Просмотр профиля
Re:Кастомные getNext и getPrevious
« Ответ #6 : 26 Октября 2011, 17:03:53 »
делаешь клоны этих макросов %system getNext()% и %system getPrevious()%

нашла их исходные коды ) их и буду использовать в качестве стандартных umi-алгоритмов получения следующего и предыдущего элементов.

*

AllaVK

  • **
  • 64
  • +0/-0
    • Просмотр профиля
Re:Кастомные getNext и getPrevious
« Ответ #7 : 26 Октября 2011, 22:52:47 »
Уважаемый Admin, подскажите, пожалуйста, правильная ли у меня логика в написанных выше двух алгоритмах. и если нет, то в чем я ошибаюсь?

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Кастомные getNext и getPrevious
« Ответ #8 : 26 Октября 2011, 23:59:44 »
я бы делал также (вернее я делал вариацию 2 варианта, так как первый вариант нельзя было сделать из-за условий задачи), в вашем случае, я бы попробовал 1 вариант, он какой-то более... usel'овский что ли))

*

Vladimir

  • ****
  • 279
  • +48/-0
    • Просмотр профиля
Re:Кастомные getNext и getPrevious
« Ответ #9 : 27 Октября 2011, 10:11:39 »
В варианте 1 м.б. нюанс, связанный с сортировкой: фотографии будут упорядочиваться по всей выборке, а не группами в пределах альбома. Если порядок неважен - то это идеальный вариант.

Вариант 2 позволяет и сохранить группировку, и упорядочивать по произвольному свойству (напомню, что в $sel->addHierarchyFilter($parent_id); можно передавать не только id одного элемента, но и массив). Но если альбомов будет много, а посещаемость большая...  потенциально это слабое место.

Наконец, никто не запрещает сделать прямой select с GROUP BY по типу фотоальбома. Тогда вариант 2 уложится в 1 запрос, но все равно, рано или поздно наплодятся фотографии и выборка станет чрезмерно большой.

В итоге получаем:
1) наилучший вариант - не мудрить и оставить все как есть, в пределах одного альбома.
2) если очень нужно общий слайдер - крайне желаетльно использовать вариант 1, как самый простой в реализации.
3) Если нужна группировка и по альбомам, и по свойствам, то вариант 2 - если задачу нужно решить быстро или предполагается, что число альбомов заведомо будет ограниченным и разумным; и свой запрос, если время позволяет.

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Кастомные getNext и getPrevious
« Ответ #10 : 27 Октября 2011, 10:15:13 »
насчет сортировки в 1 варианте согласен, но можно задать сортировку по положению в иерархии, тогда они выведутся сверху вниз как и шли в админке

*

AllaVK

  • **
  • 64
  • +0/-0
    • Просмотр профиля
Re:Кастомные getNext и getPrevious
« Ответ #11 : 27 Октября 2011, 11:14:34 »
Спасибо всем большое за комментарии.
В задаче требуется именно сквозной просмотр всех фотографий во всех альбомах. попробую первый вариант. число альбомов будет штук 6 максимум...

*

AllaVK

  • **
  • 64
  • +0/-0
    • Просмотр профиля
Re:Кастомные getNext и getPrevious
« Ответ #12 : 28 Октября 2011, 18:07:24 »
только неделю назад писал такой для одной компании, только там переходили по страницам фотоальбомов , а фотографии подгружались галерей и листались

требования к задаче изменились (((
теперь надо, чтоб фотки листались сквозь альбомы, как я и сделала, но при этом страница не перезагружалась при листании каждой фотки... например, подружались в какой-нибудь jquery-шный компонент штук по 5 и листались в нем, а остальные подгружались постепенно... пока не соображу, как это сделать... может подскажите что-нибудь? не представляю пока, как сделать постепенную подгрузку... массив всех фоток из всех альбомов у меня есть...

*

Vladimir

  • ****
  • 279
  • +48/-0
    • Просмотр профиля
Re:Кастомные getNext и getPrevious
« Ответ #13 : 28 Октября 2011, 22:04:56 »
Логично) Следовало этого ждать.
Не понятно что значит "штук по 5 и листались в нем" - это требование, чтобы было видно 5 превьюшек?

Проще всего взять стандартный лайтбокс с листанием. Как правило, он не требует, чтобы все превью были в наличии, достаточно иметь список ссылок на все картинки.
Пример http://spectroimpuls.ru/
Под левым меню 2 фоты, на оставшиеся 5 невидимые ссылки.

Там все проще, а в вашем случае я бы сделал так:

Потребуется знать имя ссылки на большую фоту и id страницы, к которой она относится
Ссылки выводим в скрытый блок, все как есть, списком.

<a class="hidden" href="/gif/defs/IMG_1969-1.jpg" rel="milkbox:110" title="" id="id_страницы_1"></a>
<a class="hidden" href="/gif/defs/IMG_1969-2.jpg" rel="milkbox:110" title="" id="id_страницы_2"></a>



Для картинки на странице 
<img id="gal_pic" data:pid="%pid%" src="/gif/defs/s1957-1.jpg">
назначаем событие (в ссылку ее оборачивать не будем, отключившие яваскрипт обойдутся), по которому инициируется клик по ссылке, с id, равным %pid%
Это нужно для того, чтобы лайтбокс запустился именно на текущей картинке. А перестраивать список для каждой страницы нам лень.

Обращаю внимание, что я использую кастомные атрибуты для хранения вспомогательной информации.
data:pid я ввел для того, чтобы можно было полностью физически разнести яваскрипт и html

Выглядеть все вместе, применительно к mootools (сорри, jquery не владею), это будет:

window.addEvent('domready', function(){
   $('gal_pic').addEvent('click', function(e){//картинке присвоили событие click
      e.stop();//запрещаем дальнейшее прохождение события. хотя в данном случае это вряд ли что-то изменит
      var current_page = this.getProperty('data:pid');//получили id текущей страницы
      $(current_page).fireEvent('click');//получили ссыку из списка и имитировали клик по ней
   });
});
« Последнее редактирование: 29 Октября 2011, 11:02:00 от Vladimir »

*

Vladimir

  • ****
  • 279
  • +48/-0
    • Просмотр профиля
Re:Кастомные getNext и getPrevious
« Ответ #14 : 29 Октября 2011, 11:00:18 »
А вообще, кажется мне, что делать такую работу сейчас бессмысленно. В ТЗ задание как было сформулировано? Потому что сейчас получается бред полнейший: ваши работодатели насмотрелись красивых картинок и не удосужились подумать, что получится в итоге.
Допустим, я зашел на страницу с картинкой. Кликаю по слайдеру, страница перезагружается, остается у меня в истории, а я вижу другую картинку. Все привычно и понятно.
Либо. Я кликаю по картинке, запускается лайтбокс, я его листаю, закрываю - и вижу ту же саму картинку, откуда я ушел, а не ту, на которой слайдер закрылся. И что? И где я? А как мне найти те две розочки, что были да клика назад??!
В таком случае логичнее вообще не позволять попасть на страницу с индивидуальной фотографией, а запускать слайдер из списка фоток. Например, яваскриптом запрещая переход по ссылкам.
В общем, Алла, поговорите-ка вы еще раз с теми, кто дает вам задание. Пока что логика выглядит недодуманой
« Последнее редактирование: 29 Октября 2011, 11:03:12 от Vladimir »