Новости Joomla

Вышли релизы Joomla 6.1 и Joomla 5.4.5: новые возможности и стабильность

Релиз Joomla 6.1.0

Проект Joomla! объявил о доступности Joomla 6.1 [Nyota] — новой минорной версии шестой серии, а также о выпуске релиза исправлений ошибок Joomla 5.4.5. Релиз 6.1 приносит ряд долгожданных функций, повышающих удобство управления контентом и защиту от спама.

👩‍💻 Компонент "CS Афиши" для Joomla.

👩‍💻 Компонент "CS Афиши" для Joomla.

Расширение "CS Афиши" позволяет выводить список мероприятий, фильтровать их по датам, поиск по заголовкам и описанию.

В состав пакета расширений входят:
- Компонент "CS Афиши"
- Модуль "Календарь событий"
- Модуль "Предстоящие события"
- Библиотека "ImgResize"

Расширение "CS Афиши" позволяет выводить список мероприятий, фильтровать их по датам, поиск по заголовкам и описанию.

Модуль "Календарь событий" отображает предстоящие и прошедшие мероприятие на календаре, с отображением мероприятий на конкретную дату во всплывающем окне.

Модуль "Предстоящие события" показывает список предстоящий событий по порядку их наступления.

P.S. Расширение платное, но плата символическая, чисто для отработки приема платежей. Ключи без ограничения по времени, купившие сейчас - смогут обновляться без ограничений.

Разработчик - участник нашего сообщества Дмитрий Денисов (@codersite).

Страница расширения
Демо

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

Геон

  • Новичок
  • 6
  • 0 / 0
Здравствуйте!

Создал модуль для отображения курсов валют. Руководствовался: инструкциями из Интернет; и, подглядывая код чужих модулей. Модуль работает. Выводит то, что от него ожидалось. Но я поверхностно изучал инструкции, мог что-то не до понять. Проверьте, пожалуйста, код модуля на наличие явных несуразностей.
Код: mod_exchange_rates.xml
<?xml version="1.0" encoding="utf-8"?>
<extension
type="module"
version="2.5"
client="site"
method="upgrade">
<name>Show Exchange Rates</name>
<author>Author</author>
<creationDate>January 2024</creationDate>
<license>GNU General Public License version 2 or later</license>
<authorEmail>email</authorEmail>
<authorUrl>http://localhost</authorUrl>
<version>1.0</version>
<description>Модуль выводит курсы валют по данным ЦБ РФ</description>
<files>
<folder module="mod_exchange_rates">tmpl</folder>
<folder module="mod_exchange_rates">images</folder>
<folder module="mod_exchange_rates">css</folder>
<filename module="mod_exchange_rates">mod_exchange_rates.php</filename>
<filename module="mod_exchange_rates">mod_exchange_rates.xml</filename>
<filename module="mod_exchange_rates">index.html</filename>
</files>
<languages folder="language">
<language tag="ru-RU">ru-RU/ru-RU.mod_exchange_rates.ini</language>
<language tag="ru-RU">ru-RU/ru-RU.mod_exchange_rates.sys.ini</language>
<language tag="en-GB">en-GB/en-GB.mod_exchange_rates.ini</language>
<language tag="en-GB">en-GB/en-GB.mod_exchange_rates.sys.ini</language>
</languages>

<config>
<fields name="params">
<fieldset name="basic">

<field name="url"
type="text"
default=""
label="MOD_EXCHANGE_RATES"
description="MOD_EXCHANGE_RATES_DESC" />

</fieldset>

<fieldset name="advanced">
<field
name="layout"
type="modulelayout"
label="JFIELD_ALT_LAYOUT_LABEL"
description="JFIELD_ALT_MODULE_LAYOUT_DESC" />

<field
name="moduleclass_sfx"
type="text"
label="COM_MODULES_FIELD_MODULECLASS_SFX_LABEL"
description="COM_MODULES_FIELD_MODULECLASS_SFX_DESC" />

<field
name="cache"
type="list"
default="1"
label="COM_MODULES_FIELD_CACHING_LABEL"
description="COM_MODULES_FIELD_CACHING_DESC">
<option
value="1">JGLOBAL_USE_GLOBAL</option>
<option
value="0">COM_MODULES_FIELD_VALUE_NOCACHING</option>
</field>

<field
name="cache_time"
type="text"
default="900"
label="COM_MODULES_FIELD_CACHE_TIME_LABEL"
description="COM_MODULES_FIELD_CACHE_TIME_DESC" />

<field
name="cachemode"
type="hidden"
default="static">
<option
value="static"></option>
</field>

</fieldset>
</fields>
</config>
</extension>
Код: mod_exchange_rates.php
<?php
/**
 * @version 1.0
 * @package mod_exchange_rates
 * @author Author
 * [member=126442]copyright[/member] Copyright (c) 2024 SeoProsto.Net. All rights reserved.
 * @license   http://www.gnu.org/licenses/gpl.html GNU/GPL
 */

defined('_JEXEC') or die();

$document = JFactory::getDocument();

$document->addStyleSheet(JURI::base() . 'modules/mod_exchange_rates/css/default.css');

$class_sfx = htmlspecialchars($params->get('class_sfx'));

require JModuleHelper::getLayoutPath('mod_exchange_rates', $params->get('layout', 'default'));
Код: language/ru-RU/ru-RU.mod_exchange_rates.ini
MOD_EXCHANGE_RATES_XML_DESCRIPTION="Модуль выводит курсы валют"
MOD_EXCHANGE_RATES_CAPTCURS_LABEL="Курс валют"
MOD_EXCHANGE_RATES_TEXT_FIELD_DESC="Модуль выводит курсы валют"

MOD_EXCHANGE_RATES_USD="Курс доллара США"
MOD_EXCHANGE_RATES_EUR="Курс Евро"

MOD_EXCHANGE_RATES_SHORT_RUB="руб"

MOD_EXCHANGE_RATES_CURRENCY_CONVERTER="конвертер валют"

MOD_EXCHANGE_RATES_SERVER_NOT_AVAILABLE="Сервер www.cbr.ru недоступен!"
Код: language/ru-RU/ru-RU.mod_exchange_rates.sys.ini
MOD_EXCHANGE_RATES="Курсы Валют"
MOD_EXCHANGE_RATES_XML_DESCRIPTION="Модуль выводит курсы валют"
Код: tmpl/default.php
<?php
/**
 * @version 1.0
 * @package mod_exchange_rates
 * @author Author
 * [member=126442]copyright[/member] Copyright (c) 2024 SeoProsto.Net. All rights reserved.
 * @license   http://www.gnu.org/licenses/gpl.html GNU/GPL
 */

defined('_JEXEC') or die();

$exchange_rates = function() {

//откуда будем парсить информацию
$document_address = 'https://www.cbr.ru/scripts/XML_daily.asp';
$info_address = 'https://www.cbr.ru';
$supplier = 'Центральный банк Российской Федерации';

setlocale(LC_TIME, "ru-Ru");
$chas_p = 3; // Время MSK: +3GMT
$now = time() + $chas_p*3600;

$weekday_now_local = gmdate('w', $now); // день недели, неделя начинается с воскресенья (= 0) !!
$date_now_local = gmdate('Ymd', $now);
$time_now_local = gmdate('Hi', $now);

// адрес xml файла, для получения котировок на заданный день
//$curr_filename = $document_address.'?date_req='.gmdate( 'd/m/Y', $now );
$curr_filename = $document_address; // если параметр(date_req) отсутствует, то Вы получите документ на последнюю зарегистрированную дату.

$currency_icon = array
(
'USD' => '<img alt="Курс Доллара к рублю на сегодня" src="modules/mod_exchange_rates/images/icons/usd.png" />',
'EUR' => '<img alt="Курс Евро к рублю на сегодня" src="modules/mod_exchange_rates/images/icons/eur.png" />',
);
$currency_title = array
(
'USD' => 'MOD_EXCHANGE_RATES_USD',
'EUR' => 'MOD_EXCHANGE_RATES_EUR',
);
?>
<table id="exchange_rates">
<thead>
<tr>
<td><a href="https://cbr.ru/curreNcy_base/daily/"><?php echo JText::_('MOD_EXCHANGE_RATES_CAPTCURS_LABEL'); ?></a></td>
</tr>
</thead>
<tbody>
<?php try {
$content = file_get_contents($curr_filename);
$document = new SimpleXMLElement($content);
$attributes = current($document->attributes());
?>
<tr>
<td><?php echo $attributes[Date]; ?></td>
</tr>
<?php
foreach ($document->Valute as $value) {
$attributes = current($value->attributes());

switch($attributes[ID])
{
case 'R01235':
case 'R01239': ?>
<tr>
<td>
<table>
<tbody>
<tr title="<?php echo JText::_($currency_title[(string)($value->CharCode)]); ?>">
<td><?php echo $value->CharCode; ?></td>
<td><?php echo $currency_icon[(string)($value->CharCode)]; ?></td>
<td><?php echo round((float)str_replace(",",".","$value->Value"), 3); ?></td>
<td>
<span><?php echo JText::_('MOD_EXCHANGE_RATES_SHORT_RUB'); ?></span>
<img src="modules/mod_exchange_rates/images/arr_red.png">
</td>
</tr>
</tbody>
</table>
</td>
</tr><?php
break;
}
}
} catch (Exception $e) {
?>
<tr>
<td><?php echo JText::_('MOD_EXCHANGE_RATES_SERVER_NOT_AVAILABLE'); ?></td>
</tr>
<?php } ?>
</tbody>
<tfoot>
<tr>
<td>
<a href="https://converter.by/cbr?ysclid=lq6ak6tj91210828053&calc_usd=10">
<?php echo JText::_('MOD_EXCHANGE_RATES_CURRENCY_CONVERTER'); ?>
</a>
</td>
</tr>
</tfoot>
</table><?php
};
$exchange_rates();
?>
« Последнее редактирование: 14.01.2024, 21:45:42 от Геон »
*

sivers

  • Живу я здесь
  • 2610
  • 363 / 0
Код
$content = file_get_contents($curr_filename);
У вас при каждом обновлении страницы будет идти запрос на внешний ресурс? Это не есть гуд.
Общий кэш сайта включен не у всех. А тот ресурс периодически тупит или не грузится вовсе. Как итог - ваш сайт будет подвисать в ожидании.
Обязательно надо установить таймаут ожидания загрузки. И обработку ситуации, когда загрузка не удалась (выводить последние загруженные курсы, например).
Ну и обновление лучше сделать с каким-то интервалом, а не при каждой загрузке страницы. Иначе, при средней посещаемости, сайт ляжет.
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

Геон

  • Новичок
  • 6
  • 0 / 0
У вас при каждом обновлении страницы будет идти запрос на внешний ресурс? Это не есть гуд.
Спасибо за рецензирование. ^-^ Вот новая модификация кода:
Код: tmpl/default.php
<?php
/**
 * @version    1.0
 * @package    mod_exchange_rates
 * @author    Author
 * [member=126442]copyright[/member] Copyright (c) 2024 SeoProsto.Net. All rights reserved.
 * @license   http://www.gnu.org/licenses/gpl.html GNU/GPL
 */

defined('_JEXEC') or die();

function object_properties_inventory(&$standard, &$content) {
foreach ($standard as $key => $value) {
if ( gettype ($value) == 'string' )
{
//echo $key . ' = ' . $content->$key . '<br />'; // ### Отладочная информация
if ( isset($content->$key) ) {
//echo 'Переменная существует<br />'; // ### Отладочная информация
if ( !empty($content->$key) ) {
//echo '...и она не пустая<br />'; // ### Отладочная информация
} else {
//echo '...однако она пустая<br />'; // ### Отладочная информация
return false;
}
} else {
//echo 'Переменная не существует<br />'; // ### Отладочная информация
return false;
}
} else {
if ( !object_properties_inventory($value, $content->$key) )
return false;
}
}
return true;
}

$exchange_rates = function() {

setlocale(LC_TIME, "ru-Ru");
$chas_p = 3; // Время MSK: +3GMT
$now = time() + $chas_p*3600;

//$weekday_now_local = gmdate('w', $now); // день недели, неделя начинается с воскресенья (= 0) !!
//$date_now_local = gmdate('d.m.Y', $now);
//$time_now_local = gmdate('H:i', $now);

$need_load_data_from_site = false; // Флаг указывающий на необходимость выполнения блока для скачивания данных с сайта ЦБ

// Проверка наличия актуальных данных в кэше
header("Content-Type: application/json"); // на какие данные рассчитан этот скрипт
// Проверяем, есть ли на сервере нужный нам файл с данными — json.data.
$filename = __DIR__ . '/data.json'; // Берём новую переменную и пишем в неё имя файла
// Если есть — запоминаем его содержимое, а если такого файла нет — создаём его отдельной командой.
if (file_exists($filename)) { // Если файл есть...
// ... — открываем его и читаем данные
$file = file_get_contents($filename);
$list_of_exchange_rates = json_decode($file);

if ( (($now - $list_of_exchange_rates->cache_local_time) < 4 * 3600) && // Если разница между временем из кэша и текущим временем не превышает 4 часа,...
!($list_of_exchange_rates->date_now_crb == '00.00.0000') ) { // ...и дата котировки не "заглушка"
//echo "Данные из кэша" . "<br />"; // ### Отладочная информация
//echo "Разница времени: " . ($now - $list_of_exchange_rates->cache_local_time) . "<br />"; // ### Отладочная информация
} else {
$difference = 10; // Разница в секундах, между отмеченным временем и текущим
if ( ($now - $list_of_exchange_rates->time_attempt_file_get) > $difference ) {
// Если расхождение между временем последней попытки скачать данные с сайта ЦБ и текущим временем превышает 10 секунд...
$need_load_data_from_site = true; // ... - выставить флаг необходимости скачать данные с сайта ЦБ
} else { // Иначе - ничего не делать
//echo "Информация о курсах просрочена.<br />Но, попытка скачать актуальные<br />данные будет через "; // ### Отладочная информация
//echo ($difference - ($now - $list_of_exchange_rates->time_attempt_file_get)) . " секунд.<br />"; // ### Отладочная информация
}
}
} else { // Если такого файла нет...
// ...то создаём его сами
$file = fopen($filename, "a+");
$need_load_data_from_site = true;
}

// Проверка контейнера с данными на комплектность значимых переменных
$file = '{"date_now_crb":"00.00.0000","cache_local_time":"0000000000","time_attempt_file_get":"0000000000",';
$file .= '"ValueID":{"R01235":{"CharCode":"USD","Value":"00.0000"},"R01239":{"CharCode":"EUR","Value":"00.0000"}}}';
$list_layout = json_decode($file);
if ( object_properties_inventory($list_layout, $list_of_exchange_rates) ) {
//echo 'Проверка пройдена<br />'; // ### Отладочная информация
} else {
//echo 'Проверка не пройдена<br />'; // ### Отладочная информация
$list_of_exchange_rates = $list_layout; // Пересоздаем контейнер
file_put_contents($filename, json_encode($list_of_exchange_rates));
}

// Получение данных с сайта ЦБ
if ($need_load_data_from_site) {
$document_address;
$info_address;
$supplier;

$curr_filename;

//откуда будем парсить информацию
$document_address = 'https://www.cbr.ru/scripts/XML_daily.asp';
$info_address = 'https://www.cbr.ru';
$supplier = 'Центральный банк Российской Федерации';

// адрес xml файла, для получения котировок на заданный день
$curr_filename = $document_address.'?date_req='.gmdate( 'd/m/Y', $now );
//$curr_filename = $document_address; // если параметр(date_req) отсутствует, то Вы получите документ на последнюю зарегистрированную дату.

try {
$content = file_get_contents($curr_filename);
$document = new SimpleXMLElement($content);
$attributes = current($document->attributes());

$list_of_exchange_rates->date_now_crb = $attributes[Date];
foreach ($document->Valute as $value) {
$attributes = current($value->attributes());

switch($attributes[ID])
{
case 'R01235':
case 'R01239':
$list_of_exchange_rates->ValueID->$attributes[ID]->CharCode = (string)$value->CharCode;
$list_of_exchange_rates->ValueID->$attributes[ID]->Value = str_replace(",",".","$value->Value");
break;
}
}
$list_of_exchange_rates->cache_local_time = $now; // В случае успешной закачки данных - отмечаем текущее время
} catch (Exception $e) {
// Сервер www.cbr.ru недоступен
echo JText::_('MOD_EXCHANGE_RATES_SERVER_NOT_AVAILABLE') . '<br />';
$list_of_exchange_rates->time_attempt_file_get = $now; // В случае неудачи закачки данных - отмечаем время попытки
}
// Записываем Обновленные данные в кэш-файл
file_put_contents($filename, json_encode($list_of_exchange_rates));

$need_load_data_from_site = false;

//echo "Данные с сайта ЦБ" . "<br />"; // ### Отладочная информация
}

/* ?><pre><?php print_r($list_of_exchange_rates); ?></pre><?php // ### Отладочная информация */

$currency_icon = array
(
'R01235' => '<img alt="Курс Доллара к рублю на сегодня" src="modules/mod_exchange_rates/images/icons/usd.png" />',
'R01239' => '<img alt="Курс Евро к рублю на сегодня" src="modules/mod_exchange_rates/images/icons/eur.png" />',
);
$currency_title = array
(
'R01235' => 'MOD_EXCHANGE_RATES_USD',
'R01239' => 'MOD_EXCHANGE_RATES_EUR',
);
?>
<table id="exchange_rates">
<thead>
<tr>
<td><a href="https://cbr.ru/curreNcy_base/daily/"><?php echo JText::_('MOD_EXCHANGE_RATES_CAPTCURS_LABEL'); ?></a></td>
</tr>
</thead>
<tbody>
<tr>
<td><?php echo $list_of_exchange_rates->date_now_crb; ?></td>
</tr>
<?php
foreach ($list_of_exchange_rates->ValueID as $key => $value) { ?>
<tr>
<td>
<table>
<tbody>
<tr title="<?php echo JText::_($currency_title[$key]); ?>">
<td><?php echo $value->CharCode; ?></td>
<td><?php echo $currency_icon[$key]; ?></td>
<td><?php echo number_format($value->Value, 3, '.', ''); ?></td>
<td>
<span><?php echo JText::_('MOD_EXCHANGE_RATES_SHORT_RUB'); ?></span>
<img src="modules/mod_exchange_rates/images/arr_red.png">
</td>
</tr>
</tbody>
</table>
</td>
</tr><?php
}
?>
</tbody>
<tfoot>
<tr>
<td>
<a href="https://converter.by/cbr?ysclid=lq6ak6tj91210828053&calc_usd=10">
<?php echo JText::_('MOD_EXCHANGE_RATES_CURRENCY_CONVERTER'); ?>
</a>
</td>
</tr>
</tfoot>
</table><?php
};
$exchange_rates();
?>
Вкратце: Скрипт проверяет на внутреннем ресурсе наличие 'data.json' (если его нет - создает). Проверяет условие: если разница во времени, между текущим временем и хранимым в кэше - не превышает 4 часа; и дата валютной ставки, хранимой в кеше - не "заглушка" ('00.00.0000') - берет данные из файла; иначе - берет данные с сайта ЦБ, но перед этим проверяет - прошло ли 10 секунд после предудущей попытки взять эти данные. Если актуальных данных в кэше нет, а сайт ЦБ недоступен - выводит сообщение о недоступности сайта ЦБ; записывает в кэш время попытки скачать данные; выводит таблицу курсов с абстрактными данными.
« Последнее редактирование: 10.02.2024, 23:15:29 от Геон »
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Модуль расширенных результатов ARI Quiz Results

Автор Beer

Ответов: 0
Просмотров: 3399
Последний ответ 03.02.2025, 15:27:35
от Beer
Модуль «Image Show gk4», не отображается ни картинка, ни текст

Автор kaasin

Ответов: 1
Просмотров: 5887
Последний ответ 13.05.2023, 15:42:15
от anastasya96
Стандартный модуль случайного изображения не выводит фотографии

Автор strix

Ответов: 8
Просмотров: 10612
Последний ответ 19.10.2022, 16:07:11
от Andrej_777
Модуль тегов Joes Word Cloud для Joomla 3

Автор ecolora

Ответов: 1
Просмотров: 5181
Последний ответ 05.05.2022, 19:04:44
от ecolora
Спрайт модуль Social Media Icon Links 2

Автор leo78

Ответов: 42
Просмотров: 12979
Последний ответ 30.06.2021, 10:27:38
от leo78