Новости 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

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

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

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

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

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

JmsNueva

  • Осваиваюсь на форуме
  • 12
  • 0 / 0
После восстановления из бекапа появилась эта ошибка,помогите разобратся с ней :(
Админка работает,Joomla 1.5
Parse error: syntax error, unexpected $end in /home/atnperm/domains/atnperm.ru/public_html/trans/includes/router.php on line 123
« Последнее редактирование: 20.04.2010, 21:40:24 от JmsNueva »
*

Aleks_El_Dia

  • Moderator
  • 3671
  • 353 / 0
  • AEDStudio Joomla! Direction
перезалейте этот файл, на который ссылается ошибка
Спам придумали боги в отместку за наши молитвы (с) Рома Воронежский
На молоко: Z369038872422 || R210017695494 || U247040729215 || ЯД 410011288250383
Мигрирую сайты, переношу расширения J!1.0->J!1.5->J!2.5. Более 50 успешных миграций.
*

JmsNueva

  • Осваиваюсь на форуме
  • 12
  • 0 / 0
Пробовал.Без изменений.
Во вложении сам файлик...

[вложение удалено Администратором]
« Последнее редактирование: 21.04.2010, 15:18:40 от JmsNueva »
*

Aleks_El_Dia

  • Moderator
  • 3671
  • 353 / 0
  • AEDStudio Joomla! Direction
Он у вас битый. Вот содержимое этого файла. Скопируйте и вставьте:
Код
<?php
/**
* @version $Id: router.php 8180 2007-07-23 05:52:29Z eddieajau $
* @package Joomla.Framework
* @subpackage Application
* @copyright Copyright (C) 2005 - 2008 Open Source Matters. All rights reserved.
* @license GNU/GPL, see LICENSE.php
* Joomla! is free software. This version may have been modified pursuant
* to the GNU General Public License, and as distributed it includes or
* is derivative of works licensed under the GNU General Public License or
* other free or open source software licenses.
* See COPYRIGHT.php for copyright notices and details.
*/

// Check to ensure this file is within the rest of the framework
defined('JPATH_BASE') or die();

/**
 * Class to create and parse routes for the site application
 *
 * @package Joomla
 * @since 1.5
 */
class JRouterSite extends JRouter
{
/**
* Class constructor
*
* @access public
*/
function __construct($options = array()) {
parent::__construct($options);
}

function parse(&$uri)
{
$vars = array();

// Get the application
$app =& JFactory::getApplication();

if($app->getCfg('force_ssl') == 2 && strtolower($uri->getScheme())!= 'https') {
//forward to https
$uri->setScheme('https');
$app->redirect($uri->toString());
}


// Get the path
$path = $uri->getPath();

//Remove the suffix
if($this->_mode == JROUTER_MODE_SEF)
{

if($app->getCfg('sef_suffix') && !(substr($path, -9) == 'index.php' || substr($path, -1) == '/'))
{
if($suffix = pathinfo($path, PATHINFO_EXTENSION))
{
$path = str_replace('.'.$suffix, '', $path);
$vars['format'] = $suffix;
}
}
}

//Remove basepath
$path = substr_replace($path, '', 0, strlen(JURI::base(true)));

//Remove prefix
$path = str_replace('index.php', '', $path);

//Set the route
$uri->setPath(trim($path , '/'));

$vars += parent::parse($uri);

return $vars;
}

function &build($url)
{
$uri =& parent::build($url);

// Get the path data
$route = $uri->getPath();

//Add the suffix to the uri
if($this->_mode == JROUTER_MODE_SEF && $route)
{
$app =& JFactory::getApplication();

if($app->getCfg('sef_suffix') && !(substr($route, -9) == 'index.php' || substr($route, -1) == '/'))
{
if($format = $uri->getVar('format', 'html'))
{
$route .= '.'.$format;
$uri->delVar('format');
}
}

if($app->getCfg('sef_rewrite'))
{
//Transform the route
$route = str_replace('index.php/', '', $route);
}
}

//Add basepath to the uri
$uri->setPath(JURI::base(true).'/'.$route);

return $uri;
}

function _parseRawRoute(&$uri)
{
$vars   = array();

$menu =& JSite::getMenu(true);

//Handle an empty URL (special case)
if(!$uri->getVar('Itemid') && !$uri->getVar('option'))
{
$item = $menu->getDefault();
if(!is_object($item)) return $vars; // No default item set

//Set the information in the request
$vars = $item->query;

//Get the itemid
$vars['Itemid'] = $item->id;

// Set the active menu item
$menu->setActive($vars['Itemid']);

return $vars;
}

//Get the variables from the uri
$this->setVars($uri->getQuery(true));

//Get the itemid, if it hasn't been set force it to null
$this->setVar('Itemid', JRequest::getInt('Itemid', null));

//Only an Itemid ? Get the full information from the itemid
if(count($this->getVars()) == 1)
{
$item = $menu->getItem($this->getVar('Itemid'));
$vars = $vars + $item->query;
}

// Set the active menu item
$menu->setActive($this->getVar('Itemid'));

return $vars;
}

function _parseSefRoute(&$uri)
{
$vars   = array();

$menu  =& JSite::getMenu(true);
$route = $uri->getPath();

//Get the variables from the uri
$vars = $uri->getQuery(true);

//Handle an empty URL (special case)
if(empty($route))
{

//If route is empty AND option is set in the query, assume it's non-sef url, and parse apropriately
if(isset($vars['option']) || isset($vars['Itemid'])) {
return $this->_parseRawRoute($uri);
}

$item = $menu->getDefault();

//Set the information in the request
$vars = $item->query;

//Get the itemid
$vars['Itemid'] = $item->id;

// Set the active menu item
$menu->setActive($vars['Itemid']);

return $vars;
}


/*
* Parse the application route
*/

if(substr($route, 0, 9) == 'component')
{
$segments = explode('/', $route);
$route      = str_replace('component/'.$segments[1], '', $route);

$vars['option'] = 'com_'.$segments[1];
$vars['Itemid'] = null;
}
else
{
//Need to reverse the array (highest sublevels first)
$items = array_reverse($menu->getMenu());

foreach ($items as $item)
{
$lenght = strlen($item->route); //get the lenght of the route

if($lenght > 0 && strpos($route.'/', $item->route.'/') === 0 && $item->type != 'menulink')
{
$route   = substr($route, $lenght);

$vars['Itemid'] = $item->id;
$vars['option'] = $item->component;
break;
}
}
}

// Set the active menu item
if ( isset($vars['Itemid']) ) {
$menu->setActive(  $vars['Itemid'] );
}

//Set the variables
$this->setVars($vars);

/*
* Parse the component route
*/
if(!empty($route) && isset($this->_vars['option']) )
{
$segments = explode('/', $route);
array_shift($segments);

// Handle component route
$component = preg_replace('/[^A-Z0-9_\.-]/i', '', $this->_vars['option']);

// Use the component routing handler if it exists
$path = JPATH_SITE.DS.'components'.DS.$component.DS.'router.php';

if (file_exists($path) && count($segments))
{
if ($component != "com_search") { // Cheap fix on searches
//decode the route segments
$segments = $this->_decodeSegments($segments);
}
else { // fix up search for URL
$total = count($segments);
for($i=0; $i<$total; $i++) {
// urldecode twice because it is encoded twice
$segments[$i] = urldecode(urldecode(stripcslashes($segments[$i])));
}
}

require_once $path;
$function =  substr($component, 4).'ParseRoute';
$vars =  $function($segments);

$this->setVars($vars);
}
}
else
{
//Set active menu item
if($item =& $menu->getActive()) {
$vars = $item->query;
}
}

return $vars;
}

function _buildRawRoute(&$uri)
{
}

function _buildSefRoute(&$uri)
{
// Get the route
$route = $uri->getPath();

// Get the query data
$query = $uri->getQuery(true);

if(!isset($query['option'])) {
return;
}

$menu =& JSite::getMenu();

/*
* Build the component route
*/
$component = preg_replace('/[^A-Z0-9_\.-]/i', '', $query['option']);
$tmp = '';

// Use the component routing handler if it exists
$path = JPATH_SITE.DS.'components'.DS.$component.DS.'router.php';

// Use the custom routing handler if it exists
if (file_exists($path) && !empty($query))
{
require_once $path;
$function = substr($component, 4).'BuildRoute';
$parts = $function($query);

// encode the route segments
if ($component != "com_search") { // Cheep fix on searches
$parts = $this->_encodeSegments($parts);
}
else { // fix up search for URL
$total = count($parts);
for($i=0; $i<$total; $i++) {
// urlencode twice because it is decoded once after redirect
$parts[$i] = urlencode(urlencode(stripcslashes($parts[$i])));
}
}

$result = implode('/', $parts);
$tmp = ($result != "")? '/'.$result : '';
}

/*
* Build the application route
*/
$built = false;
if (isset($query['Itemid']) && !empty($query['Itemid']))
{
$item = $menu->getItem($query['Itemid']);

if (is_object($item) && $query['option'] == $item->component) {
$tmp = !empty($tmp)? $item->route.'/'.$tmp : $item->route;
$built = true;
}
}

if(!$built) {
$tmp = 'component/'.substr($query['option'], 4).'/'.$tmp;
}

$route .= '/'.$tmp;

// Unset unneeded query information
unset($query['Itemid']);
unset($query['option']);

//Set query again in the URI
$uri->setQuery($query);
$uri->setPath($route);
}

function _processParseRules(&$uri)
{
// Process the attached parse rules
$vars = parent::_processParseRules($uri);

// Process the pagination support
if($this->_mode == JROUTER_MODE_SEF)
{
$app =& JFactory::getApplication();

if($start = $uri->getVar('start'))
{
$uri->delVar('start');
$vars['limitstart'] = $start;
}
}

return $vars;
}

function _processBuildRules(&$uri)
{
// Make sure any menu vars are used if no others are specified
if(($this->_mode != JROUTER_MODE_SEF) && $uri->getVar('Itemid') && count($uri->getQuery(true)) == 2)
{
$menu =& JSite::getMenu();

// Get the active menu item
$itemid = $uri->getVar('Itemid');
$item   = $menu->getItem($itemid);

$uri->setQuery($item->query);
$uri->setVar('Itemid', $itemid);
}

// Process the attached build rules
parent::_processBuildRules($uri);

// Get the path data
$route = $uri->getPath();

if($this->_mode == JROUTER_MODE_SEF && $route)
{
$app =& JFactory::getApplication();

if ($limitstart = $uri->getVar('limitstart'))
{
$uri->setVar('start', (int) $limitstart);
$uri->delVar('limitstart');
}
}

$uri->setPath($route);
}

function &_createURI($url)
{
//Create the URI
$uri =& parent::_createURI($url);

// Set URI defaults
$menu =& JSite::getMenu();

// Get the itemid form the URI
$itemid = $uri->getVar('Itemid');

if(is_null($itemid))
{
if($option = $uri->getVar('option'))
{
$item  = $menu->getItem($this->getVar('Itemid'));
if(isset($item) && $item->component == $option) {
$uri->setVar('Itemid', $item->id);
}
}
else
{
if($option = $this->getVar('option')) {
$uri->setVar('option', $option);
}

if($itemid = $this->getVar('Itemid')) {
$uri->setVar('Itemid', $itemid);
}
}
}
else
{
if(!$uri->getVar('option'))
{
$item  = $menu->getItem($itemid);
$uri->setVar('option', $item->component);
}
}

return $uri;
}
}
Спам придумали боги в отместку за наши молитвы (с) Рома Воронежский
На молоко: Z369038872422 || R210017695494 || U247040729215 || ЯД 410011288250383
Мигрирую сайты, переношу расширения J!1.0->J!1.5->J!2.5. Более 50 успешных миграций.
*

JmsNueva

  • Осваиваюсь на форуме
  • 12
  • 0 / 0
Спасибо большое.От ошибки избавился.Только вот почему то белый экран сейчас.Буду дальше копать.
*

Aleks_El_Dia

  • Moderator
  • 3671
  • 353 / 0
  • AEDStudio Joomla! Direction
index.php таким же макаром проверьте, который в корне лежит
Спам придумали боги в отместку за наши молитвы (с) Рома Воронежский
На молоко: Z369038872422 || R210017695494 || U247040729215 || ЯД 410011288250383
Мигрирую сайты, переношу расширения J!1.0->J!1.5->J!2.5. Более 50 успешных миграций.
*

JmsNueva

  • Осваиваюсь на форуме
  • 12
  • 0 / 0
Блин и он битый(((,это сейчас всё заново переустанавливать?


[вложение удалено Администратором]
« Последнее редактирование: 21.04.2010, 17:22:29 от JmsNueva »
*

Aleks_El_Dia

  • Moderator
  • 3671
  • 353 / 0
  • AEDStudio Joomla! Direction
Достаточно просто перезалить файлы с оригинального дистрибутива поверх ваших файлов + смотреть какие сторонние расширения были установлены и при необходимости заменить также эти файлы. Переустанавливать сайт заново нет смысла.
Спам придумали боги в отместку за наши молитвы (с) Рома Воронежский
На молоко: Z369038872422 || R210017695494 || U247040729215 || ЯД 410011288250383
Мигрирую сайты, переношу расширения J!1.0->J!1.5->J!2.5. Более 50 успешных миграций.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Не могу распаковать jpa архив сайта Akeeba backup. ajax error

Автор smadkz

Ответов: 4
Просмотров: 1906
Последний ответ 26.12.2020, 15:15:15
от stendapuss
Fatal error: Class 'JDocument' not found

Автор gabiboi

Ответов: 2
Просмотров: 2415
Последний ответ 04.09.2020, 14:39:07
от svetka_777
simpleform2 ошибка ajax error в Google chrome

Автор safronoff343

Ответов: 1
Просмотров: 1257
Последний ответ 05.06.2020, 20:36:42
от safronoff343
Ошибка #1050 при переносе базы данных на хостинг

Автор Ksen

Ответов: 7
Просмотров: 24894
Последний ответ 16.03.2020, 17:47:29
от Petrovich
При попытке войти в админку 404 ошибка компонента

Автор omezik

Ответов: 4
Просмотров: 2896
Последний ответ 31.08.2019, 22:41:46
от Taatshi