Новости Joomla

👩‍💻 SW JProjects v.2.6.1 - компонент каталога расширений для веб-приложений.

👩‍💻 SW JProjects v.2.6.1 - компонент каталога расширений для веб-приложений.

Компонент позволяет сделать свой мини-Joomla Extensions Directory - каталог расширений для CMS (не только для Joomla) или файлов. Есть возможность скачивания по лицензионным ключам создания кастомных схем данных для сервера обновлений.

👩‍💻 v.2.6.1. Что нового?
- Правки наследования схем серверов обновлений. Улучшена логика наследования схем серверов обновлений для проектов компонент - категория - проект.
- Не стабильные релизы в сервере обновлений. Теперь в данные сервера обновлений попадают все версии (alpha, beta и т.д.), а не только stable.
- Косметические изменения. В шаблоне по умолчанию сделаны замены некоторых CSS-классов, уточнено присвоение атрибутов loading=lazy и fetchpriority.
- Рефакторинг и правки кода. Текущее обновление кодовой базы.
- Исправление ошибок.

👩‍💻 Больше спасибо за помощь в тестировании участникам нашего сообщества Александру Новикову (@pro_portal) и Александру Судьбинову (@alexrevo).

- Страница расширения
- GitHub расширения
- Joomla Extensions Directory

@joomlafeed

Событие Pizza, Bugs & Fun - 29-30 января 2026 года.

Событие Pizza, Bugs & Fun  - 29-30  января 2026 года.

Уже несколько лет в мире Joomla проводятся мероприятия "Pizza, Bugs & Fun" (#PBF), где каждый может посвятить несколько часов своего мозгового времени тому, чтобы наша любимая CMS стала ближе к идеалу.

Ссылки на видео и статьи из этого поста рассказывает об организационных вопросах, которые пригодятся для участия в PBF, а так же что и как делать.

В рамках события PBF все желающие могут собираться в общий онлайн чат, обсудить вопросы Joomla и приложить к их разрешению свою руку. Самый классный вариант, когда эта встреча происходит оффлайн: тогда организовывается пицца, напитки по вкусу и несколько часов совместного творчества.

Каждый помогает тем, что он умеет:

  • кто-то пишет недостающую документацию,
  • кто-то пишет код,
  • кто-то тестирует как исправлены ошибки или сделан новый функционал.

На сайте события есть карта, можно "захостить" свою локацию. Практически все движки в мире развиваются за счёт спонсирующих их компаний. Joomla одна из немногих, где развитие идёт только усилиями международного сообщества энтузиастов.

https://www.youtube.com/watch?v=a-FuVKXg_Uw 

На момент написания данного поста в репозитории Joomla 810 открытых Issue (как правило это баги) и 236 Pull request (PR, исправление багов и новый функционал). Все PR обязательно тестируются минимум двумя участниками сообщества, дабы в конечный код движка не проскочила ошибка.

Если каждый из участников только нашего сообщества сделает даже одно тестирование, то, боюсь, PR и Issue на всех не хватит 😀 И ничего не останется нашим коллегам из международных Joomla-чатов.

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

Yura Vakulenko

  • Захожу иногда
  • 238
  • 6 / 1
Привет ребята! Помогите мне пожалуйста разобратся и сформировать кастомный массив с атрибутами товара, в котором будет содержатся кастомная разметка для <select></select> полей

работать нужно в Таблице Product (jshopProduct::getBuildSelectAttributes) вот в этом методе
И формировать кастомный select  (если указан в attr type выбран как select) или кастомный radio (если указан в attr type выбран как radio) нужно в том случае, если имя атрибута заканчивается на суффикс _tpl-sel (ИМЯ-АТРИБУТА_tpl-sel) Я то знаю как это сделать,  но у меня вместе с обработкой моего массива  $_tpl_options, который я и планирую использовать для построения options полей для select и radio идет и обработка оригинального массива $options. А мне нужно чтобы мой массив $_tpl_options обрабатывался и при этом $options - не затрагивался!

А мне нужно чтобы мой массив $_tpl_options обрабатывался и при этом $options - не затрагивался!

вот мой код, который я буду вставлять в тем места в оригинальном коде, которые указал ниже с моими комментами
Код

                    // мои правки
                    $_tpl_options = array(); // создаю отдельный массив в котором будут опции
                    //атрибутов.. на основе него и будет формироваться код для select или radio
                    //атрибутов.

                    $tmpl_attr_name = explode('_', $selects[$attr_id]->attr_name);
                    if ($tmpl_attr_name[1] == 'tpl-sel') { // если в имени атрибута содержится _tpl-sel
                        $selects[$attr_id]->attr_name = $tmpl_attr_name[0]; // устанавливаем имя атрибута без преф. _tpl-sel
                        foreach ($options as $k3 => $v3) {
                            $_tpl_options[$k3]=$v3; // заполняем массив $_tpl_options можно было
                            // и так $_tpl_options = array_merge($_tpl_options,$options); или
                            //$_tpl_options = $options;
                        }                       

                        $regexp_img = '/(<img.*?src\s*=.*?>)([\w\s-,]+)/'; // регулярка для обработки $_tpl_options[$k4]->value_name

                        // убираем из $_tpl_options[$k4]->value_name текстовое название и оставляем там только картинку
                        foreach ($_tpl_options as $k4 => $v4) {
                            preg_match_all($regexp_img, $_tpl_options[$k4]->value_name, $matches);
                            if ($matches[1]) {
                               $_tpl_options[$k4]->value_name = $matches[1][0];
                            } else if ($matches[2]) {
                               $_tpl_options[$k4]->value_name = $matches[2][0];
                            }                           
                        }
                        // как видите обработка идет только с $_tpl_options, но почему-то и оригинальный массив $options тоже обрабатывается и из $options ($options[$k]->value_name) так же убирается название опции атрибута, хотя этого быть не должно.. потому как с $options я не работаю..
                        $selects[$attr_id]->tpl_selects = 'will build!';
                        //wrap_pre($_tpl_options, '$_tpl_options');
                    }

вот код оригинального метода .. там я покажу куда буду вставлять свои правки
Код
function getBuildSelectAttributes($attributeValues, $attributeActive, $displayonlyattrtype = null){
        $jshopConfig = JSFactory::getConfig();
        if (!$jshopConfig->admin_show_attributes) return array();
        $dispatcher = JDispatcher::getInstance();
        $attrib = JSFactory::getAllAttributes();
$userShop = JSFactory::getUserShop();
        $selects = array();

        foreach($attrib as $k=>$v){
            $attr_id = $v->attr_id;
            if ($displayonlyattrtype){
                $v->attr_type = $displayonlyattrtype;
            }
            if (isset($attributeValues[$attr_id]) && $attributeValues[$attr_id]){
                if (isset($attributeActive[$attr_id])){
                    $_firstval = $attributeActive[$attr_id];
                }else{
                    $_firstval = 0;
                }
                $selects[$attr_id] = new stdClass();
                $selects[$attr_id]->attr_id = $attr_id;
                $selects[$attr_id]->attr_name = $v->name;
                $selects[$attr_id]->attr_description = $v->description;
                $selects[$attr_id]->groupname = $v->groupname;
                $selects[$attr_id]->firstval = $_firstval;
                $options = $attributeValues[$attr_id];
                $attrimage = array();
                foreach($options as $k2=>$v2){
                    $attrimage[$v2->val_id] = $v2->image;
$addPrice = $v2->addprice;
                    $addPrice = getPriceFromCurrency($addPrice, $this->currency_id);
                    $addPrice = getPriceCalcParamsTax($addPrice, $this->product_tax_id);
                    if ($userShop->percent_discount){
                        $addPrice = getPriceDiscount($addPrice, $userShop->percent_discount);
                    }

                    $options[$k2]->addprice = $addPrice;
                }

                if ($v->attr_type==1){
                // attribut type select

                    if ($jshopConfig->attr_display_addprice){
                        foreach($options as $k2=>$v2){
                            if (($v2->price_mod=="+" || $v2->price_mod=="-" || $jshopConfig->attr_display_addprice_all_sign) && $v2->addprice>0){
                                $ext_price_info = " (".$v2->price_mod.formatprice($v2->addprice, null, 0, -1).")";
                                $options[$k2]->value_name .=$ext_price_info;
                            }
                        }
                    }

                    if ($jshopConfig->product_attribut_first_value_empty){
                        $first = array();
                        $first[] = JHTML::_('select.option', '0', _JSHOP_SELECT, 'val_id','value_name');
                        $options = array_merge($first, $options);
                    }

                    if (isset($attributeActive[$attr_id]) && isset($attrimage[$attributeActive[$attr_id]])){
                        $_active_image = $attrimage[$attributeActive[$attr_id]];
                    }else{
                        $_active_image = '';
                    }
                    if (isset($attributeActive[$attr_id])){
                        $_select_active = $attributeActive[$attr_id];
                    }else{
                        $_select_active = '';
                    }

// СЮДА ВСТАВЛЯЮ СВОИ ПРАВКИ ДЛЯ ФОРМИРОВАНИЯ КАСТОМНОГО ATTR TYPE SELECT
// СЮДА ВСТАВЛЯЮ СВОИ ПРАВКИ ДЛЯ ФОРМИРОВАНИЯ КАСТОМНОГО ATTR TYPE SELECT
// СЮДА ВСТАВЛЯЮ СВОИ ПРАВКИ ДЛЯ ФОРМИРОВАНИЯ КАСТОМНОГО ATTR TYPE SELECT

$html_select_attribute_param = 'class="'.$jshopConfig->frontend_attribute_select_class_css.'" size = "'.$jshopConfig->frontend_attribute_select_size.'" onchange="setAttrValue(\''.$attr_id.'\', this.value);"';
                    $selects[$attr_id]->selects = JHTML::_('select.genericlist', $options, 'jshop_attr_id['.$attr_id.']', $html_select_attribute_param, 'val_id', 'value_name', $_select_active).
"<span class='prod_attr_img'>".$this->getHtmlDisplayProdAttrImg($attr_id, $_active_image)."</span>";
                    $selects[$attr_id]->selects = str_replace(array("\n","\r","\t"), "", $selects[$attr_id]->selects);
                }else{
                // attribut type radio

                    foreach($options as $k2=>$v2){
                        if ($v2->image) $options[$k2]->value_name = "<img src='".$jshopConfig->image_attributes_live_path."/".$v2->image."' alt='' /> ".$v2->value_name;
                    }

                    if ($jshopConfig->attr_display_addprice){
                        foreach($options as $k2=>$v2){
                            if (($v2->price_mod=="+" || $v2->price_mod=="-" || $jshopConfig->attr_display_addprice_all_sign) && $v2->addprice>0){
                                $ext_price_info = " (".$v2->price_mod.formatprice($v2->addprice).")";
                                $options[$k2]->value_name .=$ext_price_info;
                            }
                        }
                    }

// СЮДА ВСТАВЛЯЮ СВОИ ПРАВКИ ДЛЯ ФОРМИРОВАНИЯ КАСТОМНОГО ATTR TYPE RADIO
// СЮДА ВСТАВЛЯЮ СВОИ ПРАВКИ ДЛЯ ФОРМИРОВАНИЯ КАСТОМНОГО ATTR TYPE RADIO
// СЮДА ВСТАВЛЯЮ СВОИ ПРАВКИ ДЛЯ ФОРМИРОВАНИЯ КАСТОМНОГО ATTR TYPE RADIO

                    $radioseparator = '';
                    if ($jshopConfig->radio_attr_value_vertical) $radioseparator = "<br/>";
                    foreach($options as $k2=>$v2){
                        $options[$k2]->value_name = "<span class='radio_attr_label'>".$v2->value_name."</span>";
                    }                   

                    $selects[$attr_id]->selects = sprintRadioList($options, 'jshop_attr_id['.$attr_id.']', 'onclick="setAttrValue(\''.$attr_id.'\', this.value);"', 'val_id', 'value_name', $attributeActive[$attr_id], $radioseparator);
                    $selects[$attr_id]->selects = str_replace(array("\n","\r","\t"), "", $selects[$attr_id]->selects);



                }
                $dispatcher->trigger('onBuildSelectAttribute', array(&$attributeValues, &$attributeActive, &$selects, &$options, &$attr_id, &$v));
            }
        }
        $grname = '';
        foreach($selects as $k=>$v){
            if ($v->groupname!=$grname){
                $grname = $v->groupname;
                $selects[$k]->grshow = 1;
            }else{
                $selects[$k]->grshow = 0;
            }
        }
    return $selects;
    }

*

Yura Vakulenko

  • Захожу иногда
  • 238
  • 6 / 1
Уже сам разобрался.. Спасибо всем, кто смотрел!
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

WT On fly image handler изображения товара JoomShopping в webp на лету

Автор sergeytolkachyov

Ответов: 13
Просмотров: 4826
Последний ответ 29.01.2025, 20:38:38
от sergeytolkachyov
Видео с Youtube вместо картинки на карточке товара

Автор ksena

Ответов: 35
Просмотров: 10826
Последний ответ 08.10.2024, 04:26:36
от kit2m2
Условие для кол-ва товара больше нуля

Автор kik84

Ответов: 3
Просмотров: 1491
Последний ответ 16.02.2024, 13:33:24
от kit2m2
Убрать модуль в карточке товара JoomShopping

Автор alexkraym

Ответов: 35
Просмотров: 5993
Последний ответ 21.08.2023, 07:17:53
от delchev
Проблема с фото в карточке товара

Автор astapon

Ответов: 18
Просмотров: 2262
Последний ответ 24.04.2023, 12:37:50
от kit2m2