Новости 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

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

Artyomii

  • Захожу иногда
  • 331
  • 10 / 5
select multiple в com_content
« : 11.03.2011, 05:33:18 »
делаю в админке материала доп. поле списка выбора несколько вариантов (multiple) и никак не записывает в базу больше одного значения, перечитал на этом форуме несколько раз две темы по спискам и куча в Google но безрезультатно, прошу помочь, что я натупил вот?:
Код
$countries = Array(
            'RUS' => 'Russia',
            'USA' => 'United States',
            'UKR' => 'Ukraine',
            'FRA' => 'France',
            'ESP' => 'Spain' );
foreach ( $countries as $value => $name ) {
              $country[] = JHTML::_('select.option', $value, $name, 'value', 'text'); }
       echo $lists['countries'] = JHTML::_('select.genericlist', $country, 'countries[]', 'multiple="multiple" size="3" class="inputbox"', 'value', 'text', 'countries', $row->countries);


Тема решена, чтобы не запутались выложу здесь окончательный вариант:
отталкиваемся как всегда http://joomlaforum.ru/index.php/topic,40455.0.html
administrator\components\com_content\admin.content.html.php
Код
            	<?php
$countries = array(
             'RUS' => 'Russia',
             'USA' => 'United States',
             'UKR' => 'Ukraine',
             'FRA' => 'France',
             'ESP' => 'Spain' );
foreach ( $countries as $value => $name ) {
               $country[] = JHTML::_('select.option', $value, $name, 'value', 'text'); }
       $countries_list = explode(',',  $row->countries);
echo $lists['countries'] = JHTML::_('select.genericlist', $country, 'countries[]', 'multiple="multiple" size="3" class="inputbox"', 'value', 'text', $countries_list);
?>

administrator\components\com_content\controller.php в функцию save content не ниже метаданных
Код
		// country
$countries  = JRequest::getVar('countries', array(), 'post', 'array');
$countries = implode(',', $countries);
$row->countries = $countries;
все...
вариант просто select есть в 10 ответе!
« Последнее редактирование: 12.03.2011, 14:51:40 от Artyomii »
*

Lex

  • Завсегдатай
  • 1615
  • 274 / 1
Re: select multiple в com_content
« Ответ #1 : 11.03.2011, 07:50:51 »
Судя по исходному коду список формируется верно. Есть подозрение, что ты его на сохранение так и отправляешь - массивом. Преобразуй в строку.
Жизнь заставила учиться.
В личке на вопросы не отвечаю.
*

Artyomii

  • Захожу иногда
  • 331
  • 10 / 5
Re: select multiple в com_content
« Ответ #2 : 11.03.2011, 11:05:12 »
спасибо за наводку, но что то не то творю видимо, вставил в контроллер в функцию save контент и опять нечего :(
Код
$countries = JRequest::getVar('countries', array(), 'post', 'array');
if (is_array( $countries )) {
   $post['countries'] = implode( ",", $countries );
}
с помощью serialize тоже что-то никак хм...
*

Lex

  • Завсегдатай
  • 1615
  • 274 / 1
Re: select multiple в com_content
« Ответ #3 : 11.03.2011, 11:21:39 »
Так отладку сразу показывай.
$countries = JRequest::get('post');
var_dump($countries);
что покажет?
Там еще какая-то переменная-массив $post. Где и как инициализируется не видно.
var_dump($post);
Что покажет?
В общем выводи через var_dump() переменные и смотри что у тебя в них
Жизнь заставила учиться.
В личке на вопросы не отвечаю.
*

SmokerMan

  • Гуру
  • 5290
  • 720 / 26
Re: select multiple в com_content
« Ответ #4 : 11.03.2011, 11:32:55 »
Там еще какая-то переменная-массив $post. Где и как инициализируется не видно.
Цитировать
$post['countries'] = implode( ",", $countries );
:)
*

Lex

  • Завсегдатай
  • 1615
  • 274 / 1
Re: select multiple в com_content
« Ответ #5 : 11.03.2011, 11:39:33 »
Будем надеяться, что это не инициализация, а изменение элемента.  ;D
Жизнь заставила учиться.
В личке на вопросы не отвечаю.
*

Artyomii

  • Захожу иногда
  • 331
  • 10 / 5
Re: select multiple в com_content
« Ответ #6 : 11.03.2011, 12:53:17 »
$countries = JRequest::get('post'); var_dump($countries); показывает: array(0) { }
var_dump($countries) естественно показывает:
Код
array(5) { ["RUS"]=> string(6) "Russia" ["USA"]=> string(13) "United States" ["UKR"]=> string(7) "Ukraine" ["FRA"]=> string(6) "France" ["ESP"]=> string(5) "Spain" } 
переменная $post это в контроллере
Код
$post = JRequest::get( 'post' );
$countries = JRequest::getVar('countries', array(), 'post', 'array');
if (is_array( $countries )) {
   $post['countries'] = implode( ",", $countries );
}
все я уже запутался и начал бредить))))
   
*

Lex

  • Завсегдатай
  • 1615
  • 274 / 1
Re: select multiple в com_content
« Ответ #7 : 11.03.2011, 13:36:34 »
Да не расстраивайся. Отладка бывает делом муторным и нервным.
Про var_dump($post) так и не сказал.
Если у тебя JRequest::get('post') дает array(0), то и $post тоже пустая. SmokerMan оказался прав. Ищи где данные теряются.
Да и про JRequest::set($post,'POST'); не забывай если это в контроллере и модель при сохранении тоже берет данные  из JRequest::get('post').



« Последнее редактирование: 11.03.2011, 13:41:43 от Lex »
Жизнь заставила учиться.
В личке на вопросы не отвечаю.
*

Artyomii

  • Захожу иногда
  • 331
  • 10 / 5
Re: select multiple в com_content
« Ответ #8 : 11.03.2011, 13:54:25 »
Lex спасибо тебе за понимание
*

Diiimonn

  • Захожу иногда
  • 234
  • 29 / 0
Re: select multiple в com_content
« Ответ #9 : 11.03.2011, 13:55:24 »
вводит в заблуждение, что в бд таки что-то записывается.Значит возможно информация теряется на этапе записи.Может приведешь весь листинг по приему, обработке и записи в бд $cuntries?
Создание расширений для Joomla
Skype: diiimonn
ICQ: 351181332
*

Artyomii

  • Захожу иногда
  • 331
  • 10 / 5
Re: select multiple в com_content
« Ответ #10 : 11.03.2011, 14:17:30 »
вводит в заблуждение, что в бд таки что-то записывается.Значит возможно информация теряется на этапе записи.Может приведешь весь листинг по приему, обработке и записи в бд $cuntries?
select на ура работает! далеко ходить не надо не изменяя на select а всего лишь убрать у name [] будет записывать одно значение, могу предоставить идеальный рабочий вариант по селекту:
это рабочее поле год
Код
			<?php
$edition[] = JHTML::_('select.option', $value = ' ',
 $text= JText::_( 'Select year' ), 'value', 'text', $disable=false );
for ($i = 2015; $i >= 1890; $i--) {
$edition[] = JHTML::_('select.option',$i, JText::_( $i ) ); }
echo JHTML::_('select.genericlist',  $edition, $name = 'years', $attribs = null,
$key = 'value', $text = 'text', $row->years, $idtag = false, $translate = false );
?>
тоже самое со странами можно сделать пример
Код
            	<label for="country_one">
                <?php echo JText::_( 'Country' ); ?>&nbsp;&nbsp;
             </label>
<?php
$countries_one[] = JHTML::_('select.option', $value = ' ',
 $text= JText::_( 'Select country' ), 'value', 'text', $disable=false );
$countries_one[] = JHTML::_('select.option','ABH', JText::_( 'Abkhazia' ) );
$countries_one[] = JHTML::_('select.option','AFG', JText::_( 'Afghanistan' ) );
$countries_one[] = JHTML::_('select.option','ALD', JText::_( 'Aland Islands' ) );
$countries_one[] = JHTML::_('select.option','ALB', JText::_( 'Albania' ) );
$countries_one[] = JHTML::_('select.option','DZA', JText::_( 'Algeria' ) );
$countries_one[] = JHTML::_('select.option','ASM', JText::_( 'American Samoa' ) );
$countries_one[] = JHTML::_('select.option','AND', JText::_( 'Andorra' ) );
$countries_one[] = JHTML::_('select.option','AGO', JText::_( 'Angola' ) );
$countries_one[] = JHTML::_('select.option','AIA', JText::_( 'Anguilla' ) );
$countries_one[] = JHTML::_('select.option','ATA', JText::_( 'Antarctica' ) );
$countries_one[] = JHTML::_('select.option','ATG', JText::_( 'Antigua and Barbuda' ) );
$countries_one[] = JHTML::_('select.option','ARG', JText::_( 'Argentina' ) );
$countries_one[] = JHTML::_('select.option','ARM', JText::_( 'Armenia' ) );
$countries_one[] = JHTML::_('select.option','ABW', JText::_( 'Aruba' ) );
$countries_one[] = JHTML::_('select.option','AUS', JText::_( 'Australia' ) );
 ... и так далее ...
echo JHTML::_('select.genericlist',  $countries_one, $name = 'country_one', $attribs = null,
$key = 'value', $text = 'text', $row->country_one, $idtag = false, $translate = false );
?>
вот селекты тебе, мне мульти нужно, через параметры мульти сделать легко, но мне именно надо через доп. поле.
*

Diiimonn

  • Захожу иногда
  • 234
  • 29 / 0
Re: select multiple в com_content
« Ответ #11 : 11.03.2011, 15:15:43 »
это все код для формирования HTML.Но ошибка в фрагменте кода, который записывает данные в базу, а точнее там по видимому идет запись одного значения вместо перебора присланного массива.
Создание расширений для Joomla
Skype: diiimonn
ICQ: 351181332
*

Artyomii

  • Захожу иногда
  • 331
  • 10 / 5
Re: select multiple в com_content
« Ответ #12 : 11.03.2011, 15:23:11 »
это все код для формирования HTML.Но ошибка в фрагменте кода, который записывает данные в базу, а точнее там по видимому идет запись одного значения вместо перебора присланного массива.
об этом Lex сказал еще в первом ответе
*

Diiimonn

  • Захожу иногда
  • 234
  • 29 / 0
Re: select multiple в com_content
« Ответ #13 : 11.03.2011, 15:37:13 »
об этом Lex сказал еще в первом ответе
поэтому в ответе №9 я и предложил выложить сюда нужный фрагмент кода для исправления.Или тот код что приведен принимает, обрабатывает и записывает данные в бд??
Создание расширений для Joomla
Skype: diiimonn
ICQ: 351181332
*

Artyomii

  • Захожу иногда
  • 331
  • 10 / 5
Re: select multiple в com_content
« Ответ #14 : 11.03.2011, 15:44:10 »
поэтому в ответе №9 я и предложил выложить сюда нужный фрагмент кода для исправления.Или тот код что приведен принимает, обрабатывает и записывает данные в бд??
http://joomlaforum.ru/index.php/topic,40455.0.html
*

Diiimonn

  • Захожу иногда
  • 234
  • 29 / 0
Re: select multiple в com_content
« Ответ #15 : 11.03.2011, 16:58:14 »
похоже я натупил немного ^-^ чето решил, что в разные поля писать надо...

можно еще так попробовать:
Код
if (is_array( $countries ))
{
  $c = 1;
  foreach($countries as $value => $name)
  {
    $coma = ($c > 1)? "," : "";
    $countries .= $coma.$value;
    $c = $c+1;
  }
  $post['countries'] = $countries;
}
Создание расширений для Joomla
Skype: diiimonn
ICQ: 351181332
*

Artyomii

  • Захожу иногда
  • 331
  • 10 / 5
Re: select multiple в com_content
« Ответ #16 : 11.03.2011, 18:09:09 »
наконец то сделал)))) Diiimonn идея с циклом у меня была днем и вылетела из головы, а вы мне ее сечас напомнили, Вам и Lex поставлю плюсики за помощь и говорю Вам огромное спасибо и думаю это не мне одному пригодится.
Сейчас еще покручу немного и затем выложу цикл фор, вот только надо помочь будет немного если не смогу сейчас с тем, что не показывает после сохранения в админке выбранные значения.
« Последнее редактирование: 11.03.2011, 19:39:33 от Artyomii »
*

Artyomii

  • Захожу иногда
  • 331
  • 10 / 5
Re: select multiple в com_content
« Ответ #17 : 11.03.2011, 22:15:03 »
отталкиваемся как всегда от вышеуказанной ссылки
administrator\components\com_content\admin.content.html.php
Код
            	<?php
$countries = array(
            'RUS' => 'Russia',
            'USA' => 'United States',
            'UKR' => 'Ukraine',
            'FRA' => 'France',
            'ESP' => 'Spain' );
foreach ( $countries as $value => $name ) {
              $country[] = JHTML::_('select.option', $value, $name, 'value', 'text'); }
        echo $lists['countries'] = JHTML::_('select.genericlist', $country, 'countries[]', 'multiple="multiple" size="3" class="inputbox"', 'value', 'text', $rows->countries);
?>

administrator\components\com_content\controller.php в функцию save content не ниже метаданных
Код
		// country
$countries = JRequest::getVar('countries', '', 'array' );
for($i = 0; $i < count($countries); $i++ ) {
    if($i != 0)
      $attributevalue .= ', '.$countries[$i];
    else
      $attributevalue = $countries[$i]; }     
$row->set('countries', $attributevalue);
все...

подскажите как выбранные значения чтобы сохранялись выделенными, когда одно значение выбрано оно сохраняется выделенным, а более нет и это соответственно касается проблемы при каждом сохранении надо отмечать если не одна строка?
*

Diiimonn

  • Захожу иногда
  • 234
  • 29 / 0
Re: select multiple в com_content
« Ответ #18 : 11.03.2011, 22:55:50 »
если я правильно понял о чем речь идет, то надо чтоб те поля которые необходимо имели selected="selected"
Создание расширений для Joomla
Skype: diiimonn
ICQ: 351181332
*

Artyomii

  • Захожу иногда
  • 331
  • 10 / 5
Re: select multiple в com_content
« Ответ #19 : 11.03.2011, 23:07:53 »
если я правильно понял о чем речь идет, то надо чтоб те поля которые необходимо имели selected="selected"
да абсолютно верно
*

ChaosDay

  • Захожу иногда
  • 365
  • 104 / 1
Re: select multiple в com_content
« Ответ #20 : 11.03.2011, 23:20:46 »
У вас скорее всего $rows->countries не массивом передается(оно ж у вас через запятую в базе хранится).
*

Artyomii

  • Захожу иногда
  • 331
  • 10 / 5
Re: select multiple в com_content
« Ответ #21 : 11.03.2011, 23:26:35 »
У вас скорее всего $rows->countries не массивом передается(оно ж у вас через запятую в базе хранится).
да
*

ChaosDay

  • Захожу иногда
  • 365
  • 104 / 1
Re: select multiple в com_content
« Ответ #22 : 11.03.2011, 23:41:02 »
передайте explode(',',  $rows->countries)
*

Artyomii

  • Захожу иногда
  • 331
  • 10 / 5
Re: select multiple в com_content
« Ответ #23 : 11.03.2011, 23:56:24 »
передайте explode(',',  $rows->countries)
не могли бы Вы по подробнее, чуть выше весь окончательный код, я просто не понимаю уже под ночь, исходя из последнего кода который я выше выложил, я изначально наоборот делал чтоб преобразовать в строку, а сечас получается наоборот из строки в массив и как интересно?
*

ChaosDay

  • Захожу иногда
  • 365
  • 104 / 1
Re: select multiple в com_content
« Ответ #24 : 12.03.2011, 00:17:28 »
Поменять последнюю строку 1 блока на:
Код: php
$countries_list = explode(',',  $rows->countries);
echo $lists['countries'] = JHTML::_('select.genericlist', $country, 'countries[]', 'multiple="multiple" size="3" class="inputbox"', 'value', 'text', $countries_list);
*

Artyomii

  • Захожу иногда
  • 331
  • 10 / 5
Re: select multiple в com_content
« Ответ #25 : 12.03.2011, 00:48:04 »
ChaosDay я просто соображаю, что чето не то, здесь и так массив и мы пытаемся в массив а в контролере при сохранении из массива в строку переводим :o сечас попытаюсь уложить все в голове, проверить и вар дампом глянуть
*

Artyomii

  • Захожу иногда
  • 331
  • 10 / 5
Re: select multiple в com_content
« Ответ #26 : 12.03.2011, 01:22:15 »
ChaosDay к сожалению как я и говорил, нечего... вы посмотрите на цикл который положил я в контроллер и все понятно станет, ну и вот кстати:
var_dump($countries_list);
Код
array(1) { [0]=> string(0) "" }
*

ChaosDay

  • Захожу иногда
  • 365
  • 104 / 1
Re: select multiple в com_content
« Ответ #27 : 12.03.2011, 11:23:10 »
Ну так в контроллер вы сохраняете значения списка как строку, а в форме эту строку нужно опять разбить в массив. Итого:
 - в контроллере можно ещё проще вместо цикла сделать(у вас кстати там ошибка, ибо в методе getVar 3 переменная отвечает за метод отправки, т.е. get,post,request...):
Код: php
$countries  = JRequest::getVar('countries', array(), 'post', 'array');
$countries = implode(',', $countries);
$row->countries = $countries;
- а в форме так как я написал до этого:
Код: php
<?php
$countries = array(
'RUS' => 'Russia',
'USA' => 'United States',
'UKR' => 'Ukraine',
'FRA' => 'France',
'ESP' => 'Spain' );
foreach ( $countries as $value => $name ) {
$country[] = JHTML::_('select.option', $value, $name, 'value', 'text'); }
$countries_list = explode(',',  $rows->countries);
echo $lists['countries'] = JHTML::_('select.genericlist', $country, 'countries[]', 'multiple="multiple" size="3" class="inputbox"', 'value', 'text', $countries_list);
?>
А насчет array(1) { [ 0 ]=> string(0) "" } покажите что у вас покажет var_dump($rows->countries), т.к. что-то мне подсказывает что у вас это поле просто в базе пустое.
*

Artyomii

  • Захожу иногда
  • 331
  • 10 / 5
Re: select multiple в com_content
« Ответ #28 : 12.03.2011, 13:32:16 »
ChaosDay громаднейшее человеческое спасибо что помогаете..

теперь о наших баранах))) вообщем я вчера тоже сомневался насчет getvar и даже пробовал такой вариант как вы предложили, сделал как Вы предложили в базу записывает а selected без изменений, насчет var_dump($rows->countries) действительно NULL что значит надо?
*

ChaosDay

  • Захожу иногда
  • 365
  • 104 / 1
Re: select multiple в com_content
« Ответ #29 : 12.03.2011, 13:38:06 »
Вы в метод editContent, я так понимаю, данную правку(administrator\components\com_content\admin.content.html.php) вставляете? Если да, то там должно быть не $rows->countries, а $row->countries.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Как применить атрибут size для элемента select в модуле simpleform 2?

Автор Loh

Ответов: 5
Просмотров: 2010
Последний ответ 06.06.2015, 13:44:28
от motokraft
Contact form - multiple email

Автор zilonitiz

Ответов: 5
Просмотров: 1452
Последний ответ 02.03.2015, 20:50:49
от fsv
Почему в URL перед index.php?option=com_content&... подставляется категория??

Автор NlCK

Ответов: 4
Просмотров: 2461
Последний ответ 28.12.2012, 13:19:24
от NlCK
Как сохранить в БД множественный выбор из SELECT'а?

Автор cvgh

Ответов: 4
Просмотров: 7162
Последний ответ 21.11.2012, 11:34:01
от cvgh
склероз. как присвоить input'у значение select+text

Автор Wolverine

Ответов: 2
Просмотров: 1514
Последний ответ 24.06.2012, 02:54:18
от Wolverine