Новости Joomla

Человек на GitHub ускорил Joomla в 600 раз на объёме 150к+ материалов в 1700+ категориях

Человек на GitHub ускорил Joomla в 600 раз на объёме 150к+ материалов в 1700+ категориях

👩‍💻 Человек на GitHub ускорил Joomla в 600 раз на объёме 150к+ материалов в 1700+ категориях. На старте его сайт на Joomla 3 вообще не смог обновиться на Joomla 5. Пришлось делать экспорт/импорт материалов. Проделав всё это он запустил-таки этот объём данных на Joomla 5. Тестовый скрипт грузил 200 материалов из этого объёма всего за 94 секунды ))) А главная страница с категориями грузилась 20 секунд. Добавив индекс для таблицы #__content

CREATE INDEX idx_catid_state ON #__content (catid, state);
он сократил время загрузки категорий до 1 секунды. Затем наш герой решил поковырять SQL-запрос в ArticleModel, который отвечает за выборку материалов. И решил заменить тип JOIN на STRAIGHT_JOIN для категорий.
// ->from($db->quoteName('#__content', 'a'))->from(    $db->quoteName('#__content', 'a')    . ' STRAIGHT_JOIN ' . $db->quoteName('#__categories', 'c')    . ' ON ' . $db->quoteName('c.id') . ' = ' . $db->quoteName('a.catid'))// ->join('LEFT', $db->quoteName('#__categories', 'c'), $db->quoteName('c.id') . ' = ' . $db->quoteName('a.catid'))
Что сократило загрузку 200 материалов из 150к с 94 секунд до 5. К слову сказать, боевой сайт на Joomla 3 крутится на 12CPU 64GB рамы. А все манипуляции с кодом он делает на базовом 1CPU 1GB сервере и замеры скорости даны именно для базового сервера. Но это всё в дискуссии, хотя в идеале должно вылиться в Pull Requests. Мы - Open Source сообщество, где никто никому ничего не должен. Джунгли. Но человек ищет пути оптимизации Joomla и предлагает решения. Если оказать поддержку и предложить помощь хотя бы с тестированием самых разнообразных сценариев, то возможно эти улучшения смогут войти в ядро. Пусть не быстро, пусть через несколько лет, пусть не все, но войдут. Достаточно предложить руку помощи и приложить немного усилий.
Дискуссию на GitHub можно почитать здесь.@joomlafeed#joomla #community #php

Перевод и публикация интервью с Joomla евангелистом на греческом портале Joomla

Перевод и публикация интервью на греческом портале Joomla 🇬🇷

Утро, просматриваешь входящие письма и изучаешь новости и внезапно обнаруживаешь, что инициатива, которую ты начал, подхватывается другими людьми. 🎉

Недавно я взял интервью у Билла (Василиса) Коциаса - руководителя студии, читающего лекции в университете и популяризатора Joomla в Греции. Это интервью из журнала NorrNext, в оригинале на английском, теперь доступно на греческом языке и опубликовано на портале joomla.gr. 🎉

До чего же приятно… 😇😊 Работа замечена и с ней посчитали необходимым ознакомить аудиторию страны, в которой Билл читает лекции. И это солнечная Греция - страна, страна, с которой Россию многое связывает. 🇬🇷🇷🇺🕊

Смотрю на греческий алфавит и тут же рисуются картины белоснежных зданий в окружении винограда и амфор, красивых женщин в сандалиях и мужественных воинов, охраняющих покой полисов, в которых ученые мужи работают над трудами, позже вошедшими в века. Красиво! 😇Но вернемся к интервью.

Из него вы узнаете, что в Греции доля Joomla среди CMS занимает порядка 30-40%. По моему мнению это - самый высокий показатель во всем мире. Также чтение лекций о Joomla в университетах позволит привести новых пользователей и к тому же молодое поколение. Ну и огромное кол-во сертификтатов Билла на стене (смотрим фото в статье) свидетельствует о том, что Joomla может применяться как профессиональный инструмент.

🌐 Оригинальное интервью (на английском)
🇬🇷 Интервью на греческом портале (joomla.gr)

Что насчет перевода на русский? Увы, времени всего 24 часа в сутках. Я продолжаю готовить новые интервью. Возможно, после завершения выпуска журнала, рассмотрю перевод некоторых интервью на русский. Но я об этом не говорил. 😊 В блоге @eugenius_blog публикую анонсы интересных событий из мира Joomla, интервью, уроки и полезные советы, а также делюсь мыслями:, связанными с разработкой и веб-дизайном.

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

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Мысль неплохая, тем более, что компонент активно развивается. Скажу честно, я с каждым годом все ленивее. Ставить и проверять - во-первых лень, во-вторых нет времени, в-третьих, надо и пользователям какое-то удовольствие доставить.

Посему предлагаю проверить следующий вариант:

1. Открываем /plugins/jcomments/jcomments.avatar.xml
2. Находим и заменяем:
Код: xml
<option value="idoblog">IDoBlog</option>
на
Код: xml
<option value="hekima">Hekima</option>
3. Открываем /plugins/jcomments/jcomments.avatar.php
4. Находим и заменяем:
Код: php
		case 'idoblog':
if (count($users)) {
$db->setQuery('SELECT iduser, avatar FROM #__idoblog_users WHERE iduser in ('.implode(',', $users).')');
$avatars = $db->loadObjectList('iduser');
}

for ($i=0,$n=count($comments); $i < $n; $i++) {
$userid = (int) $comments[$i]->userid;

// profile link
$comments[$i]->profileLink = $userid ? JRoute::_('index.php?option=com_idoblog&task=profile&userid='.$userid) : '';

// avatar
if (isset($avatars[$userid]) && $avatars[$userid]->avatar != '') {
$comments[$i]->avatar = plgJCommentsAvatarImg($mainframe->getCfg('live_site').'/images/idoblog/'. $avatars[$userid]->avatar);
}
}
break;
на
Код: php
		case 'hekima':
if (count($users)) {
$db->setQuery('SELECT user_id, image as avatar FROM #__hekima_blog_myaccount WHERE user_id in ('.implode(',', $users).')');
$avatars = $db->loadObjectList('user_id');
}

include_once(JPATH_SITE.DS.'components'.DS.'com_hekima'.DS.'helpers'.DS.'hekimablog.php');

$imagesPath = HekimaBlogHelperFront::isCBintegration()? '/images/comprofiler/' : '/components/com_hekimablog/Images/blogger/th';

for ($i=0,$n=count($comments); $i < $n; $i++) {
$userid = (int) $comments[$i]->userid;

// profile link
$comments[$i]->profileLink = $userid ? JRoute::_('index.php?option=com_hekimablog&view=myposts&task=myaccount&user='.$userid) : '';

// avatar
if (isset($avatars[$userid]) && $avatars[$userid]->avatar != '') {
$comments[$i]->avatar = plgJCommentsAvatarImg($mainframe->getCfg('live_site').$imagesPath.$avatars[$userid]->avatar);
}
}
break;

Мне кажется, что все должно работать.

« Последнее редактирование: 18.01.2011, 02:28:16 от smart »
*

sherza

  • Захожу иногда
  • 226
  • 90 / 1
smart, большое вам спасибо за код
Немного изменила ваш код под текущую версию компонента

В файле  /plugins/jcomments/jcomments.avatar.php стоит сделать следующую замену:

Код: php
		case 'hekima':

include_once(JPATH_SITE.DS.'components'.DS.'com_hekimablog'.DS.'helpers'.DS.'hekimablog.php');
$hkm_settings=JRequest::getVar( 'hkm_settings', array(), 'method');
if(empty($hkm_settings)){
    $db->setQuery("SELECT name, value FROM #__hekima_blog_settings");
    $result=$db->loadAssocList('name');
    JRequest::setVar( 'hkm_settings', $result);
}
$integration = HekimaBlogHelperFront::isCBintegration();

if($integration=='kunena'){
$user_query='SELECT userid, avatar FROM #__kunena_users WHERE userid in (' . implode(',', $users)  . ')';

$avatarA = $mainframe->getCfg('absolute_path'). DS . 'media' . DS . 'kunena' . DS . 'avatars' . DS ;
$avatarL = $mainframe->getCfg('live_site'). '/media/kunena/avatars/';

}else if($integration=='cb'){

$user_query='SELECT user_id as userid, avatar FROM #__comprofiler WHERE user_id in (' . implode(',', $users)  . ') AND avatarapproved = 1';

}else if($integration=='js'){

$user_query='SELECT userid, thumb as avatar FROM #__community_users WHERE userid in (' . implode(',', $users)  . ')';
}else{
$user_query='SELECT user_id as userid, image as avatar FROM #__hekima_blog_myaccount WHERE user_id in ('.implode(',', $users).')';
}

if (count($users)) {
$db->setQuery($user_query);
$avatars = $db->loadObjectList('userid');
unset($users);
} else {
$avatars = array();
}

for ($i=0,$n=count($comments); $i < $n; $i++) {
$userid = (int) $comments[$i]->userid;

// link to profile
$comments[$i]->profileLink = $userid ? JoomlaTuneRoute::_('index.php?option=com_hekimablog&view=myposts&task=myaccount&user=' . $userid) : '';

// avatar
        if (isset($avatars[$userid]) && $avatars[$userid]->avatar != '') {
        if (is_file($avatarA . $avatars[$userid]->avatar) && $integration=='kunena') {

    $comments[$i]->avatar = plgJCommentsAvatarImg($avatarL . $avatars[$userid]->avatar);

}else if(file_exists(JPATH_SITE . DS . $avatars[$userid]->avatar) && $integration=='js'){

    $comments[$i]->avatar = plgJCommentsAvatarImg(JURI::base(). $avatars[$userid]->avatar);

}else if (isset($avatars[$userid]) && !empty($avatars[$userid]->avatar) && $integration=='cb') {

    $tn = strpos($avatars[$userid]->avatar, 'gallery') === 0 ? '' : 'tn';
    $comments[$i]->avatar = plgJCommentsAvatarImg($mainframe->getCfg('live_site'). '/images/comprofiler/'. $tn . $avatars[$userid]->avatar);

}else if(!$integration){
    $comments[$i]->avatar = plgJCommentsAvatarImg($mainframe->getCfg('live_site'). '/components/com_hekimablog/Images/blogger/th'. $avatars[$userid]->avatar);
}

} else {
$comments[$i]->avatar = '';
}
}
unset($avatars);
break;



smart, можно мне внести изменения в ваш плагин и выложить здесь на форуме и у меня на сайте, чтобы людям было удобнее ставить?
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Мне кажется как-то уж очень сложно все получилось.

1. Если нужно показывать аватары из CommunityBuilder, Kunena или JomSocial, то в плагине нужно выбирать соотв. пункт, и не нужна эта куча проверок.
2. Зачем к примеру строка:

Код: php
$hkm_settings=JRequest::getVar( 'hkm_settings', array(), 'method');

Если плагин может быть вызван откуда угодно, например из модуля, опубликованного на странице контактов? Там никогда не будет переменной hkm_settings... Кроме того, учитывая тот факт, что плагин в цикле обходит весь список комментариев на странице, он должен быть максимально легковесным, а текущая реализация получается слишком громоздкой.

Я понимаю, с чем связано добавление всех этих проверок - хочется показывать аватары из интегрированного источника, а ссылки на профиль чтобы вели в блог. Мысль весьма неплохая, но ее надо реализовывать несколько иначе. Обещаю подумать над этим в ближайшее время. А пока, считаю свой вариант интеграции более оптимальным (по крайней мере на текущий момент).

Кстати, а почему метод HekimaBlogHelperFront::isCBintegration(), который по названию по идее должен возвращать boolean, теперь возвращает string? Не лучше ли оставить старую реализацию метода для совместимости, а новый уже называть getIntegrationType или что-то в этом роде?

smart, можно мне внести изменения в ваш плагин и выложить здесь на форуме и у меня на сайте, чтобы людям было удобнее ставить?
Крайне нежелательно, ибо в этом случае может возникнуть излишняя путаница. В принципе вы можете сделать отдельный плагин, на основе текущего, убрав из него все, что касается других компонентов, который будет целиком "заточен" под Hekima Blog, он будет и легче... Назовите его, к примеру JComments - HekimaAvatar... Сам по себе JComments - Avatar выпущен под GPL, так что взять его за основу, убрать все лишнее (чтобы не пришлось поддерживать то, с чем не сталкиваетесь) и дать новое название - это все разрешается лицензией. Разве что в копирайтах укажите, что сделан на базе JComments - Avatar и оставите строчку про копирайт на оригинальный плагин.

Мне кажется это будет правильнее, тем более вы блогом занимаетесь, вы его развиваете, так что взять на поддержку еще мелкий плагин думаю проблем не будет. А я, со своей стороны, готов его выложить на JoomlaTune, рядом с остальными плагинами для JComments.
« Последнее редактирование: 18.01.2011, 23:53:35 от smart »
*

sherza

  • Захожу иногда
  • 226
  • 90 / 1
smart, я с вами согласна, хочу пояснить по некоторым пунктам

Цитировать
Если нужно показывать аватары из CommunityBuilder, Kunena или JomSocial, то в плагине нужно выбирать соотв. пункт, и не нужна эта куча проверок.
-верно, но многие пользователи не задумываются, что в самом hekima блоге у них интеграция с аватарами форума кунены или JomSocial. Поэтому в данном случае я подцепляю аватары из интеграций. Ваш вариант, конечно же, более оптимальный, но... в нем нет возможности показывать аватары из интегрированного источника. Можно оставлять это на совести пользователя, я понимаю. Я подумаю, как сделать плагин легковесным и при этом не ограничить функционал.

Цитировать
Кстати, а почему метод HekimaBlogHelperFront::isCBintegration(), который по названию по идее должен возвращать boolean, теперь возвращает string?
- все верно, в ранних версиях этот метод возвращал boolean, когда была интеграция только с CB. Теперь, поскольку существует несколько интеграций, эта функция возвращает string во всех случаях интеграций и boolean (false) в случае отсутствия интеграций. Сделано так только из-за совместимости со старыми модулями. Со следующий версии блога метод будет заменен на getIntegration()


Цитировать
$hkm_settings=JRequest::getVar( 'hkm_settings', array(), 'method');
Если плагин может быть вызван откуда угодно, например из модуля, опубликованного на странице контактов? Там никогда не будет переменной hkm_settings...
Абсолютно верное замечание. Впрямую HekimaBlogHelperFront::isCBintegration() можно вызывать только из блога. Поэтому я сначала ставлю проверку, есть ли переменная $hkm_settings (if(empty($hkm_settings))), если нет, то получаю ее значение из базы. Переменная должна быть определена, чтобы пользоваться функцией HekimaBlogHelperFront::isCBintegration().  Думаю, вам покажется ход мысли неправильным, хотя могу объяснить, почему я так сделала: В компоненте блога я делаю выборку из базы settings только в начальный момент. Затем settings заносятся в переменную и используются в различных функциях. Этим я смогла ощутимо уменьшить количество запросов к базе данных. Поэтому в вашем коде HekimaBlogHelperFront::isCBintegration() не выдаст ничего кроме false (тогда зачем он там вообще?).  В следующей версии блога для поддержки работы функции getIntegration из сторонних расширений я внесу проверку на существование переменной $hkm_settings и при необходимости буду извлекать из базы настройку. Да, в этом признаю, я не продумала: не рассчитывала на использовние из сторонних расширений. Сделаю. Так же думаю сделать уже собственную встроенную функцию getAvatar, возвращающую аватар и ссылку на профиль

Цитировать
smart, можно мне внести изменения в ваш плагин и выложить здесь на форуме и у меня на сайте, чтобы людям было удобнее ставить?
Крайне нежелательно, ибо в этом случае может возникнуть излишняя путаница.
Приношу свои извинения. Хотела сделать удобнее людям

Еще раз спасибо за проявленное внимание к компоненту
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Сделано так только из-за совместимости со старыми модулями
ну совместимость сомнительная - любая непустая строка приводится к true, не уверен что это корректно...

Так же думаю сделать уже собственную встроенную функцию getAvatar, возвращающую аватар и ссылку на профиль
Думаю это в любом случае будет полезно, но, учитывая тот факт, что данный метод будет содержать перечисленные ниже проверки, он будет несколько тяжеловат, для многократного вызова в цикле. Кроме того, лучше разделить методы возвращающие ссылку на аватар, и ссылку на профиль, ибо они могут использоваться раздельно.

Приношу свои извинения. Хотела сделать удобнее людям
Извиняться тут совершенно не за что, просто если появятся модификации, поддержка усложнится, а я бы этого не хотел. Как я уже писал ниже (я дописывал потом, может быть вы пропустили), можно сделать отдельный плагин аватаров для поддержки непосредственно компонента HekimaBlog.

Поэтому в вашем коде HekimaBlogHelperFront::isCBintegration() не выдаст ничего кроме false (тогда зачем он там вообще?).
Ну когда я вызывал этот метод, то я опирался на код версии 0.6.1.1 (правда я не очень понимаю, почему я скачал более старую версию), и там метод возвращал в любом случае значение:
Код: php
        function isCBintegration(){
          $cb=JPATH_BASE.'/components/com_comprofiler/comprofiler.php';
          if(!file_exists($cb)) return false;
          $database = JFactory::getDBO();
          $database->setQuery("SELECT value FROM #__hekima_blog_settings WHERE name='communitybuilder'");
          return $database->loadResult();
        }
В противном бы случае, я его не вызывал бы...
« Последнее редактирование: 19.01.2011, 00:52:37 от smart »
*

sherza

  • Захожу иногда
  • 226
  • 90 / 1
В общем, smart, я поняла. Надо думать над максимальной оптимизацией и при этом ничего не потерять в фукнционале. Абсолютно соглашаюсь. Если поделитесь советом относительно вашего модуля - буду очень признательна. Буду думать
На данный момент как итог для пользователей

Код: php
			case 'hekima':
if (count($users)) {
$db->setQuery('SELECT user_id, image as avatar FROM #__hekima_blog_myaccount WHERE user_id in ('.implode(',', $users).')');
$avatars = $db->loadObjectList('user_id');
}
 
$imagesPath = '/components/com_hekimablog/Images/blogger/th';
 
for ($i=0,$n=count($comments); $i < $n; $i++) {
$userid = (int) $comments[$i]->userid;
 
// profile link
$comments[$i]->profileLink = $userid ? JRoute::_('index.php?option=com_hekimablog&view=myposts&task=myaccount&user='.$userid) : '';
 
// avatar
if (isset($avatars[$userid]) && $avatars[$userid]->avatar != '') {
$comments[$i]->avatar = plgJCommentsAvatarImg($mainframe->getCfg('live_site').$imagesPath.$avatars[$userid]->avatar);
}
}
break;

smart, я убрала несколько строчек в вашем коде, поскольку они без проверки переменной теряют смысл.
На данном этапе в данном коде поддерживаются только "родные" аватары hekima блога, без интеграций. Если нужны интеграции аватаров kunena, cb или JomSocial, выбирайте эти приложения непосредственно в меню плагина аавтаров

Цитировать
Ну когда я вызывал этот метод, то я опирался на код версии 0.6.1.1
- для старых версий оно действительно работало, пока я не оптимизировала количество запросов к базе
*

Krax

  • Осваиваюсь на форуме
  • 19
  • 0 / 0
Ребята спасибо вам за такое оперативное реагирование :). установлены HEKIMA! BLOG 0.6.4  и JComments 2.2.0.2.
все работает прекрасно!
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Поддержка akismet была бы кстати в JComments

Автор Александр Кардаш

Ответов: 16
Просмотров: 5695
Последний ответ 03.10.2022, 11:03:05
от wishlight
Поддержка аватаров из компонента EasySocial

Автор GidovVM

Ответов: 2
Просмотров: 3154
Последний ответ 20.02.2022, 21:19:38
от Helios
Поддержка аватаров из phpBB3

Автор Tokyo

Ответов: 7
Просмотров: 15458
Последний ответ 17.02.2018, 17:47:27
от Sabotage
Поддержка аваторов из компонента Extra Registration

Автор lev731

Ответов: 0
Просмотров: 3062
Последний ответ 06.04.2015, 14:44:28
от lev731
Jcomments для компонента личного кабинета BS Myjspace

Автор mozerov

Ответов: 3
Просмотров: 2893
Последний ответ 06.11.2013, 13:40:00
от smart