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

InstantCMS 2.X

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

#1 17 мая 2018 в 13:31
По просьбам выкладываю свой опыт изменения шаблона движка полуколхозным методом. :)
------------------------
При просмотре канала
/channels/имя_канала
показываются все ролики этого канала
сверху есть встроенная штатная менюшка:

в которой можно выбрать просмотр списка плейлистов этого канала.
Плейлисты можно только отсортировать. Если плейлистов немного — то этого, в целом, хватает.
А вот если плейлистов несколько сотен, и они будут прибывать (как в моем случае), то необходим поиск хотя бы по названию плейлиста.

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

Итак, шаблон, ответственный за вывод именно списка плейлистов находится здесь:
templates/default/controllers/channels/playlists.tpl.php
для начала придется добавить элементы интерфейса — поле ввода и кнопочку:
ищем (примерно 31 строка) код вида:
  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.  
добавляем к нему свою часть, получается в итоге вот это:
  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.  
в данном случае, поле будет видно только администратору сайта:
  1.  
  2. <?php if($user->is_admin){?>
  3.  
если есть необходимость можно заменить на:
  1.  
  2. <?php if($user->is_logged){?>
  3.  
т.е. для всех залогиненных пользователей, или заменить на true для вообще всех.
С простейшим интерфейсом закончили, должна появиться вот такая формочка при просмотре страницы:

далее, сразу после этого кода вставляем этот кусок:
  1.  
  2. <?php
  3. $search_string = '';
  4. !empty($_GET['search']) && $user->is_logged && ($search_string=$_GET['search']);
  5. ?>
я решил не заморачиваться и поиск сделал через параметр GET['search'] (можно сделать через POST, чтобы не портить сортировку, например).
далее, вставляем JS для отработки интерфейса (также, сразу после кода выше):
  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=чего_ищем.

С обработкой интерфейса закончили, теперь перейдем к фильтрации плейлистов.
Чуть ниже по оригинальному коду идет строка:
  1.  
  2. <div class="playlists_list">
  3. <?php if($playlists) { ?>
  4.  
$playlists — в нем уже есть массив плейлистов этого выбранного канала.
Но этот плейлист содержит только часть от всех (вывод постраничный). А значит, придется все плейлисты (этого канала, или вообще все, как в моем случае) выдергивать заново.
( движок ранее плейлисты записал в переменную $playlists (она глобальная) в одном из классов, там же отсортировал и обрезал "пагинатором" по переменным $page, $perpage и $total )
Формируем свой $playlists
Для этого сразу после вышуеказанного оригинального кода вставляем свой:
  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).
В данном случае, я беру вообще все плейлисты
  1. cmsCore::getModel('video')->getPlaylists()
У меня всего один канал, а вот для плейлистов именно выбранного канала придется вызывать filter по номеру канала $channel_id .
Далее, по коду: оставляем в массиве только те элементы, которые содержат в ['title'] необходимое слово (в $search_string).
для пагинатора меняем $total,$ perpage и $page — пусть все найденные выводятся валом в одну страницу — их в общем случае не будет много. Короче, пагинатор таким образом выключаем :)

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

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

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

P.S. перед изменением шаблона, скопируйте его оригинал.
#2 17 мая 2018 в 14:36
Спасибо!
А можно готовый файлик, чтоб не напортачить случайно "шаловливыми ручками"? smile
#3 17 мая 2018 в 16:31
тут файл прикрепить нельзя, поэтому — на yandex.disk:
yadi.sk/d/8SsakJFE3W5GD6

там архив,
в файле настроено так, что поиском могут воспользоваться только залогиненные пользователи
#4 17 мая 2018 в 16:47

тут файл прикрепить нельзя, поэтому — на yandex.disk:

@AVC
Можно загрузить файл к себе в профиль и оттуда выложить ссылку.
Спасибо уже скачал.
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.