Новости Joomla

Вышли релизы Joomla 6.0.3 и Joomla 5.4.3

Релиз Joomla 6.0.3 и Joomla 5.4.3

Проект Joomla рад сообщить о выпуске Joomla 6.0.3 и Joomla 5.4.3. Это релиз исправлений ошибок и улучшений для серии Joomla 6.0 и Joomla 5.4.

👩‍💻 События плагинов и порядок их срабатывания при работе с пользовательскими полями Joomla и использовании FieldsHelper.

👩‍💻 События плагинов и порядок их срабатывания при работе с пользовательскими полями Joomla и использовании FieldsHelper.

В процессе работы с Joomla бывает необходимо работать с пользовательским интерфейсом более тонко, чем обычно. Все формы Joomla состоят из стандартных полей, содержанием, стилем отображения, состоянием (включено/выключено, доступно для редактирования или нет и т.д.) можно управлять с помощью плагинов. Да и для нестандартных проектов хорошей практикой является создание одного системного или нескольких плагинов групп "под проект", в которых храниться весь "нестандарт".

В этой статье описаны все триггеры, которые вызываются через Event Dispatcher из administrator/components/com_fields/src/Helper/FieldsHelper.php, с привязкой к жизненному циклу (порядку этапов работы запроса), аргументам, изменяемым данным и дальнейшему распространению по Joomla. Это поможет вам работать с Joomla свободнее и не опасаясь при этом потерять изменения при очередном обновлении движка.

Подходы, описанные в статье, полезны в тех случаях, когда вы работаете с данными в com_fields - механизме создания и редактирования пользовательских полей ядра Joomla и при использовании FieldsHelper. Многие сторонние компоненты не используют эту возможность, поэтому данная статья будет полезна лишь частично.

🏆 Открыто голосование за Joomla в премии CMS Critic People’s Choice Awards 2025

🏆 Открыто голосование за Joomla в  премии CMS Critic People’s Choice Awards 2025

🗓 Голосование продлится до 27 февраля 2026 года.

👩‍💻 Проголосовать! 👩‍💻

Номинации, в которых можно проголосовать за Joomla:
⭐️ Best Free CMS
⭐️ Best Open Source CMS
⭐️ Best Enterprise CMS

Также в номинации Best e-Commerce Solution участвуют компоненты интернет-магазинов для Joomla:
⭐️ HikaShop
⭐️ Virtuemart

В номинации Best Website Builder оказались:
⭐️ YooTheme
⭐️ SP Page Builder

Что такое CMS Critic Awards?
С 2012 года премия CMS Critic Awards занимает особое место в сообществе систем управления контентом (CMS). Это единственный в своем роде сайт, который составляет рейтинг системы управления контентом и связанных с ними решений на рынке — от малого до крупного и подчеркивает их инновации и услуги.

Каждый год награда CMS Critic Awards присуждается одному победителю в различных отраслевых категориях, таких как: «Лучшая облачная CMS», «Лучший DXP», «Лучшая Headless CMS и других. Затем результаты оглашаются через СМИ вместе с выбором редакции CMS Critic.
В этом году премия вернулась к своим традициям и только TOP-5 движков по количеству номинаций попали в 2-й этап - голосование.

@joomlafeed

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

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

  • Глобальный модератор
  • 7288
  • 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

  • Глобальный модератор
  • 7288
  • 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

  • Глобальный модератор
  • 7288
  • 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

  • Глобальный модератор
  • 7288
  • 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

  • Глобальный модератор
  • 7288
  • 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

  • Живу я здесь
  • 3401
  • 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

  • Глобальный модератор
  • 7288
  • 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

  • Глобальный модератор
  • 7288
  • 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

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

AlekVolsk

  • Гуру
  • 6913
  • 416 / 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

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

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

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

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

Автор SkyAn

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

Автор IvanTopor

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

Автор NeuroZ

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

Автор spirit1086

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

Автор vita1971

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