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

master-smeta

  • Захожу иногда
  • 298
  • 10 / 0
Обработка данных из базы
« : 13.05.2015, 10: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, 11:59:32 от master-smeta »
*

SeBun

  • BanMaster
  • 4015
  • 259 / 5
  • @SeBun48
Re: Обработка данных из базы
« Ответ #1 : 13.05.2015, 11: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, 11:54:46 от sebun »
Оказываю услуги по Joomla | Миграция/Обновление | Сопровождение | IT-аутсорсинг | Недорогие домены и хостинг
*

master-smeta

  • Захожу иногда
  • 298
  • 10 / 0
Re: Обработка данных из базы
« Ответ #2 : 13.05.2015, 11: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

  • BanMaster
  • 4015
  • 259 / 5
  • @SeBun48
Re: Обработка данных из базы
« Ответ #3 : 13.05.2015, 14:27:56 »
А вы поэкспериментируйте - поставьте временные метки в коде и посмотрите, что и сколько времени выполняется. Соберите в кучу все запросы к базе и все ваши циклы и засеките. И получите наглядную картину работы вашего кода.

По сабжу - можете сделать подгрузку на JQuery. Тут я лопух, так как сам в такой фиче нуждаюсь а язык так и не выучил. Пусть клиент получает страницу с формой, где подгружены только первые несколько строк в ваши селекты. Остальные подгружаются по мере листания списка.
Оказываю услуги по Joomla | Миграция/Обновление | Сопровождение | IT-аутсорсинг | Недорогие домены и хостинг
*

master-smeta

  • Захожу иногда
  • 298
  • 10 / 0
Re: Обработка данных из базы
« Ответ #4 : 13.05.2015, 14:39:12 »
А вы поэкспериментируйте - поставьте временные метки в коде и посмотрите, что и сколько времени выполняется. Соберите в кучу все запросы к базе и все ваши циклы и засеките. И получите наглядную картину работы вашего кода.

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

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Обработка данных из базы
« Ответ #5 : 13.05.2015, 15:40:31 »
Вне зависимости от того, показываете вы данные или нет, их все равно нужно загрузить, поэтому:
1. В случае, когда их много, лучше разбить форму на несколько:
1-я форма: вырать курс > обработчик > на основании ID курса загружается 2-я форма: выбрать дату и т.д.
Каждая страница (форма) требует сравнительно немного времени и, как следствие, пользователь не раздражается. А если вы еще и AJAX прикрутите, то будет эффект плавного хода.
2. Если данных не очень много, можно впихнуть данные в объект JavaScript'а (сразу на сервере или на основе скрытых полей) с ключами, равными значениям ID курсов и выводить в зависимости от выбранного ID и т.д.
Готового решения я вам, даже если захочу, дать не могу. Максимум - это простенький пример, но и на него сейчас нет времени.
Не будь паразитом, сделай что-нибудь самостоятельно!
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Вывод формы горизонтально ?

Автор warlocksp

Ответов: 5
Просмотров: 1895
Последний ответ 08.12.2016, 15:35:26
от DeniTornado
Автозаполнение полей формы

Автор 68pin

Ответов: 1
Просмотров: 1203
Последний ответ 15.06.2016, 17:06:35
от 68pin
Подставить значение одного поля в другое

Автор Agard

Ответов: 1
Просмотров: 1594
Последний ответ 09.01.2016, 12:53:48
от Agard
PDF разметка документа

Автор Agard

Ответов: 1
Просмотров: 1310
Последний ответ 31.12.2015, 17:58:57
от Agard
Формирование номера заявки/заказа в RSForm

Автор css_ufa

Ответов: 17
Просмотров: 9894
Последний ответ 28.12.2015, 23:29:53
от Agard