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

El80

  • Новичок
  • 6
  • 0 / 0
Добрый день! Помогите настроить отправку почты.
Фото настроек в админке Joomla 3.6.5 в приложении.
Хостинг Timeweb говорит, что с его стороны ограничений нет.
При отправке тестового письма пишется ошибка:
An error has occurred while fetching the JSON data: HTTP 502 status code.
« Последнее редактирование: 28.06.2017, 18:12:41 от El80 »
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
Re: Не отправляюся письма через smtp yandex
« Ответ #1 : 28.06.2017, 18:21:23 »
для smtp яндекса, насколько я знаю, имя пользователя = email
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

El80

  • Новичок
  • 6
  • 0 / 0
Re: Не отправляюся письма через smtp yandex
« Ответ #2 : 29.06.2017, 09:54:30 »
для smtp яндекса, насколько я знаю, имя пользователя = email
Не помогло, поставил имя пользователя как email: av.ru@yandex.ru. Результат тот же
*

kalita

  • Захожу иногда
  • 80
  • 2 / 0
Re: Не отправляюся письма через smtp yandex
« Ответ #3 : 29.06.2017, 09:58:47 »
на локалке делаете?
*

El80

  • Новичок
  • 6
  • 0 / 0
Re: Не отправляюся письма через smtp yandex
« Ответ #4 : 29.06.2017, 10:10:20 »
на локалке делаете?
На хостинг Timeweb. Он говорит, что с его стороны ограничений нет.
*

ProtectYourSite

  • Живу я здесь
  • 2368
  • 139 / 4
  • Безопасность вебсайтов
Re: Не отправляюся письма через smtp yandex
« Ответ #5 : 29.06.2017, 10:16:09 »
https://pdd.yandex.ru/ подключите и настройте для начала доменную почту.
Хотя случаем на https недавно не переходили?
*

El80

  • Новичок
  • 6
  • 0 / 0
Re: Не отправляюся письма через smtp yandex
« Ответ #6 : 29.06.2017, 10:27:49 »
https://pdd.yandex.ru/ подключите и настройте для начала доменную почту.
Хотя случаем на https недавно не переходили?
С доменной почтой Яндекс тоже пробовал, та же ошибка. На https не переходили.
*

ProtectYourSite

  • Живу я здесь
  • 2368
  • 139 / 4
  • Безопасность вебсайтов
Re: Не отправляюся письма через smtp yandex
« Ответ #7 : 29.06.2017, 10:55:10 »
Отображение ошибок включите или логи посмотрите, почему 502 приходит.
*

capricorn

  • Завсегдатай
  • 1949
  • 118 / 3
Re: Не отправляюся письма через smtp yandex
« Ответ #8 : 29.06.2017, 11:30:27 »
Эта ошибка может быть связана с неверными источниками JSON сторонних расширений - их нужно либо отключить, либо исправить.
https://forum.joomla.org/viewtopic.php?t=937387

Если прочтете эту тему, то найдете в ней ссылки
https://www.joomlashack.com/blog/tutorials/363/
https://www.joomlashack.com/blog/tutorials/error-decoding-json-data-syntax/

Последняя предлагает использовать скрипт для проверки БД
https://github.com/robwent/joomla-json-db-check

Он исправит неверные пустые JSON данные и обнаружит остальные, которые необходимо будет исправить вручную.

Сам скрипт

Код: php
<?php
/**
* Turn on outputbuffering for servers that have it disabled.
*/
ob_start();
?>
<!DOCTYPE html>
<html>
<head>
<title>Joomla json Check</title>
<style>
.btn {
/* Structure */
display: inline-block;
zoom: 1;
line-height: normal;
white-space: nowrap;
vertical-align: middle;
text-align: center;
cursor: pointer;
-webkit-user-drag: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
font-family: inherit;
font-size: 100%;
padding: 0.5em 1em;
border: 1px solid #999;  /*IE 6/7/8*/
border: none rgba(0, 0, 0, 0);  /*IE9 + everything else*/
background-color: rgb(0, 120, 231);
color: #fff;
text-decoration: none;
border-radius: 2px;
}
</style>
</head>
<body>
<?php
//Initiate Joomla so we can use it's functions
/**
* Constant that is checked in included files to prevent direct access.
* define() is used in the installation folder rather than "const" to not error for PHP 5.2 and lower
*/
define('_JEXEC', 1);
if (file_exists(__DIR__ . '/defines.php'))
{
include_once __DIR__ . '/defines.php';
}
if (!defined('_JDEFINES'))
{
define('JPATH_BASE', __DIR__);
require_once JPATH_BASE . '/includes/defines.php';
}
require_once JPATH_BASE . '/includes/framework.php';
// Instantiate the application.
$app    = JFactory::getApplication('site');
$db     = JFactory::getDbo();
$config = JFactory::getConfig();
$jinput    = $app->input;
$fullcheck = $jinput->get('fullcheck', 0, 'INT');
    $columns =  $jinput->get('columns', array(), 'array');
function is_trying_to_be_json($data)
{
$data = trim($data);
return ((substr($data, 0, 1) === '{') || (substr($data, -1, 1) === '}'))? true : false;
}
function is_json()
{
call_user_func_array('json_decode', func_get_args());
return (json_last_error() === JSON_ERROR_NONE);
}
    //The columns to check
    $column_string = 'COLUMN_NAME = \'params\' OR COLUMN_NAME = \'rules\' OR COLUMN_NAME = \'attribs\'';
    if(count($columns) > 0)
    {
        $column_string = '';
        $first = 1;
        if(in_array('params', $columns))
        {
            $column_string .= 'COLUMN_NAME = \'params\'';
            $first = 0;
        }
        if(in_array('rules', $columns))
        {
            $column_string .= $first ? 'COLUMN_NAME = \'rules\'' : ' OR COLUMN_NAME = \'rules\'';
            $first = 0;
        }
        if(in_array('attribs', $columns))
        {
            $column_string .= $first ? 'COLUMN_NAME = \'attribs\'' : ' OR COLUMN_NAME = \'attribs\'';
        }
    }
//We use this for both checks
$query = $db->getQuery(true)
->select('TABLE_NAME,COLUMN_NAME')
->from('INFORMATION_SCHEMA.COLUMNS')
->where($column_string)
->andWhere('TABLE_SCHEMA = \'' . $config->get('db'). '\'');
$db->setQuery($query);
$results = $db->loadObjectList();
?>
<?php if ($fullcheck == 0) : ?>
<h4>Checking for Invalid Empty Parameters</h4>
<?php
if ($results)
{
foreach ($results as $result)
{
echo "Checking table: {$result->TABLE_NAME}, column {$result->COLUMN_NAME}<br>";
$query = $db->getQuery(true)
->update($result->TABLE_NAME)
->set($result->COLUMN_NAME . ' = "{}"')
->where($result->COLUMN_NAME . ' = "" OR ' . $result->COLUMN_NAME . ' = \'{\"\"}\' OR ' . $result->COLUMN_NAME . ' = \'{\\\\\"\\\\\"}\' ');
$db->setQuery($query);
$results = $db->execute();
$changes = $db->getAffectedRows();
if ($changes != 0)
{
echo $changes . " rows modified.<br>";
}
}
}
?>
<h4>Finished checking empty parameters</h4>
<form>
<button class="btn" name="fullcheck" value="1">Check For All Invalid Values</button>
                Columns to check:
                <label for="params" class="pure-checkbox">
                    <input id="params" type="checkbox" name="columns[]" value="params" checked>
                    params
                </label>
                <label for="params" class="pure-checkbox">
                    <input id="params" type="checkbox" name="columns[]" value="rules" checked>
                    rules
                </label>
                <label for="params" class="pure-checkbox">
                    <input id="params" type="checkbox" name="columns[]" value="attribs" checked>
                    attribs
                </label>
</form>
<p></p>
<p><small>(This will not replace any values, you will need to manaully fix them)</small></p>
<?php else :
        if(count($columns) > 0)
        {
        ?>
<h4>Checking '<?php echo implode(', ', $columns)?>'  Entries for Invalid Syntax</h4>
<?php
// Check all params for invalid syntax
if ($results)
{
foreach ($results as $result)
{
echo "<p>Checking table: {$result->TABLE_NAME}, column {$result->COLUMN_NAME}</p>";
$query = $db->getQuery(true)
->select('*')
->from($result->TABLE_NAME)
->where($result->COLUMN_NAME . ' != "{}"');
$db->setQuery($query);
$results = $db->loadAssocList();
if ($results)
{
foreach ($results as $row)
{
if (!is_json($row[$result->COLUMN_NAME]) && is_trying_to_be_json($row[$result->COLUMN_NAME]))
{
$error = json_last_error_msg();
reset($row);
$first_key = key($row);
echo "Row {$row[$first_key]} is not valid JSON. Error: ($error)<br>";
echo "Content: {$row[$result->COLUMN_NAME]}<br><hr>";
}
}
}
}
}?>

<h4>Finished checking invalid parameters</h4>
<p>Check invalid rules at <a target="_blank" href="http://jsonlint.com/">jsonlint.com</a></p>
                <?php }
                else
                {
                    //No columns selected ?>
                <h4>You need to select at least one column to check!</h4>

                <?php } ?>
<form>
<button class="btn" name="fullcheck" value="1">Check Again</button>
                    Columns to check:
                    <label for="params" class="pure-checkbox">
                        <input id="params" type="checkbox" name="columns[]" value="params" <?php echo (in_array('params', $columns))? 'checked' : ''; ?>>
                        params
                    </label>
                    <label for="params" class="pure-checkbox">
                        <input id="params" type="checkbox" name="columns[]" value="rules" <?php echo (in_array('rules', $columns))? 'checked' : ''; ?>>
                        rules
                    </label>
                    <label for="params" class="pure-checkbox">
                        <input id="params" type="checkbox" name="columns[]" value="attribs" <?php echo (in_array('attribs', $columns))? 'checked' : ''; ?>>
                        attribs
                    </label>
</form>

<?php endif; ?>
</body>
</html>

Выглядит так в браузере



J 3.6.5 нормально отправляет тестовое письмо с вашими настройками почты Яндекс. проверил на локальной установке после выполнения этого скрипта на чистой J.

На всякий случай сделайте бэкап сайта перед выполнением скрипта.




*

El80

  • Новичок
  • 6
  • 0 / 0
Re: Не отправляюся письма через smtp yandex
« Ответ #9 : 29.06.2017, 11:36:08 »
Спасибо, попробую.
*

El80

  • Новичок
  • 6
  • 0 / 0
Re: Не отправляюся письма через smtp yandex
« Ответ #10 : 06.07.2017, 16:46:50 »
Эта ошибка может быть связана с неверными источниками JSON сторонних расширений - их нужно либо отключить, либо исправить.
https://forum.joomla.org/viewtopic.php?t=937387

Если прочтете эту тему, то найдете в ней ссылки
https://www.joomlashack.com/blog/tutorials/363/
https://www.joomlashack.com/blog/tutorials/error-decoding-json-data-syntax/

Последняя предлагает использовать скрипт для проверки БД
https://github.com/robwent/joomla-json-db-check

Он исправит неверные пустые JSON данные и обнаружит остальные, которые необходимо будет исправить вручную.

Сам скрипт

Код: php
<?php
/**
* Turn on outputbuffering for servers that have it disabled.
*/
ob_start();
?>
<!DOCTYPE html>
<html>
<head>
<title>Joomla json Check</title>
<style>
.btn {
/* Structure */
display: inline-block;
zoom: 1;
line-height: normal;
white-space: nowrap;
vertical-align: middle;
text-align: center;
cursor: pointer;
-webkit-user-drag: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
font-family: inherit;
font-size: 100%;
padding: 0.5em 1em;
border: 1px solid #999;  /*IE 6/7/8*/
border: none rgba(0, 0, 0, 0);  /*IE9 + everything else*/
background-color: rgb(0, 120, 231);
color: #fff;
text-decoration: none;
border-radius: 2px;
}
</style>
</head>
<body>
<?php
//Initiate Joomla so we can use it's functions
/**
* Constant that is checked in included files to prevent direct access.
* define() is used in the installation folder rather than "const" to not error for PHP 5.2 and lower
*/
define('_JEXEC', 1);
if (file_exists(__DIR__ . '/defines.php'))
{
include_once __DIR__ . '/defines.php';
}
if (!defined('_JDEFINES'))
{
define('JPATH_BASE', __DIR__);
require_once JPATH_BASE . '/includes/defines.php';
}
require_once JPATH_BASE . '/includes/framework.php';
// Instantiate the application.
$app    = JFactory::getApplication('site');
$db     = JFactory::getDbo();
$config = JFactory::getConfig();
$jinput    = $app->input;
$fullcheck = $jinput->get('fullcheck', 0, 'INT');
    $columns =  $jinput->get('columns', array(), 'array');
function is_trying_to_be_json($data)
{
$data = trim($data);
return ((substr($data, 0, 1) === '{') || (substr($data, -1, 1) === '}'))? true : false;
}
function is_json()
{
call_user_func_array('json_decode', func_get_args());
return (json_last_error() === JSON_ERROR_NONE);
}
    //The columns to check
    $column_string = 'COLUMN_NAME = \'params\' OR COLUMN_NAME = \'rules\' OR COLUMN_NAME = \'attribs\'';
    if(count($columns) > 0)
    {
        $column_string = '';
        $first = 1;
        if(in_array('params', $columns))
        {
            $column_string .= 'COLUMN_NAME = \'params\'';
            $first = 0;
        }
        if(in_array('rules', $columns))
        {
            $column_string .= $first ? 'COLUMN_NAME = \'rules\'' : ' OR COLUMN_NAME = \'rules\'';
            $first = 0;
        }
        if(in_array('attribs', $columns))
        {
            $column_string .= $first ? 'COLUMN_NAME = \'attribs\'' : ' OR COLUMN_NAME = \'attribs\'';
        }
    }
//We use this for both checks
$query = $db->getQuery(true)
->select('TABLE_NAME,COLUMN_NAME')
->from('INFORMATION_SCHEMA.COLUMNS')
->where($column_string)
->andWhere('TABLE_SCHEMA = \'' . $config->get('db'). '\'');
$db->setQuery($query);
$results = $db->loadObjectList();
?>
<?php if ($fullcheck == 0) : ?>
<h4>Checking for Invalid Empty Parameters</h4>
<?php
if ($results)
{
foreach ($results as $result)
{
echo "Checking table: {$result->TABLE_NAME}, column {$result->COLUMN_NAME}<br>";
$query = $db->getQuery(true)
->update($result->TABLE_NAME)
->set($result->COLUMN_NAME . ' = "{}"')
->where($result->COLUMN_NAME . ' = "" OR ' . $result->COLUMN_NAME . ' = \'{\"\"}\' OR ' . $result->COLUMN_NAME . ' = \'{\\\\\"\\\\\"}\' ');
$db->setQuery($query);
$results = $db->execute();
$changes = $db->getAffectedRows();
if ($changes != 0)
{
echo $changes . " rows modified.<br>";
}
}
}
?>
<h4>Finished checking empty parameters</h4>
<form>
<button class="btn" name="fullcheck" value="1">Check For All Invalid Values</button>
                Columns to check:
                <label for="params" class="pure-checkbox">
                    <input id="params" type="checkbox" name="columns[]" value="params" checked>
                    params
                </label>
                <label for="params" class="pure-checkbox">
                    <input id="params" type="checkbox" name="columns[]" value="rules" checked>
                    rules
                </label>
                <label for="params" class="pure-checkbox">
                    <input id="params" type="checkbox" name="columns[]" value="attribs" checked>
                    attribs
                </label>
</form>
<p></p>
<p><small>(This will not replace any values, you will need to manaully fix them)</small></p>
<?php else :
        if(count($columns) > 0)
        {
        ?>
<h4>Checking '<?php echo implode(', ', $columns)?>'  Entries for Invalid Syntax</h4>
<?php
// Check all params for invalid syntax
if ($results)
{
foreach ($results as $result)
{
echo "<p>Checking table: {$result->TABLE_NAME}, column {$result->COLUMN_NAME}</p>";
$query = $db->getQuery(true)
->select('*')
->from($result->TABLE_NAME)
->where($result->COLUMN_NAME . ' != "{}"');
$db->setQuery($query);
$results = $db->loadAssocList();
if ($results)
{
foreach ($results as $row)
{
if (!is_json($row[$result->COLUMN_NAME]) && is_trying_to_be_json($row[$result->COLUMN_NAME]))
{
$error = json_last_error_msg();
reset($row);
$first_key = key($row);
echo "Row {$row[$first_key]} is not valid JSON. Error: ($error)<br>";
echo "Content: {$row[$result->COLUMN_NAME]}<br><hr>";
}
}
}
}
}?>

<h4>Finished checking invalid parameters</h4>
<p>Check invalid rules at <a target="_blank" href="http://jsonlint.com/">jsonlint.com</a></p>
                <?php }
                else
                {
                    //No columns selected ?>
                <h4>You need to select at least one column to check!</h4>

                <?php } ?>
<form>
<button class="btn" name="fullcheck" value="1">Check Again</button>
                    Columns to check:
                    <label for="params" class="pure-checkbox">
                        <input id="params" type="checkbox" name="columns[]" value="params" <?php echo (in_array('params', $columns))? 'checked' : ''; ?>>
                        params
                    </label>
                    <label for="params" class="pure-checkbox">
                        <input id="params" type="checkbox" name="columns[]" value="rules" <?php echo (in_array('rules', $columns))? 'checked' : ''; ?>>
                        rules
                    </label>
                    <label for="params" class="pure-checkbox">
                        <input id="params" type="checkbox" name="columns[]" value="attribs" <?php echo (in_array('attribs', $columns))? 'checked' : ''; ?>>
                        attribs
                    </label>
</form>

<?php endif; ?>
</body>
</html>

Выглядит так в браузере



J 3.6.5 нормально отправляет тестовое письмо с вашими настройками почты Яндекс. проверил на локальной установке после выполнения этого скрипта на чистой J.

На всякий случай сделайте бэкап сайта перед выполнением скрипта.





Использовал данный скрипт. Скрипт нашел ошибки и автоматически их исправил. Но отправка писем не заработала.
Обновил Joomla до 3.7.3 и все поехало. Спасибо всем за помощь.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Вставка видео со своего сервера через media manager

Автор goga_pgasovav

Ответов: 2
Просмотров: 1544
Последний ответ 27.03.2025, 14:51:43
от Akeksandr
Регистрация и авторизация через соц сети

Автор DamaVbubi

Ответов: 3
Просмотров: 1873
Последний ответ 14.04.2024, 16:15:05
от Гоша_Компьютерный
Cайт через браузер недоступен

Автор rezchik

Ответов: 0
Просмотров: 713
Последний ответ 01.04.2023, 10:49:08
от rezchik
Редактирование title через страницу

Автор toxic_rain

Ответов: 1
Просмотров: 719
Последний ответ 28.02.2023, 11:54:28
от sivers
Свои позиции через grid

Автор androv77

Ответов: 0
Просмотров: 702
Последний ответ 21.11.2022, 16:45:05
от androv77