Получить данные из формы

Тема в разделе "Программирование", создана пользователем mila, 23.10.2015.

  1. mila
    Offline

    mila Пользователь

    Регистрация:
    01.07.2015
    Сообщения:
    32
    Симпатии:
    0
    Пол:
    Женский
    Здравствуйте всем!
    Мы разрабатываем такой компонент: зарегистрированный пользователь может создавать свои сборники, в которые может помещать свои материалы.
    В базе данных есть 2 таблицы:
    - chmos_compilations (для списка сборников)
    - chmos_compilations_articles (для создания связи между произведениями и сборниками)

    Мы написали плагин типа 'content' для вставки поля сборников, осталось в этом плагине написать код на событие onContentAfterSave для сохранения связи между материалом и сборником.
    -------------------------
    Нам нужно получить данные, которые придут из формы. В них должен быть ID сборника. Потом сохранить этот полученный ID в таблицу chmos_compilations_articles вместе с ID материала.

    Подскажите, пожалуйста, как мы это можем сделать? Как эти данные получают?
     
  2.  
  3. woojin
    Offline

    woojin Местный Команда форума

    Регистрация:
    31.05.2009
    Сообщения:
    3 209
    Симпатии:
    335
    Пол:
    Мужской
    1. почему делаете всё плагинами, если создаётся компонент, в компоненте это всё надо реализовывать
    2. в модели компонента реализуется функция сохранения данных в которую сама системе передаёт все данные из формы
    3. просто получить данные переданные формой можно из $_POST массива

    и где версия J?
    у всех разные функции для получения данных из POST
     
    Последнее редактирование: 23.10.2015
    shurikkan нравится это.
  4. draff
    Offline

    draff Russian Joomla! Team Команда форума

    Регистрация:
    17.01.2011
    Сообщения:
    6 044
    Симпатии:
    519
    Пол:
    Мужской
  5. mila
    Offline

    mila Пользователь

    Регистрация:
    01.07.2015
    Сообщения:
    32
    Симпатии:
    0
    Пол:
    Женский
    Хотим пояснить: мы ни разу не программисты. Общими усилиями пишем компонент.
    Решили (и это меняться уже не будет, плагин практически полностью написан) для для вставки поля сборников и сохранения связи между материалом и сборником написать для компонента плагин.

    Вот php-код нашего плагина. Нужно сюда, как мы и писали выше, добавить код на событие onContentAfterSave для сохранения связи между материалом и сборником.
    Код (PHP):
    1. <?php
    2.  
    3. defined('_JEXEC') or die;
    4.  
    5. class PlgContentChmosplugin extends JPlugin
    6. {
    7.     protected $autoloadLanguage = true;
    8.  
    9.     public function __construct(& $subject, $config)
    10.     {
    11.         parent::__construct($subject, $config);
    12.  
    13.         JFormHelper::addFieldPath(__DIR__ . '/fields');
    14.     }
    15.  
    16.     public function onContentPrepareForm($form, $data)
    17.     {
    18.         if (!($form instanceof JForm))
    19.         {
    20.             $this->_subject->setError('JERROR_NOT_A_FORM');
    21.  
    22.             return false;
    23.         }
    24.  
    25.         // Check we are manipulating a valid form
    26.         if ($form->getName() !== 'com_content.article')
    27.         {
    28.             return true;
    29.         }
    30.  
    31.         JForm::addFormPath(__DIR__ . '/forms ');
    32.         $form->loadFile('compilations', false);
    33.     }
    34.  
    35.  
    36.  
    37. }

    Как нам отловить этот идентификатор сборника? С помощью JInput или как-то иначе?
     
  6. woojin
    Offline

    woojin Местный Команда форума

    Регистрация:
    31.05.2009
    Сообщения:
    3 209
    Симпатии:
    335
    Пол:
    Мужской
    тут \plugins\content\joomla\joomla.php хороший пример
    если не получится, то выложи форму которая передаётся в СОХРАНЕНИЕ
    нужны все передаваемые input что бы знать какие у них имена и если напишешь какие там данные будет вообще отлично
     
  7. mila
    Offline

    mila Пользователь

    Регистрация:
    01.07.2015
    Сообщения:
    32
    Симпатии:
    0
    Пол:
    Женский
    @woojin, вот код формы.
    Код (PHP):
    1. <?php
    2. // Запрет прямого доступа.
    3. defined('_JEXEC') or die;
    4.  
    5. // Подключаем тип поля list.
    6. jimport('joomla.form.helper');
    7. JFormHelper::loadFieldClass('list');
    8.  
    9. /**
    10.  * Класс поля формы Compilation плагина chmosplugin.
    11.  */
    12. class JFormFieldCompilations extends JFormFieldList
    13. {
    14.     /**
    15.     * Тип поля.
    16.     *
    17.     * @var string
    18.     */
    19.     protected $type = 'Compilations';
    20.  
    21.    
    22.     /**
    23.     * Метод для получения списка опций для поля списка.
    24.     *
    25.     * @return    array  Массив JHtml опций.
    26.     */
    27.     protected function getOptions()
    28.     {
    29.         // Получаем объект базы данных.
    30.         $db = JFactory::getDbo();
    31.  
    32.         // Конструируем SQL запрос.
    33.         $query = $db->getQuery(true);
    34.         $query->select('id, title')
    35.             ->from('#__chmos_compilations')
    36.             ->where('created_by = ' . (int) JFactory::getUser()->get('id'));
    37.         $db->setQuery($query);
    38.         $messages = $db->loadObjectList();
    39.  
    40.         // Массив JHtml опций.
    41.         $options = array();
    42.  
    43.         if ($messages)
    44.         {
    45.             foreach($messages as $message)
    46.             {
    47.                 $options[] = JHtml::_('select.option', $message->id, $message->title);
    48.             }
    49.         }
    50.  
    51.         $options = array_merge(parent::getOptions(), $options);
    52.  
    53.         return $options;
    54.     }
    55. }


    Только мы не очень понимаем, что значит "передаётся в СОХРАНЕНИЕ"?
     
    Последнее редактирование: 23.10.2015
  8. woojin
    Offline

    woojin Местный Команда форума

    Регистрация:
    31.05.2009
    Сообщения:
    3 209
    Симпатии:
    335
    Пол:
    Мужской
    это не код формы, а обработка одного поля в котором создаётся набор опций для выпадающего списка
    я просил файл из каталога tmpl (вот так должен выглядеть путь до того файла который я просил):
    components\com_(имя компонента)\view\(какой то из видов)\tmpl\(файл шаблона с формой, скорее всего default).php
    просто форма
     
  9. mila
    Offline

    mila Пользователь

    Регистрация:
    01.07.2015
    Сообщения:
    32
    Симпатии:
    0
    Пол:
    Женский
    Нам нужно написать код на событие onContentAfterSave в плагине.
    Сам плагин стостоит из следующих файлов:
    1. Папки language
    2. Папки fields с файлом compilations.php
    3. Папки forms с файлом compilations.xml
    4. Файла chmosplugin.php
    5. Файла chmosplugin.xml

    Что именно Вам скинуть?
     
  10. woojin
    Offline

    woojin Местный Команда форума

    Регистрация:
    31.05.2009
    Сообщения:
    3 209
    Симпатии:
    335
    Пол:
    Мужской
    сначала был компонент, теперь плагин - как то надо определиться!
    с какой формы этот плагин берёт данные?
    файл выложенный выше не создаёт форму, он создаёт только одно поле (с выпадающим списком) формы
    сама то форма где?

    я не могу ни чего посоветовать, не видя исходных данных, откуда и какие берутся данные

    не зная что передаёт форма, не возможно понять что именно надо получить

    P.S. а если так просто: "ну, нам надо получить...", тогда я написал выше, смотри переменную $_POST после отправки формы
     
  11. mila
    Offline

    mila Пользователь

    Регистрация:
    01.07.2015
    Сообщения:
    32
    Симпатии:
    0
    Пол:
    Женский
    @woojin, у нас есть компонент, который во фронтенде
    1. Выводит форму для добавления сброрников пользователем
    2. Выводит список сборников, созданных пользователем.

    Вот так выглядит список сборников
    9bf5a33cb455.png

    А вот форма для добавления сборников:
    835bc03e4f87.png

    Нам нужно, чтобы пользователь мог не только создавать сборники, но и связывать их со своими материалами. Именно для этой связки мы и создали плагин (правильно это или нет - это уже дело десятое, мы исходим из того, что есть и из того, что сделано). Так вот, этот плагин в менеджере материалов выводит список сборников, который пользователь выбирает для своего материала.
    a020f9a3b505.png
    Нам нужно, добавить код на событие onContentAfterSave для сохранения связи между материалом и сборником. Вот как нам это сделать?
    Какие файлы Вам предоставить?
     
  12. woojin
    Offline

    woojin Местный Команда форума

    Регистрация:
    31.05.2009
    Сообщения:
    3 209
    Симпатии:
    335
    Пол:
    Мужской
    файл в котором форма с последнего скрина покажи, после этого я покажу что дёрнуть из POST
    Оффтопик (не в тему) - жми сюда!
     
  13. mila
    Offline

    mila Пользователь

    Регистрация:
    01.07.2015
    Сообщения:
    32
    Симпатии:
    0
    Пол:
    Женский
    Вот файл, который относится к этой форме:
    Код (xml):
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <form>
    3.     <field
    4.        name="compilations"
    5.        type="compilations"
    6.        required="true"
    7.        label="PLG_CONTENT_CHMOSPLUGIN_FIELD_COMPILATIONS_LABEL"
    8.        description="PLG_CONTENT_CHMOSPLUGIN_FIELD_COMPILATIONS_DESC"
    9.    >
    10.         <option value="">PLG_CONTENT_CHMOSPLUGIN_SELECT_COMPILATION</option>
    11.     </field>
    12.    
    13.        
    14. </form>


    и вот ещё:

    Код (PHP):
    1. <?php
    2. // Запрет прямого доступа.
    3. defined('_JEXEC') or die;
    4.  
    5. // Подключаем тип поля list.
    6. jimport('joomla.form.helper');
    7. JFormHelper::loadFieldClass('list');
    8.  
    9. /**
    10.  * Класс поля формы Compilation плагина chmosplugin.
    11.  */
    12. class JFormFieldCompilations extends JFormFieldList
    13. {
    14.     /**
    15.     * Тип поля.
    16.     *
    17.     * @var string
    18.     */
    19.     protected $type = 'Compilations';
    20.  
    21.    
    22.     /**
    23.     * Метод для получения списка опций для поля списка.
    24.     *
    25.     * @return    array  Массив JHtml опций.
    26.     */
    27.     protected function getOptions()
    28.     {
    29.         // Получаем объект базы данных.
    30.         $db = JFactory::getDbo();
    31.  
    32.         // Конструируем SQL запрос.
    33.         $query = $db->getQuery(true);
    34.         $query->select('id, title')
    35.             ->from('#__chmos_compilations')
    36.             ->where('created_by = ' . (int) JFactory::getUser()->get('id'));
    37.         $db->setQuery($query);
    38.         $messages = $db->loadObjectList();
    39.  
    40.         // Массив JHtml опций.
    41.         $options = array();
    42.  
    43.         if ($messages)
    44.         {
    45.             foreach($messages as $message)
    46.             {
    47.                 $options[] = JHtml::_('select.option', $message->id, $message->title);
    48.             }
    49.         }
    50.  
    51.         $options = array_merge(parent::getOptions(), $options);
    52.  
    53.         return $options;
    54.     }
    55. }
     
  14. woojin
    Offline

    woojin Местный Команда форума

    Регистрация:
    31.05.2009
    Сообщения:
    3 209
    Симпатии:
    335
    Пол:
    Мужской
    это чисто выпадающий список, а где поле с материалом, какое имя у этого поля?
    --- добавлено: 25.10.2015, первое сообщение размещено: 25.10.2015 ---
    Код (PHP):
    1. public function onContentAfterSave($context, $article, $isNew)
    2.     {
    3.         // Check we are handling the frontend edit form.
    4.         if ($context != 'com_{имя компонента с формой}.form')
    5.         {
    6.             return true;
    7.         }
    8.  
    9.         // Check this is a new article.
    10.         if (!$isNew)
    11.         {
    12.             return true;
    13.         }
    14.  
    15.         $db = JFactory::getDbo();
    16.         $query = $db->getQuery(true)
    17.             ->insert($db->quoteName('#__{имя таблицы БД}'))
    18.             ->columns($db->quoteName('compilations'))
    19.             ->values($article->text);
    20.         $db->setQuery($query);
    21.         $result = $db->query();
    22.  
    23.         return $result;
    24.     }

    пробуй

    может другие "телепаты" смогут подсказать лучше, но по такому количеству данных, я смог понять что надо сохранить только такие данные
     
    Последнее редактирование: 25.10.2015
    mila нравится это.
  15. mila
    Offline

    mila Пользователь

    Регистрация:
    01.07.2015
    Сообщения:
    32
    Симпатии:
    0
    Пол:
    Женский
    @woojin, СПАСИБО огромнющее!!! Вот Вы нас порадовали, так порадовали!
    Уходим пробовать. Результаты сообщим.
     
  16. woojin
    Offline

    woojin Местный Команда форума

    Регистрация:
    31.05.2009
    Сообщения:
    3 209
    Симпатии:
    335
    Пол:
    Мужской
    не уверен в результате, у формы значений намного больше:
    1. вкладка МАТЕРИАЛЫ, не известно сколько там полей, которые надо сохранить
    2. вкладка ПУБЛИКАЦИЯ, не знаю как названо поле со списком категорий, в нём id категорий должны быть, до и про compilation не уверен
    3. вкладки ЯЗЫК и МЕТАДАННЫЕ, то же самое что и п.1.

    это всё из рубрики: "давайте сделаем правильно с тем что в чёрном ящике".
    а что в нём?
    а заглядывать нельзя!
    --- добавлено: 25.10.2015, первое сообщение размещено: 25.10.2015 ---
    а это было просмотрено:
     
  17. mila
    Offline

    mila Пользователь

    Регистрация:
    01.07.2015
    Сообщения:
    32
    Симпатии:
    0
    Пол:
    Женский
    @woojin, вот то, что мы отправили:

    Код (PHP):
    1. public function onContentAfterSave($context, $article, $isNew)
    2.     {
    3.         // Check we are handling the frontend edit form.
    4.         if ($context != 'com_content.article')
    5.         {
    6.             return true;
    7.         }
    8.  
    9.         // Check this is a new article.
    10.         if (!$isNew)
    11.         {
    12.             return true;
    13.         }
    14.  
    15.         $db = JFactory::getDbo();
    16.         $query = $db->getQuery(true)
    17.             ->insert($db->quoteName('#__compilations_articles'))
    18.             ->columns($db->quoteName('compilations'))
    19.             ->values($article->text);
    20.         $db->setQuery($query);
    21.         $result = $db->query();
    22.  
    23.         return $result;
    24.     }


    Говорят, что в нашей таблице chmos_compilations_articles (для связи сборника с матералом) таблице два поля: `compilation_id` и `content_id`. Значит и вставлять нужно два значения, а не $article->text.
    -------------------------------------------------------------------------------------------
    Для исправления запроса дают подсказку (кусочек теории):

    Класс JDatabaseQuery предоставляет несколько методов для вставки данных: insert(), columns() и values().
    Код (PHP):
    1. // Получаем объект коннектора базы данных
    2. $db = JFactory::getDbo();
    3.  
    4. // Получаем объект запроса
    5. $query = $db->getQuery(true);
    6.  
    7. // Колонки для вставки
    8. $columns = array(
    9. 'user_id',
    10. 'profile_key',
    11. 'profile_value',
    12. 'ordering'
    13. );
    14.  
    15. // Значения для вставки
    16. $values = array(
    17. 42,
    18. $db->quote('custom.message'),
    19. $db->quote('Вставка данных с помощью insert()'),
    20. 1
    21. );
    22.  
    23. // Составляем запрос
    24. $query->insert($db->quoteName('#__user_profiles'))
    25. ->columns($db->quoteName($columns))
    26. ->values(implode(',', $values));
    27.  
    28. // Устанавливаем и выполняем запрос
    29. $db->setQuery($query)
    30. ->execute();


    И ещё дают совет - добавить отображение ошибки, чтобы было понятнее:
    Код (PHP):
    1. try
    2. {
    3. $db->setQuery($query)->execute();
    4. }
    5. catch (RuntimeException $e)
    6. {
    7. $this->_subject->setError($e->getMessage());
    8. return false;
    9. }
    10.  
    11. return true;

    -----------------------------------------------------------------

    Получается, нам надо запрос исправить: вместо $article->text нужно вставить значения compilation_id и content_id.
    --- добавлено: 25.10.2015, первое сообщение размещено: 25.10.2015 ---
    Вот, мы тут попробовали исправить код согласно замечаниям:

    Код (PHP):
    1. public function onContentAfterSave($context, $article, $isNew)
    2.    {
    3.        // Check we are handling the frontend edit form.
    4.        if ($context != 'com_content.article')
    5.        {
    6.            return true;
    7.        }
    8.  
    9.        // Check this is a new article.
    10.        if (!$isNew)
    11.        {
    12.            return true;
    13.        }
    14.          
    15.  
    16.        $db = JFactory::getDbo();
    17.        $query = $db->getQuery(true)
    18.    
    19.       // Колонки для вставки
    20.       $columns = array(
    21.             'compilation_id',
    22.             'content_id',
    23.             );
    24.          
    25.         // Значения для вставки
    26.         $values = array(
    27.         $db->quote('compilations'),
    28.         $db->quote('Непонятно, что сюда вставлять'),
    29.         );
    30.    
    31.       // Составляем запрос
    32.         $query->insert($db->quoteName('#__compilations_articles'))
    33.             ->columns($db->quoteName($columns))
    34.             ->values(implode(',', $values));
    35.  
    36.         // Устанавливаем и выполняем запрос
    37.         $db->setQuery($query)
    38.             ->execute();
    39.          
    40.      
    41.  
    42.    
    43.    }


    Не знаем, что с параметром $values делать...

    // Значения для вставки
    $values = array(
    $db->quote('compilations'),
    $db->quote('Непонятно, что сюда вставлять'),
    );
     
  18. woojin
    Offline

    woojin Местный Команда форума

    Регистрация:
    31.05.2009
    Сообщения:
    3 209
    Симпатии:
    335
    Пол:
    Мужской
    1. кому отправляли?
    2. кто даёт подсказки?
    3. приходящих в плагин данных вообще есть compilation_id и content_id или это так на обум сказано?

    если нет данных из п.3. тогда используй:
    Код (PHP):
    1. $jinput = JFactory::getApplication()->input;
    2. $compilation_id = $jinput->get('compilation_id', '{если надо, указать значение по умолчанию}', 'INT');
    3. $content_id = $jinput->get('content_id', '{если надо, указать значение по умолчанию}', 'INT');

    а потом полученные данные в массив $values
     
  19. mila
    Offline

    mila Пользователь

    Регистрация:
    01.07.2015
    Сообщения:
    32
    Симпатии:
    0
    Пол:
    Женский
    @woojin, спасибо за помощь. Если бы не Ваши подсказки, нам бы пришлось ещё долго возиться с плагином. Вы помогли нам сдвинуться с мёртвой точки.
    На данный момент мы этот плагин, наконец-таки, закончили, и он работает! =)
    Теперь нам осталось подкорректировать код нашего компонента, чтобы он выводил список сборников вместе с материалами, которые к ним относятся (сейчас компонент выводит просто список сборников, созданных пользователем).
     

Поделиться этой страницей

Загрузка...