Форум русской поддержки Joomla!® CMS
11.12.2016, 06:20:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

Обработка данных из базы

 (Прочитано 558 раз)
0 Пользователей и 1 Гость смотрят эту тему.
master-smeta
Давно я тут
****

Репутация: +8/-0
Offline Offline

Пол: Мужской
Сообщений: 254


« : 13.05.2015, 11:12:52 »

Здравствуйте. У меня возникла проблема с динамическими выпадающими списками. В моей форме используются выпадающие списки, в которые загружаются данные из базы, как описано в инструкции: https://www.rsjoomla.com/support/documentation/view-article/94-auto-populate-a-list-from-a-table.html
Код:
//<code>
// Prepare the empty array
$items = array();
// Prepare the database connection
$db = JFactory::getDbo();
// Keep this if you'd like a "Please select" option, otherwise comment or remove it
$items[] = "|Please Select[c]";
 
// Run the SQL query and store it in $results
$db->setQuery("SELECT your_value, your_label FROM #__your_table");
$results = $db->loadObjectList();
 
// Now, we need to convert the results into a readable RSForm! Pro format.
// The Items field will accept values in this format:
// value-to-be-stored|value-to-be-shown
// Eg. m|M-sized T-shirt
foreach ($results as $result) {
  $value = $result->your_value;
  $label = $result->your_label;
  $items[] = $value.'|'.$label;
}
 
// Multiple values are separated by new lines, so we need to do this now
$items = implode("\n", $items);
 
// Now we need to return the value to the field
return $items;
//</code>
Проблема в том, что выпадающих списков в форме несколько десятков, и при загрузке страницы они создают огромную нагрузку на сервер.
Решить проблему просто - нужно загрузить данные из базы один раз при загрузке формы, а затем передать их в выпадающие списки, чтобы сделать выборку полученных данных из массива. Но у меня не получается это сделать. Я могу добавить скрытое поле в которое будут загружены данные из базы данных, но как эти данные передать в выпадающий список?

P.S. Задача состоит в следующем: 1) Есть таблица БД с расписанием занятий.
2) Есть форма записи на курсы. Пользователю доступен выпадающий список с названием курсов. Он выбирает курс и появляется дополнительный список, в котором можно выбрать конкретную дату обучения на выбранном курсе.
3) Т.к. заранее не известно, какой курс выберет пользователь, то все расписания загружаются заранее и просто скрыты.
« Последнее редактирование: 13.05.2015, 12:59:32 от master-smeta » Записан
SeBun
Практически профи
*******

Репутация: +134/-3
Offline Offline

Пол: Мужской
Сообщений: 2289



« Ответ #1 : 13.05.2015, 12:36:53 »

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

По сабжу:
Код:
$db->setQuery("SELECT your_value, your_label FROM #__your_table");
$results = $db->loadObjectList();
Здесь у вас делается запрос в базу и создается объект, содержащий результат этого запроса. Можете продублировать для всех ваших запросов и создать несколько объектов.
Код:
foreach ($results as $result) {
  $value = $result->your_value;
  $label = $result->your_label;
  $items[] = $value.'|'.$label;
}
Чтение из объекта в массив. Так же можно продублировать для каждого вашего запроса. Как раз такой цикл и будет жрать ресурсы сервака. И чем их больше, тем хуже.

Как передать странице данные? Вопрос не понял, так как форма формируется на стороне сервера, набивается данными и отдается клиенту.
 
Пример:
Код:
$db->setQuery("SELECT your_value, your_label FROM #__your_table");
$results_1 = $db->loadObjectList();
$db->setQuery("SELECT your_value, your_label FROM #__your_table2");
$results_2 = $db->loadObjectList();

foreach ($results_1 as $result) {
  $value = $result_1->your_value;
  $label = $result_1->your_label;
  $items[1][] = $value.'|'.$label;
}
foreach ($results_2 as $result) {
  $value = $result_2->your_value;
  $label = $result_2->your_label;
  $items[2][] = $value.'|'.$label;
}

Ну и далее создаете формы уже с использованием этого массива.

P.S. Не уверен, что такая конструкция вам поможет - циклы остаютя. Подумайте, можно ли как то оптимизировать выборку? Объем данных в базе одинаков, можно выборку засунуть в один цикл?
P.P.S. Писал на коленке, мог и ошибится )
« Последнее редактирование: 13.05.2015, 12:54:46 от sebun » Записан
master-smeta
Давно я тут
****

Репутация: +8/-0
Offline Offline

Пол: Мужской
Сообщений: 254


« Ответ #2 : 13.05.2015, 12:54:44 »

Код:
$db->setQuery("SELECT your_value, your_label FROM #__your_table");
$results = $db->loadObjectList();
Здесь у вас делается запрос в базу и создается объект, содержащий результат этого запроса.
Да, это я знаю. Сейчас у меня такой код в каждом выпадающем списке (а их несколько десятков). Вот я и попытался получить все необходимые данные один раз, а уже потом передавать объект в списки и там его форычить этим:
Код:
foreach ($results as $result) {
  $value = $result->your_value;
  $label = $result->your_label;
  $items[] = $value.'|'.$label;
}

Цитировать
Чтение из объекта в переменную. Так же можно продублировать для каждого вашего запроса. Как раз такой цикл и будет жрать ресурсы сервака. И чем их больше, тем хуже.
Т.е. нагрузку на сервер дает не выборка из базы (несколько десятков раз сразу), а непосредственно "форычинги" этого объекта?
Цитировать
Как передать странице данные? Хм, а вы уверены, что у пользователя такая страница загрузится и что данных не будет слишком много?
Ну, в данный момент страница загружается, но данных очень много. (дополнил первый топик, чтобы была понятнее задача).
Цитировать
В принципе я вижу решение этого вопроса в том, что вы создаете на сервере многомерный массив, в который загружаете все данные для ваших форм и отдаете его клиенту. А на стороне клиента создаются формы, которые получают данные из этого массива.
Так ведь и я это примерно так представляю. И массив создаю... Но вот передать этот массив никуда не получается
Записан
SeBun
Практически профи
*******

Репутация: +134/-3
Offline Offline

Пол: Мужской
Сообщений: 2289



« Ответ #3 : 13.05.2015, 15:27:56 »

А вы поэкспериментируйте - поставьте временные метки в коде и посмотрите, что и сколько времени выполняется. Соберите в кучу все запросы к базе и все ваши циклы и засеките. И получите наглядную картину работы вашего кода.

По сабжу - можете сделать подгрузку на JQuery. Тут я лопух, так как сам в такой фиче нуждаюсь а язык так и не выучил. Пусть клиент получает страницу с формой, где подгружены только первые несколько строк в ваши селекты. Остальные подгружаются по мере листания списка.
Записан
master-smeta
Давно я тут
****

Репутация: +8/-0
Offline Offline

Пол: Мужской
Сообщений: 254


« Ответ #4 : 13.05.2015, 15:39:12 »

А вы поэкспериментируйте - поставьте временные метки в коде и посмотрите, что и сколько времени выполняется. Соберите в кучу все запросы к базе и все ваши циклы и засеките. И получите наглядную картину работы вашего кода.

По сабжу - можете сделать подгрузку на JQuery. Тут я лопух, так как сам в такой фиче нуждаюсь а язык так и не выучил. Пусть клиент получает страницу с формой, где подгружены только первые несколько строк в ваши селекты. Остальные подгружаются по мере листания списка.
Дык и я лопух Azn Даже не знаю как временные метки ставить и замерять время выполнения скриптов Azn
Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3595


« Ответ #5 : 13.05.2015, 16:40:31 »

Вне зависимости от того, показываете вы данные или нет, их все равно нужно загрузить, поэтому:
1. В случае, когда их много, лучше разбить форму на несколько:
1-я форма: вырать курс > обработчик > на основании ID курса загружается 2-я форма: выбрать дату и т.д.
Каждая страница (форма) требует сравнительно немного времени и, как следствие, пользователь не раздражается. А если вы еще и AJAX прикрутите, то будет эффект плавного хода.
2. Если данных не очень много, можно впихнуть данные в объект JavaScript'а (сразу на сервере или на основе скрытых полей) с ключами, равными значениям ID курсов и выводить в зависимости от выбранного ID и т.д.
Готового решения я вам, даже если захочу, дать не могу. Максимум - это простенький пример, но и на него сейчас нет времени.
Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet