| @copyright 2007-2026 (c) AVE.cms | @link https://ave-cms.ru | @version 3.3 */ namespace App\Adminx\Rubrics\FieldEditors; defined('BASEPATH') || die('Direct access to this location is not allowed.'); use App\Helpers\Json; class MediaFieldEditor extends AbstractFieldEditor { public function parseValue($type, $value) { $type = (string) $type; $value = (string) $value; if (in_array($type, array('image_single', 'download'), true)) { $json = $this->decodeJsonValue($value); if (is_array($json)) { return array( 'raw' => $value, 'url' => isset($json['url']) ? (string) $json['url'] : (isset($json['path']) ? (string) $json['path'] : ''), 'description' => isset($json['description']) ? (string) $json['description'] : (isset($json['descr']) ? (string) $json['descr'] : ''), ); } $parts = explode('|', $value); return array( 'raw' => $value, 'url' => isset($parts[0]) ? (string) $parts[0] : '', 'description' => isset($parts[1]) ? implode('|', array_slice($parts, 1)) : '', ); } if ($type === 'youtube') { $parts = explode('|', $value); return array( 'raw' => $value, 'url' => isset($parts[0]) ? (string) $parts[0] : '', 'width' => isset($parts[1]) ? (string) $parts[1] : '', 'height' => isset($parts[2]) ? (string) $parts[2] : '', 'fullscreen' => isset($parts[3]) ? (string) $parts[3] : '', 'source' => isset($parts[4]) ? (string) $parts[4] : '', ); } if ($type === 'image_multi') { $items = $this->decodeListValue($value); $out = array(); foreach ($items as $item) { if (is_array($item)) { $url = isset($item['url']) ? (string) $item['url'] : (isset($item['path']) ? (string) $item['path'] : ''); if ($url === '') { continue; } $out[] = array( 'url' => $url, 'description' => isset($item['description']) ? (string) $item['description'] : (isset($item['descr']) ? (string) $item['descr'] : ''), ); continue; } $parts = explode('|', (string) $item); $url = isset($parts[0]) ? trim((string) $parts[0]) : ''; if ($url !== '') { $out[] = array( 'url' => $url, 'description' => isset($parts[1]) ? implode('|', array_slice($parts, 1)) : '', ); } } return array('raw' => $value, 'items' => $out); } if ($type === 'image_mega') { $items = $this->decodeListValue($value); $out = array(); foreach ($items as $item) { if (is_array($item)) { $url = isset($item['url']) ? (string) $item['url'] : (isset($item['path']) ? (string) $item['path'] : ''); if ($url === '') { continue; } $out[] = array( 'url' => $url, 'title' => isset($item['title']) ? (string) $item['title'] : (isset($item['name']) ? (string) $item['name'] : ''), 'description' => isset($item['description']) ? (string) $item['description'] : (isset($item['descr']) ? (string) $item['descr'] : ''), 'link' => isset($item['link']) ? (string) $item['link'] : '', ); continue; } $parts = explode('|', (string) $item); $url = isset($parts[0]) ? trim((string) $parts[0]) : ''; if ($url !== '') { $out[] = array( 'url' => $url, 'title' => isset($parts[1]) ? (string) $parts[1] : '', 'description' => isset($parts[2]) ? (string) $parts[2] : '', 'link' => isset($parts[3]) ? (string) $parts[3] : '', ); } } return array('raw' => $value, 'items' => $out); } if ($type === 'doc_files') { $items = $this->decodeListValue($value); $out = array(); foreach ($items as $item) { if (is_array($item)) { $url = isset($item['url']) ? (string) $item['url'] : (isset($item['path']) ? (string) $item['path'] : ''); if ($url === '') { continue; } $out[] = array( 'name' => isset($item['name']) ? (string) $item['name'] : '', 'description' => isset($item['descr']) ? (string) $item['descr'] : (isset($item['description']) ? (string) $item['description'] : ''), 'url' => $url, ); continue; } $parts = explode('|', (string) $item); $url = count($parts) > 2 ? (string) $parts[2] : (string) $item; $url = trim($url); if ($url !== '') { $out[] = array( 'name' => isset($parts[0]) && count($parts) > 2 ? (string) $parts[0] : basename($url), 'description' => isset($parts[1]) && count($parts) > 2 ? (string) $parts[1] : '', 'url' => $url, ); } } return array('raw' => $value, 'items' => $out); } return parent::parseValue($type, $value); } public function serializeValue($type, $value) { $type = (string) $type; if (!is_array($value)) { return (string) $value; } if ($type === 'image_single') { $url = trim(isset($value['url']) ? (string) $value['url'] : ''); $description = trim(isset($value['description']) ? (string) $value['description'] : ''); return $url === '' ? '' : htmlspecialchars($url . '|' . $description, ENT_QUOTES); } if ($type === 'download') { $url = trim(isset($value['url']) ? (string) $value['url'] : ''); $description = trim(isset($value['description']) ? (string) $value['description'] : ''); return $url === '' ? '' : htmlspecialchars($url . ($description !== '' ? '|' . $description : ''), ENT_QUOTES); } if ($type === 'youtube') { $url = trim(isset($value['url']) ? (string) $value['url'] : ''); if ($url === '') { return ''; } return htmlspecialchars(implode('|', array( $url, isset($value['width']) ? (string) $value['width'] : '', isset($value['height']) ? (string) $value['height'] : '', isset($value['fullscreen']) ? (string) $value['fullscreen'] : '', isset($value['source']) ? (string) $value['source'] : '', )), ENT_QUOTES); } if ($type === 'image_multi') { $items = isset($value['items']) && is_array($value['items']) ? $value['items'] : array(); $out = array(); foreach ($items as $item) { if (!is_array($item)) { continue; } $url = trim(isset($item['url']) ? (string) $item['url'] : ''); $description = trim(isset($item['description']) ? (string) $item['description'] : ''); if ($url !== '') { $out[] = $url . ($description !== '' ? '|' . $description : ''); } } return !empty($out) ? serialize($out) : ''; } if ($type === 'image_mega') { $items = isset($value['items']) && is_array($value['items']) ? $value['items'] : array(); $out = array(); foreach ($items as $item) { if (!is_array($item)) { continue; } $url = trim(isset($item['url']) ? (string) $item['url'] : ''); if ($url === '') { continue; } $out[] = $url . '|' . stripslashes(htmlspecialchars(isset($item['title']) ? (string) $item['title'] : '', ENT_QUOTES)) . '|' . stripslashes(htmlspecialchars(isset($item['description']) ? (string) $item['description'] : '', ENT_QUOTES)) . '|' . ltrim(isset($item['link']) ? (string) $item['link'] : '', '/'); } return !empty($out) ? serialize($out) : ''; } if ($type === 'doc_files') { $items = isset($value['items']) && is_array($value['items']) ? $value['items'] : array(); $out = array(); foreach ($items as $item) { if (!is_array($item)) { continue; } $url = trim(isset($item['url']) ? (string) $item['url'] : ''); if ($url === '') { continue; } $out[] = array( 'name' => isset($item['name']) ? (string) $item['name'] : '', 'descr' => isset($item['description']) ? (string) $item['description'] : '', 'url' => $url, ); } return !empty($out) ? serialize($out) : ''; } return parent::serializeValue($type, $value); } public function renderEdit(array $field) { $type = isset($field['rubric_field_type']) ? (string) $field['rubric_field_type'] : ''; $kind = isset($field['editor_kind']) ? (string) $field['editor_kind'] : 'media'; $parsed = $this->value($field); $parsed = is_array($parsed) ? $parsed : array(); if ($type === 'youtube') { return $this->renderYoutube($field, $parsed); } if ($type === 'text_to_image') { $value = isset($parsed['value']) ? (string) $parsed['value'] : (isset($parsed['raw']) ? (string) $parsed['raw'] : ''); return ''; } if ($kind === 'media_list') { return $this->renderMediaList($field, $type, $parsed); } return $this->renderSingleMedia($field, $type, $parsed); } protected function renderYoutube(array $field, array $p) { $url = isset($p['url']) ? (string) $p['url'] : ''; $width = isset($p['width']) ? (string) $p['width'] : ''; $height = isset($p['height']) ? (string) $p['height'] : ''; $fs = isset($p['fullscreen']) ? (string) $p['fullscreen'] : ''; $src = isset($p['source']) ? (string) $p['source'] : ''; return '
' . $this->e($url) . ''
: '' . ($isImage ? 'Изображение не выбрано' : 'Файл не выбран') . '';
return '' . $this->e($targetDir) . '