Помогите добить VideoGallery
Videogallery сохраняет в Json
core/components/videogallery/tv/tpl/tv.videoGallery.input.tpl
{"video":"https://rutube.ru/video/embed/xxxxxxx","videoId":"xxxxx",
"image":"/assets/videoGallery/01/xxxx.jpg",
"title":"Название","desc":"Описание","videoDuration":"PTxxMxxS"}Редактировать его кривыми ручками чревато, поэтому для редактирования по полям отредактировал и заменил файл core/components/videogallery/tv/tpl/tv.videoGallery.input.tpl, но при нажатии на кнопку «сохранить данные» из json массива удаляются video, image и videourl.core/components/videogallery/tv/tpl/tv.videoGallery.input.tpl
{$array = []}
{if !empty($tv->value)}
{$array = $modx->fromJSON($tv->value)}
{/if}
{if empty($array)}
{$array = ['video' => '','videoId' => '','image' => '','title' => '','desc' => '','videoDuration' => '']}
{/if}
{if is_array($array)}
{$array['title'] = htmlspecialchars($array['title'])}
{$array['desc'] = htmlspecialchars($array['desc'])}
{/if}
{$json = $modx->toJSON($array)}
<form id="tvForm_{$tv->id}" style="margin:0; padding:0;">
<div class="videogallery-wrapper">
<div class="videogallery-form">
<input type="text" id="vgUrl_{$tv->id}" class="videogallery-url" placeholder="Ссылка на видео для обработки"
value="{if isset($array['video'])}{$array['video']}{/if}">
<div>
<small>Вставьте в это поле ссылку на видео, чтобы её обработать.</small>
</div>
<div>
<small id="vgError_{$tv->id}" style="color:red"></small>
</div>
<div class="videogallery-video" id="vgVideo_{$tv->id}"></div>
<div class="videogallery-image" id="vgImage_{$tv->id}"></div>
<div class="clear"></div>
</div>
<div class="videogallery-fields">
<div>
<label><b>Заголовок видео:</b></label>
<input type="text" name="title" id="vgTitle_{$tv->id}"
value="{$array['title']|default:''}"
placeholder="Введите заголовок">
</div>
<div>
<label><b>Описание:</b></label>
<textarea name="desc" id="vgDesc_{$tv->id}" rows="3"
placeholder="Введите описание">{$array['desc']|default:''}</textarea>
</div>
<div>
<label><b>Ссылка на видео:</b></label>
<input type="url" name="video" id="vgVideo_{$tv->id}"
value="{$array['video']|default:''}"
placeholder="https://..." readonly
style="background:#f0f0f0;">
</div>
<div>
<label><b>ID видео:</b></label>
<input type="text" name="videoId" id="vgVideoId_{$tv->id}"
value="{$array['videoId']|default:''}"
placeholder="abc123xyz">
</div>
<div>
<label><b>Изображение-превью:</b></label>
<input type="url" name="image" id="vgImage_{$tv->id}"
value="{$array['image']|default:''}"
placeholder="https://...">
</div>
<div>
<label>Длительность видео в формате: <b>PTxxHxxMxxS</b></label>
<input type="text" name="videoDuration" id="vgVideoDuration_{$tv->id}"
value="{$array['videoDuration']|default:''}"
placeholder="PT1H20M30S">
</div>
</div>
</div>
</form>
<!-- Скрытое поле для MODX -->
<textarea name="tv{$tv->id}" id="tv{$tv->id}" style="display:true;">{$json}</textarea>
<!-- Кнопка сохранения -->
<div style="margin-top:15px">
<button type="button" onclick="compareAndSave('{$tv->id}')" style="padding:5px 15px;background:#007bff;color:white;border:none;cursor:pointer">
Сохранить данные
</button>
</div> Комментарии: 2
Функция сохранения
<script type="text/javascript">
// <![CDATA[
Ext.onReady(function () {
// Сохраняем исходные значения при загрузке
const originalValues = {
title: document.getElementById('vgTitle_{$tv->id}').value,
desc: document.getElementById('vgDesc_{$tv->id}').value,
video: document.getElementById('vgVideo_{$tv->id}').value,
videoId: document.getElementById('vgVideoId_{$tv->id}').value,
image: document.getElementById('vgImage_{$tv->id}').value,
videoDuration: document.getElementById('vgVideoDuration_{$tv->id}').value
};
window.compareAndSave = function(tvId) {
const currentValues = {
title: document.getElementById('vgTitle_' + tvId).value,
desc: document.getElementById('vgDesc_' + tvId).value,
video: document.getElementById('vgVideo_' + tvId).value,
videoId: document.getElementById('vgVideoId_' + tvId).value,
image: document.getElementById('vgImage_' + tvId).value,
videoDuration: document.getElementById('vgVideoDuration_' + tvId).value
};
// Проверяем, есть ли изменения
let hasChanges = false;
for (const key in currentValues) {
if (currentValues[key] !== originalValues[key]) {
hasChanges = true;
break;
}
}
if (!hasChanges) {
alert('Нет изменений для сохранения.');
return;
}
// Формируем новый JSON
const newJson = JSON.stringify(currentValues);
// Обновляем скрытое поле
document.getElementById('tv' + tvId).value = newJson;
// Сигнализируем MODX об изменении
if (typeof MODx !== 'undefined' && MODx.fireResourceFormChange) {
MODx.fireResourceFormChange();
}
alert('Данные сохранены!');
// Обновляем исходные значения (чтобы следующие изменения сравнивались корректно)
Object.assign(originalValues, currentValues);
};
// Интеграция с videoGalleryHandler
if (typeof vgHandlers !== 'undefined' && vgHandlers['{$tv->id}']) {
vgHandlers['{$tv->id}'].callbacks.success = function(resp) {
// Обновляем поля формы
document.getElementById('vgVideo_{$tv->id}').value = resp.object.video || '';
document.getElementById('vgVideoId_{$tv->id}').value = resp.object.videoId || '';
document.getElementById('vgImage_{$tv->id}').value = resp.object.image || '';
};
}
});
// ]]>
</script>
<style>
.videogallery-wrapper { padding:10px; border:1px solid #ddd; border-radius:4px; }
.videogallery-fields div { margin:10px 0; }
label { display:inline-block; width:120px; font-weight:bold; }
input,textarea { width:100%; padding:5px; box-sizing:border-box; }
</style>
Далее код оставил без изменений
<script type="text/javascript">
// <![CDATA[
{literal}
Ext.onReady(function () {
var fld = MODx.load({
{/literal}
xtype: 'textfield',
applyTo: 'tv{$tv->id}',
width: '99%',
id: 'tv{$tv->id}',
enableKeyEvents: true,
allowBlank: {if $params.allowBlank == 1 || $params.allowBlank == 'true'}true{else}false{/if},
value: '{$tv->value}',
{literal}
listeners: {'change': {fn: MODx.fireResourceFormChange, scope: this}},
});
Ext.getCmp('modx-panel-resource').getForm().add(fld);
MODx.makeDroppable(fld);
});
{/literal}
// ]]>
</script>
{$fields = [
'title' => $_config.videogallery_field_title,
'desc' => $_config.videogallery_field_desc,
'image' => $_config.videogallery_field_image,
'video' => $_config.videogallery_field_video,
'videoId' => $_config.videogallery_field_videoId,
'videoDuration' => $_config.videogallery_field_videoDuration
]}
{foreach from=$fields key=name item=item}
{if $item != ''}
{if substr($item, 0,3) == 'tv.'}
{$vg_fields[$name] = str_replace('tv.', '', $item)}
{$input_ids_data = "tv`$modx->getObject('modTemplateVar', ['name'=>$vg_fields[$name]] )->id`"}
{if $input_ids_data != 'tv' AND $input_ids_data != ''}
{$input_ids[$name] = $input_ids_data}
{/if}
{else}
{$vg_fields[$name] = $item}
{$input_ids[$name] = "modx-resource-`$vg_fields[$name]`"}
{/if}
{/if}
{/foreach}
<script type="text/javascript">
// <![CDATA[
Ext.onReady(function () {
if (typeof vgHandlers == 'undefined') {
vgHandlers = {
/* */
};
}
vgHandlers['{$tv->id}'] = new videoGalleryHandler({
tv: '{$tv->id}',
tvid: '{$tvid}',
resource: {$modx->resource->id},
actionUrl: MODx.config.assets_url + 'components/videogallery/connector.php?HTTP_MODAUTH=' + MODx.siteId + '&wctx=mgr&action=mgr/gallery/handle',
selectors: {
tvInput: '#tv{$tv->id}',
},
callbacks: {
success: function (resp) {
var element = {
/* */
};
element['{$tv->id}'] = {
/* */
};
{foreach from=$fields key=name item=field}
{if $field != '' AND $field != 'tv'}
if (resp.object.hasOwnProperty('{$name}')) {
element['{$tv->id}']['{$name}'] = document.querySelector('#{$input_ids[$name]}');
if (element['{$tv->id}']['{$name}']) {
element['{$tv->id}']['{$name}'].value = resp.object['{$name}'];
}
}
{/if}
{/foreach}
},
reset: function () {
var element = {
/* */
};
element['{$tv->id}'] = {
/* */
};
{foreach from=$fields key=name item=field}
{if $field != '' AND $field != 'tv'}
element['{$tv->id}']['{$name}'] = document.querySelector('#{$input_ids[$name]}');
if (element['{$tv->id}']['{$name}']) {
element['{$tv->id}']['{$name}'].value = '';
}
{/if}
{/foreach}
},
},
});
});
// ]]>
</script>
{* Fix "Smarty Compiler: Syntax error {/foreach} unclosed {foreach} tag" *}
{foreach from=$fields key=name item=field}
{/foreach}
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.