Новости Joomla

Nevigen Audit JoomShopping 5+Расширение представляет собой большой дашборд для управления...

Nevigen Audit JoomShopping 5+Расширение представляет собой большой дашборд для управления...

Nevigen Audit JoomShopping 5+Расширение представляет собой большой дашборд для управления JoomShopping и работы с его данными. Расширение может:Товары:- отображение списка товаров в удобном информативном виде,- дополненные возможности фильтрации товаров в списке,- возможность быстрого удобного просмотра базовой статистики по товарам.- расширенные возможности поиска по товарам,- возможности анализа базовой подготовки SEO параметров товаров, с возможностью перехода к отфильтрованным товарам с "проблемами"- анализ базовой SEO подготовки товаров проводится по всем установленным для магазина языкам- редактирование товара (в апдейтах)Заказы:- отображать заказы в удобном виде,- обеспечивает широкие дополненные возможности фильтрации,- предоставляет расширенные возможности поиска по полям заказов,- возможность быстрого удобного просмотра базовой статистики по заказам.- планируются дополнительные возможности статистики и анализа продаж. (отдельными расширениями)Клиенты:- отображать список клиентов в удобном виде,- предоставляет расширенные возможности поиска по полям клиентов,- возможность быстрого удобного просмотра базовой статистики по клиентам.- исключена возможность блокировки собственной учетной записи, чтобы не утратить контроль для доступа в админпанель,- добавлено поле заметок для клиента (интегрированы заметки пользователя Joomla), что дает дополнительные возможности для работы разных менеджеров с клиентом.- планируются дополнительные возможности работы с клиентами (отдельными расширениями)Системные требования: JoomShopping 5.5+, PHP 8.1+Вопросы по расширению к участнику нашего сообщества @IhorNVGСтраница расширения#JoomShopping #расширения

Собственные макеты вывода для пользовательских полей JoomlaМы привыкли использовать механизм...

Собственные макеты вывода для пользовательских полей JoomlaМы привыкли использовать механизм...

Собственные макеты вывода для пользовательских полей JoomlaМы привыкли использовать механизм переопределения макетов Joomla: скопируй нужный тебе файл макета в папку html шаблона и твори там что хочешь. Это в полной мере относится и к пользовательским полям Joomla.Joomla ищет макеты рендера всех пользовательских полей в следующем порядке:- Есть ли файл templates/[template name]/html/layouts/[component name]/fields/render.php , переопределяющий макет вывода полей для конкретного компонента? Да - используем его.- Нет? Есть ли файл components/[component name]/layouts/fields/render.php в папке компонента? Да - используем его.- Нет? Есть ли файл templates/[template name]/html/layouts/com_fields/fields/render.php, переопределяющий вывод полей для com_fields? Да - используем его.- Нет? Используем файл components/com_fields/layouts/fields/render.phpЭто механизм поиска переопределений файлов макетов. Вчера столкнулся с тем, что если поле вставлено в текст материала с помощью шорт-кода (кнопкой редактора) вида {field 25}, то переопределения не сработали. Поэтому стал вспоминать как сделать свой макет для поля Joomla. Файл components/com_fields/layouts/field/render.php копируем в templates/YOUR_TEMPLATE/html/layouts/com_fields/field/etapy-raboty-nad-proektom.php. Обратите внимание, что мы файл переименовали, чтобы в настройках поля видеть его в выпадающем списке. После этого всё заработало как надо. Благо, переводил уже раньше статью Как происходит рендер пользовательских полей в Joomla?. Потом, порывшись по своему же переводу увидел, что эта особенность работы Joomla в статье уже в ней описана 😂. А также напомнил себе о возможности указывать макет поля прямо в шорт-коде, через запятую: {field 25,etapy-raboty-nad-proektom}. Правда, если честно, никогда этой возможностью не пользовался. @webtolkru#joomla #php #разработка #webdev

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

Геон

  • Новичок
  • 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

  • Живу я здесь
  • 2566
  • 351 / 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
Просмотров: 194
Последний ответ 03.02.2025, 15:27:35
от Beer
Модуль «Image Show gk4», не отображается ни картинка, ни текст

Автор kaasin

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

Автор strix

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

Автор ecolora

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

Автор leo78

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