Здравствуйте всем! Мы разрабатываем такой компонент: зарегистрированный пользователь может создавать свои сборники, в которые может помещать свои материалы. В базе данных есть 2 таблицы: - chmos_compilations (для списка сборников) - chmos_compilations_articles (для создания связи между произведениями и сборниками) Мы написали плагин типа 'content' для вставки поля сборников, осталось в этом плагине написать код на событие onContentAfterSave для сохранения связи между материалом и сборником. ------------------------- Нам нужно получить данные, которые придут из формы. В них должен быть ID сборника. Потом сохранить этот полученный ID в таблицу chmos_compilations_articles вместе с ID материала. Подскажите, пожалуйста, как мы это можем сделать? Как эти данные получают?
1. почему делаете всё плагинами, если создаётся компонент, в компоненте это всё надо реализовывать 2. в модели компонента реализуется функция сохранения данных в которую сама системе передаёт все данные из формы 3. просто получить данные переданные формой можно из $_POST массива и где версия J? у всех разные функции для получения данных из POST
Хотим пояснить: мы ни разу не программисты. Общими усилиями пишем компонент. Решили (и это меняться уже не будет, плагин практически полностью написан) для для вставки поля сборников и сохранения связи между материалом и сборником написать для компонента плагин. Вот php-код нашего плагина. Нужно сюда, как мы и писали выше, добавить код на событие onContentAfterSave для сохранения связи между материалом и сборником. Код (PHP): <?php defined('_JEXEC') or die; class PlgContentChmosplugin extends JPlugin { protected $autoloadLanguage = true; public function __construct(& $subject, $config) { parent::__construct($subject, $config); JFormHelper::addFieldPath(__DIR__ . '/fields'); } public function onContentPrepareForm($form, $data) { if (!($form instanceof JForm)) { $this->_subject->setError('JERROR_NOT_A_FORM'); return false; } // Check we are manipulating a valid form if ($form->getName() !== 'com_content.article') { return true; } JForm::addFormPath(__DIR__ . '/forms '); $form->loadFile('compilations', false); } } Как нам отловить этот идентификатор сборника? С помощью JInput или как-то иначе?
тут \plugins\content\joomla\joomla.php хороший пример если не получится, то выложи форму которая передаётся в СОХРАНЕНИЕ нужны все передаваемые input что бы знать какие у них имена и если напишешь какие там данные будет вообще отлично
@woojin, вот код формы. Код (PHP): <?php // Запрет прямого доступа. defined('_JEXEC') or die; // Подключаем тип поля list. jimport('joomla.form.helper'); JFormHelper::loadFieldClass('list'); /** * Класс поля формы Compilation плагина chmosplugin. */ class JFormFieldCompilations extends JFormFieldList { /** * Тип поля. * * @var string */ protected $type = 'Compilations'; /** * Метод для получения списка опций для поля списка. * * @return array Массив JHtml опций. */ protected function getOptions() { // Получаем объект базы данных. $db = JFactory::getDbo(); // Конструируем SQL запрос. $query = $db->getQuery(true); $query->select('id, title') ->from('#__chmos_compilations') ->where('created_by = ' . (int) JFactory::getUser()->get('id')); $db->setQuery($query); $messages = $db->loadObjectList(); // Массив JHtml опций. $options = array(); if ($messages) { foreach($messages as $message) { $options[] = JHtml::_('select.option', $message->id, $message->title); } } $options = array_merge(parent::getOptions(), $options); return $options; } } Только мы не очень понимаем, что значит "передаётся в СОХРАНЕНИЕ"?
это не код формы, а обработка одного поля в котором создаётся набор опций для выпадающего списка я просил файл из каталога tmpl (вот так должен выглядеть путь до того файла который я просил): components\com_(имя компонента)\view\(какой то из видов)\tmpl\(файл шаблона с формой, скорее всего default).php просто форма
Нам нужно написать код на событие onContentAfterSave в плагине. Сам плагин стостоит из следующих файлов: 1. Папки language 2. Папки fields с файлом compilations.php 3. Папки forms с файлом compilations.xml 4. Файла chmosplugin.php 5. Файла chmosplugin.xml Что именно Вам скинуть?
сначала был компонент, теперь плагин - как то надо определиться! с какой формы этот плагин берёт данные? файл выложенный выше не создаёт форму, он создаёт только одно поле (с выпадающим списком) формы сама то форма где? я не могу ни чего посоветовать, не видя исходных данных, откуда и какие берутся данные не зная что передаёт форма, не возможно понять что именно надо получить P.S. а если так просто: "ну, нам надо получить...", тогда я написал выше, смотри переменную $_POST после отправки формы
@woojin, у нас есть компонент, который во фронтенде 1. Выводит форму для добавления сброрников пользователем 2. Выводит список сборников, созданных пользователем. Вот так выглядит список сборников А вот форма для добавления сборников: Нам нужно, чтобы пользователь мог не только создавать сборники, но и связывать их со своими материалами. Именно для этой связки мы и создали плагин (правильно это или нет - это уже дело десятое, мы исходим из того, что есть и из того, что сделано). Так вот, этот плагин в менеджере материалов выводит список сборников, который пользователь выбирает для своего материала. Нам нужно, добавить код на событие onContentAfterSave для сохранения связи между материалом и сборником. Вот как нам это сделать? Какие файлы Вам предоставить?
файл в котором форма с последнего скрина покажи, после этого я покажу что дёрнуть из POST правила п.1.7 хотя на ВЫ не запрещается
Вот файл, который относится к этой форме: Код (xml): <?xml version="1.0" encoding="utf-8"?> <form> <field name="compilations" type="compilations" required="true" label="PLG_CONTENT_CHMOSPLUGIN_FIELD_COMPILATIONS_LABEL" description="PLG_CONTENT_CHMOSPLUGIN_FIELD_COMPILATIONS_DESC" > <option value="">PLG_CONTENT_CHMOSPLUGIN_SELECT_COMPILATION</option> </field> </form> и вот ещё: Код (PHP): <?php // Запрет прямого доступа. defined('_JEXEC') or die; // Подключаем тип поля list. jimport('joomla.form.helper'); JFormHelper::loadFieldClass('list'); /** * Класс поля формы Compilation плагина chmosplugin. */ class JFormFieldCompilations extends JFormFieldList { /** * Тип поля. * * @var string */ protected $type = 'Compilations'; /** * Метод для получения списка опций для поля списка. * * @return array Массив JHtml опций. */ protected function getOptions() { // Получаем объект базы данных. $db = JFactory::getDbo(); // Конструируем SQL запрос. $query = $db->getQuery(true); $query->select('id, title') ->from('#__chmos_compilations') ->where('created_by = ' . (int) JFactory::getUser()->get('id')); $db->setQuery($query); $messages = $db->loadObjectList(); // Массив JHtml опций. $options = array(); if ($messages) { foreach($messages as $message) { $options[] = JHtml::_('select.option', $message->id, $message->title); } } $options = array_merge(parent::getOptions(), $options); return $options; } }
это чисто выпадающий список, а где поле с материалом, какое имя у этого поля? --- добавлено: 25.10.2015, первое сообщение размещено: 25.10.2015 --- Код (PHP): public function onContentAfterSave($context, $article, $isNew) { // Check we are handling the frontend edit form. if ($context != 'com_{имя компонента с формой}.form') { return true; } // Check this is a new article. if (!$isNew) { return true; } $db = JFactory::getDbo(); $query = $db->getQuery(true) ->insert($db->quoteName('#__{имя таблицы БД}')) ->columns($db->quoteName('compilations')) ->values($article->text); $db->setQuery($query); $result = $db->query(); return $result; } пробуй может другие "телепаты" смогут подсказать лучше, но по такому количеству данных, я смог понять что надо сохранить только такие данные
@woojin, СПАСИБО огромнющее!!! Вот Вы нас порадовали, так порадовали! Уходим пробовать. Результаты сообщим.
не уверен в результате, у формы значений намного больше: 1. вкладка МАТЕРИАЛЫ, не известно сколько там полей, которые надо сохранить 2. вкладка ПУБЛИКАЦИЯ, не знаю как названо поле со списком категорий, в нём id категорий должны быть, до и про compilation не уверен 3. вкладки ЯЗЫК и МЕТАДАННЫЕ, то же самое что и п.1. это всё из рубрики: "давайте сделаем правильно с тем что в чёрном ящике". а что в нём? а заглядывать нельзя! --- добавлено: 25.10.2015, первое сообщение размещено: 25.10.2015 --- а это было просмотрено:
@woojin, вот то, что мы отправили: Код (PHP): public function onContentAfterSave($context, $article, $isNew) { // Check we are handling the frontend edit form. if ($context != 'com_content.article') { return true; } // Check this is a new article. if (!$isNew) { return true; } $db = JFactory::getDbo(); $query = $db->getQuery(true) ->insert($db->quoteName('#__compilations_articles')) ->columns($db->quoteName('compilations')) ->values($article->text); $db->setQuery($query); $result = $db->query(); return $result; } Говорят, что в нашей таблице chmos_compilations_articles (для связи сборника с матералом) таблице два поля: `compilation_id` и `content_id`. Значит и вставлять нужно два значения, а не $article->text. ------------------------------------------------------------------------------------------- Для исправления запроса дают подсказку (кусочек теории): Класс JDatabaseQuery предоставляет несколько методов для вставки данных: insert(), columns() и values(). Код (PHP): // Получаем объект коннектора базы данных $db = JFactory::getDbo(); // Получаем объект запроса $query = $db->getQuery(true); // Колонки для вставки $columns = array( 'user_id', 'profile_key', 'profile_value', 'ordering' ); // Значения для вставки $values = array( 42, $db->quote('custom.message'), $db->quote('Вставка данных с помощью insert()'), 1 ); // Составляем запрос $query->insert($db->quoteName('#__user_profiles')) ->columns($db->quoteName($columns)) ->values(implode(',', $values)); // Устанавливаем и выполняем запрос $db->setQuery($query) ->execute(); И ещё дают совет - добавить отображение ошибки, чтобы было понятнее: Код (PHP): try { $db->setQuery($query)->execute(); } catch (RuntimeException $e) { $this->_subject->setError($e->getMessage()); return false; } return true; ----------------------------------------------------------------- Получается, нам надо запрос исправить: вместо $article->text нужно вставить значения compilation_id и content_id. --- добавлено: 25.10.2015, первое сообщение размещено: 25.10.2015 --- Вот, мы тут попробовали исправить код согласно замечаниям: Код (PHP): public function onContentAfterSave($context, $article, $isNew) { // Check we are handling the frontend edit form. if ($context != 'com_content.article') { return true; } // Check this is a new article. if (!$isNew) { return true; } $db = JFactory::getDbo(); $query = $db->getQuery(true) // Колонки для вставки $columns = array( 'compilation_id', 'content_id', ); // Значения для вставки $values = array( $db->quote('compilations'), $db->quote('Непонятно, что сюда вставлять'), ); // Составляем запрос $query->insert($db->quoteName('#__compilations_articles')) ->columns($db->quoteName($columns)) ->values(implode(',', $values)); // Устанавливаем и выполняем запрос $db->setQuery($query) ->execute(); } Не знаем, что с параметром $values делать... // Значения для вставки $values = array( $db->quote('compilations'), $db->quote('Непонятно, что сюда вставлять'), );
1. кому отправляли? 2. кто даёт подсказки? 3. приходящих в плагин данных вообще есть compilation_id и content_id или это так на обум сказано? если нет данных из п.3. тогда используй: Код (PHP): $jinput = JFactory::getApplication()->input; $compilation_id = $jinput->get('compilation_id', '{если надо, указать значение по умолчанию}', 'INT'); $content_id = $jinput->get('content_id', '{если надо, указать значение по умолчанию}', 'INT'); а потом полученные данные в массив $values
@woojin, спасибо за помощь. Если бы не Ваши подсказки, нам бы пришлось ещё долго возиться с плагином. Вы помогли нам сдвинуться с мёртвой точки. На данный момент мы этот плагин, наконец-таки, закончили, и он работает! =) Теперь нам осталось подкорректировать код нашего компонента, чтобы он выводил список сборников вместе с материалами, которые к ним относятся (сейчас компонент выводит просто список сборников, созданных пользователем).