плейлисты в компоненте iVideo2 2.X

как я сделал поиск плейлистов в списке (канала)

 
Посетитель
small user social cms
Сообщений: 25
По просьбам выкладываю свой опыт изменения шаблона движка полуколхозным методом. :)
------------------------
При просмотре канала
/channels/имя_канала
показываются все ролики этого канала
сверху есть встроенная штатная менюшка:
плейлисты в компоненте iVideo2
в которой можно выбрать просмотр списка плейлистов этого канала.
Плейлисты можно только отсортировать. Если плейлистов немного - то этого, в целом, хватает.
А вот если плейлистов несколько сотен, и они будут прибывать (как в моем случае), то необходим поиск хотя бы по названию плейлиста.

Встроенный поиск в движке iCMS не ищет в названиях плейлистов. Да, и, в случае глобального поиска могут вылезти тысячи роликов - пойди, сыщи между ними плейлист.

Итак, шаблон, ответственный за вывод именно списка плейлистов находится здесь:
templates/default/controllers/channels/playlists.tpl.php
для начала придется добавить элементы интерфейса - поле ввода и кнопочку:
ищем (примерно 31 строка) код вида:
Код PHP:
  1.  
  2. <div class="filter-panel gui-panel channel_sorting_panel">
  3. <div class="field">
  4. <div class="title"><?php echo LANG_SORTING; ?></div>
  5. <div class="control sort">
  6. <?php echo html_select('sort', $sortings, $sort); ?>
  7. </div>
  8. </div>
  9. </div>
  10.  
добавляем к нему свою часть, получается в итоге вот это:
Код PHP:
  1.  
  2. <div class="filter-panel gui-panel channel_sorting_panel">
  3. <div class="field">
  4. <div class="title"><?php echo LANG_SORTING; ?></div>
  5. <div class="control sort">
  6. <?php echo html_select('sort', $sortings, $sort); ?>
  7. </div>
  8. </div>
  9. <?php if($user->is_admin){?>
  10. <div class="field" style="margin-left:10px">
  11. <div class="title">поиск</div>
  12. <div class="control search">
  13. <input type="text" value=""><button class="search">поиск</button>
  14. </div>
  15. </div>
  16. <?php } ?>
  17. </div>
  18.  
в данном случае, поле будет видно только администратору сайта:
Код PHP:
  1.  
  2. <?php if($user->is_admin){?>
  3.  
если есть необходимость можно заменить на:
Код PHP:
  1.  
  2. <?php if($user->is_logged){?>
  3.  
т.е. для всех залогиненных пользователей, или заменить на true для вообще всех.
С простейшим интерфейсом закончили, должна появиться вот такая формочка при просмотре страницы:
плейлисты в компоненте iVideo2
далее, сразу после этого кода вставляем этот кусок:
Код PHP:
  1.  
  2. <?php
  3. $search_string = '';
  4. !empty($_GET['search']) && $user->is_logged && ($search_string=$_GET['search']);
  5. ?>
я решил не заморачиваться и поиск сделал через параметр GET['search'] (можно сделать через POST, чтобы не портить сортировку, например).
далее, вставляем JS для отработки интерфейса (также, сразу после кода выше):
Код PHP:
  1. <script type="text/javascript">
  2. $(function(){
  3. $('div.control.search input[type=text]').val(<?php var_export($search_string);?>);
  4. $('div.control.search input[type=text]').keypress(function(e) {
  5. if(e.which == 13) {
  6. $(this).blur();
  7. $('div.control.search button.search').focus().click();
  8. }
  9. });
  10. $('div.control.search button.search').on('click', function(){
  11. window.location.href = '?search=' + $('div.control.search input[type=text]').val();
  12. });
  13. });
  14. </script>
  15.  
ловим Enter на поле ввода (пустое тоже надо - когда хочется "посмотреть всех"), кнопочка для дублирования - вдруг кому-то мышкой нажать захочется.
По клику перезагружает всю страницу с параметром search=чего_ищем.

С обработкой интерфейса закончили, теперь перейдем к фильтрации плейлистов.
Чуть ниже по оригинальному коду идет строка:
Код PHP:
  1.  
  2. <div class="playlists_list">
  3. <?php if($playlists) { ?>
  4.  
$playlists - в нем уже есть массив плейлистов этого выбранного канала.
Но этот плейлист содержит только часть от всех (вывод постраничный). А значит, придется все плейлисты (этого канала, или вообще все, как в моем случае) выдергивать заново.
( движок ранее плейлисты записал в переменную $playlists (она глобальная) в одном из классов, там же отсортировал и обрезал "пагинатором" по переменным $page, $perpage и $total )
Формируем свой $playlists
Для этого сразу после вышуеказанного оригинального кода вставляем свой:
Код PHP:
  1. <?php.
  2. if ( trim($search_string) ) {
  3. $playlists = cmsCore::getModel('video')->getPlaylists();
  4. $playlists = array_filter( $playlists, function($a) use ($search_string) {
  5. return strpos( mb_strtolower($a['title']), mb_strtolower($search_string) )===false ? false:true;
  6. });
  7. $total = count($playlists);
  8. $perpage = $total;
  9. $page = 1;
  10. }
  11. ?>
  12.  
( насколько я помню, "use" уже с PHP 5.3). И mb_ модуль конечно, должен быть включен в PHP (ну это понятно, что у вас UTF-8).
В данном случае, я беру вообще все плейлисты
Код PHP:
  1. cmsCore::getModel('video')->getPlaylists()
У меня всего один канал, а вот для плейлистов именно выбранного канала придется вызывать filter по номеру канала $channel_id .
Далее, по коду: оставляем в массиве только те элементы, которые содержат в ['title'] необходимое слово (в $search_string).
для пагинатора меняем $total,$ perpage и $page - пусть все найденные выводятся валом в одну страницу - их в общем случае не будет много. Короче, пагинатор таким образом выключаем :)

Если $search_string пустой, то $playlists остается оригинальным (каким его построил движок), и все будет как обычно.
Это все.

В данном примере я не рассматривал фильтрацию по номеру канала, не рассматривал проблему исключения остальных параметров GET при поиске, не рассматривал CSS стили для интерфейса кнопок и поля.

Самого движка я не знаю, лишь примерно представляю как он работает. Доку еще толком не читал, занимаюсь iCMS совсем недавно.

P.S. перед изменением шаблона, скопируйте его оригинал.
Посетитель
small user social cms
МедальПочетный донор проектаАвторитет форума
Сообщений: 2223
Спасибо!
А можно готовый файлик, чтоб не напортачить случайно "шаловливыми ручками"? smile
Лучшее место для вашего сайта!
Реклама
cms
Посетитель
small user social cms
Сообщений: 25
тут файл прикрепить нельзя, поэтому - на yandex.disk:
yadi.sk/d/8SsakJFE3W5GD6

там архив,
в файле настроено так, что поиском могут воспользоваться только залогиненные пользователи
Редактировалось: 1 раз (Последний: 17 мая 2018 в 16:31)
Посетитель
small user social cms
МедальПочетный донор проектаАвторитет форума
Сообщений: 2223
@AVC:
тут файл прикрепить нельзя, поэтому - на yandex.disk:
Можно загрузить файл к себе в профиль и оттуда выложить ссылку.
Спасибо уже скачал.
Лучшее место для вашего сайта!
В начало страницы
Предыдущая темаСледующая тема Перейти на форум:
Быстрый ответ
Чтобы писать на форуме, зарегистрируйтесь или авторизуйтесь.