Новости 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 Гость просматривают эту тему.
  • 17 Ответов
  • 4391 Просмотров
*

oazis

  • Захожу иногда
  • 97
  • 2 / 0
Здравствуйте,
подскажите пожалуйста, как в стандартном профиле пользователя Joomla 3.0 сделать недоступное поле для редактирования (по аналогии с полем логин). Чтобы пользователь зайдя в профиль не мог редактировать это поле но видел его визуально? необходимо запретить редактировать поле "имя пользователя".

Благодарю.
*

kreker92

  • Захожу иногда
  • 390
  • 18 / 0
$("input[name='name']").attr('disabled', 'false');
Все вопросы и предложения на почту.
*

kreker92

  • Захожу иногда
  • 390
  • 18 / 0
Код
$("input[name='name']").attr('disabled', 'false');


Или же найти шаблон и прописать там этот атрибут.
Все вопросы и предложения на почту.
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
kreker92 это не решение. Js я смогу легко отключить и отредактировать поле.
Для решения нужно писать плагин группы user в котором нужно обрабатывать два события
onUserBeforeSave возвращать старое имя (для тех кто попытается его изменить) и сделать поле не редактируемым
Код: php-brief
function onContentPrepareForm($form, $data){
    if (!($form instanceof JForm)) {
        $this->_subject->setError('JERROR_NOT_A_FORM');

        return false;
    }
    if ($form->getName() =='com_users.profile')
    {
        $form->setFieldAttribute('name', 'readonly', 'true', null);
    }
}
*

varX

  • Живу я здесь
  • 2467
  • 141 / 5
  • разработка компонентов
kreker92 это не решение. Js я смогу легко отключить и отредактировать поле.
Для решения нужно писать плагин группы user в котором нужно обрабатывать два события
onUserBeforeSave возвращать старое имя (для тех кто попытается его изменить) и сделать поле не редактируемым

Зачем такие сложности? Функцию unset() никто не отменял.
Разработка и ремонт. VirtueMart. JoomShopping. Свои компоненты. Принимаю заявки на plasma-web.ru.
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Цитировать
Функцию unset() никто не отменял
необходимо запретить редактировать поле "имя пользователя".
lcd25 где здесь взаимосвязь? и при чем здесь unset?
*

varX

  • Живу я здесь
  • 2467
  • 141 / 5
  • разработка компонентов
lcd25 где здесь взаимосвязь? и при чем здесь unset?
Это же элементарно:
if(JRequest::getCmd('view', '')=='profile')unset($_REQUEST['name']);
Можно даже в шаблоне написать сверху, чтобы обновляться. зачем тут плагины плодить?
Разработка и ремонт. VirtueMart. JoomShopping. Свои компоненты. Принимаю заявки на plasma-web.ru.
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
и дальше что, что будет при обновлении записи, что вы запишите пользователю в поле name?
Что будет мешать добавить его обратно туда(к примеру я модулем вывожу форму)?
*

varX

  • Живу я здесь
  • 2467
  • 141 / 5
  • разработка компонентов
Цитировать
и дальше что, что будет при обновлении записи, что вы запишите пользователю в поле name?
Задача в том и заключается, чтобы туда ничего не записалось.

Цитировать
Что будет мешать добавить его обратно туда(к примеру я модулем вывожу форму)?
Почитайте спецификацию функции unset. очень рекомендую вообще читать спецификации.
Разработка и ремонт. VirtueMart. JoomShopping. Свои компоненты. Принимаю заявки на plasma-web.ru.
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Цитировать
Задача в том и заключается, чтобы туда ничего не записалось.
Таким образом вы не сможете изменить профиль пользователя. Может тогда вообще не выводить форму редактирования.
lcd25 не зацикливайтесь на unset //$form->removeField('name');. Это не решение.

Цитата: oazis от 04.10.2013, 23:15:45
необходимо запретить редактировать поле "имя пользователя".
и каким же вы образом запретили.
И иногда стоит признавать ошибки. Ибо все мы ошибаемся. А вот зацикливаться не стоит. Без хаков это только плагин. Запретили редактирование имени и при записи вернули оригинальные.
*

varX

  • Живу я здесь
  • 2467
  • 141 / 5
  • разработка компонентов
Цитировать
Таким образом вы не сможете изменить профиль пользователя. Может тогда вообще не выводить форму редактирования.
lcd25 не зацикливайтесь на unset //$form->removeField('name');. Это не решение.
С чего вы взяли, что не будет меняться профиль пользователя? Не будет меняться только имя пользователя самим пользователем, чего и требовалось добиться.

Цитировать
И иногда стоит признавать ошибки. Ибо все мы ошибаемся. А вот зацикливаться не стоит. Без хаков это только плагин. Запретили редактирование имени и при записи вернули оригинальные.
Без хаков, действительно, понадобится плагин. Увы, это большой недостаток Joomla - в ней теряется гибкость и динамичность PHP. Но если проблема обновлений не стоит, то гораздо проще добавить unset($data['name']); в модель com_users/models/profile.php
« Последнее редактирование: 05.10.2013, 04:50:42 от lcd25 »
Разработка и ремонт. VirtueMart. JoomShopping. Свои компоненты. Принимаю заявки на plasma-web.ru.
*

oazis

  • Захожу иногда
  • 97
  • 2 / 0
Друзья,

приятно видеть, что мой вопрос вызвал бурную дискуссию, но, можете посоветовать решение. А то из прочитанного я так ничего не понял. ^-^ На сайте нет свободной регистрации, все "учетные записи" (акки) создаются вручную администраторами.

Задача: чтобы пользователь не мог изменять в своем профиле поле 'name', по аналогии с полем логин. Плохо, что в Joomla 3.0 не предусмотрено запрещать или разрешать менять это поле.

Буду благодарен за помощь в решении задачи.
*

varX

  • Живу я здесь
  • 2467
  • 141 / 5
  • разработка компонентов
oazis, думаю, вам стоит воспользоваться советом Fedor Vlasenko и заказать разработку плагина. Но если это ваш сайт, и обновлять его вы не планируете, то можно воспользоваться моим советом - именно, прописать unset($data['name']); в функцию save() в модель com_users/models/profile.php. При этом, чтобы не вводить пользователя в заблуждение, также добавить в шаблон 'disabled', как советовал kreker92 выше.
Разработка и ремонт. VirtueMart. JoomShopping. Свои компоненты. Принимаю заявки на plasma-web.ru.
*

oazis

  • Захожу иногда
  • 97
  • 2 / 0
Fedor Vlasenko, вы как разработчик можете подсказать, сколько будет стоить разработка плагина?
*

s0042

  • Новичок
  • 3
  • 0 / 0
Здравствуйте нужен плагин или компонент, который может создавать профиль в профиле пользователя. Другими словами создав свой профиль, пользователь может создать другой профиль, из своего кабинета, о другом пользователе, с указанием области города, ФИО, года рождения, выбор пола и прикрепить фото, с возможностью комментировать этого человека всеми кто его найдет. Сколько будет стоить сие чудо?) и кто сможет взяться за эту работу?
*

kreker92

  • Захожу иногда
  • 390
  • 18 / 0
Создайте отдельную тему в коммерческом разделе.
Все вопросы и предложения на почту.
*

Hishchnik

  • Захожу иногда
  • 253
  • 19 / 1
  • ©
Мож кому и пригодится:
readonly="true" в XML файле формы ни кто не отменял, при этом создается и отображается строка, но имеет атрибут "readonly"
Пример:
Код: xml
<field name="name" type="text" description="Название метки" label="Описание" readonly="true" size="30" />
также есть disabled="true" - тоже не дает изменить, но уже и в форму не передает данные...
« Последнее редактирование: 15.05.2014, 02:58:27 от Hishchnik »
1. Помог? Благодарность выражается кнопочкой "+" ;)
2. Остановите землю я сойду!
3.
*

EndVal

  • Захожу иногда
  • 54
  • 10 / 0
Здравствуйте нужен плагин или компонент, который может создавать профиль в профиле пользователя. Другими словами создав свой профиль, пользователь может создать другой профиль, из своего кабинета, о другом пользователе, с указанием области города, ФИО, года рождения, выбор пола и прикрепить фото, с возможностью комментировать этого человека всеми кто его найдет. Сколько будет стоить сие чудо?) и кто сможет взяться за эту работу?
Посмотри здесь, может подойдет
http://www.adsmirny.ru/kontakty
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Пароль Пользователя

Автор Олег5

Ответов: 3
Просмотров: 808
Последний ответ 14.02.2025, 10:41:20
от fbr
Я создал пользователя Author, но он не может зайти в редактирование

Автор Olegus79

Ответов: 7
Просмотров: 1117
Последний ответ 19.10.2023, 20:48:52
от Vastriet
Доступ в админку без права редактировать контент

Автор NIKOLY

Ответов: 1
Просмотров: 903
Последний ответ 01.06.2023, 14:12:06
от stepan39
Как редактировать табы?

Автор KyMaHeK

Ответов: 0
Просмотров: 600
Последний ответ 17.02.2023, 17:24:13
от KyMaHeK
Блок особенностей, как добавить в поле с информацией кнопку или ссылку Подробнее

Автор Alex from SPb

Ответов: 5
Просмотров: 979
Последний ответ 28.11.2022, 19:54:42
от marksetter