Новости Joomla

Обработка HTTP ответа в Joomla 6+. Изменения по сравнению с Joomla 3 - Joomla 5

👩‍💻 Обработка HTTP ответа в Joomla 6+. Изменения по сравнению с Joomla 3 - Joomla 5.В Joomla для выполнения внешних запросов из PHP к сторонним API используется класс Joomla\Http\Http напрямую или же Joomla\Http\HttpFactory, который возвращает для работы преднастроенный по умолчанию класс Http. О работе с HTTP-запросами подробно рассказывалось в статье 2021 года Создание внешних запросов с использованием HttpFactory (Joomla). Некоторые изменения касаются работы с ответами на запросы. Например, наш запрос:
use Joomla\Http\HttpFactory;$http = (new HttpFactory)->getHttp($options, ['curl', 'stream']);$response = $http->get('https://any-url.ru/api/any/endpoint');
Раньше можно было получить код ответа или тело ответа как свойство $response - $response->code или $response->body. Однако, Joomla, начиная с Joomla 4 во многом переходит на стандарты PSR. В частности для работы с HTTP-ответами - на PSR-7. Также хорошая статья на Хабре о PSR-7: PSR-7 в примерах.
Прямое обращение к свойствам code, headers, body объявлено устаревшим в Joomla 6.0.0 и обещают удалить в Joomla 7.0.0.
Вместо этого нужно работать с HTTP-ответом по стандартам PSR-7. Код ответа.Было $response->code. Стало $response->getStatusCode().Заголовки ответа.Было $response->headers. Стало $response->getHeaders().Тело ответа.Было $response->body. Стало (string)$response->getContents().В тело ответа теперь приходит не строка, а поток - объект класса Laminas\Diactoros\Stream. Поэтому его нужно привести к строке (если это json, к примеру): (string)$response->getContents(). Чаще всего в коде Joomla встречается именно такой вариант. Однако, есть и вариант с перемещением указателя чтения на начало потока:
// Получили ответ в виде потока$stream = $response->getBody();// "перемотали" на начало$stream->rewind();// Получили строковый ответ$json = $stream->getContents();
В итоге результат одинаковый.@joomlafeed#joomla #разработка #php

Quantum Manager нужен сообществу, а автору нужна ваша поддержка!

Quantum Manager нужен сообществу, а автору нужна ваша поддержка!Файловый менеджер Quantum — одно...

Файловый менеджер Quantum — одно из самых популярных решений для Joomla, созданное разработчиком из сообщества Joomla, Дмитрием Цымбалом (@tsymbalmitia). Он делает Quantum удобным, безопасным и современным, обновляет его, исправляет уязвимости и отвечает пользователям — всё это в свободное от основной работы время.

Теперь настал момент для следующего шага: развитие проекта требует больше времени и ресурсов.

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

ildar87

  • Осваиваюсь на форуме
  • 15
  • 0 / 0
Приветствую

Прошу проконсультировать.
Пользователь с фронта будет создавать материал и загружать фотографии с возможностью их обрезки. На сервер отправляется массив с изображениями в base64, на сервере изображения сохраняются в разных размерах. Делал подобное под laravel, но с Joomla не так все просто.
Думаю, в шаблоне добавления материала сделать кнопку загрузки изображений, добавить дополнительное поле, в которое будет сохраняться массив загруженных изображений в base64, на сервере также сохранять в разных размерах и перезаписывать это доп поле массивом путей к сохраненным изображениям.

Где на стороне сервера обрабатывать и перезаписывать значение доп поля?
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
В Joomla есть система плагинов для врезки своего кода без хака ядра. Они разпределены по группам и их методы вызываются определенными событиями. В вашем случае я бы написал плагинчик группы content на событие onContentAfterSave. Надо еще подумать, куда записать пути к файлам, возможно, вам придется добавить столбик для них.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

sivers

  • Живу я здесь
  • 2596
  • 360 / 0
Можно и вовсе обойтись без хранения путей в БД (если только нет необходимости поиска в БД по ним). Сохранять для каждого материала в отдельную папку, содержащую в названии ИД материала, а при открытии страницы материала, проверять содержимое этой папки функцией glob().
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

ildar87

  • Осваиваюсь на форуме
  • 15
  • 0 / 0
В Joomla есть система плагинов для врезки своего кода без хака ядра. Они разпределены по группам и их методы вызываются определенными событиями. В вашем случае я бы написал плагинчик группы content на событие onContentAfterSave. Надо еще подумать, куда записать пути к файлам, возможно, вам придется добавить столбик для них.
Спасибо, погуглю
*

ildar87

  • Осваиваюсь на форуме
  • 15
  • 0 / 0
Можно и вовсе обойтись без хранения путей в БД (если только нет необходимости поиска в БД по ним). Сохранять для каждого материала в отдельную папку, содержащую в названии ИД материала, а при открытии страницы материала, проверять содержимое этой папки функцией glob().
Будет очень много материалов, планировал сохранять в подкаталоги по первым двум буквам хешированного имени файла
*

sivers

  • Живу я здесь
  • 2596
  • 360 / 0
Будет очень много материалов, планировал сохранять в подкаталоги по первым двум буквам хешированного имени файла
Лучше уж ИД хэшить. Вдруг имя поменять надо будет в материале?
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

ildar87

  • Осваиваюсь на форуме
  • 15
  • 0 / 0
Лучше уж ИД хэшить. Вдруг имя поменять надо будет в материале?
Имя будет состоять из ид пользователя, времени, счётчика - совпадений не будет
*

ildar87

  • Осваиваюсь на форуме
  • 15
  • 0 / 0
В Joomla есть система плагинов для врезки своего кода без хака ядра. Они разпределены по группам и их методы вызываются определенными событиями. В вашем случае я бы написал плагинчик группы content на событие onContentAfterSave. Надо еще подумать, куда записать пути к файлам, возможно, вам придется добавить столбик для них.
Разобрался, получилось, еще раз спасибо.
Но разве нельзя менять значение доп свойства до сохранения?
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
а еще в Joomla есть допполя и для них есть поле галереи https://github.com/JPathRu/pkg_gallery_field, фронт для поля дописать имхо не проблема
*

ildar87

  • Осваиваюсь на форуме
  • 15
  • 0 / 0
а еще в Joomla есть допполя и для них есть поле галереи https://github.com/JPathRu/pkg_gallery_field, фронт для поля дописать имхо не проблема
Спасибо, но пока мне нравится идея хранения в поле типа textarea
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Разобрался, получилось, еще раз спасибо.
Но разве нельзя менять значение доп свойства до сохранения?
Можно. onContentNormaliseRequestData или onContentBeforeSave.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

ildar87

  • Осваиваюсь на форуме
  • 15
  • 0 / 0
Можно. onContentNormaliseRequestData или onContentBeforeSave.
Нашел только, как получить список полей материала:
FieldsHelper::getFields($context, $article, true);

И перезаписать в бд:
$model = BaseDatabaseModel::getInstance('Field', 'FieldsModel', array('ignore_request' => true));
$model->setFieldValue($field->id, $article->get('id'), $newValue);

Как можно изменить значение свойства до сохранения?
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Метод - onContentBeforeSave($context, $table, $isNew, $data), $table - объект JTable, $data - данные из формы. Смотрите код Joomla\CMS\MVC\Model\AdminModel::save().
Не будь паразитом, сделай что-нибудь самостоятельно!
*

ildar87

  • Осваиваюсь на форуме
  • 15
  • 0 / 0
Видимо, что-то не понимаю

В событии onContentBeforeSave изменение значения доп поля не сохраняются
В форме создания материала, заполняю доп поле test-field значением 111
В плагине в событии onContentBeforeSave($context, $article, $isNew, $data) присваиваю новое значение $data['com_fields']['test-field'] = '333';
Но в базе сохраняется прежнее значение, т.е. 111

Может значения доп полей нужно править не в группе content?
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
В плагине в событии onContentBeforeSave($context, $article, $isNew, $data) присваиваю новое значение $data['com_fields']['test-field'] = '333';
Но в базе сохраняется прежнее значение, т.е. 111
Мало менять $data, нужно еще ее прикручивать к $article, я же вам писал
Смотрите код Joomla\CMS\MVC\Model\AdminModel::save()
Не будь паразитом, сделай что-нибудь самостоятельно!
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Вставка видео в Материал

Автор VIK4

Ответов: 10
Просмотров: 509
Последний ответ 03.11.2025, 08:18:22
от wishlight
Как вставить видео с Telegram в материал?

Автор Ishti39

Ответов: 2
Просмотров: 1191
Последний ответ 18.06.2024, 10:41:30
от Olg
Как сделать картинку ссылкой на материал без Вводного изображения?

Автор OZlaim

Ответов: 0
Просмотров: 995
Последний ответ 30.05.2024, 01:28:37
от OZlaim
Поиск в Материал- Блог категории

Автор mag_num83

Ответов: 1
Просмотров: 923
Последний ответ 14.09.2023, 20:36:34
от beliyadm
Менеджер изображений не запоминает последнюю выбранную папку

Автор saxes

Ответов: 0
Просмотров: 627
Последний ответ 26.04.2023, 07:36:23
от saxes