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

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Re: Создание папок из фронтенда
« Ответ #180 : 21.10.2015, 09:44:53 »
Поправка - нужно использовать событие onContentAfterSave, потому что в onContentBeforeSave не доступен ID материала, если он новый.
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #181 : 22.10.2015, 01:38:18 »
Странно: что-то у нас с языковыми файлами не ладится. Срабатывает почему-то только ru-RU.plg_content_chmosplugin.sys.ini, а ru-RU.plg_content_chmosplugin.ini упорно не поддаётся.

Для добавления языковых файлов мы создали папку language, в которой создали 2 папки: en-GB и ru-RU.
В папке en-GB создали 2 языковых файла:
1. en-GB.plg_content_chmosplugin.ini
2. en-GB.plg_content_chmosplugin.sys.ini
В папке ru-RU создали 2 языковых файла:
1. ru-RU.plg_content_chmosplugin.ini
2. ru-RU.plg_content_chmosplugin.sys.ini

Так вот, ru-RU.plg_content_chmosplugin.sys.ini работает...
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #182 : 22.10.2015, 01:48:16 »
... а ru-RU.plg_content_chmosplugin.ini - нет.
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #183 : 22.10.2015, 01:55:52 »
Содержание ru-RU.plg_content_chmosplugin.ini:
PLG_CONTENT_CHMOSPLUGIN_FIELD_COMPILATIONS_LABEL="Ваши сборники"
PLG_CONTENT_CHMOSPLUGIN_FIELD_COMPILATIONS_DESK="Выберете сборник"

...В папке forms плагина содержится файл compilations.xml.
Вот содержание этого файла
Спойлер
[свернуть]

В этом файле мы обратили внимание на строки
label="PLG_CONTENT_CHMOSPLUGIN_FIELD_COMPILATIONS_LABEL"
description="PLG_CONTENT_CHMOSPLUGIN_FIELD_COMPILATIONS_DESC"


Может быть, в этом файле нужно вносить какие-то изменения, - подключать наш языковой файл? Подскажите, пожалуйста, а то мы уже раз 6 наш плагин переустанавливали, вносили изменения - всё бестолку. 
*

JLang

  • Захожу иногда
  • 103
  • 19 / 0
Re: Создание папок из фронтенда
« Ответ #184 : 22.10.2015, 05:52:07 »
Странно: что-то у нас с языковыми файлами не ладится.

Попробовать добавить в public function __construct файла chmosplugin.php
Код
JPlugin::loadLanguage('plg_content_chmosplugin');
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Re: Создание папок из фронтенда
« Ответ #185 : 22.10.2015, 07:04:44 »
Попробовать добавить в public function __construct файла chmosplugin.php
Код
JPlugin::loadLanguage('plg_content_chmosplugin');
Можно проще - добавить
Код: php
protected $autoloadLanguage = true;

Смотрим плагин профиля
https://github.com/joomla/joomla-cms/blob/staging/plugins/user/profile/profile.php#L33

У меня в материале о создании плагина этого нет, потому что для фронта не используется. Добавлю этот момент.

mila_serdnaya - Вам нужно стараться проявлять смекалку. Что-то не получается, смтрите как в других компонента/плагинах сделано. Я Вам не будут вечно помогать...
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #186 : 22.10.2015, 17:11:22 »
Урра! Получилось!

Сначала у нас почему-то только одна строка перевелась, а другая - нет:

*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #187 : 22.10.2015, 17:24:20 »
Но затем мы проявили смекалку) и добавили в файл ru-RU.plg_content_chmosplugin.ini строку PLG_CONTENT_CHMOSPLUGIN_SELECT_COMPILATION="Выберете сборник"

И теперь всё работает:
« Последнее редактирование: 22.10.2015, 17:54:21 от mila_serdnaya »
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #188 : 22.10.2015, 17:47:27 »
JLang, спасибо за подсказку.

b2z, использовать решили Ваш код. Спасибо, самостоятельно мы с этим вопросом не справились бы.
Насчёт смекалки услышали Вас, поняли.
----------------------------------------
Сейчас переходим к связыванию сборника с пользователем. Изучаем информацию, которую порекомендовал автор b2z.
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #189 : 25.10.2015, 01:54:45 »
Вот, написали-таки код на событие onContentAfterSave, чтобы связать сборник с пользователем. В таблице chmos_compilations_articles никаких изменений нет. Код не срабатывает. Посмотрите, пожалуйста, что мы не так делаем:

Код
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('#__chmos_compilations_articles'))
            ->columns($db->quoteName('compilations'))
            ->values($article->text);
        $db->setQuery($query);
        $result = $db->query();
 
        return $result;
    }

*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Re: Создание папок из фронтенда
« Ответ #191 : 25.10.2015, 08:43:20 »
Fedor Vlasenko - название таблицы верно, а вот запрос на вставку - нет.

В таблице два поля: `compilation_id` и `content_id`. Значит и вставлять нужно два значения, и уж никак не $article->text.

mila_serdnaya - проявите сообразительность и исправьте запрос.

Совет - добавьте отображение ошибки, чтобы было понятнее:

Код: php
try
{
$db->setQuery($query)->execute();
}
catch (RuntimeException $e)
{
$this->_subject->setError($e->getMessage());
return false;
}

return true;
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #192 : 25.10.2015, 13:05:51 »
b2z, мы прошли по ссылке, которую Вы указали. У нас получается пока что следующее:
Спойлер
[свернуть]
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #193 : 25.10.2015, 13:22:10 »
Два часа уже пытаемяся разобраться с переменной $values, перелопатили половину интернета, как же нам получить id материала, который мы создаём (редактируем) и как же получить id сборника, который пользователь выбирает.
Додумались мы только до этого:
// Значения для вставки
      $values = array(
      $db->quote('compilations'),
      $db->quote(' . $this->db->q( $id ). '),
      );

Мысль-то хоть у нас верная, подскажите, пожалуйста!
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #195 : 25.10.2015, 21:29:35 »
b2z, оставшийся день мы искали информацию о том, как же нам получить  id материала, как можно использовать $article. Мы посмотрели и Joomla.php, и wssdoc.php, и profile.php - практически все компоненты и плагины Joomla.
Также мы перечитали Ваши статьи на joomlablog.ru (замечательные статьи - автор Dmitry Rekun, нам они очень помогли), поискали ответы у людей, которые с кодом работают...

Вот, что мы нашли:

$article_id = JFactory::getApplication()->input->get('id');

и ещё вот это:

$id = JFactory::getApplication()->input->getInt('id');
$article->load($id); // Get Article

Этот код нам поможет?
« Последнее редактирование: 25.10.2015, 21:42:35 от mila_serdnaya »
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #196 : 25.10.2015, 21:39:47 »
Но вот как эту информацию в $values правильно прикрепить, мы не знаем. Ну не программисты мы. Может быть, так?

      $values = array(
      $db->quote('compilations'),
      $db->quote(' . $article->id. '),
      );
« Последнее редактирование: 25.10.2015, 21:43:49 от mila_serdnaya »
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Создание папок из фронтенда
« Ответ #197 : 25.10.2015, 22:04:36 »
$values = array(
      $db->quote('compilations'),
      $article->id,
);
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Re: Создание папок из фронтенда
« Ответ #198 : 25.10.2015, 22:43:10 »
Код: php
// Данные формы
$formData = JFactory::getApplication()->input->get('jform', array(), 'array');

$values = array(
    (int) $formData['compilations'],
    $article->id
);

И таблица у Вас #__chmos_compilations_articles, а не #__compilations_articles.
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #199 : 25.10.2015, 23:40:44 »
Спасибо, что не оставляете нас. Мы ценим Вашу помощь и терпение.
-------------------------------------
Наш код на событие теперь выглядит так:

Код
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;
       }


try
{
$db->setQuery($query)->execute();
}
catch (RuntimeException $e)
{
$this->_subject->setError($e->getMessage());
return false;
}
 
return true;


$db = JFactory::getDbo();
$query = $db->getQuery(true)
   
   // Колонки для вставки
   $columns = array(
'compilation_id',
'content_id',
);

// Значения для вставки
$values = array(
        $article->compilations,
        $article->id,
        );
   
   // Составляем запрос
$query->insert($db->quoteName('#__compilations_articles'))
->columns($db->quoteName($columns))
->values(implode(',', $values));

// Устанавливаем и выполняем запрос
$db->setQuery($query)
->execute();
       
}
 

Мы переустановили плагин - у нас компьютер пишет:
Parse error: syntax error, unexpected T_VARIABLE in Z:\home\starting\www\plugins\content\chmosplugin\chmosplugin.php on line 69

Строка 69 - это

 // Колонки для вставки
     $columns = array(
         'compilation_id',
         'content_id',
         );

---------------------
Посмотрели в интернете, что такое ошибка T_VARIABLE - это синтаксическая ошибка, скорее всего перед указанной строкой пропущен знак ;
Мы поставили ; в нужное место

$db = JFactory::getDbo();
         $query = $db->getQuery(true); - вот сюда
      
      // Колонки для вставки
      $columns = array(
         'compilation_id',
         'content_id',
         );

И ошибка исчезла. Мы создали новый материал, поместили его в сборник, нажали кнопку "сохранить". А как теперь узнать, появилась ли связь между сборником и материалом?
Мы пошли в http://localhost/Tools/phpMyAdmin - в нашу таблицу _chmos_compilations_articles. В ней ничего не увидели, нашего материала в ней нет. В ней, вообще, ничего нет...
« Последнее редактирование: 25.10.2015, 23:51:47 от mila_serdnaya »
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #200 : 26.10.2015, 00:01:29 »
Вносим правки согласно сообщению автора b2z.
Теперь наш код на событие onContentAfterSave:

Код
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;
       }


try
{
$db->setQuery($query)->execute();
}
catch (RuntimeException $e)
{
$this->_subject->setError($e->getMessage());
return false;
}
 
return true;


$db = JFactory::getDbo();
$query = $db->getQuery(true);
   
   // Колонки для вставки
$columns = array(
'compilation_id',
'content_id',
);

// Данные формы
$formData = JFactory::getApplication()->input->get('jform', array(), 'array');
 
$values = array(
(int) $formData['compilations'],
$article->id
);

   
   // Составляем запрос
$query->insert($db->quoteName('#__chmos_compilations_articles'))
->columns($db->quoteName($columns))
->values(implode(',', $values));

// Устанавливаем и выполняем запрос
$db->setQuery($query)
->execute();
       
}

Опять создали материал, выбрали для него сборник, нажали сохранить, но всё равно таблица _chmos_compilations_articles в локалхосте пустует.
И представление для сборника тоже.
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Создание папок из фронтенда
« Ответ #201 : 26.10.2015, 07:12:11 »
намучаетесь вы с этими плагинами...
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Re: Создание папок из фронтенда
« Ответ #202 : 26.10.2015, 08:33:22 »
намучаетесь вы с этими плагинами...
Да дело не в этом, а в том, что не программист пытается кодить. Ничего хорошего из этого конечно не получается... Это тоже самое, что я начну собирать движок для автомобиля...

mila_serdnaya - вот скажите, зачем Вы вставили код

Код: php
try
{
$db->setQuery($query)->execute();
}
catch (RuntimeException $e)
{
$this->_subject->setError($e->getMessage());
return false;
}

return true;

перед запросом? ПОнятное дело, что работать не будет. Это нужно было вставить вместо

Код
$db->setQuery($query)
->execute();

И кстати, на представление сборников это никак не повлияет...

Рабочий код запроса:
Спойлер
[свернуть]
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #203 : 26.10.2015, 18:09:27 »
AlekVolsk, ну, альтернативы, к сожалению у нас нет. Хорошо хоть мы не одни мучаемся, вы все  - с нами и вместе с нами. =)
Спасибо вам за это.
--------------------
b2z, исправили код согласно Вашим замечаниям.
Он теперь такой:
Спойлер
[свернуть]

В таблице для связи материала и сборника на локальном хосте никаких изменений нет.... Скажите, пожалуйста, мы правильно проверяем, работает ли наш код на событие onContentAfterSave, заглядывая в эту таблицу? Или это нужно как-то по-другому делать?
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Re: Создание папок из фронтенда
« Ответ #204 : 26.10.2015, 18:59:43 »
Не знаю, у меня все в таблице появляется... Попробуйте убрать это

Код
// 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;
       }
         
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #205 : 26.10.2015, 20:20:19 »
b2z, убрали...

У нас вот такая ошибка при сохранении материала вылезает:

Cannot add or update a child row: a foreign key constraint fails (`starting`.`#_chmos_compilations_articles`, CONSTRAINT `#_chmos_compilations_articles_fk_compilation_id` FOREIGN KEY (`compilation_id`) REFERENCES `#_chmos_compilations` (`id`) ON ) SQL=INSERT INTO `#_chmos_compilations_articles` (`compilation_id`,`content_id`) VALUES (0,630)
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #206 : 26.10.2015, 20:34:35 »
Мы понимаем, что что-то с ключами не так.
Поискали информацию в интернете на этот счёт, - пишут, что в таблице есть запись с неверным ключём (возможно там просто 0).

Подскажите, пожалуйста, как нам можно проверить эти наши ключи?
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Создание папок из фронтенда
« Ответ #207 : 26.10.2015, 20:43:53 »
уберите все внешние ключи (foreign key), в J это не практикуется, обеспечивайте эту логику запросами самостоятельно

проверьте, какие параметры передаются в запрос, убедитесь в корректности значений, например это можно сделать так:
после формирования массива $values (в котором после последнего значения перед закрывающей скобкой уберите запятую) вставьте следующее
Код: php-brief
$file = fopen( JPATH_SITE.'/1.txt', 'w' );
fwrite( $file, print_r( $values, true ) );
flush();
fclose( $file );
это создаст в корне сайта файл 1.txt, в котором будет текстовое представление содержимого массива $values (файл будет перезаписываться после каждой отработки плагина, после удаления отладочного кода не забудьте удалить и этот файл)
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Re: Создание папок из фронтенда
« Ответ #208 : 26.10.2015, 21:04:11 »
уберите все внешние ключи (foreign key), в J это не практикуется, обеспечивайте эту логику запросами самостоятельно
Вообще-то в тройке специально перешли на InnoDB, чтобы разработчики могли использовать приемущества внешних ключей. А ошибка из-за того, что compilation_id равен 0. И это логично, у Вас пропущена строка:
Код
$formData = JFactory::getApplication()->input->get('jform', array(), 'array');

Вы когда копируете чужой код (в данном случае мой), хотя бы проверяйте. У меня локально в плагине это строка выше, поэтому её нет в моем коде.

Если всё заработает, верните обратно

Код
// 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;
       }
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Создание папок из фронтенда
« Ответ #209 : 26.10.2015, 23:38:32 »
Вообще-то в тройке специально перешли на InnoDB, чтобы разработчики могли использовать преимущества внешних ключей.
Согласен. Но есть 2 нюанса (исключительно имхо):
1) еще ни в одном клубном/коммерческом расширении (из тех, что сам ковырял, а ковырял не мало) я внешних ключей не встречал, как и в самой J, нет даже примеров, чтобы показать их новичкам
2) если у новичка в J и в веб в частности нет предыдущего опыта в десктопном программировании СУБД, то я бы не рискнул рекомендовать использование внешних ключей, без должных знаний только путаница
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Создание релиза компонента средствами GitHub

Автор SkyAn

Ответов: 4
Просмотров: 716
Последний ответ 01.11.2019, 17:42:04
от Septdir
[Решено] Создание контент плагина

Автор IvanTopor

Ответов: 4
Просмотров: 1248
Последний ответ 26.02.2016, 13:10:37
от IvanTopor
Создание динамических полей в своем компоненте

Автор NeuroZ

Ответов: 14
Просмотров: 1454
Последний ответ 18.08.2015, 11:17:59
от b2z
Создание таблиц средствами компонента

Автор spirit1086

Ответов: 3
Просмотров: 1034
Последний ответ 18.08.2015, 10:17:09
от spirit1086
Создание изображений PHP и GD

Автор vita1971

Ответов: 6
Просмотров: 921
Последний ответ 10.05.2015, 13:10:38
от vita1971