getMVCFactory()->createTable($name, $prefix, $config); } public function getForm($data = [], $loadData = true) { return $this->loadForm('com_testquestions.set', 'set', ['control' => 'jform', 'load_data' => $loadData]); } public function getItem($pk = null) { $item = parent::getItem($pk); if ($item && !empty($item->id)) { $db = Factory::getContainer()->get('DatabaseDriver'); $item->question_ids = $db->setQuery( $db->getQuery(true) ->select($db->quoteName('question_id')) ->from($db->quoteName('#__testquestions_set_questions')) ->where($db->quoteName('set_id') . ' = ' . (int) $item->id) ->order($db->quoteName('ordering') . ' ASC') )->loadColumn(); } else { $item->question_ids = []; } return $item; } protected function loadFormData() { return Factory::getApplication()->getUserState('com_testquestions.edit.set.data', []) ?: $this->getItem(); } public function getQuestions() { $db = Factory::getContainer()->get('DatabaseDriver'); return $db->setQuery( $db->getQuery(true) ->select(['q.id', 'q.question', 'q.question_type', 'q.answer_a', 'q.answer_b', 'q.answer_c', 'q.answer_d', 'q.answer_open', 'q.correct_answer', 'q.category_id', 'c.title AS category_title']) ->from($db->quoteName('#__testquestions_questions', 'q')) ->leftJoin($db->quoteName('#__testquestions_categories', 'c') . ' ON c.id = q.category_id') ->order('c.title ASC, q.ordering ASC, q.id ASC') )->loadObjectList(); } public function getCategories() { $db = Factory::getContainer()->get('DatabaseDriver'); return $db->setQuery( $db->getQuery(true) ->select(['id', 'title']) ->from($db->quoteName('#__testquestions_categories')) ->order($db->quoteName('title') . ' ASC') )->loadObjectList(); } public function save($data) { $formData = Factory::getApplication()->getInput()->post->get('jform', [], 'array'); $questionIds = array_values(array_unique(array_filter(array_map('intval', (array) ($formData['question_ids'] ?? $data['question_ids'] ?? []))))); unset($data['question_ids']); if (!parent::save($data)) { return false; } $setId = (int) $this->getState($this->getName() . '.id'); $db = Factory::getContainer()->get('DatabaseDriver'); $db->setQuery( $db->getQuery(true) ->delete($db->quoteName('#__testquestions_set_questions')) ->where($db->quoteName('set_id') . ' = ' . $setId) )->execute(); if ($questionIds) { $query = $db->getQuery(true) ->insert($db->quoteName('#__testquestions_set_questions')) ->columns([$db->quoteName('set_id'), $db->quoteName('question_id'), $db->quoteName('ordering')]); foreach ($questionIds as $ordering => $questionId) { $query->values(implode(',', [$setId, $questionId, $ordering])); } $db->setQuery($query)->execute(); } return true; } public function delete(&$pks) { if (!parent::delete($pks)) { return false; } $db = Factory::getContainer()->get('DatabaseDriver'); $ids = array_map('intval', (array) $pks); if ($ids) { $db->setQuery( $db->getQuery(true) ->delete($db->quoteName('#__testquestions_set_questions')) ->where($db->quoteName('set_id') . ' IN (' . implode(',', $ids) . ')') )->execute(); } return true; } }