Новости Joomla

0 Пользователей и 1 Гость просматривают эту тему.
  • 30 Ответов
  • 2018 Просмотров
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Доброго дня!

Буквально темой ниже разобрался как создавать динамические поля для элемента (в моем случае - товара). Разобрался как читать значения и присваивать их полю.
Сейчас встал вопрос о сохранении этих значений. Первое что я сделал - это пошел и посмотрел переменную $data в методе save модели элемента (товара). Ни полей, ни их значений в $data нет.

Где они?

Ссылка на тему создания динамических полей и чтения в поля значений [РЕШЕНО] Присвоить значения динамическому полю SimpleXMLElement
« Последнее редактирование: 11.11.2019, 15:11:14 от platonische »
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Посмотрел input - данные в jform о полях есть.
Где происходит обработка jform данных в $data?
*

sivers

  • Живу я здесь
  • 2453
  • 333 / 0
Посмотрите события плагинов группы Content:
Спойлер
[свернуть]
Там есть все, что может Вам пригодиться:
onContentPrepareForm - подготовка формы. Именно здесь удобно добавлять/менять/удалять поля формы редактирования объекта.
onContentBeforeSave и onContentAfterSave - вызываются перед и после сохранения данных, соответственно.
onContentPrepareData - подготовка данных перед выдачей
и другие, которые могут быть полезны.

Все стандартные компоненты Joomla вызывают эти события и позволяют легко делать "динамические изменения элементов". Если ваш компонент писан по канонам Joomla, то он тоже должен вызывать эти события. Имеется свой плагин, который можно рассматривать как пример, но думаю, что и без него разберетесь.
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Я не понял почему стоит посмотреть в сторону событий плагина? Динамические поля создаются в самом приложении.
Все что я сейчас нашел это метод save контролера JControllerForm. Именно он занимается этим.
Пытаюсь читать его...
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Итак, читаю libraries\src\MVC\Controller\FormController.php метод save. Именно он используется в контроллере в качестве родительского save.
Что я подметил важного? приводить буду те куски которые относятся к формированию data
Код
...
$data  = $this->input->post->get('jform', array(), 'array');
...
                // Validate the posted data.
// Sometimes the form needs some posted data, such as for plugins and modules.
$form = $model->getForm($data, false);
...
                // Send an object which can be modified through the plugin event
$objData = (object) $data;
$app->triggerEvent(
'onContentNormaliseRequestData',
array($this->option . '.' . $this->context, $objData, $form)
);
$data = (array) $objData;
...
                // Test whether the data is valid.
$validData = $model->validate($form, $data);
...
                // Attempt to save the data.
if (!$model->save($validData)) и тд....


Тут видно и внедрение плагина и то что данные анализируются по форме - $validData = $model->validate($form, $data);
продолжаем поиски в model->validate()
Если есть у кого мысли - прошу - высказывайтесь.
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Плагины нужны для вмешательства в код чужого расширения. Здес речь шла о вашем собственном, вам нужно  переопределить родительские методы.
А тут-то
Код
$data  = $this->input->post->get('jform', array(), 'array');
есть ваши поля?
Не будь паразитом, сделай что-нибудь самостоятельно!
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
*

Director.Gq

  • Осваиваюсь на форуме
  • 33
  • 1 / 1
Я так понимаю в вашем контроллере тоже есть публичный метод save.
*

Director.Gq

  • Осваиваюсь на форуме
  • 33
  • 1 / 1
Тогда другой вопрос а в базе данных...
Какое поле вы пытаетесь Сохранить свои поля. ??
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Да тут есть
Тогда отследите, с какого места их не станет. Возможно, после валидации.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

Director.Gq

  • Осваиваюсь на форуме
  • 33
  • 1 / 1
Цитировать
Тогда отследите, с какого места их не станет. Возможно, после валидации.
Я не думаю что их не станет после валидации.
*

Director.Gq

  • Осваиваюсь на форуме
  • 33
  • 1 / 1
В общем контроллере вашего вида.
Должен также быть метод save который переопределяет родительский метод.
И после всех преобразований Вы должны вызвать родительский метод save. Коротко это выглядит так.
Код: php
public function save($key = null, $urlVar = null)
{
     $saved = parent::save($key, $urlVar);
}
*

passer

  • Завсегдатай
  • 1013
  • 75 / 3
$model->save($validData)
Может в модели посмотреть? С БД модель работает.
*

Director.Gq

  • Осваиваюсь на форуме
  • 33
  • 1 / 1
Просто если Поля динамические то под них не выделяется одно поле в базе для каждого поля.
Обычно данные из этих полей хранятся в базе данных поле TEXT.
Вам нужна ваша методе контроллером save.
Поймать ваши динамические поля и перевести в json.
 Выглядеть это будет примерно так. 
Код: php
public function save($key = null, $urlVar = null)
{
   $data  = $this->input->post->get('jform', array(), 'array');
   $dataDinamicDield = json_encode($data['dataDinamicDield']) ;
   $this->input->post->set('dataDinamicDield', $dataDinamicDield );

   $saved = parent::save($key, $urlVar);   
}
« Последнее редактирование: 08.11.2019, 14:56:05 от Director.Gq »
*

Director.Gq

  • Осваиваюсь на форуме
  • 33
  • 1 / 1
Может и модель но правильно это делать в контроллере.
*

Viclingvolive

  • Осваиваюсь на форуме
  • 31
  • 2 / 1
Цитировать
Да тут есть
Вы бы хотя бы принт предоставили какой у вас вывод этих данных.
И в какое поле вы хотите сохранить.
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Итак собираю все запрошенные данные
Итак выводы данных из метода save родительского контроллера FormController (прям в ядре поставил выводы)
итак $data имеет мои поля - смотрим
Спойлер
[свернуть]
Теперь смотрим $validData
Спойлер
[свернуть]
по счетчику уже видно что не хватает 5 полей. Секцию rules почистил чтоб не листать ее.

Я так понимаю в вашем контроллере тоже есть публичный метод save.
В моем контроллере метода save нет.

Какое поле вы пытаетесь Сохранить свои поля. ??
Поля выделил жирным. Про БД пока речи не идет. Эти динамические поля пойдут в др. таблицу (потому они и динамические)
В общем контроллере вашего вида.
Должен также быть метод save который переопределяет родительский метод.
И после всех преобразований Вы должны вызвать родительский метод save. Коротко это выглядит так.
Этого метода у меня нет, т.к. переопределять ничего не собирался пока в нем. У меня есть переопределенный метод save в моделе -> там я и собирался работать с поступающими данными, а их там нет.
Просто если Поля динамические то под них не выделяется одно поле в базе для каждого поля.
Обычно данные из этих полей хранятся в базе данных поле TEXT.
Вам нужна ваша методе контроллером save.
Поймать ваши динамические поля и перевести в json.
 Выглядеть это будет примерно так. 
Эту вещь я решил чуть по другому. У меня есть таблицы для хранения данных динамических полей и повторюсь, пока до БД дело то не дошло, еще нет данных.

Ну и как спрашивалось данные различаются сразу после метода validate
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
проверил значение $form в родительском методе save из FormController
в форме нет динамических полей...
хотя получение происходит $form = $model->getForm($data, false); какой getForm тут берется? если из модели моей (по умолчанию она и должна быть) то я же там добавил элементы формы - поля...
П.С.: $model проверил - имя модели мое.
« Последнее редактирование: 08.11.2019, 15:51:06 от platonische »
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Значит, что-то не так с вашим getForm().
Не будь паразитом, сделай что-нибудь самостоятельно!
*

Viclingvolive

  • Осваиваюсь на форуме
  • 31
  • 2 / 1
А ну да у вас неправильно форма отправляет данные.
Скорее всего в форме ваши поля приблизительно выглядят так.
<input type="text" value="" name='1' />
А должно быть что-то вроде этого.
<input type="text" value="" name='dinamic_field[color][]' />
<input type="text" value="" name='dinamic_field[country][]' />
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
А ну да у вас неправильно форма отправляет данные.
Скорее всего в форме ваши поля приблизительно выглядят так.
<input type="text" value="" name='1' />
А должно быть что-то вроде этого.
<input type="text" value="" name='dinamic_field[color][]' />
<input type="text" value="" name='dinamic_field[country][]' />

Данные всех полей приходят и доступны во входящем потоке, но их нет в переменной data. Сейчас я не за компом, но есть подозрение на параметр false в вызове getform из родительского контроллера, возможно формат result отличается
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
подозрение на параметр false в вызове getform из родительского контроллера
Нет этот параметр loadData не повлиял.
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Видимо я нашел.
В фале модели models/cake.php есть вот такое
Код
protected $item_propvalues;
...
public function getItem( $id = null ) {
....

            $model_propvalues = JModelLegacy::getInstance( $name = 'Propvalues', $prefix = 'MyCompModel' );  // Взяли модель
            $propvalues = $model_propvalues->getItemsByProductId($item->id); // Получаем значения свойств конкретного продукта

            foreach ($propvalues as $value){
                $f_name = $value->prop_id;
                $f_value = $value->prop_value;
                $item->$f_name = $f_value;
                $this->item_propvalues->$f_name = $f_value; // Добавили данные свойств в общедоступный объект (нужно для getForm setValue)
            }
...
}

public function getForm( $data = array( ), $loadData = true ) {
...
foreach ($name_array as $name)
        {
            if (isset($this->item_propvalues->$name))
            {
                $form->setValue($name,null, $this->item_propvalues->$name);
            }
        }
...
}

Т.е. поля есть, а значения этих полей выставляется по содержимому $this->item_propvalues и вот как раз это содержимое в запросе от родителя не доступно.
*

fsv

  • Живу я здесь
  • 2765
  • 402 / 2
Цитировать
Этого метода у меня нет, т.к. переопределять ничего не собирался пока в нем. У меня есть переопределенный метод save в моделе -> там я и собирался работать с поступающими данными, а их там нет.
И не будет. То, что в моделе $data, в контроллере $validData. А валидацию не пройдет, т.к. в xml-ке полей нет.
Как вам уже советовали, переопределите в контроллере save, в нем словите из реквеста поля, сохраните, вызовите parent.
Веб-разработка: заказ. Только новая объемная разработка. Качественно, дорого.
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
И не будет. То, что в моделе $data, в контроллере $validData. А валидацию не пройдет, т.к. в xml-ке полей нет.
Как вам уже советовали, переопределите в контроллере save, в нем словите из реквеста поля, сохраните, вызовите parent.
Если это так, то я могу и в модели словить реквест - он там полный, со всеми значениями. Думалось мне что тут что-то по феншую можно было заточить.

ПС: и опять же что значит в xml полей нет? в файле формы вида нет, но в методе они добавляются, а валидатор запрашивает именно из этого метода. Так что не однозначно, если только не проверено на личном опыте...
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
$this->item_propvalues и вот как раз это содержимое в запросе от родителя не доступно
Не так.
Дело в том, что JModelLegacy::getInstance() всегда создает новый объект модели, а ваши item_propvalues зависят от getItem(), который не был вызван.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

Viclingvolive

  • Осваиваюсь на форуме
  • 31
  • 2 / 1
Цитировать
Если это так, то я могу и в модели словить реквест - он там полный, со всеми значениями.
Я так думаю что модель вам нужно Если вы собираетесь отсылать какой-то конкретный ответ или страницу или Редирект.
А вообще без разницы делайте или в контроллере или в модели. !

Наверное даже в модели будет правильнее Для Joomla.
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Не так.
Дело в том, что JModelLegacy::getInstance() всегда создает новый объект модели, а ваши item_propvalues зависят от getItem(), который не был вызван.
Пробовал занести получение значение данной переменной в метод getform - результата не дало. Ещё есть вызов хелпера который генерит строку XML в его вызове может ещё что-то зарыто?
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Продолжаю поиски... читайте, пинайте, критикуйте, подсказывайте ))))

Собственно отладчик я еще тот, но начал делать следующее:
- Раз вызывается метод getForm - ковыряем его.
- Останавливаю метод getForm в моменте сохранения (т.е. ставлю exit; только в тех случаях когда я уже в редакторе элемента и есть возможность нажать на save)
- Пошел построчно выводить echo и var_dump переменных. И вот что нарыл:

нет переменной $item_id = $this->state->get('cake.id'); //Получили id элемента
от которой в дальнейшем пляшут все динамические поля!

Проверил входящий поток переменную $data(в методе getForm) - в ней нет параметра id.
Вопрос: Где взять id?

П.С.: для тех кто не все прочитал...
$item_id = $this->state->get('cake.id'); - существует когда я загружаю элемент на редактирование
$item_id = $this->state->get('cake.id'); - не существует когда метод вызывается в рамках валидации ( $model->validate($form,$data) ) данных родительским методом save контроллера FormController


*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Извиняюсь в $data есть id.
Смотрю дальше - позже отпишусь
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Счётчик полей в админке модуля

Автор zeus07

Ответов: 9
Просмотров: 557
Последний ответ 28.06.2021, 13:40:31
от zeus07
[РЕШЕНО] Дублирование при создании

Автор platonische

Ответов: 7
Просмотров: 921
Последний ответ 12.02.2021, 11:24:26
от platonische
[РЕШЕНО] onChange в админке на field modal

Автор platonische

Ответов: 1
Просмотров: 378
Последний ответ 30.01.2021, 16:40:45
от platonische
Событие: сохранение настроек плагина

Автор anatol81n

Ответов: 2
Просмотров: 661
Последний ответ 29.01.2021, 07:17:45
от voland
[РЕШЕНО] Присвоить значения динамическому полю SimpleXMLElement

Автор platonische

Ответов: 4
Просмотров: 753
Последний ответ 08.11.2019, 11:13:27
от platonische