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

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
Просмотров: 4562
Последний ответ 29.01.2025, 20:38:38
от sergeytolkachyov
Видео с Youtube вместо картинки на карточке товара

Автор ksena

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

Автор kik84

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

Автор alexkraym

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

Автор astapon

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