Документация KVS

Ответы на частые вопросы

Содержание

1. Проблемы
1.1. Я добавил видео, а оно не появляется на сайте.
1.2. Я перевел видео в неактивный статус, но по ссылке оно все равно открывается.
1.3. Я добавил несколько видео в категорию X, но список категорий на сайте мне показывает, что у данной категории 0 видео, либо меньше, чем я ожидаю.
1.4. Я создал формат таймлайновых скриншотов, выбрал его в настройках плеера - но на сайте таймлайновые скриншоты не отображаются.
1.5. У меня зависла обработка фоновых задач.
1.6. Мне не нравится качество скриншотов. Где можно его изменить?
1.7. В последнее время стала часто срабатывать защита от перегрузки, админы смотрели и ничего не заметили.
1.8. После сохранения данных в админке перед всеми кавычками появляются слэши.
1.9. Я настроил, чтобы комментарии не требовали проверки, но они все равно появляются в списке на проверку.
1.10. Я забыл свой пароль от админки, как его сбросить?
1.11. Не работает проигрывание некоторых MP4 файлов. Также нет возможности скачать их для проверки.
1.12. На списке видео в ссылках появились параметры ?pqr=строка. Откуда они взялись и можно ли от них избавиться?
1.13. Я загружаю видео и не хочу, чтобы оно переконверчивалось, но оно все равно переконверчивается.
1.14. Не загружаются файлы больших размеров.
2. Работа с контентом, видео, фотоальбомы
2.1. Установка длительности видео по трейлеру.
2.2. Я хочу сделать FHG, чтобы по каждому видео создавалось 4 файла-фрагмента с длительностью в 1 минуту. Возможно ли такое?
2.3. Мне нужно внести изменения в настройки форматов, но KVS не позволяет этого сделать из-за того, что у меня есть фоновые задачи.
2.4. Как правильно перенести видео на другой сервер?
2.5. Как подключить второй винчестер для хранения видео?
2.6. Можно ли организовать загрузку контента сторонними вебмастерами, чтобы они могли задавать свою рекламу для страницы видео?
2.7. Как правильно добавить еще один формат для видео?
3. Плеер и вопросы связанные с ним
3.1. Как подставить свой embed код в плеер на сайте? Я хочу выдавать пользователям нестандартный код.
3.2. Я не хочу, чтобы пользователи имели возможность скопировать embed код на мои видео из плеера.
3.3. Как вывести embed код в RSS?
3.4. Как перейти на новый формат iframe embed кодов после обновления до 3.5.0?
3.5. Как перейти на новый формат похожих видео в плеере после обновления до 3.9.0?
4. Работа с сайтом, шаблоны, вывод данных
4.1. Как изменить вид ссылок на страницы просмотра видео (фотоальбомов), которые выводятся на списках?
4.2. Я хочу кастомизировать значения, которые выводятся в шапку сайта в качестве названия, описания и ключевых слов страницы.
4.3. Как вывести рекламу из доп. полей контент провайдеров на странице просмотра видео?
4.4. Как сделать так, чтобы на списке видео после 12 и после 24 тумб выводилась реклама?
4.5. Я хочу сделать древовидную категоризацию. Как сделать, чтобы в разных группах категорий были категории с одинаковыми названиями?
4.6. Я хочу вывести в шаблоне HTML код из доп. поля категории, чтобы он стал частью страницы.
4.7. Как изменить количество тумб в ряд на списке видео?
4.8. Как изменить размеры тумб, которые используются на списках видео?
4.9. Как настроить, чтобы по видео / альбомам вместо рейтинга показывался % кому понравилось?
4.10. Как на списке видео вывести ссылки для скачивания видео?
4.11. Как заставить даты на сайте форматироваться на русском языке?
4.12. Каким образом в название страницы видео можно вывести его категорию?
4.13. Я хочу на индексе сайта выводить скриншоты другого размера, чем на других страницах. Можно ли такое сделать?
4.14. Как можно сделать стрелки вперед / назад для похожих видео, чтобы они прокручивались без перезагрузки страницы?
4.15. Как показать % голосов за флаг "I like it" на странице просмотра видео / альбома без использования рейтинга?
4.16. Какие варианты возможны для организации пагинации на сайте?
4.17. Как вывести скриншоты видео на странице просмотра и на списке видео?
4.18. Как на списках видео по категории выводить рекламу, специфичную для категории?
4.19. Как в шапке сайта включить разные фрагменты кода для разных страниц?
4.20. Как сделать, чтобы список видео по тэгу отличался от остальных списков видео на сайте?
4.21. Можно ли сделать так, чтобы пользователи сами указывали моделей для контента?
4.22. Как сделать добавление контента в плэйлисты и расширить системные закладки?
4.23. Как на странице просмотра видео (альбома) включить возможность покупки доступа за токены?
4.24. Как можно организовать голосование за комментарии пользователей?
4.26. Как можно использовать bb-коды и смайлики в комментариях?
4.27. Как перенести дизайн сайта с одного проекта на другой?
5. Кастомизация
5.1. Как подключить скрипт подсчета входов для трейда?
5.2. Как сделать красивые ссылки на трейд?
5.3. Как подключить выполнение своего PHP кода в шаблоне?
6. Инфраструктурные вопросы
6.1. Как перенести проект на другой сервер?
6.2. Как перенести проект из директории в корень домена?
6.3. Как построить мобильную версию сайта?
6.4. Как восстановить сайт из резервной копии, сделанной плагином KVS?
6.5. Как настроить загрузку файлов через сабдомен для корректной работы проекта под CloudFlare?

1. Проблемы

1.1. Я добавил видео, а оно не появляется на сайте.

Видео и фотоальбомы появляются на сайте при одновременном совпадении 2 условий:

  • Объект находится в активном статусе.
  • Дата и время постинга видео или фотоальбома (поле post date) меньше текущего серверного времени, т.е. уже наступило.

Скорее всего, в вашем случае время появления видео еще не наступило и оно появится позднее. Либо видео неактивно исходя из его настроенного статуса. Также проблема может быть в том, что вы видите закэшированную версию страниц сайта, если вы заходите на сайт не в том браузере, в котором вы залогинены в панели администрирования.

1.2. Я перевел видео в неактивный статус, но по ссылке оно все равно открывается. Мне нужно, чтобы это видео было недоступно по ссылке.

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

  • Удалить видео или фотоальбом.
  • Поставить его дату постинга в далекое будущее (например, через 10 лет).
  • В разделе Настройки -> Настройки сайта установить выдачу 404 ошибки в опции Доступ к неактивному контенту.

Необходимо учитывать, что при выборе способа (2) или (3) такие видео или фотоальбомы по ссылке все равно будут доступны вам в том браузере, где вы залогинены в панели администрирования. Чтобы убедиться в недоступности страницы, вам необходимо проверять в другом браузере.

Не стоит также забывать и про кэширование всех страниц и блоков движком сайта. По умолчанию кэш страницы видео имеет время жизни 24 часа. Если вы деактивировали видео, страница с видео может быть доступна еще некоторое время, пока не произойдет устаревание кэша этой страницы.

1.3. Я добавил несколько видео в категорию X, но список категорий на сайте мне показывает, что у данной категории 0 видео, либо меньше, чем я ожидаю.

Такое поведение справедливо для всех объектов категоризации: категорий, тэгов, моделей и контент провайдеров. На любом списке данных объектов на сайте есть возможность показать кол-во связанных видео (фотоальбомов) всего и кол-во связанных видео (фотоальбомов), добавленных за сегодня. Данные цифры обновляются с задержкой в 8 часов, независимо от установленного времени кэширования этих страниц сайта. Это сделано с целью оптимизации нагрузки. Таким образом, максимум через 8 часов данные цифры пересчитаются.

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

1.4. Я создал формат таймлайновых скриншотов, выбрал его в настройках плеера - но на сайте таймлайновые скриншоты не отображаются.

Для того, чтобы таймлайновые скриншоты появились на сайте, необходимо в первую очередь включить их создание в настройках того формата видео, для которого вы хотите создавать таймлайновые скриншоты (Настройки -> Форматы Видео -> Редактирование Формата):

Таймлайновые скриншоты в настройках формата видео
Таймлайновые скриншоты в настройках формата видео.

При включении таймлайновых скриншотов в настройках формата видео их создание может занять длительное время, если у вас уже есть видео с таким форматом. Для каждого видео будет создана фоновая задача создания таймлайновых скриншотов, полный список которых вы можете увидеть в разделе Администрирование -> Фоновые Задачи. Проверить для каждого видео наличие или отсутствие таймлайновых скриншотов вы можете в панели администрирования, если зайдете на страницу редактирования видео (Видео -> Редактирование Видео). На этой странице вы увидите список всех форматов данного видео, и для любого формата, у которого имеются в наличии таймлайновые скриншоты, должно быть выведено их количество. Если вы не видите этой цифры - значит у данного видео еще нет таймлайновых скриншотов:

Кол-во таймлайновых скриншотов у файлов видео
Кол-во таймлайновых скриншотов у файлов видео.

Если по каким-то причинам вы удалили фоновые задачи создания таймлайновых скриншотов до их завершения, то может возникнуть такая ситуация, что в формате видео таймлайновые скриншоты включены, но при этом они не создались для всех видео. Это поправимо. Вам необходимо зайти в настройки формата видео, выключить галочку таймлайновых скриншотов для него и сохранить. После этого включите галочку снова и сохраните формат - при включении галочки KVS создаст новые фоновые задачи для создания таймлайновых скриншотов для тех видео, у которых их нет.

1.5. У меня зависла обработка фоновых задач.

Скорее всего, действительно у вас произошло зависание движка конвертации. Это может произойти по разным причинам, в основном связанным с операциями скачивания или загрузки видеофайлов со сторонних ресурсов. Чтобы это проверить, вам необходимо посмотреть лог движка конвертации. Его можно найти в панели администрирования в разделе Администрирование / Информация установки: внизу страницы находится список всех логов и вам нужен файл, который называется cron_conversion.txt:

Список системных логов
Список системных логов.

Если в логе последнее событие произошло много часов назад, то это значит, что движок конвертации завис. Исправить эту ситуацию можно только имея доступ к shell: необходимо удалить (командой kill) процесс PHP, который обрабатывает скрипт cron_conversion.php.

Другие причины, по которым может произойти зависание обработки фоновых задач:

  • Не работает главный крон. В этом случае на странице старта должна быть ошибка, сигнализирующая об этом. В этом случае необходимо убедиться, что в серверных настройках крона установлена корректная команда на выполнение раз в минуту. Формат команды вы можете посмотреть в разделе Администрирование -> Информация Установки.
  • Возникли проблемы с подключением к серверу конвертации или хранения. В этом случае также на странице старта будут выведены ошибки серверов хранения или конвертации. Детали ошибок можно посмотреть на списке серверов хранения или конвертации в разделе Настройки.

1.6. Мне не нравится качество скриншотов. Где можно его изменить?

Управление качеством скриншотов происходит из 2 мест:

  • В форматах скриншотов задается строка опций ImageMagick, она содержит параметр качества: -quality 92
  • В файле /admin/include/setup.php задается глобальная настройка качества, которая используется для промежуточных операций: $config['imagemagick_default_jpeg_quality']="85";

1.7. В последнее время стала часто срабатывать защита от перегрузки, админы смотрели и ничего не заметили.

Обычно защита срабатывает из-за того, что на сервере поднимается LA. Вы можете поднять пороговые значения на свое усмотрение, чтобы защита не срабатывала (вам нужно проконсультироваться с администраторами, какой LA нормальный для работы сервера, обычно у всех по-разному). По умолчанию KVS считает, что при нормальной работе LA должен находиться в границах до 10.

Чтобы поменять пороговые значения, нужно отредактировать файл /admin/include/setup.php. Там есть 3 таких настройки:

// При каком LA перестает происходить генерация блоков сайта.
$config['overload_max_la_blocks']=30;

// При каком LA перестает происходить генерация страниц сайта, всем пользователям отдается ошибка, что сайт перегружен.
$config['overload_max_la_pages']=50;

// При каком LA перестает срабатывать крон.
$config['overload_max_la_cron']=10;

1.8. После сохранения данных в админке перед всеми кавычками появляются слэши.

Это происходит из-за того, что в вашей конфигурации PHP включена директива magic_quotes_gpc. Нужно попросить администраторов выключить ее.

1.9. Я настроил, чтобы комментарии не требовали проверки, но они все равно появляются в списке на проверку.

Такое поведение корректно. При выключении необходимости проверки комментариев (параметр need_approve блока комментариев) комментарии будут появляться на сайте без проверки администратором. В то же время, они будут появляться и в списке администратора на проверку, просто для того, чтобы администратор мог в любой момент проверить новые комментарии и при необходимости удалить. Но в любом случае при выключенном параметре need_approve комментарии уже видны на сайте.

Такая же концепция характерна и для другого контента, который может добавляться пользователями.

1.10. Я забыл свой пароль от админки, как его сбросить?

Для сброса логина и пароля суперадминистратора вы можете воспользоваться скриптом сброса пароля, который находится по адресу:

http://kernel-scripts.com/files/reset_admin_password.zip

Вам необходимо скопировать PHP файл из архива в корень проекта и запустить через веб. После этого логин будет изменен на admin, а пароль будет изменен на 123. Не забудьте удалить скрипт.

1.11. Не работает проигрывание некоторых MP4 файлов. Также нет возможности скачать их для проверки.

Если это происходит только для некоторых файлов, то проблема заключается в самих файлах. Наиболее вероятная причина проблемы - вы загружали видеофайл напрямую в качестве MP4 формата (а не исходника), при этом, несмотря на то, что файл имел расширение mp4 и мог проигрываться в видео плеере, он не являлся корректным MP4 контейнером. При конвертации эта проблема не всплыла, потому что KVS не делает проверку соответствия контейнеров загружаемых файлов форматам видео.

В итоге конвертация прошла успешно, скриншоты создались - а видеофайл не проигрывается. Для решения проблемы вам нужно создать это видео заново, но видеофайл загрузить в качестве исходника, а не MP4 формата. Тогда видеофайл будет обработан движком, который создаст корректный MP4 файл для проигрывания.

1.12. На списке видео в ссылках появились параметры ?pqr=строка. Откуда они взялись и можно ли от них избавиться?

Эти параметры добавляются ротатором, чтобы определять место и скриншот, по которому был сделан клик. Эти параметры появляются автоматически при включении ротатора. В коде шаблона блока list_videos они выводятся вместе со ссылкой на страницу видео при использовании переменной {{$item.view_page_url}}. Для того чтобы избавиться от них, можно воспользоваться встроенной (v3.0+) JavaScript функцией, которая передает информацию о кликах асинхронно. Однако для этого необходимо внести некоторые изменения в шаблоны сайта и конфигурацию KVS. Компоненты страниц, о редактировании которых пойдет речь, находятся в панели администрирования в разделе UI Сайта -> Компоненты Страниц.

Для начала необходимо отредактировать компонент страницы list_videos_block_common.tpl (таким образом, поправка повлияет только на те блоки list_videos, которые используют этот компонент). Если у вас используются другие шаблоны, которые выводят HTML код списка видео - их нужно также учесть. Во всех ссылках, где в качестве URL-а используется переменная {{$item.view_page_url}}, необходимо добавить атрибут data-rt, чтобы общий вид ссылок на страницу видео был такой:

<a href="{{$item.view_page_url}}" data-rt="{{$item.rotator_params}}" ...

Важно! В компоненте list_videos_block_common.tpl содержится несколько ссылок на страницу просмотра видео ({{$item.view_page_url}}); во всех них нужно добавить атрибут data-rt. Клики будут учитываться только в тех ссылках, в которых добавлен этот атрибут.

Затем в футере сайта (по умолчанию это компонент страницы footer_general.tpl) необходимо добавить такой фрагмент JavaScript кода:

<script type="text/javascript">
    rotatorEnableLinks(true, 'videos');
</script>

Вызов этой функции добавит обработчик события для каждой ссылки с непустым атрибутом data-rt, чтобы при клике на ссылку отправлялись данные на сервер. Последним штрихом необходимо указать ротатору, что больше не требуется добавлять параметр ?pqr ко всем ссылкам на видео. Делается это путем настройки в скрипте /admin/include/setup.php (если у вас такого свойства нет, просто добавьте эту строчку где-нибудь в конце файла, иначе замените значение с false -> true):

$config['rotator_no_params']="true";

1.13. Я загружаю видео и не хочу, чтобы оно переконверчивалось, но оно все равно переконверчивается.

KVS позволяет загружать видеофайлы для хранения "как есть", без обработки. Однако для этого они должны быть загружены не в поле исходного файла, а в поле конкретного формата видео, под которым должны сохраниться загруженные файлы. Возможность загружать видеофайлы под конкретными форматами есть как при ручном добавлении, так и при массовом импорте.

В вашем случае проблема, скорее всего, в том, что вы загружаете файлы как исходные файлы, а в этом случае движок переконверчивает их в файлы форматов, которые отображаются на сайте.

1.14. Не загружаются файлы больших размеров.

Если ваш проект работает через CloudFlare, то смотрите вопрос 6.5.

Существует несколько конфигураций, где могут стоять лимиты на размеры загружаемых файлов:

  • Корневой .htaccess файл - по умолчанию стоят лимиты 2000mb: php_value upload_max_filesize 2000M
    php_value post_max_size 2000M
  • Если в .htaccess файлах на вашем сервере стоит запрет на перекрытие опций PHP, то данные строки будут отсутствовать либо выключены. Если так, то изменить лимиты можно только в главном файле конфигурации PHP (php.ini).
  • Если ваш сервер работает под Nginx (в большинстве случаев это так), то на уровне Nginx есть свои ограничения. В конфиге Nginx для этого может использоваться директива client_max_body_size.

2. Работа с контентом, видео, фотоальбомы

2.1. Я загружаю видеофайлы большой длительности в качестве исходников, но из них создаются небольшие трейлеры (3 минуты). При этом длительность видео устанавливается не в 3 минуты, а в длительность исходного файла, что является некорректным для моего сайта.

По умолчанию длительность всегда определяется исходным файлом. Если вам нужно, чтобы длительность устанавливалась на основе файла какого-либо формата - вам необходимо выбрать соответствующий формат в опции Определять длительность видео по, которая находится в разделе Настройки -> Настройки Контента:

Настройка длительности видео
Настройка длительности видео.

2.2. Я хочу сделать FHG, чтобы по каждому видео создавалось 4 файла-фрагмента с длительностью в 1 минуту. Возможно ли такое?

Такое сделать возможно. Для этого вам нужно создать 4 разных формата видео (с похожими постфиксами, например free1.mp4, free2.mp4, free3.mp4 и free4.mp4). Для каждого формата в настройках ограничений вам необходимо задать 1 минуту ограничение длительности, а также указать смещения в процентах, разные значения в зависимости от формата:

  • Формат 1: смещение с начала - 0%, смещение с конца - 75%.
  • Формат 2: смещение с начала - 25%, смещение с конца - 50%.
  • Формат 3: смещение с начала - 50%, смещение с конца - 25%.
  • Формат 4: смещение с начала - 75%, смещение с конца - 0%.
Пример настройки ограничений длительности для формата 2
Пример настройки ограничений длительности для формата 2.

Таким образом, у вас получится 4 файла с минутной длительностью, каждый файл будет снят на определенном этапе исходного видео. При необходимости получения 2, 3 или 5 файлов - идея такая же, меняются только цифры процентов.

2.3. Мне нужно внести изменения в настройки форматов, но KVS не позволяет этого сделать из-за того, что у меня есть фоновые задачи. Можно ли обойти это ограничение?

Для этого существует понятие режима паузы. В разделе Настройки -> Настройки Контента вам необходимо включить режим паузы и дождаться, пока все уже запущенные задачи завершатся. После этого вверху панели администрирования, где отображается кол-во задач, появится информация о том, что движок конвертации переведен в режим паузы. После этого вы сможете внести необходимые изменения в настройки форматов и выключить режим паузы.

Включение режима паузы
Включение режима паузы.
Режим паузы включен
Режим паузы включен.

2.4. Как правильно перенести видео на другой сервер?

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

Видео хранится на сервере A в директории /path/to/contents/videos. Путь к этой директории задается в настройках сервера хранения в панели администрирования KVS, либо в настройках FTP сервера, если у вас используется удаленный сервер хранения (Настройки -> Сервера Хранения -> Редактирование Сервера А):

Путь к директории хранения для локального сервера хранения
Путь к директории хранения для локального сервера хранения.

Вам нужно на сервер B скопировать все, что находится в этой директории сервера A (а там будет структура директорий и файлов). Скопировать можно в любую директорию (не обязательно в /path/to/contents/videos). На скопированные файлы и директории нужно поставить того владельца, через которого будет происходить соединение с сервером B, чтобы в последствии у этого владельца было достаточно прав удалять файлы и директории, а также создавать новые.

Затем после копирования файлов нужно добавить сервер B в панели администрирования KVS в ту же серверную группу, что и сервер A. При добавлении вы должны указать путь к той директории, в которую вы предварительно скопировали файлы (либо FTP подключение к этой директории). После добавлении нового сервера в группу происходит проверка отдачи случайных файлов, поэтому если вы скопировали не в то место, либо указали не те данные - будет ошибка, говорящая о том, что проверка отдачи нашла ошибки.

После добавления сервера B он появится в выключенном состоянии и отдача контента с него происходить не будет. Перед его включением вам необходимо убедиться, что отдача контента с него работает корректно. Для этого воспользуйтесь опцией Проверить отдачу контента в контекстном меню этого сервера хранения на списке серверов. При включении сервера В вы можете временно поставить сервер A в выключенное состояние, чтобы проверить работу проекта с одним сервером В. Включить / выключить отдачу контента с сервера хранения можно в настройках группы серверов:

Выключение отдачи видео с сервера A и включение сервера В
Выключение отдачи видео с сервера A и включение сервера В.

Также желательно запустить полную проверку контента в плагине аудита - она проверит наличие каждого файла. После того, как через некоторое время вы убедитесь, что со всем порядок - сервер A можно удалить из KVS.

Важно! Если вы оставите старый сервер хранения в неактивном состоянии, то контент будет продолжать копироваться на него, даже несмотря на то, что отдача с этого сервера происходить не будет. Если хранение файлов на старом сервере вам больше не нужно, вы должны удалить этот сервер из KVS, а затем и вручную удалить все файлы из его директории, поскольку KVS не удаляет файлы автоматически.

2.5. Как подключить второй винчестер для хранения видео?

Основное отличие подключения сервера хранения, который находится на втором винчестере этого же сервера - это тот факт, что второй винчестер будет иметь особый серверный путь в обход всех путей отдачи видео (например, /hdd2). Чтобы решить эту проблему, необходимо создать симлинк на основном винчестере, который ведет на второй винчестер, например:

/usr/username/domains/mydomain.com/www/contents/videos2 -> /hdd2

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

2.6. Можно ли организовать загрузку контента сторонними вебмастерами, чтобы они могли задавать свою рекламу для страницы видео?

Для организации загрузки контента сторонними вебмастерами можно использовать следующий подход.

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

Реклама на странице видео (и внутри плеера при необходимости) выводится с помощью контент провайдера видео (Категоризация -> Контент Провайдеры). Для этого можно использовать любые, в том числе и доп. поля, которые включаются в разделе Настройки -> Кастомизация. Для каждого вебмастера заранее создается нужный ему список контент провайдеров с его реф ссылками на рекламу. Все контент провайдеры одного вебмастера должны быть добавлены в одну и ту же группу контент провайдеров. Очевидно, что при необходимости использования одной и той же рекламы разными вебмастерами - эта реклама должна быть добавлена как несколько разных контент провайдеров, поскольку они должны быть разбиты на разные группы и реф ссылки у них будут разные.

Каждому пользователю-вебмастеру в настройках его профиля необходимо назначить группу контент провайдеров, которая была создана для него и содержит только контент провайдеры с настройками его рекламы: в таком случае при загрузке видео с сайта данный пользователь сможет выбирать из того множества контент провайдеров, которые входят в группу, назначенную для него. Пользователь также сможет выбирать и тех контент провайдеров, которые не отнесены ни к одной группе.

Настройка группы контент провайдеров для пользователя-вебмастера
Настройка группы контент провайдеров для пользователя-вебмастера.

Загрузка видео с сайта осуществляется посредством блока video_edit. Если вы хотите открыть возможность загрузки видео только для пользователей-вебмастеров, то вам в большинстве случаев достаточно спрятать ссылку на страницу загрузки для остальных пользователей сайта (не вебмастеров). Делается это простым условием в шаблоне, где выводится ссылка на страницу загрузки видео:

{{if $smarty.session.status_id==6}} {{* добавили это условие *}}
    {{* это вебмастер, показываем ссылку *}}
    <a href="...">Upload video</a>
{{/if}}

Если вы хотите оставить возможность загрузки видео для всех пользователей сайта, но дать возможность выбирать контент провайдера видео только вебмастерам, то вам нужно зайти на редактирование блока video_edit, который находится на странице UI Сайта -> Страницы -> [Memberzone] My Video Edit, и найти там блок кода, отвечающий за вывод списка контент провайдеров. Этот блок кода необходимо обставить таким же условием, как и в примере выше:

{{if $smarty.session.status_id==6}} {{* добавили это условие *}}
    {{* это вебмастер, показываем селектбокс с возможностью выбора одного из его контент провайдеров *}}
    {{if count($list_content_sources)>0}}
        ...
        Рекламодатель:
        ...
        <select name="content_source_id">
            <option value="0">Не использовать это поле</option>
            {{foreach item=item from=$list_content_sources}}
                <option value="{{$item.content_source_id}}" {{if $item.content_source_id==$smarty.post.content_source_id}}selected="selected"{{/if}}>{{$item.title}}</option>
            {{/foreach}}
        </select>
    {{/if}}
{{/if}}

2.7. Как правильно добавить еще один формат для видео?

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

Во-первых, вам необходимо выбрать постфикс для формата. Постфикс содержит расширение (например, .mp4) и иногда добавочные символы перед расширением, если у вас планируется несколько форматов с одинаковым расширением (например, _lq.mp4 и _hq.mp4).

Во-вторых, вы должны выбрать тип видео, к которым будет относиться данный формат: стандартные или премиум.

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

И в четвертых, вам необходимо выбрать статус формата - обязательный формат или необязательный. Файлы обязательного формата будет создаваться для всех видео (в том числе и существующих), необязательного - только если вы загрузите их вручную или запустите их создание через массовое редактирование. Если у вас уже есть видео в этой группе форматов (стандартные или премиум), то создание обязательного формата приведет к автоматической процедуре создания файлов этого формата для всех существующих видео. Если вы случайно указали некорректные опции в настройках формата, то это может привести к потере времени и необходимости переделывать файлы этого формата для всех видео. Поэтому в таких случаях мы рекомендуем всегда создавать формат как необязательный, после чего вручную запускать создание его файлов для нескольких тестовых видео через массовое редактирование. Проверить корректность созданных файлов для тестовых видео вы сможете на странице редактирования видео в панели администрирования: там отображаются все доступные файлы форматов с возможностью просмотра или скачивания. Если при создании файлов нового формата для тестовых видео ошибок не было, если размеры, длительность и качество файлов вас устраивают - вы можете менять статус формата с необязательного на обязательный. Это запустит создание файлов формата для всех остальных видео.

3. Плеер и вопросы связанные с ним

3.1. Как подставить свой embed код в плеер на сайте? Я хочу выдавать пользователям нестандартный код.

В шаблоне блока просмотра видео video_view, который находится на странице UI Сайта -> Страницы -> View Video есть такой кусочек JavaScript:

function getEmbed() {
    var embedCode = '<iframe width="{{$player_size_embed[0]}}" height="{{$player_size_embed[1]}}" ...>';
    embedCode += '</iframe>';
    return embedCode;
}

В нем вы можете сформировать нужный вам код.

3.2. Я не хочу, чтобы пользователи имели возможность скопировать embed код на мои видео из плеера.

Для этого существует опция в настройках плеера и настройках embed плеера, которая убирает возможность скопировать embed код:

Выключение возможности скопировать embed код на видео
Выключение возможности скопировать embed код на видео.

Опция в настройках плеера непосредственно влияет на возможность получить embed код в плеере у вас на сайте, опция в настройках embed плеера влияет на возможность получить embed код внутри ваших embed кодов на сторонних сайтах.

3.3. Как вывести embed код в RSS?

RSS список видео по умолчанию генерируется страницей сайта UI Сайта -> Страницы -> RSS Videos. Вам нужно отредактировать шаблон блока list_videos на этой странице и вставить в него вывод embed кода, например, так:

<content><![CDATA[
    <iframe width="600" height="400" src="{{$config.project_url}}/embed/{{$item.video_id}}" frameborder="0" allowfullscreen webkitallowfullscreen mozallowfullscreen oallowfullscreen msallowfullscreen></iframe>
]]></content>

В данном случае размеры каждого embed кода строго фиксированы (600x400) и не зависят от размеров исходного видео.

3.4. Как перейти на новый формат iframe embed кодов после обновления до 3.5.0?

Зайдите в раздел Настройки -> Настройки Embed Плеера и убедитесь, что поле Шаблон embed кода непустое. Проверьте, что новый embed код работает корректно по такой ссылке (в конце ссылки вам нужно подставить идентификатор любого активного видео):

http://domain.com/player/iframe_embed.php?video_id=12345

Если плеер отображается корректно, необходимо сделать, чтобы новый формат начал работать и по стандартным ссылкам. Для этого в корневом файле .htaccess в самом конце вам нужно заменить правило:

RewriteRule ^embed/(.+)$ /iframe_embed.php?video_id=$1 [L,QSA]

На такое:

RewriteRule ^embed/(.+)$ /player/iframe_embed.php?video_id=$1 [L,QSA]

Теперь на всех сайтах, которые используют ваши iframe embed коды они стали работать по новому формату. Проверьте, что все в порядке (в конце ссылки вам нужно подставить идентификатор любого активного видео):

http://domain.com/embed/12345

3.5. Как перейти на новый формат похожих видео в плеере после обновления до 3.9.0?

Скачайте архив по приведенной ссылке и скопируйте файлы из него поверх проекта:

http://kernel-scripts.com/files/related_videos.zip

В корневом файле .htaccess в раздел SYSTEM / DO NOT CHANGE вам нужно добавить такое правило:

RewriteRule ^related_videos_html/([0-9]+)/?$ /related_videos_html.php?video_id=$1 [L,QSA]

Рекомендуем также добавить исключение в файл robots.txt в корне проекта, чтобы избежать индексирования запросов на вывод похожих видео:

Disallow: /related_videos_html/*

В CSS стили сайта добавьте такие стили:

/* related videos in player */
.player-related-videos {
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
padding: 5px 10px 30px 10px;
background: #000000;
overflow: hidden;
}
.player-related-videos .player-related-videos-container {
position: relative;
width: 100%;
height: 100%;
overflow: hidden;
text-align: center;
}
.player-related-videos .player-related-videos-item {
position: relative;
display: inline-block;
vertical-align: middle;
margin-top: 5px;
}
.player-related-videos .player-related-videos-item .title {
display: none;
position: absolute;
left: 0;
top: 0;
right: 0;
height: 52px;
overflow: hidden;
text-align: left;
padding: 5px;
color: #ffffff;
background: -moz-linear-gradient(top, rgba(12, 12, 12, 0.8) 0px, transparent 50px);
background: -webkit-gradient(linear, left top, left bottom, color-stop(0px, rgba(12, 12, 12, 0.8)), color-stop(50px, transparent));
background: -webkit-linear-gradient(top, rgba(12, 12, 12, 0.8) 0px, transparent 50px);
background: -o-linear-gradient(top, rgba(12, 12, 12, 0.8) 0px, transparent 50px);
background: -ms-linear-gradient(top, rgba(12, 12, 12, 0.8) 0px, transparent 50px);
background: linear-gradient(to bottom, rgba(12, 12, 12, 0.8) 0px, transparent 50px);
}
.player-related-videos .player-related-videos-item .duration {
display: none;
position: absolute;
bottom: 5px;
right: 5px;
color: #ffffff;
background: rgba(12, 12, 12, 0.8);
padding: 2px 5px;
}
.player-related-videos .player-related-videos-item:hover .title,
.player-related-videos .player-related-videos-item:hover .duration {
display: block;
}

Важно! По умолчанию похожие видео будут использовать формат скриншотов 180x135. Если у вас нет такого формата, то вам необходимо изменить шаблон блока UI сайта -> Страницы -> [System] Player Related Videos -> Player Related Videos. В настройках этого блока вы также сможете изменить режим подбора похожих видео в параметре mode_related.

4. Работа с сайтом, шаблоны, вывод данных

4.1. Как изменить вид ссылок на страницы просмотра видео (фотоальбомов), которые выводятся на списках?

Для настройки паттернов ссылок на страницы просмотра видео и фотоальбомов существуют опции в разделе Настройки -> Настройки Сайта:

Настройка паттернов для ссылок на страницы видео и альбомов
Настройка паттернов для ссылок на страницы видео и альбомов.

При изменении этих паттернов вы должны также изменить правила для этих страниц в корневом .htaccess файле проекта, чтобы страницы не потеряли работоспособность:

# для видео
RewriteRule ^videos/([0-9]+)/([^/]+)/([0-9]+)/$ /view_video.php?id=$1&dir=$2&from=$3 [L,QSA]
RewriteRule ^videos/([0-9]+)/([^/]+)/$ /view_video.php?id=$1&dir=$2 [L,QSA]

# для альбомов
RewriteRule ^albums/([0-9]+)/([^/]+)/([0-9]+)/$ /view_album.php?id=$1&dir=$2&from=$3 [L,QSA]
RewriteRule ^albums/([0-9]+)/([^/]+)/$ /view_album.php?id=$1&dir=$2 [L,QSA]
RewriteRule ^albums/([0-9]+)/([^/]+)/image([0-9]+)/([0-9]+)/$ /view_album.php?id=$1&dir=$2&image_id=$3&from=$4 [L,QSA]
RewriteRule ^albums/([0-9]+)/([^/]+)/image([0-9]+)/$ /view_album.php?id=$1&dir=$2&image_id=$3 [L,QSA]

4.2. Я хочу кастомизировать значения, которые выводятся в шапку сайта в качестве названия, описания и ключевых слов страницы.

Компонент страницы, который отображает шапку сайта (UI Сайта -> Компоненты страниц -> header_general.tpl), поддерживает несколько переменных для реализации этой задачи:

  • page_title
  • page_description
  • page_keywords

Обычно значения этих переменных устанавливаются перед включением шапки в шаблон страницы, например:

{{assign var=page_title value="Demo Tube Website"}}
{{assign var=page_description value="..."}}
{{assign var=page_keywords value="..."}}
{{include file="header_general.tpl"}}

В качестве значения в value можно использовать не только статический текст, но и storage переменные любых блоков, которые объявлены ранее в шаблоне этой страницы, например:

{{insert name="getBlock" block_id="video_view" block_name="Video View" assign="video_view_result"}}

{{assign var=page_title value="Вы смотрите видео `$storage.video_view_video_view.title`"}}
{{assign var=page_description value=$storage.video_view_video_view.description}}
{{assign var=page_keywords value=$storage.video_view_video_view.tags_as_string}}
{{include file="header_general.tpl"}}

Несколько замечаний по вышеописанному коду:

  • Атрибут assign="video_view_result" при вставке блока нужен для того, чтобы блок не выводился в этом месте шаблона страницы, а результат своего вывода помещал в переменную $video_view_result, которую потом можно вывести в нужном месте шаблона.
  • Косые кавычки (``) нужны для экранирования переменных smarty, когда они используются внутри строки, заключенной в двойные кавычки.
  • Чтобы узнать, какие переменные вы можете использовать из storage хранилища блока, вам нужно открыть отладчик страницы (добавить к ссылке в браузере параметр ?debug=true) и там они все будут перечислены для каждого блока на этой странице. Например, можно сделать так: {{insert name="getBlock" block_id="video_view" block_name="Video View" assign="video_view_result"}}

    {{assign var=page_title value="Вы смотрите видео `$storage.video_view_video_view.title` от пользователя `$storage.video_view_video_view.username`"}}
    Обратите внимание, что вы можете использовать переменные из storage хранилища блока только после того места в шаблоне страницы, в котором вставлен этот блок. Такой код не будет работать: {{* Попытка использовать переменные storage блока video_view_video_view до того как он объявлен на странице *}}
    {{* Выведет пустые значения: Вы смотрите видео   от пользователя   *}}
    {{assign var=page_title value="Вы смотрите видео `$storage.video_view_video_view.title` от пользователя `$storage.video_view_video_view.username`"}}

    {{insert name="getBlock" block_id="video_view" block_name="Video View"}}
    {{* Теперь переменные storage блока video_view_video_view использовать допустимо *}}

4.3. Как вывести рекламу из доп. полей контент провайдеров на странице просмотра видео?

У контент провайдеров много доп. полей, которые могут быть как текстовыми, так и файловыми. Эти поля включаются в разделе Настройки -> Кастомизация:

Включение доп. полей для контент провайдеров
Включение доп. полей для контент провайдеров.

Вы можете использовать любые доп. поля для отображения их содержимого на странице просмотра видео (текстовки, ссылки, баннеры). Для того, чтобы отобразить значение текстового доп. поля контент провайдера видео в блоке просмотра видео (UI Сайта -> Страницы -> View Video -> Блок video_view), вы можете использовать следующий код в его шаблоне:

{{if $data.content_source.content_source_id>0}} {{* Проверка, есть ли у видео контент провайдер? *}}
    Текстовое поле Custom 1 содержит: {{$data.content_source.custom1}}

    {{if $data.content_source.custom2<>''}} {{* Проверка, есть ли у контент провайдера значение в поле custom2? *}}
        Текстовое поле Custom 2 может быть пустым для некоторых контент провайдеров: {{$data.content_source.custom2}}
    {{/if}}
    ...
{{/if}}

Для файловых доп. полей следует использовать такой код:

{{if $data.content_source.content_source_id>0}} {{* Проверка, есть ли у видео контент провайдер? *}}
    Ссылка на файл из файлового поля Custom file 1:
    {{$data.content_source.base_files_url}}/{{$data.content_source.custom_file1}}

    {{if $data.content_source.custom_file2<>''}} {{* Проверка, есть ли у контент провайдера значение в поле custom_file2? *}}
        Файловое поле Custom file 2 может быть пустым для некоторых контент провайдеров:
        {{$data.content_source.base_files_url}}/{{$data.content_source.custom_file2}}
    {{/if}}
    ...
{{/if}}

4.4. Как сделать так, чтобы на списке видео после 12 и после 24 тумб выводилась реклама?

Для этого необходимо внести изменения в шаблон отображения списка видео UI Сайта -> Компоненты Страниц -> list_videos_block_common.tpl. Шаблон содержит цикл вывода списка:

{{foreach name=data item=item from=$data}}
    ...вывод одного видео
{{/foreach}}

Концепцию вывода необходимо немного изменить:

{{assign var=pos value=1}}
{{foreach name=data item=item from=$data}}
    ...вывод одного видео
    {{if $pos==12}}
        выводим рекламу
    {{elseif $pos==24}}
        выводим рекламу
    {{/if}}
    {{assign var=pos value=$pos+1}}
{{/foreach}}

4.5. Я хочу сделать древовидную категоризацию. Как сделать, чтобы в разных группах категорий были категории с одинаковыми названиями?

Приведем простой пример. Есть группы категорий, такие как Сериалы и Фильмы. И в той, и в другой группе может быть категория с названием Комедии. Но KVS не позволяет создавать категории с одинаковыми названиями, поскольку название категории используется для идентификации в некоторых аспектах, например, при импорте контента.

Чтобы добиться требуемого уровня категоризации, придется создать 2 категории для комедий, но с разными названиями: например, Комедии [Сериалы] и Комедии [Фильмы]. И назначить этим категориям соответственно разные группы категорий. Для того, чтобы эти категории на сайте имели одинаковые названия, можно воспользоваться доп. полем из кастомизации. Чтобы включить его зайдите в раздел Настройки -> Кастомизация. Например, можно включить доп. поле #4 для категорий и внести туда для обеих категорий слово Комедии:

Включение доп. поля #4 для категории
Включение доп. поля #4 для категории.
Установка одинакового значения для отображения в доп. поле #4 для обеих категорий
Установка одинакового значения для отображения в доп. поле #4 для обеих категорий.

Далее для вывода названия категории на сайте везде следует использовать не свойство title, а свойство custom4.

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

<h2>Фильмы</h2>
{{insert name="getBlock" block_id="list_categories" block_name="Films Categories"}}
<h2>Сериалы</h2>
{{insert name="getBlock" block_id="list_categories" block_name="Serials Categories"}}
...

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

4.6. Я хочу вывести в шаблоне HTML код из доп. поля категории, чтобы он стал частью страницы. Когда я просто пытаюсь вывести его - он выводится как HTML текст и не становится частью страницы.

Обычно какие-либо данные в шаблоне страницы или блока выводятся таким образом (пример для доп. поля #4 категории в блоке list_categories):

{{$item.custom4}}

При таком стандартном выводе все спецсимволы HTML автоматически экранируются, чтобы не дать возможность кому-либо внедрить свой вредоносный код в шаблоны сайта. Если вы хотите, чтобы для какого-либо конкретного вывода данных экранирование не использовалось, то в шаблоне необходимо использовать специальный модификатор |smarty:nodefaults. Для рассматриваемого примера это будет выглядеть таким образом:

{{$item.custom4|smarty:nodefaults}}

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

4.7. Как изменить количество тумб в ряд на списке видео?

Все элементы списка видео идут в один ряд, CSS стили регулируют размеры каждого элемента, и их количество зависит от ширины контейнера и ширины каждого элемента. Таким образом, вам необходимо изменить ширину DIV-контейнера видео в CSS стилях. Для набора шаблонов по умолчанию это такое CSS правило:

.list_videos .item {
    float: left;
    width: 242px;
    padding: 2px;
    font-size: 11px;
}

4.8. Как изменить размеры тумб, которые используются на списках видео?

Для начала вам нужно создать формат скриншотов с нужными размерами (например, 300x200). Размеры, которые используются для отображения на сайте, задаются непосредственно в шаблонах сайта. Для того, чтобы найти все места их использования, вы можете воспользоваться функцией поиска в разделе UI Сайта -> Поиск По Шаблонам (в дефолтовых шаблонах используются размеры 240x180 и 180x135):

Поиск размера скриншотов по шаблонам сайта
Поиск размера скриншотов по шаблонам сайта.

Ссылка на скриншот видео определенного размера будет выглядеть примерно таким образом:

{{$item.screen_url}}/240x180/{{$item.screen_main}}.jpg

Вам нужно заменить старый размер 240x180 на ваш новый размер 300x200 во всех шаблонах сайта (обратите внимание, что в некоторых шаблонах размеры скриншотов повторяются несколько раз). Для нормального отображения сайта вам нужно будет также поправить CSS стили, чтобы они учитывали новый размер скриншотов.

4.9. Как настроить, чтобы по видео / альбомам вместо рейтинга показывался % кому понравилось?

Флаги можно настроить таким образом, чтобы они прибавляли к рейтингу определенные значения (или вычитали из него). В настройках самих флагов в разделе Категоризация -> Флаги необходимо задать их рейтинг: для флага I like this рейтинг должен быть 5, для флага I dislike this рейтинг должен быть 0:

Рейтинги флагов I like this и I dislike this
Рейтинги флагов I like this и I dislike this.

Таким образом, при выборе флага I like this пользователь поставит видео оценку +5, при выборе флага I dislike this - поставит оценку 0 к рейтингу, но кол-во голосов увеличится. Чтобы посчитать процент, нужно рейтинг разделить на 5, т.к. рейтинг 5 - это 100%.

В качестве начального рейтинга видео / альбомов в разделе Настройки -> Настройки Контента вы можете установить любое значение, в зависимости от требуемого вам начального процента рейтинга (значение 4 будет означать 80%).

Начальный рейтинг для видео установлен в 0
Начальный рейтинг для видео установлен в 0.

В шаблоне блока list_videos (UI Сайта -> Компоненты Страниц -> list_videos_block_common.tpl и list_videos_block_internal.tpl) % голосов I like this для каждого видео в списке можно вывести так:

{{assign var="flags" value="`$item.rating/5*100`"}}
{{if $flags>100}}
    {{assign var="flags" value="100"}}
{{/if}}
{{$flags|string_format:"%d"}}%

В шаблоне блока video_view (UI Сайта -> Страницы -> View Video -> Блок video_view) % голосов I like this можно вывести так:

{{assign var="flags" value="`$data.rating/5*100`"}}
{{if $flags>100}}
    {{assign var="flags" value="100"}}
{{/if}}
{{$flags|string_format:"%d"}}%

Для альбомов действия аналогичны.

4.10. Как на списке видео вывести ссылки для скачивания видео?

Этот вопрос неоднозначный. Скачивание видео может быть доступно / недоступно разным типам пользователей сайта, поэтому здесь необходимо рассмотреть вариации. Кроме того, кэширование блока list_videos не позволяет отображать разные варианты шаблона разным типам пользователей, поэтому необходимо написание JavaScript кода для выполнения логики разделения привилегий.

Рассмотрим первый пример, который является наиболее типичным. Ссылка Скачать ведет себя по-разному:

  • Премиум пользователи скачивают видеофайл WMV формата
  • Незарегистрированные пользователи перенаправляются на страницу регистрации

Ссылку на видеофайл WMV формата в блоке list_video можно сформировать следующим образом для каждого видео в списке (слэш в конце ссылки обязателен!):

{{if $item.server_group_id>0}}
    {{* ".wmv" - это постфикс формата WMV, вам нужно поменять на свой если отличается *}}
    {{assign var="postfix" value=".wmv"}}
    Download url: {{$config.project_url}}/get_file/{{$item.server_group_id}}/{{$item.formats[$postfix].file_path}}/
{{/if}}

Для того чтобы эта ссылка работала, необходимо включить возможность скачивания для формата WMV в настройках самого формата (Настройки -> Форматы Видео -> Редактирование Формата).

Включение возможности скачивания для формата WMV
Включение возможности скачивания для формата WMV.

Теперь мы имеем возможность вывести в шаблон блока list_videos ссылки на скачивание WMV файлов, но эти ссылки будут работать только для премиум пользователей. Чтобы незарегистрированные пользователи сайта отправлялись на страницу регистрации, в шаблоне списка видео необходимо поставить условие по статусу пользователя:

{{if $item.server_group_id>0}}
    {{* ".wmv" - это постфикс формата WMV, вам нужно поменять на свой если отличается *}}
    {{assign var="postfix" value=".wmv"}}
    {{if $smarty.session.status_id==3}}
        {{* это премиум пользователь, скачивание возможно *}}
        Download url: {{$config.project_url}}/get_file/{{$item.server_group_id}}/{{$item.formats[$postfix].file_path}}/
    {{else}}
        {{* это не премиум пользователь, отправляем на регистрацию *}}
        Download url: {{$config.project_url}}/signup.php
    {{/if}}
{{/if}}

Однако при сохранении такого кода KVS покажет ошибку кэширования. Дело в том, что блок списка видео показывает одинаковые варианты кэша для всех пользователей сайта, поэтому такое условие не будет работать корректно во время кэширования - иногда премиум пользователям вместо ссылки на скачивание будет показываться ссылка на регистрацию, и наоборот, незарегистрированным пользователям будет показываться ссылка на скачивание файла. Чтобы избежать этой проблемы, движок сайта нужно перевести в режим, когда пользователям разных статусов показываются разные варианты кэша. Для этого необходимо добавить такую опцию в файл /admin/include/setup.php:

$config['cache_control_user_status_in_cache']="true";

4.11. Как заставить даты на сайте форматироваться на русском языке?

За форматирование дат отвечают установки локали PHP. Для того, чтобы установить русскую локаль для сайта, вам необходимо добавить такую строчку PHP кода в файл /admin/include/pre_process_page_code.php:

setlocale(LC_ALL,'ru_RU.UTF-8');

Файл /admin/include/pre_process_page_code.php вызывается движком перед обработкой каждой страницы сайта, поэтому данная команда будет выполняться только для страниц этого сайта и не затронет другие проекты на сервере.

4.12. Каким образом в название страницы видео можно вывести его категорию?

Название страницы видео формируется в шаблоне страницы UI Сайта -> Страницы -> View Video таким образом:

{{assign var=page_title value=$storage.video_view_video_view.title}}

Переменная $storage.video_view_video_view.title содержит название видео. Кроме этой переменной, вы можете также использовать переменную $storage.video_view_video_view.categories_as_string, которая содержит список всех категорий видео через запятую:

{{assign var=page_title value="Видео `$storage.video_view_video_view.title` из категорий `$storage.video_view_video_view.categories_as_string`"}}

4.13. Я хочу на индексе сайта выводить скриншоты другого размера, чем на других страницах. Можно ли такое сделать?

Размер используемых скриншотов задается в шаблонах (см. вопрос 4.8). Большинство списков видео на сайте отображаются 2 компонентами страниц: UI Сайта -> Компоненты Страниц -> list_videos_block_common.tpl и list_videos_block_internal.tpl (второй компонент используется для отображения своих закладок или загруженных видео залогиненного пользователя). При изменении размеров в шаблонах этих компонентов - изменения затронут весь сайт, поэтому сначала необходимо создать отдельный компонент, который будет использоваться только в списках видео на индексе.

Для создания отдельного компонента можно воспользоваться функцией клонирования уже существующего:

Клонирование компонента list_videos_block_common.tpl
Клонирование компонента list_videos_block_common.tpl.

В появившемся диалоге можно указать идентификатор list_videos_block_index для нового компонента:

Название нового компонента
Название нового компонента.

После клонирования компонента его шаблон будет иметь такой же вид, как и исходный. Вы можете отредактировать его, заменив стандартный размер скриншотов на нужный вам размер, который должен отображаться на индексе сайта. После этого нужно настроить, чтобы все списки видео на индексе использовали новый компонент, вместо list_videos_block_common.tpl. Для этого зайдите на редактирование каждого блока list_videos на странице UI Сайта -> Страницы -> Index и замените директиву:

{{include file="list_videos_block_common.tpl"}}

на похожую директиву:

{{include file="list_videos_block_index.tpl"}}

Переключение индекса на использование нового компонента
Переключение индекса на использование нового компонента.

4.14. Как можно сделать стрелки вперед / назад для похожих видео, чтобы они прокручивались без перезагрузки страницы?

KVS позволяет использовать AJAX запросы для обращения к любому блоку страницы. Например, если у вас есть блок list_videos : Related Videos на странице просмотра видео, то получить его HTML код отдельно из страницы можно таким запросом:

?mode=async&action=get_block&block_id=list_videos_related_videos

Значение list_videos_related_videos - это уникальный идентификатор блока на странице, который может отличаться в зависимости от типа блока и его названия. Используя подобный запрос, вы можете получить отдельный HTML код любого блока на любой странице. Чтобы узнать, какой идентификатор блока нужно использовать, вы можете открыть страницу редактирования нужно вам блока и увидеть его идентификатор:

Уникальный идентификатор блока на странице
Уникальный идентификатор блока на странице.

Для того чтобы получать разные страницы списка похожих видео вам нужно включить параметр var_from в блоке и оставить значение from в нем. После включения этого параметра вы можете обращаться к разным страницам блока по таким ссылкам:

?mode=async&action=get_block&block_id=list_videos_related_videos&from=1
?mode=async&action=get_block&block_id=list_videos_related_videos&from=2
...
?mode=async&action=get_block&block_id=list_videos_related_videos&from=1234

После этого вам только остается написать или подключить JavaScript, который будет использовать данные ссылки для перехода вправо / влево по списку похожих видео.

4.15. Как показать % голосов за флаг "I like it" на странице просмотра видео / альбома без использования рейтинга?

Использование рейтинга для высчитывания % голосов за флаг "I like it" рассмотрено в вопросе 4.9. Если вы не хотите использовать рейтинг для этих целей, то показать % голосов за флаг "I like it" можно только в блоке просмотра видео / альбома. Процент может быть выведен таким блоком:

{{if $data.flags.flag_like_this_video>0 || $data.flags.flag_dislike_this_video>0}}
    {{math equation="100*(x / (x + y))" format="%d" x=$data.flags.flag_like_this_video y=$data.flags.flag_dislike_this_video}}% likes
{{else}}
    50% likes
{{/if}}

4.16. Какие варианты возможны для организации пагинации на сайте?

Вариант пагинации зависит от того, какую ссылку вы используете для доступа к странице списка. Если ссылка имеет вид директории, то se-friendly пагинация будет осуществляться таким образом:

http://domain.com/page-url/
http://domain.com/page-url/2/
http://domain.com/page-url/3/
...
http://domain.com/page-url/N/

Именно на такой вид пагинации рассчитан файл .htaccess в дефолтовом наборе шаблонов. Если ссылка на страницу списка имеет вид файла, то se-friendly пагинация будет осуществляться таким образом:

http://domain.com/page-url.html
http://domain.com/page-url-2.html
http://domain.com/page-url-3.html
...
http://domain.com/page-url-N.html

Для работы этих ссылок необходимо прописывать в .htaccess соответствующее правило (пример для страницы latest-updates.html):

RewriteRule ^latest-updates.html$ /videos_list.php [L,QSA]
RewriteRule ^latest-updates-([0-9]+).html$ /videos_list.php?from=$1 [L,QSA]

Описанные выше оба варианта пагинации будут работать в случае использования пагинации внутри блока списка (любой блок list_xxx при включенном параметре блока var_from). Существует также возможность использования отдельного блока пагинации (pagination), который работает аналогично пагинации внутри блока списка, но дополнительно позволяет использовать префикс URL. Это может понадобиться для решения 2 задач: (А) заставить пагинацию выводить ссылки на другую страницу и (Б) сформировать все ссылки пагинации с префиксом.

Задача (А) может иметь смысл, если вы хотите на странице индекса поставить пагинацию, которая ведет, например, на страницу новых видео. Так сделано в дефолтовом варианте шаблонов:

http://domain.com/
http://domain.com/latest-updates/2/
http://domain.com/latest-updates/3/
...
http://domain.com/latest-updates/N/

Чтобы этого добиться, на странице индекса необходимо вставить блок пагинации и настроить в нем такие параметры:

Параметры конфигурации блока pagination на странице индекса
Параметры конфигурации блока pagination на странице индекса.

В качестве значения related_block_ext_id (Block) необходимо выбрать тот блок списка, для которого выводится пагинация на странице. Параметр блока url_prefix (String) как раз и задает тот самый префикс, по которому будут генерироваться ссылки на страницы. Кликнув на такую ссылку, пользователь уйдет на страницу /latest-updates/N/, где уже работает своя пагинация.

Задача (Б) позволяет добиться эффекта, когда вся пагинация на сайте имеет одинаковый префикс. В данном случае пагинация будет иметь такой вид (при использовании префикса pages):

http://domain.com/some_page/
http://domain.com/some_page/pages/2/
http://domain.com/some_page/pages/3/
...
http://domain.com/some_page/pages/N/

Этим удобно воспользоваться при необходимости отключить пагинацию от индексирования поисковыми роботами (через robots.txt). Для этого всю пагинацию на сайте можно перевести на унифицированный префикс, например, pages и исключить все страницы с префиксом pages из индексации сайта. Для реализации такой пагинации необходимо на всех интересующих страницах вставить отдельный блок pagination, который должен быть настроен подобным образом:

Параметры конфигурации блока pagination на странице списка видео
Параметры конфигурации блока pagination на странице списка видео.

Основные нюансы, на которые стоит обратить внимание в данном случае:

  • Префикс не начинается со слэша.
  • Необходимо убрать старую пагинацию, которая может выводиться внутри блока списка (в данном случае в шаблоне блока Common Videos List).
  • Время кэширования блока пагинации должно совпадать со временем кэширования блока списка, к которому привязывается блок пагинации.
  • Для каждой ссылки, под которой будет работать такая пагинация, необходимо создавать правило в .htaccess файле, иначе при клике на страницы будет возникать 404 ошибка. Пример для ссылки /latest-updates/: RewriteRule ^latest-updates/pages/([0-9]+)/$ /videos_list.php?from=$1 [L,QSA]

4.17. Как вывести скриншоты видео на странице просмотра и на списке видео?

Для вывода обзорных скриншотов в блоке video_view на странице UI Сайта -> Страницы -> View Video можно воспользоваться таким кодом (240x180 - это существующий формат обзорных скриншотов, замените на свой если отличается):

{{section name="screenshots" start="1" loop=$data.screen_amount+1}}
    <img src="{{$data.screen_url}}/240x180/{{$smarty.section.screenshots.index}}.jpg" alt="Screenshot #{{$smarty.section.screenshots.index}}"/>
{{/section}}

Если вы также хотите поставить ссылки на исходные файлы скриншотов, которые имеют оригинальный размер, то так:

{{section name="screenshots" start="1" loop=$data.screen_amount+1}}
    <a href="{{$data.screenshot_sources[$smarty.section.data.index]}}"">
        <img src="{{$data.screen_url}}/240x180/{{$smarty.section.screenshots.index}}.jpg" alt="Screenshot #{{$smarty.section.screenshots.index}}"/>
    </a>
{{/section}}

Вывод таймлайновых скриншотов осуществляется несколько сложнее. Таймлайновые скриншоты привязаны к конкретному формату видео, а также могут присутствовать не для всех видео. Вы можете использовать такой код:

{{assign var="format_postfix" value=".mp4"}} {{* ".mp4" - это постфикс формата, у которого включены таймлайновые скриншоты, вам нужно поменять на свой если отличается *}}
{{if $data.formats[$format_postfix]<>'' && $data.formats[$format_postfix].timeline_screen_amount>0}}
    {{section name="screenshots" start="1" loop=$data.formats[$format_postfix].timeline_screen_amount+1}}
        <img src="{{$data.screen_url}}/timelines/{{$data.formats[$format_postfix].timeline_directory}}/240x180/{{$smarty.section.screenshots.index}}.jpg"/>
    {{/section}}
{{/if}}

Для вывода обзорных скриншотов в блоке list_videos (на списке) можно воспользоваться таким кодом:

{{section name="screenshots" start="1" loop=$item.screen_amount+1}}
    <img src="{{$item.screen_url}}/240x180/{{$smarty.section.screenshots.index}}.jpg" alt="Screenshot #{{$smarty.section.screenshots.index}}"/>
{{/section}}

4.18. Как на списках видео по категории выводить рекламу, специфичную для категории?

Для вывода рекламы, привязанной к категориям, необходимо воспользоваться доп. полями категории. В разделе Настройки -> Категоризация включите одно из текстовых полей, например, Доп. поле 5 и установите для него понятное название. Теперь для каждой категории в этом поле вы можете задать рекламу в виде HTML кода.

Включение доп. поля категории
Включение доп. поля категории.

Далее необходимо изменить шаблоны сайта, чтобы настроить вывод рекламы. По умолчанию за вывод списка видео по категории отвечает компонент UI Сайта -> Компоненты Страниц -> list_videos_block_common.tpl, который подключается из блока list_videos на странице UI Сайта -> Страницы -> Common Videos List. В его шаблоне в место под рекламу необходимо вставить такой фрагмент кода:

{{if $list_type=='categories' && $category_info.custom5<>''}}
    {{* текущий список по категории и в доп. поле #5 содержится не пустое значение -> выводим его *}}
    {{$category_info.custom5|smarty:nodefaults}}
{{else}}
    {{* текущий список либо не по категории, либо в доп. поле #5 не содержится значения -> показываем рекламу по умолчанию *}}
    ...
{{/if}}

Данный код будет работать только внутри блока list_videos (компонент list_videos_block_common.tpl подключается внутри блока list_videos). Если вам необходимо вывести рекламу вне блока, например, в шапке сайта (UI Сайта -> Компоненты Страниц -> header_general.tpl), то вы можете использовать другой код, при условии что в шаблоне данной страницы данный блок list_videos подключен до подключения шапки (в случае страницы Common Videos List это условие выполняется):

{{if $storage.list_videos_common_videos_list.list_type=='categories' && $storage.list_videos_common_videos_list.category_info.custom5<>''}}
    {{* текущий список по категории и в доп. поле #5 содержится не пустое значение -> выводим его *}}
    {{$storage.list_videos_common_videos_list.category_info.custom5|smarty:nodefaults}}
{{else}}
    {{* текущая страница либо не список по категории, либо в доп. поле #5 не содержится значения -> показываем рекламу по умолчанию *}}
    ...
{{/if}}

Для того, чтобы вывести рекламу подобным образом на странице просмотра видео, необходимо использовать такой же подход, но с одним нюансом - у видео может быть несколько категорий, поэтому рекламу следует брать из первой доступной категории. В шаблоне блока video_view на странице UI Сайта -> Страницы -> View Video вам следует использовать такой код:

{{if @count($data.categories)>0 && $data.categories.0.custom5<>''}}
    {{* у видео есть хотя бы одна категория и в доп. поле #5 содержится не пустое значение -> выводим его *}}
    {{$data.categories.0.custom5|smarty:nodefaults}}
{{else}}
    {{* у видео нет категорий, либо в доп. поле #5 не содержится значения -> показываем рекламу по умолчанию *}}
    ...
{{/if}}

Для вывода рекламы вне блока video_view, например, в шапке сайта, вам следует использовать код, приведенный ниже. Как и для списка видео, в этом случае блок video_view на странице должен быть подключен до использования этого кода.

{{if @count($storage.video_view_video_view.categories)>0 && $storage.video_view_video_view.categories.0.custom5<>''}}
    {{* у видео есть хотя бы одна категория и в доп. поле #5 содержится не пустое значение -> выводим его *}}
    {{$storage.video_view_video_view.categories.0.custom5|smarty:nodefaults}}
{{else}}
    {{* это не страница просмотра видео, либо у видео нет категорий, либо в доп. поле #5 не содержится значения -> показываем рекламу по умолчанию *}}
    ...
{{/if}}

4.19. Как в шапке сайта включить разные фрагменты кода для разных страниц?

Любая страница сайта представлена PHP скриптом, который лежит в корне проекта. Посмотреть, какой именно скрипт используется для данной страницы сайта можно в отладчике страницы (добавить к URL-у страницы параметр debug=true).

В любом компоненте страниц (например, в компоненте для шапки сайта) можно сослаться на этот скрипт так:

{{if $smarty.server.SCRIPT_NAME=='/index.php'}}
    вывод кода, специфичного для страницы index.php
{{/if}}

4.20. Как сделать, чтобы список видео по тэгу отличался от остальных списков видео на сайте?

В шаблонах по умолчанию большинство списков видео (новые видео, популярные видео, видео по категории, видео по тэгу и т.д.) обрабатываются одной страницей, которая называется Common Videos List. Эта страница содержит блок list_videos, который настроен выводить список видео по различным фильтрам и сортировкам, переданным через HTTP параметры запроса.

Вывод списка видео по тэгу - одно из назначений данной страницы. Для кастомизации списка видео по тэгу лучше всего сделать дубликат страницы Common Videos List и использовать его - так вы сможете быть уверенным, что в случае проблем или ошибок никакие другие списки не пострадают. Сделать дубликат страницы можно в 2 клика в разделе UI Сайта -> Страницы:

Создание дубликата страницы
Создание дубликата страницы.

Во всплывающем окне вам требуется указать идентификатор новой страницы, за основу можно взять идентификатор уже существующей страницы. Важным аспектом является тот факт, что KVS не всегда сможет создать необходимый PHP файл в корне проекта (т.к. пользователь, от которого работает KVS, может не иметь прав на запись в корневую директорию проекта). Перед завершением дублирования страницы вам необходимо вручную скопировать файл /admin/tools/page_template.php в корневую директорию проекта и переименовать скопированный файл в соответствии с идентификатором новой страницы - в нашем примере это videos_list_tags.php:

Ввод идентификатора новой страницы
Ввод идентификатора новой страницы.

Если файл videos_list_tags.php существует, KVS создаст полный клон страницы Common Videos List, доступный по другому URL-у. Теперь вы можете переделать новую страницу требуемым образом для отображения видео по тэгам. После этого остается лишь перевести правила в .htaccess файле для тэгов на новую страницу. Найдите все интересующие вас правила и переведите их на страницу videos_list_tags.php вместо старой videos_list.php:

RewriteRule ^tags/(.*)/latest/([0-9]+)/$ /videos_list_tags.php?tag=$1&from=$2 [L,QSA]
RewriteRule ^tags/(.*)/latest/$ /videos_list_tags.php?tag=$1 [L,QSA]
...и т.д.

Теперь все списки видео по тэгам должны обрабатываться новой страницей, а значит, будут выглядеть иначе, чем другие списки видео. При необходимости такой подход можно применить и к другим спискам видео, которые отображаются страницей Common Videos List.

4.21. Можно ли сделать так, чтобы пользователи сами указывали моделей для контента?

Такое возможно сделать с использованием флагов. В KVS за флаги можно не только голосовать, но и опционально указывать текстовое сообщение. Сообщения, указанные к флагам, появятся в панели администрирования в разделах Видео -> Отзывы Пользователей и Альбомы -> Отзывы Пользователей.

Шаблоны по умолчанию не предоставляют возможности указывать текстовые сообщения к флагам, но это легко может быть реализовано. В первую очередь вам нужно создать отдельный флаг, например, такой:

Создание флага для указания моделей пользователями на сайте
Создание флага для указания моделей пользователями на сайте.

Затем в шаблоне блока video_view на странице UI Сайта -> Страницы -> View Video вам необходимо добавить верстку для нового флага (контейнер с текстовым полем, кнопкой отправки, спрятанными контейнерами для сообщения об успешной отправке / возникшей ошибке):

<div id="flag_video_model_container">
    <label for="flag_video_model_textfield">Укажите моделей:</label>
    <input type="text" id="flag_video_model_textfield"/>
    <input type="button" id="flag_video_model_btn" value="Отправить"/>
</div>
<div id="flag_video_model_hint">укажите моделей к видео</div>
<div id="flag_video_model_success" class="g_hidden">Спасибо! Мы рассмотрим ваше предложение.</div>
<div id="flag_video_model_failure" class="g_hidden">Вы уже указывали моделей для этого видео.</div>

А также блок JavaScript кода, который проинициализирует всю логику:

<script>
    params = {};
    params['flag_external_id'] = 'flag_video_model'; // идентификатор флага
    params['container_id'] = 'flag_video_model_container'; // id контейнера, который должен спрятаться после голосования за флаг
    params['button_id'] = 'flag_video_model_btn'; // id кнопки, на которую повесить событие onclick
    params['text_id'] = 'flag_video_model_textfield'; // id текстового поля, в которое будет вводиться текст
    params['hint_message_id'] = 'flag_video_model_hint'; // id контейнера с подсказкой, который должен спрятаться после голосования за флаг
    params['success_message_id'] = 'flag_video_model_success'; // id контейнера с сообщением об успешном голосовании, который должен появиться после голосования за флаг
    params['failure_message_id'] = 'flag_video_model_failure'; // id контейнера с сообщением об ошибке, который должен появиться после голосования за флаг
    params['video_id'] = {{$data.video_id}}; // id видео
    videoViewEnableFlagging(params);
</script>

Если вы хотите обрабатывать ответ самостоятельно, вместо указания различных контейнеров вы можете указать функцию-обработчик, которая вызовется вместо логики по умолчанию:

<script>
    params = {};
    params['flag_external_id'] = 'flag_video_model'; // идентификатор флага
    params['button_id'] = 'flag_video_model_btn'; // id кнопки, на которую повесить событие onclick
    params['text_id'] = 'flag_video_model_textfield'; // id текстового поля, в которое будет вводиться текст
    params['video_id'] = {{$data.video_id}}; // id видео
    params['callback'] = function(errors) { // функция-обработчик
        if (errors) {
            alert('Вы уже указывали моделей для этого видео.');
        } else {
            alert('Спасибо! Мы рассмотрим ваше предложение.');
        }
    };
    videoViewEnableFlagging(params);
</script>

Для альбомов все делается по аналогии, за исключением 2 изменений:

  • Вместо params['video_id'] = {{$data.video_id}} необходимо использовать params['album_id'] = {{$data.album_id}}.
  • Вместо функции videoViewEnableFlagging() необходимо использовать функцию albumViewEnableFlagging().

4.22. Как сделать добавление контента в плэйлисты и расширить системные закладки?

Шаблоны по умолчанию позволяют добавлять контент только в стандартные закладки, но KVS поддерживает до 10 дополнительных списков закладок, а также любое кол-во плэйлистов, которые создаются самими пользователями. Для работы с плэйлистами существуют блоки playlist_edit (создание и редактирование плэйлистов) и list_playlists (вывод списка плэйлистов).

Добавление контента в закладки на странице видео / фотоальбома происходит при нажатии на кнопку, для которой настраивается обработчик таким блоком JavaScript кода:

var params = {};
params['link_id'] = 'fav_link'; // id кнопки, на которую повесить событие onclick
params['success_message_id'] = 'fav_block_success'; // id контейнера с сообщением об успешном добавлении в закладки, который должен появиться после обработки
params['video_id'] = {{$data.video_id}}; // id видео
videoViewEnableAddToFavourites(params);

Предоставим возможность добавлять видео в дополнительный список закладок "На будущее", а также в любой из плэйлистов пользователя. Для этого нам нужно сделать выпадающий список кнопок, который может быть представлен элементом ul, и который будет содержать 2 фиксированных кнопки и кнопки для всех плэйлистов пользователя:

<ul>
    <li><a id="fav_link">Закладки</a></li>
    <li><a id="future_link">Для будушего просмотра</a></li>
    {{if count($smarty.session.playlists)>0}}
        {{foreach name=data item=item from=$smarty.session.playlists}}
            <li><a id="playlist_{{$item.playlist_id}}">Плэйлист "{{$item.title}}"</a></li>
        {{/foreach}}
    {{/if}}
<ul>

<div id="fav_block_success" class="g_hidden">Видео добавлено в ваши личные закладки.</div>

<script type="text/javascript">
    var params;

    // стандартные закладки
    params = {};
    params['link_id'] = 'fav_link'; // id кнопки, на которую повесить событие onclick
    params['success_message_id'] = 'fav_block_success'; // id контейнера с сообщением об успешном добавлении в закладки, который должен появиться после обработки
    params['video_id'] = {{$data.video_id}}; // id видео
    videoViewEnableAddToFavourites(params);

    // закладки для будушего просмотра
    params = {};
    params['link_id'] = 'future_link'; // id кнопки, на которую повесить событие onclick
    params['success_message_id'] = 'fav_block_success'; // id контейнера с сообщением об успешном добавлении в закладки, который должен появиться после обработки
    params['video_id'] = {{$data.video_id}}; // id видео
    params['fav_type'] = 1; // идентификатор системных закладок отличный от 0 (любое число от 1 до 9)
    videoViewEnableAddToFavourites(params);

    {{if count($smarty.session.playlists)>0}}
        {{foreach name=data item=item from=$smarty.session.playlists}}
            // закладки для каждого плэйлиста
            params = {};
            params['link_id'] = 'playlist_{{$item.playlist_id}}'; // id кнопки, на которую повесить событие onclick
            params['success_message_id'] = 'fav_block_success'; // id контейнера с сообщением об успешном добавлении в закладки, который должен появиться после обработки
            params['video_id'] = {{$data.video_id}}; // id видео
            params['playlist_id'] = {{$item.playlist_id}}; // идентификатор плэйлиста
            videoViewEnableAddToFavourites(params);
        {{/foreach}}
    {{/if}}
</script>

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

  • Вместо params['video_id'] = {{$data.video_id}} необходимо использовать params['album_id'] = {{$data.album_id}}.
  • Вместо функции videoViewEnableAddToFavourites() необходимо использовать функцию albumViewEnableAddToFavourites().

4.23. Как на странице просмотра видео (альбома) включить возможность покупки доступа за токены?

Вот основные переменные, которые вы можете использовать в шаблоне блока video_view для реализации покупки видео за токены:

{{$data.tokens_required}} - стоимость видео в токенах, если стоимость равна 0, то видео нельзя купить за токены
{{$data.is_purchased_video}} - флаг 0 / 1, куплено ли текущее видео пользователем или нет
{{$smarty.session.user_id}} - идентификатор текущего пользователя, должен быть > 0 для возможности покупки (т.е. пользователь должен быть залогинен)
{{$smarty.session.status_id}} - статус текущего пользователя, должен быть == 2 для возможности покупки (т.е. стандартный пользователь)
{{$smarty.session.tokens_available}} - кол-во доступных у текущего пользователя токенов

Таким образом для организации покупки видео за токены можно использовать такой код в шаблоне блока video_view:

{{if $data.tokens_required>0 && $data.is_purchased_video==0 && $smarty.session.user_id>0 && $smarty.session.status_id==2}}
    <div id="purchase_info_message" class="message_info">
        Вы можете получить полный доступ к этому видео за {{$data.tokens_required}} токенов. В настоящее время у вас есть {{$smarty.session.tokens_available}} токенов.<br/>
        <input type="checkbox" id="cb_confirm"/> подтвердите покупку<br/>
        <input type="button" id="btn_purchase" value="Купить полный доступ"/>
        <script>
            var params = {};
            params['link_id'] = 'btn_purchase';
            params['checkbox_id'] = 'cb_confirm';
            params['info_message_id'] = 'purchase_info_message';
            params['success_message_id'] = 'purchase_success_message';
            params['error_message_id'] = 'purchase_error_message';
            params['video_id'] = {{$data.video_id}};
            videoViewEnablePurchaseVideo(params);
        </script>
    </div>
    <div id="purchase_error_message" class="g_hint g_hidden">У вас недостаточно токенов для покупки этого видео.</div>
    <div id="purchase_success_message" class="g_hint g_hidden">Спасибо! Теперь вы имеете полный доступ к этому видео, перегрузите страницу.</div>
{{/if}}

В шаблоне блока просмотра альбома album_view вы можете использовать похожий код:

{{if $data.tokens_required>0 && $data.is_purchased_album==0 && $smarty.session.user_id>0 && $smarty.session.status_id==2}}
    <div id="purchase_info_message" class="message_info">
        Вы можете получить полный доступ к этому альбому за {{$data.tokens_required}} токенов. В настоящее время у вас есть {{$smarty.session.tokens_available}} токенов.<br/>
        <input type="checkbox" id="cb_confirm"/> подтвердите покупку<br/>
        <input type="button" id="btn_purchase" value="Купить полный доступ"/>
        <script>
            var params = {};
            params['link_id'] = 'btn_purchase';
            params['checkbox_id'] = 'cb_confirm';
            params['info_message_id'] = 'purchase_info_message';
            params['success_message_id'] = 'purchase_success_message';
            params['error_message_id'] = 'purchase_error_message';
            params['album_id'] = {{$data.album_id}};
            albumViewEnablePurchaseAlbum(params);
        </script>
    </div>
    <div id="purchase_error_message" class="g_hint g_hidden">У вас недостаточно токенов для покупки этого альбома.</div>
    <div id="purchase_success_message" class="g_hint g_hidden">Спасибо! Теперь вы имеете полный доступ к этому альбому, перегрузите страницу.</div>
{{/if}}

4.24. Как можно организовать голосование за комментарии пользователей?

Комментарии в KVS поддерживают голосование флагами "за" и "против". В блоках video_comments, album_comments и др. блоках комментариев вывести количество голосов для каждого комментария в цикле можно так:

{{$item.likes}} согласных, {{$item.dislikes}} несогласных

Для голосования "за" или "против" можно использовать такой подход:

<script type="text/javascript">
    function voteCallback(errors) {
        if (!errors) {
            alert('Спасибо!');
        } else {
            alert('Вы уже голосовали.');
        }
    }
</script>
<a href="javascript:stub()" onclick="videoCommentsVote({comment_id: {{$item.comment_id}}, vote: 1, callback: voteCallback})">+1</a>
<a href="javascript:stub()" onclick="videoCommentsVote({comment_id: {{$item.comment_id}}, vote: -1, callback: voteCallback})">-1</a>

Функции videoCommentsVote передается объект из 3 параметров:

  • comment_id - идентификатор комментария.
  • vote - знак голоса, положительное число если голос "за", в противном случае голос засчитается "против".
  • callback - функция обработки ответа.

JavaScript функция videoCommentsVote доступна только в блоке video_comments, для других блоков необходимо использовать другие функции:

  • Блок album_comments - функция albumCommentsVote.
  • Блок model_comments - функция modelCommentsVote.
  • Блок content_source_comments - функция csCommentsVote.
  • Блок dvd_comments - функция dvdCommentsVote.

4.26. Как можно использовать bb-коды и смайлики в комментариях?

Смайлики и bb-коды поддерживаются по всему сайту, а не только в комментариях, но по умолчанию они не обрабатываются. Для того, чтобы включить их обработку для вывода какой-либо строки, в шаблоне сайта вам необходимо использовать модификатор bbcode:

{{* В блоке комментариев для комментария *}}
{{$item.comment|bbcode|replace:"\n":"<br/>"}}

{{* В блоке просмотра видео для описания *}}
{{$data.description|bbcode}}

По умолчанию поддерживается стандартный набор bb-кодов:

[b]Жирный текст[/b]
[i]Курсив[/i]
[u]Подчерктнутый текст[/u]
[s]Перечеркнутый текст[/s]
[quote]Цитата[/quote]
[code]Моноширинный текст[/code]
[img]Путь к картинке[/img]

Расширить набор поддерживаемых bb-кодов вы можете внеся изменения в скрипт конфигурации /admin/include/bbcode.php. Там же можно увидеть список поддерживаемых смайлов со ссылками на их картинки.

Если вы захотите вывести текст без смайлов и bb-кода, т.е. чтобы они были вырезаны, то к модификатору bbcode следует добавить параметр :"hide":

{{* В блоке комментариев для комментария *}}
{{$item.comment|bbcode:"hide"|replace:"\n":"<br/>"}}

{{* В блоке просмотра видео для описания *}}
{{$data.description|bbcode:"hide"}}

4.27. Как перенести дизайн сайта с одного проекта на другой?

Перенос дизайна можно сделать легко через плагин резервного копирования. В плагине выберите только опцию создания резервной копии сайта. Это создаст архив с директорией website внутри, которая будет содержать не только настройки страниц и шаблонов, но и js файлы, файлы стилей, настройки сайта и плеера.

Перед копированием на новый проект - если это еще не запущенный проект - рекомендуется удалить все страницы сайта в разделе UI Сайта -> Страницы, затем зайти в раздел UI Сайта -> Восстановить Страницы и также полностью удалить там все страницы. Если при удалении страниц возникнут ошибки с привилегиями на доступ, поставьте временно привилегии 777 на корневую директорию проекта. После удаления верните на 755. Далее в разделе UI Сайта -> Компоненты Страниц удалите все компоненты.

Скопируйте содержимое директории website из резервной копии поверх корня проекта. После этого проект должен быть полностью рабочим, если форматы скриншотов, видео и альбомов совпадают на обоих проектах.

После копирования файлов страницы сайта и компоненты страниц в разделе UI сайта могут быть подсвечены предупреждениями о нехватке привилегий на редактирование. Для выставления привилегий вы можете использовать такие команды из консоли (текущая директория должна быть установлена в корне проекта):

find template -type d | xargs chmod 777
find template -type f \( ! -iname ".htaccess" \) | xargs chmod 666
find admin/data/config -type d | xargs chmod 777
find admin/data/config -type f \( -iname "*.dat" \) | xargs chmod 666

5. Кастомизация

5.1. Как подключить скрипт подсчета входов для трейда?

Обычно трейд скрипт предоставляет PHP или CGI файл для учета входов на страницу. Этот файл должен срабатывать при каждом запросе страницы сайта, он обрабатывает запрос и выводит небольшой блок JavaScript кода. Для того, чтобы это корректно работало в связке с KVS, необходимо выполнить следующие действия:

  • В разделе Настройки -> Настройки Сайта в поле Кэширование сайта необходимо установить значение Только кэширование блоков. Это значит что шапка сайта не будет кэшироваться и будет вызываться при каждом запросе.
  • В шаблоне шапки сайта (UI Сайта -> Компоненты Страниц -> header_general.tpl) в нужное место необходимо вставить подключение трейд скрипта (возьмите код из документации трейд скрипта): {{php}}
        virtual('/path/to/your/site/index/directory/trade_script/in.php');
    {{/php}}

5.2. Как сделать красивые ссылки на трейд?

В большинстве случаев ссылки на трейд выглядят таким образом:

http://domain.com/out.php?u=http://domain.com/videos/123/video-directory/

Вы можете добавить правило в .htaccess по вашему вкусу, которое передаст скрипту out.php реальную ссылку на видео, например такое:

RewriteRule ^goto/([0-9]+)/([^/]+)/$ /out.php?url=http://domain.com/videos/$1/$2/ [L,QSA]

После этого в блоках list_videos вы можете использовать ссылки подобного вида, которые обработаются скриптом трейда out.php и средиректятся на страницу с видео, либо на трейд. Для этого в шаблоне компонента UI Сайта -> Компоненты Страниц -> list_videos_block_common.tpl замените переменную {{$item.view_page_url}} в нескольких местах на такой код:

{{$config.project_url}}/goto/{{$item.video_id}}/{{$item.dir}}/

При необходимости параметры трейд скрипта можно добавлять прямо к этим ссылкам:

{{$config.project_url}}/goto/{{$item.video_id}}/{{$item.dir}}/?p=50&trade_option=value

Важно! Ни в коем случае нельзя прописывать ссылки вида /goto/ в качестве паттерна страницы просмотра видео в разделе Настройки -> Настройки Сайта. Паттерн всегда должен ссылаться на реальную страницу просмотра видео, в то время как ссылки вида /goto/ ведут на промежуточный скрипт.

5.3. Как подключить выполнение своего PHP кода в шаблоне?

Для того, чтобы это сделать необходимо понимать, какую функцию выполняет ваш PHP код. В зависимости от этого могут быть вариации:

  • Ваш код не выводит ничего, просто обрабатывает запросы, например, для статистики. В этом случае вы можете смело вставлять его в файл /admin/include/pre_display_page_code.php, который вызывается для всех запросов на отображение страниц сайта (кроме XML страниц).
  • Ваш код выводит какие-то данные, но при этом он не привязан к каждому отдельному запросу и эти данные могут быть закэшированы. В этом случае вы можете вставить свой код в любой шаблон таким образом: {{php}}
        ваш код
    {{/php}}
  • Ваш код выводит какие-то данные, и при этом он привязан к каждому отдельному запросу, то есть данные не могут быть закэшированы и они теоретически могут быть разными для разных запросов. В этом случае единственный вариант для вас - выключать кэширование Memcache в разделе Настройки -> Настройки сайта и вставлять свой код только в шаблоны страниц или в компоненты шапки / футера: {{php}}
        ваш код
    {{/php}}
    Важно! Такой код нельзя вставлять в шаблоны блоков или в компоненты, которые используются в шаблонах блоков (например, внутри списка видео, внутри блока просмотра видео). Из-за кэширования блоков ваш код не будет выполняться в 100% случаев и результат его выполнения будет также кэшироваться.

Если вам необходимо выводить рекламу отдельным от KVS способом, то рассмотрите также возможность написания отдельного PHP скрипта, который будете подключать через iframe в шаблонах сайта - при таком подходе не будет никаких проблем с кэшированием, потому что ваш код не интегрируется в KVS и отрабатывает отдельно.

6. Инфраструктурные вопросы

6.1. Как перенести проект на другой сервер?

При переносе KVS на новый сервер ожидается, что настройки нового сервера будут соответствовать настройкам старого сервера. Также ожидается, что конфиг Nginx будет соответствовать аналогичному конфигу на старом сервере (с учетом измененных серверных путей при необходимости).

Для переноса проекта на другой сервер необходимо выполнить следующие действия:

  • Перенесите содержимое базы данных.
  • Скопируйте все файлы из директории, куда установлен проект KVS, в аналогичную директорию на новом сервере. При этом обязательно нужно сохранить все привилегии файловой системы, которые установлены на различных файлах и директориях проекта. При копировании файлов без сохранения привилегий может потребоваться повторное копирование.
  • Измените данные соединения с БД MySQL в файле /admin/include/setup_db.php.
  • Измените старые пути на новые в файле /admin/include/setup.php. Данный файл содержит множество путей к различным директориям проекта, необходимо убедиться, что вы поменяли их все.
  • При необходимости измените пути к библиотекам PHP, FFmpeg, ImageMagick в файле /admin/include/setup.php.
  • При использовании локального сервера конвертации измените пути к библиотекам в файле /admin/data/conversion/config.properties (если на новом сервере библиотеки находятся по другим путям). Затем в настройках сервера конвертации в панели администрирования измените путь к его директории (/admin/data/conversion).
  • При использовании локальных серверов хранения измените пути к ним в настройках серверов хранения в панели администрирования.
  • Установите на крон скрипт /admin/include/cron.php раз в минуту в следующем виде: cd /PATH/admin/include/ && /usr/local/bin/php cron.php > /dev/null 2>&1 или cd /PATH/admin/include/ && /usr/bin/php cron.php > /dev/null 2>&1
  • Запустите плагин аудита и исправьте все ошибки. После этого проект можно считать перенесенным.

6.2. Как перенести проект из директории в корень домена?

Перенос рабочего проекта из директории в корень домена может привести к временной потере работоспособности проекта. Мы рекомендуем вам создать заготовку страницы, чтобы показывать ее пользователям в течение некоторого времени при неработающем проекте. Вы можете использовать для этого файл /website_unavailable.html и в начале работ выключить сайт в разделе Настройки -> Настройки Сайта. В этом случае сайт будет доступен только администратору - все остальные пользователи будут видеть содержимое файла /website_unavailable.html.

При переносе KVS в корень домена ожидается, что конфиг Nginx будет изменен таким образом, чтобы правила, которые действовали для директории с установленным KVS, станут действовать для корня домена.

Для переноса проекта в корень домена необходимо выполнить следующие действия:

  • Проверьте шаблоны сайта на наличие в них ссылок с использованием директории (можно сделать поиск по строке /folder). Исправьте все найденные случаи. Шаблоны KVS по умолчанию не содержат таких ссылок, но вы могли их добавить при кастомизации дизайна.
  • В настройках блока pagination на странице Index при необходимости измените значение параметра блока url_prefix, чтобы оно ссылалось на корень домена, а не на директорию /folder.
  • Во всех .htaccess файлах внутри директории KVS во всех правилах уберите использование директории /folder. Таких файлов несколько: /.htaccess
    /js/.htaccess (может отсутствовать)
    /player/.htaccess
    /admin/.htaccess
    /admin/feeds/.htaccess (может отсутствовать)
  • На уровне файловой системы из корня домена перенесите все файлы и директории (кроме директории с KVS) в отдельное место на файловой системе. Это стоит делать только в том случае, если вы хотите заменить проектом KVS содержимое в корне домена. Если же вы хотите, чтобы старое содержимое корня домена оставалось работать каким-то образом после переноса туда KVS, вам необходимо учесть любые пересечения по файлам и директориям.
  • Перенесите все файлы и директории KVS из /folder в корень домена. Эта операция должна выполниться максимально быстро, т.к. копирования файлов не произойдет.
  • Во всех путях и URL-ах в файле /admin/include/setup.php уберите использование директории /folder. Данный файл содержит множество путей и URL-ов к различным директориям проекта, необходимо убедиться, что вы поменяли их все.
  • При правильном выполнении предыдущих шагов, сайт KVS и панель администрирования должны заработать в корне домена. В случае возникновения проблем с отображением данных необходимо проверить корректность путей и URL-ов в файле /admin/include/setup.php.
  • При использовании локального сервера конвертации измените путь к нему в настройках сервера конвертации в панели администрирования.
  • При использовании локальных серверов хранения измените пути к ним в настройках серверов хранения в панели администрирования.
  • Сохраните Настройки -> Настройки Контента и при необходимости исправьте ошибки валидации, которые могут возникнуть при сохранении.
  • В разделах Настройки -> Настройки Плеера и Настройки -> Настройки Embed Плеера при необходимости измените все ссылки, которые ссылаются на файлы в директории, где ранее был установлен KVS.
  • Измените команду крона, чтобы она запускала скрипт /admin/include/cron.php из корня домена.
  • Запустите плагин аудита и исправьте все ошибки. После этого проект можно считать перенесенным. Не забудьте включить сайт в разделе Настройки -> Настройки Сайта, если вы выключали его перед началом миграции.

6.3. Как построить мобильную версию сайта?

Идея заключается в том, что в KVS можно создать набор мобильных страниц (мобильный индекс, мобильная страница просмотра и т.д.) с отдельной версткой под мобильные устройства. Эти страницы как и любые другие будут доступны с основного домена. Затем в конфиге Apache нужно создать виртуальный хост для мобильного сабдомена m.domain.com. Его настройка не должна ничем отличаться от обычной настройки за исключением 2 вещей:

  • Опция DocumentRoot должна указывать на ту же самую директорию, где установлен KVS на основном домене.
  • Опция AccessFileName должна задавать название файла, отличное от стандартного .htaccess, например .htaccess_mobile.

Пример настройки мобильного сабдомена в Apache:

DocumentRoot /var/www/domain.com/public_html
ServerName m.domain.com
ServerAlias m.domain.com
AccessFileName .htaccess_mobile

Теперь при открытии мобильного сабдомена будет использоваться файл адресации .htaccess_mobile, где вы можете поместить правила адресации на мобильные страницы. Также необходимо поместить системные правила, т.к. они будут одинаковы. Вот небольшой пример мобильного набора правил для индекса и страниц просмотра видео и альбомов:

RewriteEngine on
RewriteBase /

# мобильный индекс
RewriteRule ^$ /mobile_index.php [L,QSA]

# здесь остальные правила, которые нужны для дизайна мобильной версии
...

# мобильная страница просмотра видео
RewriteRule ^videos/([0-9]+)/([^/]+)/([0-9]+)/$ /mobile_view_video.php?id=$1&dir=$2&from=$3 [L,QSA]
RewriteRule ^videos/([0-9]+)/([^/]+)/$ /mobile_view_video.php?id=$1&dir=$2 [L,QSA]

# мобильная страница просмотра альбома
RewriteRule ^albums/([0-9]+)/([^/]+)/([0-9]+)/$ /mobile_view_album.php?id=$1&dir=$2&from=$3 [L,QSA]
RewriteRule ^albums/([0-9]+)/([^/]+)/$ /mobile_view_album.php?id=$1&dir=$2 [L,QSA]
RewriteRule ^albums/([0-9]+)/([^/]+)/image([0-9]+)/([0-9]+)/$ /mobile_view_album.php?id=$1&dir=$2&image_id=$3&from=$4 [L,QSA]
RewriteRule ^albums/([0-9]+)/([^/]+)/image([0-9]+)/$ /mobile_view_album.php?id=$1&dir=$2&image_id=$3 [L,QSA]

# некоторые другие правила, которые не отличаются
RewriteRule ^random_video(/)?$ /redirect_random_video.php [L,QSA]
RewriteRule ^random_album(/)?$ /redirect_random_album.php [L,QSA]
RewriteRule ^cs/(.*)/.*$ /redirect_cs.php?dir=$1 [L,QSA]

# SYSTEM / DO NOT CHANGE -----------------------------------------------------------------------------------------------

RewriteRule ^embed/(.+)$ /player/iframe_embed.php?video_id=$1 [L,QSA]
RewriteRule ^related_videos_xml/([0-9]+)/?$ /related_videos_xml.php?video_id=$1 [L,QSA]
RewriteRule ^get_file/([0-9]+)/([^/]*)/(.*)$ /get_file.php?sg_id=$1&hash=$2&file=$3 [L,QSA]
RewriteRule ^get_image/([0-9]+)/([^/]*)/(.*)/$ /get_image.php?sg_id=$1&hash=$2&file=$3 [L,QSA]

# END SYSTEM -----------------------------------------------------------------------------------------------------------

Для того, чтобы эти правила работали корректно, вам необходимо создать все эти страницы в разделе UI сайта и настроить их внешний вид. В данном примере заданы правила для 3 мобильных страниц с идентификаторами: mobile_index (мобильный индекс), mobile_view_video (мобильная страница просмотра видео) и mobile_view_album (мобильная страница просмотра альбома).

Теперь после открытия http://m.domain.com вы должны видеть страницу мобильного индекса. Если какие-либо ссылки в дизайне ссылаются на http://domain.com, вместо http://m.domain.com, то этому может быть 2 причины:

  • В шаблонах сайта вы напрямую задаете ссылки через http://domain.com. Делать этого не стоит по многим причинам. Вместо указания доменного имени в шаблонах следует использовать переменную {{$config.project_url}} в качестве основы для ссылок: {{$config.project_url}}/latest-updates/
  • Если исходная версия KVS у вас была младше, чем 3.5.0, вам необходимо внести поправку в файл /admin/include/setup.php, чтобы ссылки переводились на мобильные, если сайт открывается на мобильном сабдомене. Для этого добавьте такой блок кода внизу файла до закрывающего тэга ?> (измените domain.com на ваш домен): if ($_SERVER['SERVER_NAME']== 'm.domain.com')
    {
        $config['project_url']="http://m.domain.com";
    }

Теперь все ссылки на мобильной версии должны вести на мобильный сабдомен, на основной версии - на основной домен. Финально, чтобы работал плеер вам нужно скопировать файл /player/.htaccess -> /player/.htaccess_mobile и поменять в скопированном файле 1 строку, где используется domain.com на m.domain.com.

6.4. Как восстановить сайт из резервной копии, сделанной плагином KVS?

Плагин резервного копирования создает архив с 3 компонентами проекта:

  • База данных - файл mysql/backup.sql из архива. Для восстановления базы из резервной копии вам нужно создать новую базу данных и выполнить в ней backup.sql: mysql --user=%DB_USER% --password=%DB_PASS% --force --verbose %DB_DEVICE% < backup.sql Здесь %DB_USER% и %DB_PASS% - это имя пользователя и пароль, а %DB_DEVICE% - это имя чистой базы данных. Затем в файле /admin/include/setup_db.php прописать данные подключения к новой базе данных.
  • Системные файлы KVS - директория kvs из архива. Для восстановления системных файлов вам нужно скопировать содержимое директории kvs поверх корня проекта без удаления каких-либо старых файлов из проекта.
  • Настройки сайта - директория website из архива. Для восстановления сайта к состоянию на момент создания резервной копии вам нужно скопировать содержимое директории website поверх корня проекта без удаления каких-либо старых файлов из проекта.

После восстановления запустите плагин аудита для проверки работоспособности проекта и исправьте ошибки.

6.5. Как настроить загрузку файлов через сабдомен для корректной работы проекта под CloudFlare?

При использовании CloudFlare размер загружаемых файлов ограничен 100 мегабайтами. Для обхода этого лимита вам необходимо настроить сабдомен upload.domain.com (или другое название) и пустить загрузку через него.

При настройке сабдомена в Apache необходимо учесть 2 нюанса:

  • Опция DocumentRoot должна указывать на ту же самую директорию, где установлен KVS на основном домене.
  • Опция AccessFileName должна задавать название файла, отличное от стандартного .htaccess, например .htaccess_upload.

Пример настройки сабдомена в Apache:

DocumentRoot /var/www/domain.com/public_html
ServerName upload.domain.com
ServerAlias upload.domain.com
AccessFileName .htaccess_upload

Содержимое файла .htaccess_upload - обратите внимание, что в нем проставлены лимиты на макс. размер загружаемых файлов (2000M), которые вы можете повысить при необходимости:

php_flag magic_quotes_gpc Off
php_flag register_globals Off
php_flag display_errors Off
php_value upload_max_filesize 2000M
php_value post_max_size 2000M

RewriteEngine on
RewriteBase /

Header set Access-Control-Allow-Origin "*"

RewriteCond %{REQUEST_METHOD} =POST
RewriteRule ^uploader$ /admin/include/uploader_nginx.php [L,QSA]

RewriteCond %{REQUEST_METHOD} =POST
RewriteRule ^upload-video/$ /member_profile_view.php?type=upload_video [L,QSA]

RewriteCond %{REQUEST_METHOD} =POST
RewriteCond %{REQUEST_URI} !^/admin/include/uploader_nginx\.php.*
RewriteCond %{REQUEST_URI} !^/member_profile_view\.php.*
RewriteRule ^.*$ - [R=404,L]

RewriteCond %{REQUEST_METHOD} =GET
RewriteRule ^.*$ - [R=404,L]

В файле /admin/include/setup.php пропишите новый URL загрузчика через сабдомен:

$config['uploader_url']="http://upload.domain.com/uploader";

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