Помогите добить VideoGallery

Videogallery сохраняет в Json
{"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>
SYAN
Сегодня в 01:36
modx.pro
38
0

Комментарии: 2

SYAN
Сегодня в 01:38
0
Функция сохранения
<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>
    SYAN
    Сегодня в 01:40
    0
    Далее код оставил без изменений
    <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}
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      2