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

Nikoz

  • Захожу иногда
  • 115
  • 4 / 0
Давно искал такой скрипт, нигде не нашел, решил сам уже написать.. пример: skateandsnow . ru/catalog/chekhly/chekhol-dakine-womens-pipe-148-cm-detail (если ссылки запрещены - извиняюсь)

Принцип работы: в доп поле (select) есть текст, у доп.картинки есть alt который идентичен тексту в селекте, изменили селект - имитировался клик на доп.изображение.

Приступим:

1) Действия в админке.
В карточке товара выставляете доп.поле (select) к примеру - цвет. Добавляете значения: reg,green,blue - сохраняем, грузим фотки, в загруженных фото прописываем "Alt текст изображения" - red (собственно цвет к каждому фото, после каждого написания альта жмите сохранить)

2) Действия в /productdetails/tmpl/default.php (если у вас доп.картинки выводятся стандартно, то лезем в default_images.php)
Ищем форейч доп.картинок (у меня он уже был немного по выводу изменен
Код
// List all Images
if (count($this->product->images) > 0) {

   foreach ($this->product->images as $image) {
if(count($this->product->images)==++$i){ $last = 'last';}
echo $image->displayMediaThumb('class="product-image"  style="border: 1px solid black;"', true, 'class="cloud-zoom-gallery" rel=" useZoom:\'zoom1\', smallImage:\''.JURI::base().$image->file_url .'\' "', true, true); //'class="modal"'

   }
}


Добавляем наш alt ($image->file_meta)
Код
id="add_img-'.$image->file_meta.'"

Должно получится так
Код
// List all Images
if (count($this->product->images) > 0) {

   foreach ($this->product->images as $image) {
if(count($this->product->images)==++$i){ $last = 'last';}
echo $image->displayMediaThumb('class="product-image" id="add_img-'.$image->file_meta.'" style="border: 1px solid black;"', true, 'class="cloud-zoom-gallery" rel=" useZoom:\'zoom1\', smallImage:\''.JURI::base().$image->file_url .'\' "', true, true); //'class="modal"'

   }
}

Добавляем скрипт
Код
<script type="text/javascript">
$( document ).ready(function() {
$(function(){
$('select').change(function(){
alt_image = $('select option:selected').text();
$('#add_img-'+alt_image+'').click();
})
});
});
</script>


3) Радуемся *DRINK*

p.s.: можно было сделать это по "data-color" чтоб не всплывал текст, хотя это удобно с одной стороны.
       было бы неплохо добавить в админке доп.поле чтоб не мудрить так  :-X
       еще есть скрипт который выводит все товары на одной странице (30 вывел, нажали кнопку - еще 30, нажали еще раз - все), но там дуратский вывод (absolute, height 0, margin -over9000) т.к. не работает opacity если было бы .show() / .hide()... skateandsnow . ru/catalog/velosipedyi/results,1000-9

« Последнее редактирование: 21.09.2013, 02:20:17 от Nikoz »
*

Максим Пишняк

  • Давно я тут
  • 837
  • 35 / 0
Вполне изящно.

Вы для данной задачи не захотели реализовывать тип поля изображение?
*

Nikoz

  • Захожу иногда
  • 115
  • 4 / 0
Вполне изящно.

Вы для данной задачи не захотели реализовывать тип поля изображение?
Думал, но руки не доходят
*

Nikoz

  • Захожу иногда
  • 115
  • 4 / 0
Модифицировал скрипт, теперь добавляет класс на выбранное доп.фото и по нажатию на доп.фото меняется селект
Код
<script type="text/javascript">
$( document ).ready(function() {
$(function(){
$('select').change(function(){
alt_image = $('select option:selected').text();
$('.product-image').removeClass('test');
$('#add_img-'+alt_image+'').click();
});
$('.product-image').click(function(){$('.product-image').removeClass('selected-img');
$(this).addClass('selected-img')});
});
});


$(function(){
$('.product-image').click(function(){
alt_image = $(this).attr("alt");
$('select :contains('+alt_image+')').attr("selected", "selected");
});
});
</script>
*

G-Nome

  • Осваиваюсь на форуме
  • 46
  • 5 / 0
Доброго времени суток. Попробовал. Заработала, к сожалению, только модификация. А именно:

Цитировать
...добавляет класс на выбранное доп.фото и по нажатию на доп.фото меняется селект

А вот из селекта изменить главную картинку в карточке товара? Никак.

Понимаю смысл, что в скрипте имитируется "клик по миниатюре (по доп.фото)" и далее меняется сама главная картинка товара после того как в селекте выбирается определенный цвет (идет сравнение по мета тегам alt).

Теги и в селекте и в описании мини-фотографий - прописаны/указаны.

Класс class="product-image" в миниатюрах меняется на class="product-image selected-img" и обратно, когда через селект выбираю цвета (отслеживаю это через FireBug)...

...но вот события click() на мини-фото? Не происходит.

В представленном примере, по ссылке из первого поста, уже сравнивал и код и классы, но правильного результата пока так сам и не добился. Прошу помощи. Куда копать? На что обратить внимание еще?

P.S.: в карму ставлю жирный плюсище и за саму идею (сравнивания по мета-тегам) и за реализацию.

Да, и коротко "о себе":
Joomla 2.5.11;
VirtueMart 2.0.22;
По счастливой случайности так совпало, что вывожу фотографию товара так же, как и в примере, на сайте, через модуль Flexible VirtueMart Zoom Effect on Product Page
*

Aleks_El_Dia

  • Живу я здесь
  • 3671
  • 353 / 0
  • AEDStudio Joomla! Direction
А где подобных хак реализован, можно взглянуть?
Спам придумали боги в отместку за наши молитвы (с) Рома Воронежский
На молоко: Z369038872422 || R210017695494 || U247040729215 || ЯД 410011288250383
Мигрирую сайты, переношу расширения J!1.0->J!1.5->J!2.5. Более 50 успешных миграций.
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Здравствуйте. Может подскажете, а как на JS после этого самого клика по select вывести изображение скажем из папки images? Интересует только строка кода js по вставке <img> после тега с определённым классом
*

fsv

  • Moderator
  • 2782
  • 411 / 2
как на JS после этого самого клика по select вывести изображение скажем из папки images? Интересует только строка кода js по вставке <img> после тега с определённым классом
В код выше не вникал, абстрактный ответ только на ваш вопрос:
Код
<select id="myselect">
<option value="0">Выбор</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select>
<div class="myClass1">11111</div>
<div class="myClass2">222222</div>
<div class="myClass3">333333</div>
<div class="myClass4">444444</div>
<script type="text/javascript">
jQuery(function($) {
$('#myselect').on('change', function(){
$('.myImg').remove();
if( $( '.myClass' + $(this).val() ).length ) {
$( '.myClass' + $(this).val() ).after( '<img class="myImg" src="/images/banners/osmbanner1.png" alt="My Image" title="My Image" />' );
}
});
});
</script>
Веб-разработка: заказ. Только новая разработка.
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Благодарю. А что проверяется этим условием:
Код
		if( $( '.myClass' + $(this).val() ).length ) {
?
Если существует такой myClass, у которого индекс выбран в select'е?

Вот что получилось у меня. Вот подопытная страница, упражняюсь над выбором значения поля "Тип багета"

Что я делал:
0. Мои библиотека jquery оказалась древнее метода on, поэтому пришлось залить версию 1.7.2 на сайт и подключить.
1. создал файл /templates/вашшаблон/вашаjsпапка/вашфайлскрипта.js следующего содержания:
Код
jQuery(function($) {
$('#baget_select').on('change', function(){
$('.myImg').remove();
if($(':selected',$(this)).text()=="темный"){
$( '.addtocart-area .product-field-type-S').after( '<img class="myImg" src="/images/banners/dark_baget.jpg" alt="Тёмный багет" title="Тёмный багет" />' );
}
else{
$( '.addtocart-area .product-field-type-S').after( '<img class="myImg" src="/images/banners/light_baget.jpg" alt="Светлый багет" title="Светлый багет" />' );
}
});
});
где baget_select - значение атрибута id интересуемого select'а
2. Прописал в index.php шаблона подключение .js файла:
Код
<script type="text/javascript" src="<?php echo $this->baseurl ?>/templates/<?php echo $this->template ?>/вашаjsпапка/вашфайлскрипта.js"> </script>
3. Выложил картинки dark_beget.jpg, light_baget.jpg в /images/banners
« Последнее редактирование: 26.01.2014, 11:47:27 от borro »
*

fsv

  • Moderator
  • 2782
  • 411 / 2
А что проверяется этим условием:?
Здесь это не надо. Думал об одном, написал другое.
Вообще так проверяю на существование селектора, с которым работает скрипт. Это, если скрипт подключать не на одной конкретной рабочей странице, а в шаблоне. На страницах, где нет селектора, notice выскакивать будут.

Вот что получилось у меня. Вот подопытная страница, упражняюсь над выбором значения поля "Тип багета"
Не работает.
Так работает:
Код
jQuery(function($) {
$('#baget_select').on('change', function(){
$('.myImg').remove();
if($(this).val() == 5788){
$( '.product-field-type-S').after( '<img class="myImg" src="/images/banners/dark_baget.jpg" alt="Тёмный багет" title="Тёмный багет" />' );
}
else{
$( '.product-field-type-S').after( '<img class="myImg" src="/images/banners/light_baget.jpg" alt="Светлый багет" title="Светлый багет" />' );
}
});
});
Веб-разработка: заказ. Только новая разработка.
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Не работает.
Так работает:
Благодарю, подправил. В моем случае у разных товаров различаются значения value у option'ов, хотя цвета всегда остаются одинаковыми, поэтому использовал проверку по $(':selected',$(this)).text()
Осталось доработать пару моментов:
1. Как сделать, чтобы картинки выводились не по изменению значения select, а по значению, что в нем установлено? А то если возвращаться на страницу товара с другой страницы( например из корзины), значение select'a проставлено, но картинки багета нет.
2. как лучше сделать, чтобы при пустом значении select кнопка "Добавить в корзину" не работала?
« Последнее редактирование: 26.01.2014, 11:53:59 от borro »
*

fsv

  • Moderator
  • 2782
  • 411 / 2
Пустому присвойте val=0
Код
jQuery(function($) {
function imageBagetSelect(){
   if( $('.myImg').length ) {
       $('.myImg').remove();
   }
   if($("#baget_select option:selected").text()=="темный"){
       $( '.addtocart-area .product-field-type-S').after( '<img class="myImg" src="/images/banners/dark_baget.jpg" alt="Тёмный багет" title="Тёмный багет" />' );
  } else if ($("#baget_select option:selected").text()=="светлый"){ {
       $( '.addtocart-area .product-field-type-S').after( '<img class="myImg" src="/images/banners/light_baget.jpg" alt="Светлый багет" title="Светлый багет" />' );
  }
            if($("#baget_select").val()==0){
              $( '.addtocart-button').prop("disabled", true);
            } else {
                $( '.addtocart-button').prop("disabled", false);
            }
}
imageBagetSelect();
$('#baget_select').on('change', function(){
                  imageBagetSelect();
});
});
Не проверял.
Веб-разработка: заказ. Только новая разработка.
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Не проверял.
Благодарю. Немного подправил и добавил вывод сообщения о необходимости заполнить поле:
Спойлер
[свернуть]
« Последнее редактирование: 27.01.2014, 15:37:16 от borro »
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Подправил код так, чтобы картинки не показывались, если багет выбирается на странице категории товаров(если кнопка добавить в корзину выводится в категориях вместе с возможностью выбора настраиваемого поля там же)
Спойлер
[свернуть]
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Как вывести категории с фото и подкатегориями?

Автор sergspb

Ответов: 0
Просмотров: 2536
Последний ответ 18.05.2022, 15:01:55
от sergspb
Эффект добавления товара в корзину VM3

Автор bassez

Ответов: 0
Просмотров: 2873
Последний ответ 05.06.2020, 12:28:26
от bassez
Вывод краткого описания товара в корзине

Автор PavelK

Ответов: 2
Просмотров: 3190
Последний ответ 04.04.2020, 16:34:10
от PavelK
Редактирование карточки товара VirtueMart

Автор muserun

Ответов: 2
Просмотров: 5128
Последний ответ 31.10.2019, 12:53:51
от Sandruk1
Изменение количества товара в корзине

Автор 1AZ1

Ответов: 18
Просмотров: 3906
Последний ответ 23.09.2019, 15:41:49
от draff