instantsoft / icms2

Self-hosted Site Management System
https://instantcms.ru
GNU General Public License v2.0
294 stars 120 forks source link

Поле файл в форме в админке #1363

Closed asnenne closed 2 years ago

asnenne commented 2 years ago

Используемая версия InstantCMS: 2.14.2

Не работает поле "Файл" в форме компонента в админке. Сохраняет данные в бд в json и дальше, при редактировании, выдает ошибку.

Перевел в yaml, сохраняет нормально. При редактировании поле заполнено. Но при повторном сохранении оно уже пустое.

Такая же беда с полем Изображение. Но оно при изменении формата на yaml работает нормально.

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

Возможно я что-то делаю не так, документации-то нет совсем по этому поводу. Но проблема давняя и острая.

Спасибо.

fuzegit commented 2 years ago

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

asnenne commented 2 years ago

Добавить поле файл в форму компонента в админке и попробовать загрузить файл в этом поле.

<?php class formControllerAction extends cmsForm {
    public function init($do, $id) {
        return array(
            'basic' => array(
                'title' => '',
                'type' => 'fieldset',
                'childs' => array(
                    new fieldFile('file_x', array(
                        'title' => 'Файл'
                    ))
                )
            )
        );
    }
}

После этого открыть форму, выбрать в поле файл и сохранить.

fuzegit commented 2 years ago

Никаких проблем

Выделение_010

fuzegit commented 2 years ago

В экшенах контроллеров в админке всё так же работает без проблем, см. "Генератор RSS"

fuzegit commented 2 years ago

Полагаю, что вы при сохранении формы сохраняете в json, а потом, при выборке из базы конвертируете в Ямл.

asnenne commented 2 years ago

1 2 Вот такая вот картина получается. Наверное я на самом деле что-то делаю не правильно. Полагаю, что вы при сохранении формы сохраняете в json Я просто добавил форму и просто ее пытаюсь сохранить))

fuzegit commented 2 years ago

https://github.com/instantsoft/icms2/blob/master/system/core/model.php#L2227

Есть четыре функции: две для ямл и две для json. По умолчанию массивы с формы сохраняются в ямле. Но могут сохраняться и в json https://github.com/instantsoft/icms2/blob/master/system/core/formfield.php#L502

fuzegit commented 2 years ago

Вот такая вот картина получается. Наверное я на самом деле что-то делаю не правильно.

Полагаю, да)

Я просто добавил форму и просто ее пытаюсь сохранить

Она и сохраняется.

В общем без всего кода сказать сложно, что там у вас.

asnenne commented 2 years ago

Не пытался я сохранить в yaml

if ($do == 'add') {

    $this->model->insert('sales_versions', $ver, true);

} else {

    $this->model->update('sales_versions', $id, $ver, false, true);

}
asnenne commented 2 years ago

Обычный код, ничего особенного)) И такая же беда с полем Изображение. Но там костылями выкрутился, а с файлом не получается ничего.

fuzegit commented 2 years ago

Не пытался я сохранить в yaml

Вы сохраняете в JSON.

Выделение_011 Выделение_012

Уберите последние аргументы и всё у вас будет ок.

asnenne commented 2 years ago

Этот аргумент отвечает за перевод в yaml? Я знал, что истина где-то рядом)))

Спасибо.

asnenne commented 2 years ago

Сообщения почищу, пожалуй))

fuzegit commented 2 years ago

Этот аргумент отвечает за перевод в yaml

Нет, за json. Еще раз: по умолчанию массивы в ямл. Но можно и в json, используя аргумент $array_as_json.

asnenne commented 2 years ago

Да, в json

asnenne commented 2 years ago

Но не всё хорошо)). Файл загрузился, при редактировании он в форме. Но при повторном сохранении пропадает.

asnenne commented 2 years ago

В общем-то в этом и была проблема. Когда я его в json перевел, я его назад потом вернул)) А вот повторно сохранить так и не смог.

fuzegit commented 2 years ago

Файл загрузился, при редактировании он в форме. Но при повторном сохранении пропадает.

Это баг, да. Починю.

asnenne commented 2 years ago

С изображением нормально всё теперь, а вот с файлом беда))

fuzegit commented 2 years ago

/system/core/backend.php

в public function actionOptions(){

$options = array_merge($options, $form->parse($this->request, true));

заменить на

$options = array_merge($options, $form->parse($this->request, true, $options));

asnenne commented 2 years ago

Спасибо. Но не помогло))

fuzegit commented 2 years ago

Но не помогло))

Я про общие настройки компонентов :)

В вашем случае

$ver = $form->parse($this->request, true, $ver);

Т.е. при редактировании в экшене в parse третьим аргументом надо передавать существующие данные.

asnenne commented 2 years ago

Помогло, спасибо!)) Если добавить вот это 1

asnenne commented 2 years ago

Еще раз спасибо!))