Курсы фильтрации Moodle на основе раскрывающегося настраиваемого поля ⇐ Php
Курсы фильтрации Moodle на основе раскрывающегося настраиваемого поля
Я создал несколько настраиваемых полей курса и хочу создать некоторые, чтобы показать фильтры, которые будут фильтровать курсы на основе предпочтений пользователя. например, язык фильтра имеет ENG, SP, IT
если пользователь выбирает ENG, должны отображаться только курсы, на языке которых есть ENG (произвольное поле)
мой код:
require_once(__DIR__ . '/../config.php'); $PAGE->set_context(context_system::instance()); $PAGE->set_pagelayout('стандартный'); $PAGE->set_title("Настраиваемые поля"); $PAGE->set_heading("Все настраиваемые поля для курсов"); эхо $OUTPUT->header(); $ftopics = $DB->get_records('customfield_field', array('shortname' => 'topic')); $flevels = $DB->get_records('customfield_field', array('shortname' => 'level')); $flanguages = $DB->get_records('customfield_field', array('shortname' => 'language')); echo ''; // Запускаем форму // ----- ВАРИАНТЫ ТЕМЫ ----- echo ''; // Запускаем раскрывающийся список/выбираем элемент echo 'Все темы'; // Включить опцию для всех тем foreach ($ftopics как $topic) { $configdata = json_decode($topic->configdata, true); // Проверяем, существует ли ключ «options» в декодированных конфигурационных данных if (isset($configdata['options'])) { // Разделяем строку параметров на массив, используя "\r\n" в качестве разделителя $options = взорваться("\r\n", $configdata['options']); // Удаляем пустые значения $options = array_filter($options); // Отображение параметров в виде раскрывающегося списка foreach ($options как $option) { echo '' . $опция. ''; } } } эхо ''; // Завершаем элемент раскрывающегося списка/выбора // ----- ОПЦИИ УРОВНЯ ----- echo ''; echo 'Все уровни'; // Включаем опцию для всех уровней foreach ($flevels как $level) { $configdata = json_decode($level->configdata, true); // Проверяем, существует ли ключ «options» в декодированных конфигурационных данных if (isset($configdata['options'])) { // Разделяем строку параметров на массив, используя "\r\n" в качестве разделителя $options = взорваться("\r\n", $configdata['options']); // Удаляем пустые значения $options = array_filter($options); // Отображение параметров в виде раскрывающегося списка foreach ($options как $option) { echo '' . $опция. ''; } } } эхо ''; // Завершаем элемент раскрывающегося списка/выбора // ----- ОПЦИИ ЯЗЫКА ----- echo ''; echo 'Все языки'; // Включаем опцию для всех языков foreach ($flanguages как $language) { $configdata = json_decode($language->configdata, true); // Проверяем, существует ли ключ «options» в декодированных конфигурационных данных if (isset($configdata['options'])) { // Разделяем строку параметров на массив, используя "\r\n" в качестве разделителя $options = взорваться("\r\n", $configdata['options']); // Удаляем пустые значения $options = array_filter($options); // Отображение параметров в виде раскрывающегося списка foreach ($options как $option) { echo '' . $опция. ''; } } } эхо ''; // Завершаем элемент раскрывающегося списка/выбора echo ''; эхо ''; // Завершаем форму // Получение значений фильтра $topicFilter = option_param('topic_filter', null, PARAM_TEXT); $levelFilter = option_param('level_filter', null, PARAM_TEXT); $languageFilter = option_param('language_filter', null, PARAM_TEXT); // Построение SQL-запроса на основе выбранных фильтров $sql = "ВЫБЕРИТЕ c.id, c.полное имя, c.summary FROM {course} c"; // Добавляем предложение WHERE на основе выбранных фильтров $whereClause = массив(); если (!empty($topicFilter)) { $whereClause[] = "c.id IN (ВЫБЕРИТЕ cd.instanceid FROM {customfield_data} cd WHERE cd.shortname = 'topic' И cd.value = :topic_filter И cd.instanceid = c.id)"; } если (!empty($levelFilter)) { $whereClause[] = "c.id IN (ВЫБЕРИТЕ cd.instanceid FROM {customfield_data} cd WHERE cd.shortname = 'level' AND cd.value = :level_filter AND cd.instanceid = c.id)"; } если (!empty($languageFilter)) { $whereClause[] = "c.id IN (ВЫБЕРИТЕ cd.instanceid FROM {customfield_data} cd WHERE cd.shortname = 'language' AND cd.value = :language_filter AND cd.instanceid = c.id)"; } // Объединяем предложения WHERE с AND if (!empty($whereClause)) { $sql .= 'ГДЕ' . implode('И', $whereClause); } // Выполняем запрос $params = массив( 'topic_filter' => $topicFilter, 'level_filter' => $levelFilter, 'language_filter' => $languageFilter ); $courses = $DB->get_records_sql($sql, $params); // Отображение названий отфильтрованных курсов foreach ($courses как $course) { эхо ''; эхо '' . html_writer::link(new Moodle_url('/course/view.php', array('id' => $course->id)), $course->fullname) . ''; эхо '' . $курс->резюме . '
'; эхо ''; } echo $OUTPUT->footer(); ?>
ошибка:
Ошибка чтения из базы данных
Подробнее об этой ошибке
Информация об отладке: неизвестный столбец «cd.shortname» в разделе «where»
ВЫБЕРИТЕ c.id, c.fullname, c.summary ИЗ mdl_course c ГДЕ c.id IN (ВЫБЕРИТЕ cd.instanceid ИЗ mdl_customfield_data cd ГДЕ cd.shortname = 'level' И cd.value = ? И cd.instanceid = c.id) [множество ( 0 => 'ВУЗ', )] Код ошибки: dmlreadException
Можете ли вы помочь мне с моим кодом или я что-то еще упускаю
Я создал несколько настраиваемых полей курса и хочу создать некоторые, чтобы показать фильтры, которые будут фильтровать курсы на основе предпочтений пользователя. например, язык фильтра имеет ENG, SP, IT
если пользователь выбирает ENG, должны отображаться только курсы, на языке которых есть ENG (произвольное поле)
мой код:
require_once(__DIR__ . '/../config.php'); $PAGE->set_context(context_system::instance()); $PAGE->set_pagelayout('стандартный'); $PAGE->set_title("Настраиваемые поля"); $PAGE->set_heading("Все настраиваемые поля для курсов"); эхо $OUTPUT->header(); $ftopics = $DB->get_records('customfield_field', array('shortname' => 'topic')); $flevels = $DB->get_records('customfield_field', array('shortname' => 'level')); $flanguages = $DB->get_records('customfield_field', array('shortname' => 'language')); echo ''; // Запускаем форму // ----- ВАРИАНТЫ ТЕМЫ ----- echo ''; // Запускаем раскрывающийся список/выбираем элемент echo 'Все темы'; // Включить опцию для всех тем foreach ($ftopics как $topic) { $configdata = json_decode($topic->configdata, true); // Проверяем, существует ли ключ «options» в декодированных конфигурационных данных if (isset($configdata['options'])) { // Разделяем строку параметров на массив, используя "\r\n" в качестве разделителя $options = взорваться("\r\n", $configdata['options']); // Удаляем пустые значения $options = array_filter($options); // Отображение параметров в виде раскрывающегося списка foreach ($options как $option) { echo '' . $опция. ''; } } } эхо ''; // Завершаем элемент раскрывающегося списка/выбора // ----- ОПЦИИ УРОВНЯ ----- echo ''; echo 'Все уровни'; // Включаем опцию для всех уровней foreach ($flevels как $level) { $configdata = json_decode($level->configdata, true); // Проверяем, существует ли ключ «options» в декодированных конфигурационных данных if (isset($configdata['options'])) { // Разделяем строку параметров на массив, используя "\r\n" в качестве разделителя $options = взорваться("\r\n", $configdata['options']); // Удаляем пустые значения $options = array_filter($options); // Отображение параметров в виде раскрывающегося списка foreach ($options как $option) { echo '' . $опция. ''; } } } эхо ''; // Завершаем элемент раскрывающегося списка/выбора // ----- ОПЦИИ ЯЗЫКА ----- echo ''; echo 'Все языки'; // Включаем опцию для всех языков foreach ($flanguages как $language) { $configdata = json_decode($language->configdata, true); // Проверяем, существует ли ключ «options» в декодированных конфигурационных данных if (isset($configdata['options'])) { // Разделяем строку параметров на массив, используя "\r\n" в качестве разделителя $options = взорваться("\r\n", $configdata['options']); // Удаляем пустые значения $options = array_filter($options); // Отображение параметров в виде раскрывающегося списка foreach ($options как $option) { echo '' . $опция. ''; } } } эхо ''; // Завершаем элемент раскрывающегося списка/выбора echo ''; эхо ''; // Завершаем форму // Получение значений фильтра $topicFilter = option_param('topic_filter', null, PARAM_TEXT); $levelFilter = option_param('level_filter', null, PARAM_TEXT); $languageFilter = option_param('language_filter', null, PARAM_TEXT); // Построение SQL-запроса на основе выбранных фильтров $sql = "ВЫБЕРИТЕ c.id, c.полное имя, c.summary FROM {course} c"; // Добавляем предложение WHERE на основе выбранных фильтров $whereClause = массив(); если (!empty($topicFilter)) { $whereClause[] = "c.id IN (ВЫБЕРИТЕ cd.instanceid FROM {customfield_data} cd WHERE cd.shortname = 'topic' И cd.value = :topic_filter И cd.instanceid = c.id)"; } если (!empty($levelFilter)) { $whereClause[] = "c.id IN (ВЫБЕРИТЕ cd.instanceid FROM {customfield_data} cd WHERE cd.shortname = 'level' AND cd.value = :level_filter AND cd.instanceid = c.id)"; } если (!empty($languageFilter)) { $whereClause[] = "c.id IN (ВЫБЕРИТЕ cd.instanceid FROM {customfield_data} cd WHERE cd.shortname = 'language' AND cd.value = :language_filter AND cd.instanceid = c.id)"; } // Объединяем предложения WHERE с AND if (!empty($whereClause)) { $sql .= 'ГДЕ' . implode('И', $whereClause); } // Выполняем запрос $params = массив( 'topic_filter' => $topicFilter, 'level_filter' => $levelFilter, 'language_filter' => $languageFilter ); $courses = $DB->get_records_sql($sql, $params); // Отображение названий отфильтрованных курсов foreach ($courses как $course) { эхо ''; эхо '' . html_writer::link(new Moodle_url('/course/view.php', array('id' => $course->id)), $course->fullname) . ''; эхо '' . $курс->резюме . '
'; эхо ''; } echo $OUTPUT->footer(); ?>
ошибка:
Ошибка чтения из базы данных
Подробнее об этой ошибке
Информация об отладке: неизвестный столбец «cd.shortname» в разделе «where»
ВЫБЕРИТЕ c.id, c.fullname, c.summary ИЗ mdl_course c ГДЕ c.id IN (ВЫБЕРИТЕ cd.instanceid ИЗ mdl_customfield_data cd ГДЕ cd.shortname = 'level' И cd.value = ? И cd.instanceid = c.id) [множество ( 0 => 'ВУЗ', )] Код ошибки: dmlreadException
Можете ли вы помочь мне с моим кодом или я что-то еще упускаю
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Получите значение цены настраиваемого поля для настраиваемого типа публикации в Woocommerce.
Anonymous » » в форуме Php - 0 Ответы
- 139 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Мобильное приложение Moodle зависло на логотипе Moodle, который не меняется [закрыто]
Anonymous » » в форуме Android - 0 Ответы
- 136 Просмотры
-
Последнее сообщение Anonymous
-