Новости Joomla

Перевод и публикация интервью с Joomla евангелистом на греческом портале Joomla

Перевод и публикация интервью на греческом портале Joomla 🇬🇷

Утро, просматриваешь входящие письма и изучаешь новости и внезапно обнаруживаешь, что инициатива, которую ты начал, подхватывается другими людьми. 🎉

Недавно я взял интервью у Билла (Василиса) Коциаса - руководителя студии, читающего лекции в университете и популяризатора Joomla в Греции. Это интервью из журнала NorrNext, в оригинале на английском, теперь доступно на греческом языке и опубликовано на портале joomla.gr. 🎉

До чего же приятно… 😇😊 Работа замечена и с ней посчитали необходимым ознакомить аудиторию страны, в которой Билл читает лекции. И это солнечная Греция - страна, страна, с которой Россию многое связывает. 🇬🇷🇷🇺🕊

Смотрю на греческий алфавит и тут же рисуются картины белоснежных зданий в окружении винограда и амфор, красивых женщин в сандалиях и мужественных воинов, охраняющих покой полисов, в которых ученые мужи работают над трудами, позже вошедшими в века. Красиво! 😇Но вернемся к интервью.

Из него вы узнаете, что в Греции доля Joomla среди CMS занимает порядка 30-40%. По моему мнению это - самый высокий показатель во всем мире. Также чтение лекций о Joomla в университетах позволит привести новых пользователей и к тому же молодое поколение. Ну и огромное кол-во сертификтатов Билла на стене (смотрим фото в статье) свидетельствует о том, что Joomla может применяться как профессиональный инструмент.

🌐 Оригинальное интервью (на английском)
🇬🇷 Интервью на греческом портале (joomla.gr)

Что насчет перевода на русский? Увы, времени всего 24 часа в сутках. Я продолжаю готовить новые интервью. Возможно, после завершения выпуска журнала, рассмотрю перевод некоторых интервью на русский. Но я об этом не говорил. 😊 В блоге @eugenius_blog публикую анонсы интересных событий из мира 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

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

avantyrist

  • Захожу иногда
  • 228
  • 3 / 0
Добрый день.
Выполняю такой код:


Код
$db = JFactory::getDBO();
$query = "
UPDATE `#__table_name`
  SET count = @new_count  := count +1
  WHERE `field` = 'my_field';
SELECT @new_count;
     ";
$db->setQuery($query);
$result = $db->loadResult();

Я хочу добиться ОБНОВЛЕНИЯ(увеличение на число) поля и получения результата(результат увеличения) одним запросом
Eтот запрос срабатывает в phpMyAdmin

Но Joomla вываливает ошибку:
1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT @new_count' at line 4 SQL=UPDATE `#__table_name` SET count = @new_count := id+5 WHERE `field` = 'my_field'; SELECT @new_count;

Joomla почемуто не делает подстановку префикса для таблицы  #__
Попробовал жёстко прописать префикс таблиц `prefix_table_name`, но Вываливает таже ошибка. Причём префикс магическим образом меняется на `#__table_name` О_о

Если сделать  $db->execute();  Получается таже беда :(

Подскажите пожалуйста как правильно сделать такой запрос ??

UPD:
В моём случае Двумя запросами(1й изменение, 2й получение) делать нельзя,  так как после изменения может вклиниться повторное изменение от другого юзера, и тогда для первого прийдёт не верный результат :(
« Последнее редактирование: 11.03.2017, 22:21:58 от avantyrist »
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
А причём тут префикс она и не должна. У вас в синтаксисе ошибка. А с префиксом все в порядке.  Если бы было не в порядке то писало бы не найдена таблица. 
Сам запрос разбирать не стал ибо с телефона.  Думаю дальше вы сами разбираетесь.
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

avantyrist

  • Захожу иногда
  • 228
  • 3 / 0
Я понимаю что Joomla информирует об ошибке синтаксиса
НО я не понимаю какой О_о

Eтот запрос срабатывает в phpMyAdmin. Запрос  ИДЕНТИЧНЫЙ, только подставлен префикс таблицы
phpMyAdmin Показывает результат:

Отображает строки 0 - 0 ( 1 всего, запрос занял 0.0001 сек.)
@new_count
-------------
17


UPD:
$db->loadResult();  и аналогичные методы не позволяют выполнить   SELECT @new_count;

Подскажите пожалуйста как правильно сделать такой запрос ??

« Последнее редактирование: 11.03.2017, 22:54:11 от avantyrist »
*

passer

  • Завсегдатай
  • 1013
  • 75 / 3
Не великий спец, но помнится для нескольких запросов использовался
Код: php
$db->setQuery($sql);
$db->queryBatch();
*

avantyrist

  • Захожу иногда
  • 228
  • 3 / 0
его нет в Joomla 3+  https://api.joomla.org/cms-3/classes/JDatabaseDriverMysqli.html#method_execute

и я не знаю что оно такое :(
*

beliyadm

  • Легенда
  • 9758
  • 1665 / 66
  • Севастополь, Россия
у вас ошибка на уровне переменной @new_count
сделайте проще
Код: sql
SET count = count +1 
Если конечно уверены в типе значений в поле count
Все истины, которые я хочу вам изложить, — бесстыдная ложь. Сделать всё хорошо
TLG: @Beliyadm
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
В моём случае Двумя запросами(1й изменение, 2й получение) делать нельзя,  так как после изменения может вклиниться повторное изменение от другого юзера, и тогда для первого прийдёт не верный результат :(
даже если бы Joomla понимала такую запись - у вас все равно 2 разных запроса. и между ними точно также мог бы вклинится другой процесс. а для решения этого давным давно придуманы транзакции и блокировки.
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

avantyrist

  • Захожу иногда
  • 228
  • 3 / 0
Ух...
А разве пользовательская переменная живёт не во время текущего подключения к БД текущем юзером ??
Тоесть как я понимаю user_1 выполнил UPDATE, установил переменную @variable=1 и выполнил SELECT  тойже @variable переменной (Всё ето в одном подключении) и результат @variable доступен только user_1
  Под одним подключением к БД я понимаю $db->execute(); или схожие $db->load__();


или я не прав ? и получается чтото Вроде етого:

user_1
1) Выполняет php код
2) делает запрос к `table_1` чтото отработал и устанавливает @variable=11 (пользовательскую переменную)
3) возвращается к php коду(продолжается обработка после выборки из БД)
4) в етот момент user_2  выполнил тотже пункт 2) и 3)  но изменил значение @variable=99
5) теперь user_1 подключается опять к бд и делает SELECT @variable

Итог: у user_1 @variable  будет равен 99  или 11  ?
пункты 1,2,3,5  Выполняются в одном потоке(одним скриптом), одним Юзером
« Последнее редактирование: 12.03.2017, 00:31:06 от avantyrist »
*

beliyadm

  • Легенда
  • 9758
  • 1665 / 66
  • Севастополь, Россия
avantyrist - а это вам читать документацию по  MySQL lock table
И да - всегда хорошо иметь уникальные ключи, чтобы при блокировки таблицы не было дублей
Все истины, которые я хочу вам изложить, — бесстыдная ложь. Сделать всё хорошо
TLG: @Beliyadm
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
До барлся до компа.
Дабы не перелопачивать весь ваш запрос, скажу что dmitry_stas - это все равно два запроса. и можно вклиниться, но можно и без LOCK TABLES.
Поэтому если оставлять два запроса их просто надо попенять местами. Без всей логики сложно подсказать правильный вариант. Но попробую поиграть в угадайку.
Если мы не знаем значения count то логика такая:
1. Сначала делаем select получаем значение. делаем + 1
2. делаем запрос update
3. Отдаем юзеру значние из первого пунка
P.S как же сложно иногда предать логику словами.
Если мы занем count то логика такая:
По сути оптимальный вариант, изначально передавать занчение (ведь оно навреника выводиться перед отправкой)
2. делаем запрос update
3. Отдаем юзеру значние +1
Так запрос будет один.
С другой стороны, ничего страшного если пользователь получить не count+1 а точное значение из базы, тоже ничего страшного, думаю многие встречали нажал +1 а рейтинг изменился на +3 (т.к еще 2 человека нажали).
Еще вариант, если у вас AJAX то юзеру вообще ненужно выдеть что идет запрос. пусть у него сразу число увеличиваеться, тут главное сделать защиту от дураков чтобы по 3 подряд раза не нажимали, но ее все равно делать надо.

Так просто ради того чтобы было.

Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

avantyrist

  • Захожу иногда
  • 228
  • 3 / 0
beliyadm   я также ступорился с javaScript, тонкости ньюансы, Закалебался клянчить на форумах....   в Итоге меня климанолу и  я всё забросил и перелопатил Оочень много инфы по JS, в том числе книги...
Итог php забыт был напрочь :) Joomla темболее...   в Голове Каша с Винигредом
Сейчас по новой всё востонавливаю по возможности, итог в Голове добавилось Оливье

Если сейчас также лезть  в SQL  можно идти в больничку....

По существу:
- Joomla поддерживает такой запрос на переменную ?  Как сделать выборку пользовательской переменной в Joomla  запросе ?
- По поводу жизни @variable как она себя ведёт ?  я склоняюсь к первоому моему Предположению.
   Изза того что в phpMyAdmin сначала сделать
      SET @var=9999;   -> выполнить
      SELECT @var;       -> выполнить
          результат будет NULL



*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
http://php.net/manual/ru/ говорит:
Цитировать
Множественные запросы, или мультизапросы, должны запускаться функцией mysqli_multi_query().
...
Функции API mysqli_query() и mysqli_real_query() во время работы не устанавливают на сервере специальный флаг, необходимый для выполнения мультизапросов. Отдельная API функция для мультизапросов позволяет снизить вероятность случайных SQL инъекций. Злоумышленник может попытаться добавить в конец запроса выражения, вроде ; DROP DATABASE MySQL или ; SELECT SLEEP(999). Если ему это удастся, но не будет использоваться функция mysqli_multi_query, сервер не выполнит второе внедренное и опасное SQL выражение.
JDatabaseDriver не поддерживает mysqli_multi_query().
Не будь паразитом, сделай что-нибудь самостоятельно!
*

avantyrist

  • Захожу иногда
  • 228
  • 3 / 0
robert спасибо
А я пойду пить чай...  нервы уже на пределе
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Вывести поля профиля Joomla

Автор romagromov

Ответов: 11
Просмотров: 2842
Последний ответ 28.04.2025, 10:25:44
от sivers
[Решено] Вывод значений из custom fields материала в модуле по имени поля

Автор goga_pgasovav

Ответов: 3
Просмотров: 1496
Последний ответ 30.12.2024, 13:22:11
от goga_pgasovav
Вывод дополнительного поля материала в модуле

Автор timofe

Ответов: 10
Просмотров: 2644
Последний ответ 06.10.2023, 14:02:24
от Mitriy
Изменение отображения модуля от разрешения экрана

Автор mag_num83

Ответов: 5
Просмотров: 1041
Последний ответ 17.05.2023, 09:35:23
от Театрал
Добавление поля в форму регистрации

Автор Robert24

Ответов: 3
Просмотров: 988
Последний ответ 10.10.2022, 23:35:04
от Robert24