besnovatyj/yii2-cms-videojs-10-widget
Composer 安装命令:
composer require besnovatyj/yii2-cms-videojs-10-widget
包简介
Video.js v10 (Web Components) widget for Yii2 CMS. Supports local MP4 via VideoJS v10 and iframe embed for YouTube, Rutube, VK, Vimeo.
README 文档
README
VideoJS v10 (Web Components) виджет для Yii2 CMS. Замена старого yii2-cms-videojs-widget на базе VideoJS v8.
Возможности
- Локальное видео MP4 — через VideoJS v10 Web Components (
<video-player>) - Внешние платформы — YouTube, Rutube, VK, Vimeo через iframe
- Click-to-play overlay — постер с кнопкой воспроизведения (iframe загружается только после клика)
- Шорткоды — полная совместимость с
besnovatyj/yii2-cms-shortcode - Accessibility — aria-label, role=button, keyboard navigation (Tab + Enter/Space)
- Bootstrap 5 — responsive через
ratio ratio-16x9 - TypeScript strict — весь клиентский код на TypeScript
Установка
1. Сборка TypeScript (требуется для VideoJS v10 Web Components)
cd app/packages/besnovatyj/yii2-cms-videojs-10-widget
npm install
npm run build
Без сборки работает только iframe режим (YouTube, Rutube, VK, Vimeo).
VideoJS v10 Web Components (<video-player>) требуют собранного player.js.
2. Регистрация в шорткодах (через admin или migration)
| Поле | Значение |
|---|---|
| shortcode | videojs |
| type | widget |
| replacement | \Besnovatyj\VideoJs\Player |
Использование
PHP API — локальное видео (VideoJS v10)
echo \Besnovatyj\VideoJs\Player::widget([ 'sources' => [ ['src' => '/videos/movie.mp4', 'type' => 'video/mp4'], ['src' => '/videos/movie.webm', 'type' => 'video/webm'], // fallback ], 'poster' => '/images/poster.jpg', 'title' => 'Название фильма', ]);
Генерирует HTML:
<video-player> <video-skin> <video controls preload="auto" poster="/images/poster.jpg" playsinline aria-label="Название фильма"> <source src="/videos/movie.mp4" type="video/mp4"> <source src="/videos/movie.webm" type="video/webm"> </video> </video-skin> </video-player>
PHP API — iframe (YouTube, Rutube, VK, Vimeo)
// Click-to-play (по умолчанию, lazyIframe = true) echo \Besnovatyj\VideoJs\Player::widget([ 'iframeSrc' => 'https://www.youtube.com/embed/VIDEO_ID', 'iframeAllow' => 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture', 'iframeReferrerPolicy' => 'strict-origin-when-cross-origin', 'poster' => 'https://img.youtube.com/vi/VIDEO_ID/mqdefault.jpg', 'title' => 'Название видео', ]); // Прямой iframe (без click-to-play) echo \Besnovatyj\VideoJs\Player::widget([ 'iframeSrc' => 'https://rutube.ru/play/embed/VIDEO_ID', 'iframeAllow' => 'autoplay; fullscreen', 'lazyIframe' => false, ]);
PHP API — данные из модуля актёров (PersonVideo)
// PersonVideo содержит все необходимые данные для iframe foreach ($person->videos as $video) { echo \Besnovatyj\VideoJs\Player::widget([ 'iframeSrc' => $video->iframe_url, 'iframeAllow' => $video->iframe_allow, 'iframeReferrerPolicy' => $video->iframe_referrerpolicy, 'poster' => $video->thumbnail_url, 'title' => $person->name . ' — видео', ]); }
Шорткоды (besnovatyj/yii2-cms-shortcode)
ВАЖНОЕ!
Ссылки для вставки видео со сторонних видеохостингов должны быть embed, например:
https://rutube.ru/embed/610084de88e90f53f038ebee2eef8dbb/
Обычные видео видеохостинги не разрешают встраивать в чужие страницы
| ❌ Неверно (страница) | ✅ Верно (embed) |
|---|---|
https://rutube.ru/video/ID/ |
https://rutube.ru/play/embed/ID |
https://youtube.com/watch?v=ID |
https://www.youtube.com/embed/ID |
https://vk.com/video... |
https://vk.com/video_ext.php?... |
Локальное видео
[videojs, poster="/files/poster.jpg"][source src="/files/movie.mp4" type="video/mp4"][/videojs]
Несколько форматов (fallback):
[videojs, poster="/files/poster.jpg"]
[source src="/files/movie.mp4" type="video/mp4"]
[source src="/files/movie.webm" type="video/webm"]
[/videojs]
Iframe (YouTube)
[videojs, iframeSrc="https://www.youtube.com/embed/VIDEO_ID" iframeAllow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" poster="https://img.youtube.com/vi/VIDEO_ID/mqdefault.jpg" title="Название видео"][/videojs]
Iframe (Rutube)
[videojs, iframeSrc="https://rutube.ru/play/embed/VIDEO_ID" iframeAllow="autoplay; fullscreen" poster="THUMBNAIL_URL"][/videojs]
Без click-to-play
[videojs, iframeSrc="https://www.youtube.com/embed/VIDEO_ID" lazyIframe=0][/videojs]
Примечание:
lazyIframe=0через шорткод — атрибуты без кавычек парсятся как целые числа.0(int) будет falsy в PHP. Если нужно false, используйтеlazyIframe=false(будет строка — truthy!). Надёжнее задавать через PHP API.
Параметры виджета
| Свойство | Тип | По умолчанию | Описание |
|---|---|---|---|
poster |
?string |
null |
URL постера (превью) |
title |
?string |
null |
Заголовок для aria-label |
width |
?int |
null |
Ширина |
height |
?int |
null |
Высота |
sources |
array |
[] |
Список источников [['src', 'type'], ...] |
controls |
bool |
true |
Элементы управления |
autoplay |
bool |
false |
Автовоспроизведение |
preload |
string |
'auto' |
Предзагрузка: 'auto', 'metadata', 'none' |
muted |
bool |
false |
Без звука |
playsinline |
bool |
true |
Inline на мобильных |
content |
?string |
null |
Внутренний контент шорткода (авто-парсинг [source ...]) |
iframeSrc |
?string |
null |
URL iframe (YouTube, Rutube, VK, Vimeo) |
iframeAllow |
string |
'' |
Атрибут allow для iframe |
iframeReferrerPolicy |
string |
'' |
Атрибут referrerpolicy |
lazyIframe |
bool |
true |
Click-to-play (постер + кнопка) |
options |
array |
[] |
Доп. HTML-атрибуты |
Структура модуля
yii2-cms-videojs-10-widget/
├── composer.json # Pакет Yii2 расширение, namespace Besnovatyj\VideoJs\
├── package.json # npm: @videojs/html, esbuild, typescript
├── tsconfig.json # TypeScript strict config
├── esbuild.config.mjs # Сборка TS → src/media/player.js + player.css
├── README.md # Этот файл (инструкция по использованию)
├── DEVELOPMENT.md # Руководство по разработке и расширению
└── src/
├── Player.php # Основной Yii2 Widget
├── PlayerAssets.php # Yii2 AssetBundle → src/media/
├── ts/
│ ├── index.ts # TypeScript entry: VideoJS v10 + iframe click-to-play
│ └── styles.css # Custom CSS (overlay), импортируется в index.ts
└── media/ # Собранные assets (output npm run build)
├── player.js # Бандл: @videojs/html + iframe JS
└── player.css # Бандл: VideoJS v10 skin + overlay CSS
Команды разработки
# Установка зависимостей npm install # Однократная сборка (production, minified) npm run build # Сборка с watch (development) npm run dev
Совместимость браузеров
VideoJS v10 использует Web Components (Custom Elements v1) — требуются современные браузеры:
| Браузер | Минимальная версия |
|---|---|
| Chrome | 100+ |
| Firefox | 100+ |
| Safari | 15+ |
| Edge | 100+ |
IE11 не поддерживается — VideoJS v10 нативно использует ESM и Web Components.
统计信息
- 总下载量: 0
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 2
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2026-07-06