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

nvyush

  • Осваиваюсь на форуме
  • 17
  • 1 / 0
Сообщение напрашивается в раздел "Баги Joomla", но создавать там темы у меня прав нет.
Недавно понадобилось импортировать большой объём данных (категорий и материалов) из другой системы в Joomla! 3.4.5.
Сгенерировать нужные значения для полей `parent_id` и `level` таблиц `#__assets` и `#__categories` труда не составило, а для полей `lft` и `rgt` установил -1 в надежде после импорта перестроить штатными средствами Joomla.
Для таблицы категорий такой инструмент имеется (кнопка "Перестроить" в менеджере категорий), а вот для таблицы `#__assets` пришлось написать свой модуль (бесплатного в сети не нашёл, да и платного тоже). В ходе написания обнаружил, что класс JTableAsset наследуется от класса JTableNested, в котором есть "магический" метод rebuild, который собственно и делает то, что мне нужно. Но в этом методе также перестраиваются пути (поле `path`) используя значения поля `alias`. Ни поля `alias`, ни поля `path` в таблице `#__assets` нет, соответственно, вызов метода rebuild для объекта класса JTableAsset вызывает ошибку.
Для решения данной проблемы написал класс JTableAssetRebuild, наследующий от JTableAsset и переопределяющий метод rebuild. Правильней конечно было бы либо переопределить указанный метод непосредственно в классе JTableAsset, либо переписать всю иерархию классов в части JTableNested и JTableAsset, например, добавить в иерархию класс перед JTableNested с "правильным" rebuild (и другими полями/методами) и наследовать JTableAsset уже от него. [upd] Либо в классе JTableNested имеющийся rebuild переименовать, например, в _rebuildWithAlias и сделать его protected, добавить protected метод _rebuildWithoutAlias с аналогичным кодом, но без обновления путей (код ниже), а также добавить вызывающий их public метод rebuild (код ниже)  [/upd]. Однако влезать в код ядра Joomla не хотел, чтобы не потерять изменения при обновлении. Если у кого-нибудь есть возможность сообщить о данной ошибке разработчикам Joomla!, прошу сделать это.

Вот собственно код метода ([upd]если добавлять его как protected в класс JTableNested, то переименовать в _rebuildWithoutAlias и не забыть про рекурсивный вызов [/upd]):
Код
	/**
* Method to recursively rebuild the whole nested set tree.
*
* @param   integer  $parentId  The root of the tree to rebuild.
* @param   integer  $leftId    The left id to start with in building the tree.
* @param   integer  $level     The level to assign to the current nodes.
*
* @return  integer  1 + value of root rgt on success, false on failure
*
* @throws  RuntimeException on database error.
*/
public function rebuild($parentId = null, $leftId = 0, $level = 0)
{
// If no parent is provided, try to find it.
if ($parentId === null)
{
// Get the root item.
$parentId = $this->getRootId();

if ($parentId === false)
{
return false;
}
}

$query = $this->_db->getQuery(true);

// Build the structure of the recursive query.
if (!isset($this->_cache['rebuild.sql']))
{
$query->clear()
->select($this->_tbl_key)
->from($this->_tbl)
->where('parent_id = %d')
->order('parent_id, lft');

$this->_cache['rebuild.sql'] = (string) $query;
}

// Make a shortcut to database object.

// Assemble the query to find all children of this node.
$this->_db->setQuery(sprintf($this->_cache['rebuild.sql'], (int) $parentId));

$children = $this->_db->loadObjectList();

// The right value of this node is the left value + 1
$rightId = $leftId + 1;

// Execute this function recursively over all children
foreach ($children as $node)
{
/*
* $rightId is the current right value, which is incremented on recursion return.
* Increment the level for the children.
*/
$rightId = $this->rebuild($node->{$this->_tbl_key}, $rightId, $level + 1); //в классе JTableNested заменить на _rebuildWithoutAlias !

// If there is an update failure, return false to break out of the recursion.
if ($rightId === false)
{
return false;
}
}

// We've got the left value, and now that we've processed
// the children of this node we also know the right value.
$query->clear()
->update($this->_tbl)
->set('lft = ' . (int) $leftId)
->set('rgt = ' . (int) $rightId)
->set('level = ' . (int) $level)
->where($this->_tbl_key . ' = ' . (int) $parentId);
$this->_db->setQuery($query)->execute();

// Return the right value of this node + 1.
return $rightId + 1;
}

/**
* код метода rebuild для класса JTableNested
*/
public function rebuild($parentId = null, $leftId = 0, $level = 0, $path = '') {
$fields = $this->getFields();

if (isset($fields['alias'])) {
return $this->_rebuildWithAlias($parentId, $leftId, $level, $path);
} else {
return $this->_rebuildWithoutAlias($parentId, $leftId, $level);
}
}




« Последнее редактирование: 17.11.2015, 16:03:31 от nvyush »
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Не работает менеджер материалов, ошибка 500 SSL certificate problem

Автор Екатерина М

Ответов: 5
Просмотров: 1959
Последний ответ 06.04.2025, 09:27:20
от wishlight
Ошибка 0 Call to undefined function GuzzleHttp\choose_handler()

Автор Alllex

Ответов: 0
Просмотров: 1015
Последний ответ 15.03.2024, 21:03:09
от Alllex
Ошибка version_compare(): Argument #3 ($operator)

Автор Шмайсер

Ответов: 1
Просмотров: 1395
Последний ответ 07.11.2023, 20:44:21
от fsv
reCapcha во всплывающем окне - "Ошибка защиты от спама"

Автор Dannik

Ответов: 12
Просмотров: 2636
Последний ответ 14.09.2023, 18:59:24
от all_zer
Ошибка 1054 Unknown column 'created_by' in 'field list' VirtueMart

Автор Evgen Kulibin

Ответов: 3
Просмотров: 1492
Последний ответ 26.02.2023, 01:56:42
от lakshmi