Новости Joomla

Новый способ добавления и рендера полей в Joomla Form - метод renderControlFields() (Joomla 5.3+)

Новый способ добавления и рендера полей в Joomla Form - метод renderControlFields() (Joomla 5.3+)

Новый способ добавления и рендера полей в Joomla Form - метод renderControlFields() (Joomla 5.3+). При отображении форм компонента в админке раньше разработчикам нужно было описывать скрытые поля в лейаутах. И выглядело это так:

<?php     // Это файл в /layouts/components/com_component/your_layout.php?><input type="hidden" name="task" value=""><input type="hidden" name="return" value="<?php echo $input->getBase64('return'); ?>"><input type="hidden" name="forcedLanguage" value="<?php echo $input->get('forcedLanguage', '', 'cmd'); ?>"><?php echo HTMLHelper::_('form.token'); ?>
Начиная с Joomla 5.3 добавлен новый способ добавления таких полей (их называют control fields) - программно. И теперь это можно сделать просто в Controller / View.
// В Controller/View добавляем поля$this->form  ->addControlField('task', '')  ->addControlField('return', $input->getBase64('return', ''))  ->addControlField('forcedLanguage', $forcedLanguage);
А в layout'е просто используем метод
renderControlFields()
// В layout формыecho $this->form->renderControlFields();
Многие компоненты ядра уже используют этот подход. Соответствующий PR был принят в Joomla 5.3 осенью 2024г.Смотреть
Pull Request@joomlafeed#joomla #разработка #php

JoomGallery 4.1.0 - компонент галереи изображений для Joomla

JoomGallery 4.1.0 - компонент галереи изображений для Joomla

Новая итерация компонента продолжает развиваться, ведь с v.4.x компонент был переписан практически с нуля.

v.4.1.0. Что нового?

Редактирование метаданных изображений. Теперь метаданные можно не только читать, но и напрямую редактировать и записывать обратно в изображение JPG. Поддерживаются данные EXIF ​​и IPTC.

Полная совместимость с Joomla! 4.x, 5.x и 6.x. Компонент почистили от устаревших методов в коде.

Заметно ускорили загрузку больших галерей. Списки в админке, особенно для очень больших галерей ( >30 000 изображений), теперь загружаются значительно быстрее.

Несколько сеток lightGallery на одной странице. Будь то плагины контента или модули изображений: теперь вы можете отображать несколько галерей или категорий на одной странице без каких-либо ограничений.

Множество мелких исправлений ошибок и оптимизаций.

Сайт проекта

GitHub расширения

Скачать

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

ptipti

  • Новичок
  • 1
  • 1 / 0
Вообще это прекрасно, что было готовое решение, но не забывайте об эксцентричности вм...

Так как я воспользовался вашим решением, припишу кой чего своего.

Откройте файлик shop.browse.php и найдите строку

Код
/*** Start printing out all products (in that category) ***/
while ($db_browse->next_record())

А теперь внимательно проследуем вниз...
$ps_product->show_price($db_browse->f("product_id")) - 4 запроса;
$ps_product->get_adjusted_attribute_price($db_browse->f('product_id')) - 2 запроса;
ps_product_files::getFilesForProduct($db_browse->f('product_id')) - 6 запросов;
ps_reviews::allvotes($db_browse->f("product_id")) - 1 запрос;
product_has_attributes($db_browse->f('product_id'), true) - 2 запроса

Итого вывод одного товара стоит 15 запросов... Руки за такое отрывать надо, а если по категориям файлов накопиться ну хотяб штук 200 - 200*15+39(системных) = 3039 запросов...
На локальном компьютере листинг 464 товаров занимал 11.5 секнд на 250 атлоне с 64 битным ПО... Понятно куда вас пошлют все хостеры с такими запросами...
 
Те, кто не использует моженые рейтинги товаров и не смотрят больше 50 товаров (хотя это 750 лишних запросов) или кому фиолетово ЗАРАНЕЕ ПРОШУ не читать и засунуть своё "мнение" поглубже.

Так вот, на чём можно сэкономить.

show_price и get_adjusted_attribute_price
Я аж удивился, но в запроснике (shop_browse_queries.php) даже уже был готовый JOIN, но ничего от туда не выбиралось. Так как цены у меня все были в рублях и о другом я даж и не думал (но при желании можно использовать класс вроде VMCURRENCY), то на этом я решил сэкономить. То есть добавляем

в основной SELECT shop_browse_queries.php
в районе $fieldnames = ...
`product_price_id`,`is_percent`,`amount`,`product_price`
и в районе $join_array = ...
'LEFT JOIN `#__{vm}_product_discount` ON `#__{vm}_product`.`product_discount_id` <> 0 AND `#__{vm}_product`.`product_discount_id` = `#__{vm}_product_discount`.`discount_id`'
(то есть доказываем, что ksort ниже (по причине его коммента) и лишние 4 запроса к базе нам не нужны.

в shop.browse.php комментим строку в районе $product_price = ...
и вставляем ниже
Код
if ($db_browse->f("amount")) :
$product_price = '<span class="product-Old-Price"> '.$db_browse->f("product_price").' р.</span><span class="productPrice"> ';
$product_price_disc_val = $db_browse->f("is_percent") == 1 ? number_format ($db_browse->f("product_price") - ($db_browse->f("product_price") * $db_browse->f("amount") / 100), 0, '', ' ') : $db_browse->f("product_price") - $db_browse->f("amount");
$product_price .= $product_price_disc_val.' р. </span>';
else :
$product_price = '<span class="productPrice">'.$db_browse->f("product_price").' р.</span>';
endif;

теперь зачем-то очень нужный $product_price_raw = ... комментим тоже и ниже него вставляем
Код
$product_price_disc_val_arr = $product_price_disc_val ? $product_price_disc_val : $db_browse->f("product_price");
$product_price_val_arr = $db_browse->f("product_price");
$product_price_id_arr = $db_browse->f("product_price_id");
$product_price_raw = Array (
    'product_price' => "$product_price_disc_val_arr",
    'product_currency' => RUB,
    'product_base_price' => "$product_price_val_arr",
    'product_has_multiple_prices' => '',
    'product_price_id' => "$product_price_id_arr",
    'item' => 1
);

Таким образом, без потери качества мы уже сэкономили 6 лишних запросов.

allvotes
Хоть один, но лишний запрос. К тому же убрать его просто элементарно.
в основной SELECT shop_browse_queries.php
в районе $fieldnames = ... дописываем поля
`votes`,`allvotes`,`rating`
и в районе $join_array = ... добавляем
'LEFT JOIN `#__{vm}_product_votes` ON `#__{vm}_product`.`product_id` = `#__{vm}_product_votes`.`product_id`'

теперь идём обратно в shop.browse.php комментим строку в районе $product_rating = ... и вставляем туда
$product_rating = allvotesx($db_browse->f("votes"), $db_browse->f("allvotes"), $db_browse->f("rating"), $db_browse->f("product_id"));
и в самом низу перед ?> вставляем нашу функцию:
Код
function allvotesx ($votes, $allvotes, $rating, $product_id) {
$tpl = new $GLOBALS['VM_THEMECLASS']();
$allvotes = $allvotes ? $allvotes : 0;
$rating = $rating ? $rating : 0;
$tpl->set('allvotes', $allvotes );
$tpl->set('rating', $rating );
$tpl->set('product_id', $product_id );
return $tpl->fetch( 'common/votes_allvotes.tpl.php' );
}
На этом мы сэкономили уже 7 запросов... Честно говоря, getFilesForProduct и product_has_attributes были просто закомментены, по причине что getFilesForProduct - я вообще смутно представляю для чего оно, ибо даже в админке не видел где его можно натыкать, а product_has_attributes наверное кроме демо VirtueMart не использует никто... к тому же атрибуты можно получить из основного селекта путём добавления нужного поля (и это поле есть в таблице товаров и вывести чем-то подобным (смотреть ниже), но повторюсь - мне оно было не надо. Всё спасибо за внимание, и поменьше левых запросов к вашим базам данных :)
 
Код
if ($special->attribute) :
$specials_data .= '<div class="attributes">';
$attr_arr = explode (';', $special->attribute);
foreach ($attr_arr as $attr) :
preg_match ('/^([^\,]+)\,(.*)$/', $attr, $matches);
$specials_data .= '<div class="special">'.$matches[1].': <select name="'.$matches[1].''.$special->product_id.'">';
$options_tag = explode (',', $matches[2]);
foreach ($options_tag as $option_tag) :
preg_match ('/^([^\[]+)\[?([^\]]+)?\]?$/', $option_tag, $matches);
$specials_data .= '<option value="'.$matches[1].'">'.$matches[1];
$specials_data .= $matches[2] ? ' ('.$matches[2].' руб.)' : '';
$specials_data .= '</option>';
endforeach;
$specials_data .= '</select></div>';
endforeach;
$specials_data .= '</div>';
endif;

Ещё есть один подлый момент в addtocart_form.tpl.php в виде $ps_product_attribute->show_quantity_box, он не стесняясь тоже плодит 1 запрос к базе. Надо немного поправить функцию, собственно ничего сложного.
« Последнее редактирование: 03.02.2011, 21:11:09 от beagler »
*

shevron77

  • Осваиваюсь на форуме
  • 13
  • 0 / 0
Весьма интересная тема, но Вы не могли бы для тех кто в танке, crazy! выложить более конкретно что и на что меняем, буду Вам признателен!  
*

DastR33

  • Осваиваюсь на форуме
  • 14
  • 0 / 0
Поддерживаю предыдущий пост.... половину заменил - нормально, но на часть где надо дописавыть в основной селект - появляются ошибки какие то...
и в итоге в категориях неправильно показываются цены на товары
*

321

  • Захожу иногда
  • 364
  • 3 / 8
Присоединяюсь.

Тема, очень актуальна! Автор отзовитесь.....

В принципе, по тексту понятно так:
Идем в /administrator/components/com_virtuemart/html. Как раз там лежат эти два файла shop_browse_queries.php и shop.browse.php.
В shop_browse_queries.php примерно 37 и 40 строки - это и есть $fieldnames = и $join_array =. Куда как я понял мы и подписываем указанные значения.
Тут только одно не совсем ясно, какой должна правильно получиться строка $join_array =.
В $fieldnames = просто добиваем `product_price_id`,`is_percent`,`amount`,`product_price`.
После идем в shop.browse.php там $product_price = примерно 317 строка и $product_price_raw примерно 323 строка. Тут не совсем ясно только, что подразумевал автор под словами "комментим строку в районе $product_price =". Необходимо комментировать всю часть строки или все строку. После комментирования всей строки и выполнения вышеописанных манипуляций товары испаряются или выводятся не корректно.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Сравнения товара в VM 1.1.X

Автор Bear

Ответов: 464
Просмотров: 83248
Последний ответ 17.06.2016, 10:44:50
от uralmas
вывод категории и её подкатегорий на одной странице

Автор sega

Ответов: 44
Просмотров: 15703
Последний ответ 30.04.2014, 14:05:45
от ИринаМ
[Решено] Добавление Watermark к фото товара V1.0.15 V1.1.3

Автор mickymouse

Ответов: 52
Просмотров: 22723
Последний ответ 13.06.2013, 01:04:46
от richman
[Решено] Вывод товаров из подкатегорий в родительскую категорию V1.0.15 V1.1.3

Автор baldesarini

Ответов: 273
Просмотров: 97062
Последний ответ 08.04.2013, 15:20:07
от asterix_kpi
[Решено] Вывод прикрепленных файлов в списке товаров V1.0.15 V1.1.3

Автор a69

Ответов: 13
Просмотров: 11544
Последний ответ 20.02.2013, 23:41:04
от kreolka_8