Новости Joomla

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

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #210 : 27.10.2015, 00:56:42 »
Ура-ура-ура! =) У нас в таблице _chmos_compilations_articles начали появляться записи! С праздником нас всех! =)

*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #211 : 27.10.2015, 01:08:23 »
Но как только мы вставляем в код вот это:

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

...то материал перестаёт связываться со сборником и новая запись в таблицу _chmos_compilations_articles не заносится...
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #212 : 27.10.2015, 01:25:01 »
AlekVolsk, спасибо Вам за замечания.

b2z, разобрались, кажется, почему в таблицу _chmos_compilations_articles перестают добавляться записи, когда мы вставляем в код вот это:

// 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;
       }

Мы посмотрели код joomla-example/php/plugins/content/joomla/joomla.php и вместо нашего com_content.article, мы написали com_content.form - и всё наладилось, записи в таблицу стали добавляться!

// Check we are handling the frontend edit form.
      if ($context != 'com_content.form') {
         return true;
      }
      
      // Check this is a new article.
      if (!$isNew) {
         return true;
      }

--------------------------------------------
Вот код нашего плагина, который мы сейчас имеем (и всё работает!):
Спойлер
[свернуть]
« Последнее редактирование: 27.10.2015, 01:29:09 от mila_serdnaya »
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #213 : 27.10.2015, 02:28:10 »
Компонент выводит список сборников без материалов, которые к ним относятся.
Для того, чтобы это исправить, "надо менять запрос в модели Compilations. Сейчас он делает просто выборку сборников из таблицы compilations. А надо делать выборку из таблицы content + из таблицы compilations присоединять сборники по content_id (делать JOIN). Далее красиво выводить на фронте в представлении Compilations" (автор b2z).

Скажите, пожалуйста, мы правильно понимаем, что нам нужно менять код в файле compilations.php, который находится в папке models (папка models находится в папке site компонента com_chmos)?

Вот этот код:
Спойлер
[свернуть]
*

b2z

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

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #215 : 27.10.2015, 21:12:59 »
Переписываем код.
Изменяем вот этот  абзац: protected function getListQuery():
Спойлер
[свернуть]
---------------------------------------
Начали мы разбираться и что-то запутались.

1.Сначала мы устанавливаем запрос к базе данных:
$db    = $this->getDbo();
$query = $db->getQuery(true);


2. Затем обращаемся к таблице #__content

$query->select('a.*');
$query->from($db->quoteName('#__content', 'a'));
$query->where($db->quoteName('a.title') ); - если мы правильно поняли, здесь ставим фильтр, который отбирает названия материалов
$query->where($db->quoteName('a.created_by'). ' = ' . (int) JFactory::getUser()->get('id')'); - здесь мы поставили фильтр, отбирающий материалы текущего пользователя (не уверены, что правильно)

Материал, который создал текущий пользователь, мы вроде как из таблицы выбрали. Теперь нам нужно к этому материалу прикрепить названия сборников, т.е. "из таблицы compilations присоединять сборники по content_id (делать JOIN)" (автор b2z)

Вот здесь мы и застопарились: в таблице compilations нет поля content_id. Поле content_id есть в таблице chmos_compilations_articles. Так какую же таблицу нам использовать для JOIN?


3. Делаем пока так, как Вы нам подсказали, т.е. присоединяем таблицу #__chmos_compilations

$query->select($db->quoteName('b.title')); - если мы правильно поняли, здесь ставим фильтр, который отбирает названия сборников
$query->leftJoin(
    $db->quoteName('#__chmos_compilations', 'b')
    . ' ON '
    . $db->quoteName('b.id') -здесь мы говорим, что поле "id" таблицы chmos_compilations связано с полем "id" таблицы content
    . ' = '
    . $db->quoteName('b.id')
);

4. Делаем сортировку по полю title таблицы chmos_compilations, по возрастанию
$query->order($db->quoteName('b.title'). ' ASC');

5. Делаем запрос.
$db->setQuery($query);

6. Получаем результат
$result = $db->loadObjectList();

--------------------------------
Подскажите, пожалуйста, правильно ли мы рассуждаем? Или мы не тем путём пошли?
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Re: Создание папок из фронтенда
« Ответ #216 : 28.10.2015, 10:02:40 »
$query->where($db->quoteName('a.title') ); лишнее. Зачем фильтровать по названию, тем более не по чему фильтровать.
Цитировать
5. Делаем запрос.
$db->setQuery($query);

6. Получаем результат
$result = $db->loadObjectList();
Тоже лишнее, Вы же только $query возвращаете.

Цитировать
Вот здесь мы и застопарились: в таблице compilations нет поля content_id. Поле content_id есть в таблице chmos_compilations_articles. Так какую же таблицу нам использовать для JOIN?
Нужно соединять две таблицы. Сначала chmos_compilations_articles, а потом chmos_compilations

Код: php
$query->leftJoin(
    $db->quoteName('#__chmos_compilations_articles', 'cc'). ' ON ' . $db->quoteName('cc.content_id'). ' = ' . $db->quoteName('a.id')
);
$query->leftJoin(
    $db->quoteName('#__chmos_compilations', 'b'). ' ON ' . $db->quoteName('b.id'). ' = ' . $db->quoteName('cc.compilation_id')
);

Полный запрос

Код: php
$query
->select('a.id AS articleId, a.title AS articleTitle, a.alias AS articleAlias, a.catid AS articleCategory')
->from($db->quoteName('#__content', 'a'))
->where($db->quoteName('a.created_by'). ' = ' . (int) JFactory::getUser()->get('id'));

$query
->select($db->quoteName('b.*'))
->leftJoin(
$db->quoteName('#__chmos_compilations_articles', 'cc'). ' ON ' . $db->quoteName('cc.content_id'). ' = ' . $db->quoteName('a.id')
)
->leftJoin(
$db->quoteName('#__chmos_compilations', 'b'). ' ON ' . $db->quoteName('b.id'). ' = ' . $db->quoteName('cc.id')
);

// Join over the users for the checked out user.
$query
->select('uc.name AS editor')
->leftJoin($db->quoteName('#__users'). ' AS uc ON uc.id = b.checked_out');

$query->order($db->quoteName('b.title'). ' ASC');
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #217 : 28.10.2015, 12:29:07 »
b2z, мы вставили Ваш код (полный запрос) в код файла compilations.php (в абзац protected function getListQuery():)
Вот полный код файла, который сейчас имеем:
Спойлер
[свернуть]

Переустановили компонент, перешли во фронтенд, нажимаем на представление для списка сборников - и вылезает вот такая ошибка: Fatal error: Call to a member function select() on a non-object in Z:\home\starting\www\components\com_chmos\models\compilations.php on line 184

Строка находится здесь:

protected function getListQuery()
   {
$query
      ->select('a.id AS articleId, a.title AS articleTitle, a.alias AS articleAlias, a.catid AS articleCategory') - линия 184
      ->from($db->quoteName('#__content', 'a'))
      ->where($db->quoteName('a.created_by'). ' = ' . (int) JFactory::getUser()->get('id'));

----------------------
Это получается, что параметры функции select не найдены? То есть, их как-то отдельно нужно где-то прописывать?
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Re: Создание папок из фронтенда
« Ответ #218 : 28.10.2015, 14:24:37 »
Ну а чего Вы выкинули ? $query же не пустого места появляется.
Код
$db = $this->getDbo();
$query = $db->getQuery(true);
Ну сами пытайтесь такие вещи решать.
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #219 : 28.10.2015, 14:53:48 »
b2z, мы вот этот код

Код
$db = $this->getDbo();
$query = $db->getQuery(true);

сначала не выкидывали. Вставили перед Вашим кодом (полный запрос). Но у нас сразу же вылезла такая вот ошибка, когда мы нажали на представление для списка сборников:

 
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #220 : 28.10.2015, 14:57:48 »
Мы испугались и эти две строчки удалили.
Вернули сейчас эти две строки на место, непонятная ошибка опять возникла.
Вот код, который у нас сейчас (с добавленными строками):
Спойлер
[свернуть]
*

b2z

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

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #222 : 28.10.2015, 16:31:58 »
b2z, извините нас, пожалуйста, за наше невежество. Понимаем, что если бы мы были программистами, Вы бы уже перестали бы с нами нянчиться. Спасибо Вам огромное за Ваше терпение, за Вашу работу снами,  и ещё раз за терпение.
----------------
Мы вставили в код строку return $query;.

Возникла вот такая ошибка:
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #223 : 28.10.2015, 16:38:17 »
Мы пошли читать теорию, правильно ли мы вставили return $query; - почитали в Joomlaблоге статью СОЗДАНИЕ ПОСТРАНИЧНОГО ВЫВОДА ИНФОРМАЦИИ В Joomla, а именно обратили внимание на функцию protected function getListQuery().
Посмотрели, как там строится запрос и куда вставляется return $query;, обратили внимание на создание класса JModelList, проверили наш код на соответствие полученной информации - всё совпадает.
Вот наш код с добавленной строкой return $query;
Спойлер
[свернуть]

*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Re: Создание папок из фронтенда
« Ответ #224 : 28.10.2015, 17:12:11 »
Исправьте
Код: php
$db->quoteName('#__chmos_compilations', 'b'). ' ON ' . $db->quoteName('b.id'). ' = ' . $db->quoteName('cc.id')
на
Код: php
$db->quoteName('#__chmos_compilations', 'b'). ' ON ' . $db->quoteName('b.id'). ' = ' . $db->quoteName('cc.compilation_id')
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #225 : 28.10.2015, 17:46:30 »
Исправили. Теперь вот такая ошибка вылезает:

Unknown column 'b.*' in 'field list' SQL=SELECT a.id AS articleId, a.title AS articleTitle, a.alias AS articleAlias, a.catid AS articleCategory,`b`.`*`,uc.name AS editor FROM `dzy7s_content` AS `a` LEFT JOIN `dzy7s_chmos_compilations_articles` AS `cc` ON `cc`.`content_id` = `a`.`id` LEFT JOIN `dzy7s_chmos_compilations` AS `b` ON `b`.`id` = `cc`.`compilation_id` LEFT JOIN `dzy7s_users` AS uc ON uc.id = b.checked_out WHERE `a`.`created_by` = 912 ORDER BY `b`.`title` ASC LIMIT 0, 20

*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: Создание папок из фронтенда
« Ответ #226 : 28.10.2015, 17:47:46 »
`b`.* вместо `b`.`*`
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #227 : 28.10.2015, 17:48:05 »
Код, который имеем на данный момент:
Спойлер
[свернуть]
*

b2z

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

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #229 : 28.10.2015, 18:04:31 »
Istaan, скажите, пожалуйста, мы правильно поняли, что в строку ->select($db->quoteName('b.*')) нам нужно заменить на ->select($db->quoteName('b.'*))?
Или, например, $db->quoteName('b.id')  нужно менять на $db->quoteName('b'.id)?
Извините за глупый вопрос, пожалуйста.
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #230 : 28.10.2015, 18:12:43 »
Ой! Мы поменяли строку ->select($db->quoteName('b.*')) на ->select('b.*') и у нас появилась картинка! Странная, правда, но зато кракозябные ошибки исчезли! =)
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #231 : 28.10.2015, 18:21:00 »
Нет ни названий сборников, ни названий материалов, которые к ним относятся... Просто много пустых строк, с рабочими кнопками редактирования ("добавить название" и "удалить")
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Re: Создание папок из фронтенда
« Ответ #232 : 28.10.2015, 18:49:19 »
Ну да, данные то другие пришли - список материалов и данные сборников, которые относятся к каждому конкретному материалу. Теперь надо думать, как их сгруппировать по сборникам. Я бы в getItems() прошелся по всем данным и собрал их в новый многомерный массив.

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

В любом случае придется переделывать макет вывода списка (views/compilations/tmpl/default.php).

Кстати, чтобы убедиться, что текущий запрос правильный и данные на месте, попробуйте в макете вывода после строки
Код: php
$canDelete  = $user->authorise('core.delete', 'com_chmos');
добавить
Код: php
print_r($this->items);
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #233 : 28.10.2015, 19:16:25 »
b2z, строку добавили, данные отображаются. Делаем вывод, что всё в порядке. =)
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #234 : 28.10.2015, 19:30:24 »
Скажите, пожалуйста, мы правильно понимаем, что наш дальнейший порядок действий такой:

1. Пройтись по всем данным в getItems() и собрать их в новый многомерный массив (эти действия мы выполняем в файле compilations.php, который находится в папке models компонента)
2. Либо в этом же файле "поменять запрос, чтобы сначала выбрать все сборники, а потом к каждому сборнику сделать выборку материалов".

После того, как мы определимся, каким путём идти, нам нужно будет переделывать макет вывода списка (views/compilations/tmpl/default.php).

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

С выбором пути мы определились - будем в getItems() проходиться по всем данным и собрать их в новый многомерный массив. Подскажите, пожалуйста, какие данные нам для этого понадобятся?
Сами пока ушли читать, что такое многомерные массивы.

*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #235 : 28.10.2015, 22:09:34 »
Мы посмотрели ещё раз на макет вывода списка и, кажется, поняли, что за параметры нам нужны.
Вот то, что показывает нам сайт (представление для списка сборников), после того, как мы добавили print_r($this->items); в код макета вывода списка:

Array
([0] => stdClass Object ( [articleId] => 229 [articleTitle] => Кольцов [articleAlias] => koltsov [articleCategory] => 55 [id] => [asset_id] => [title] => [ordering] => [state] => [created_time] => [checked_out] => [checked_out_time] => [created_by] => [editor] => )
 
[1] => stdClass Object ( [articleId] => 525 [articleTitle] => Черный [articleAlias] => chernyj [articleCategory] => 55 [id] => [asset_id] => [title] => [ordering] => [state] => [created_time] => [checked_out] => [checked_out_time] => [created_by] => [editor] => )

[3] => stdClass Object ( [articleId] => 25 [articleTitle] => Анаграмма [articleAlias] => anagramma [articleCategory] => 55 [id] => [asset_id] => [title] => [ordering] => [state] => [created_time] => [checked_out] => [checked_out_time] => [created_by] => [editor] => )

Мы сделали вывод, что нам нужно вот эти повторяющиеся параметры и собирать в многомерный массив:
----------------
stdClass Object
[articleId]
[articleTitle]
[articleAlias]
[articleCategory]
-----------------
[id]
[asset_id]
[title]
[ordering]
[state]
[created_time]
[checked_out]
[checked_out_time]
[created_by]
[editor]  
-------------------

 
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Создание папок из фронтенда
« Ответ #236 : 28.10.2015, 23:33:42 »
эмм, так у вас уже многомерный массив, его и исопользуйте
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Создание папок из фронтенда
« Ответ #237 : 28.10.2015, 23:41:25 »
Цитировать
Array
([0] => stdClass Object ( [articleId] => 229 [articleTitle] => Кольцов [articleAlias] => koltsov [articleCategory] => 55 [id] => [asset_id] => [title] => [ordering] => [state] => [created_time] => [checked_out] => [checked_out_time] => [created_by] => [editor] => )
 
[1] => stdClass Object ( [articleId] => 525 [articleTitle] => Черный [articleAlias] => chernyj [articleCategory] => 55 [id] => [asset_id] => [title] => [ordering] => [state] => [created_time] => [checked_out] => [checked_out_time] => [created_by] => [editor] => )

[3] => stdClass Object ( [articleId] => 25 [articleTitle] => Анаграмма [articleAlias] => anagramma [articleCategory] => 55 [id] => [asset_id] => [title] => [ordering] => [state] => [created_time] => [checked_out] => [checked_out_time] => [created_by] => [editor] => )

то, что выделено - это элементы массива 1 уровня вложенности, по сути - объекты-записи набора данных (строки в таблице),  каждая такая запись является тоже массивом (второго уровня вложенности) и состоит из одинакового набора полей (столбцов таблицы).

В шаблоне представления (компонент/view/tmpl/default.php) перебираете массив в цикле и выводите построчно значения:

foreach ($this->items as $item) {

  // здесь $item - это строка, для первой строки (отсчет начинается всегда с 0) $item->articleTitle == 'Кольцов'

}

при этом вам не обязательно обращаться ко всем полям, выводите только необходимое :)
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #238 : 29.10.2015, 15:49:17 »
AlekVolsk, разбираемся сейчас с шаблоном представления (views/compilations/tmpl/default.php).
Подскажите, пожалуйста, а какой абзац в коде нам нужно редактировать? Не совсем понятно, куда нам вставлять:

foreach ($this->items as $item) {

  // здесь $item - это строка, для первой строки (отсчет начинается всегда с 0) $item->articleTitle == 'Кольцов'

}


Вот наш код (views/compilations/tmpl/default.php):

Спойлер
[свернуть]
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Re: Создание папок из фронтенда
« Ответ #239 : 29.10.2015, 16:04:52 »
Простая переборка не поможет - у Вас будет просто списко материалов. А Вам нужен список сборников с материалами:

Название сборника
- материал
- материал
Название сборника
- материал
- материал

Плюс отдельно материалы без сборников.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

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

Автор SkyAn

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

Автор IvanTopor

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

Автор NeuroZ

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

Автор spirit1086

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

Автор vita1971

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