* @link https://www.tassos.gr * @copyright Copyright © 2024 Tassos All Rights Reserved * @license GNU GPLv3 or later */ // No direct access to this file defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\Registry\Registry; require_once __DIR__ . '/ajaxify.php'; /* * Creates an AJAX-based dropdown * https://select2.org/ */ class JFormFieldComponentItems extends JFormFieldAjaxify { /** * Single items table name * * @var string */ protected $table = 'content'; /** * Primary key column of the single items table * * @var string */ protected $column_id = 'id'; /** * The title column of the single items table * * @var string */ protected $column_title = 'title'; /** * The state column of the single items table * * @var string */ protected $column_state = 'state'; /** * Pass extra where SQL statement * * @var string */ protected $where; /** * Pass extra join SQL statement * * @var string */ protected $join; /** * Pass extra group SQL statement * * @var string */ protected $query_group; /** * The Joomla database object * * @var object */ protected $db; /** * Method to attach a JForm object to the field. * * @param SimpleXMLElement $element The SimpleXMLElement object representing the `` tag for the form field object. * @param mixed $value The form field value to validate. * @param string $group The field name group control value. This acts as an array container for the field. * For example if the field has name="foo" and the group value is set to "bar" then the * full field name would end up being "bar[foo]". * * @return boolean True on success. * * @since 3.2 */ public function setup(SimpleXMLElement $element, $value, $group = null) { if ($return = parent::setup($element, $value, $group)) { $this->init(); } return $return; } public function init() { $this->table = isset($this->element['table']) ? (string) $this->element['table'] : $this->table; $this->column_id = isset($this->element['column_id']) ? (string) $this->element['column_id'] : $this->column_id; $this->column_id = $this->prefix($this->column_id); $this->column_title = isset($this->element['column_title']) ? (string) $this->element['column_title'] : $this->column_title; $this->column_title = $this->prefix($this->column_title); $this->column_state = isset($this->element['column_state']) ? (string) $this->element['column_state'] : $this->column_state; $this->column_state = $this->prefix($this->column_state); $this->where = isset($this->element['where']) ? (string) $this->element['where'] : null; $this->join = isset($this->element['join']) ? (string) $this->element['join'] : null; $this->query_group = isset($this->element['group']) ? (string) $this->element['group'] : null; if (!isset($this->element['placeholder']) && isset($this->element['description'])) { $this->placeholder = (string) $this->element['description']; } // Initialize database Object $this->db = Factory::getDbo(); } private function prefix($string) { if (strpos($string, '.') === false) { $string = 'i.' . $string; } return $string; } protected function getTemplateResult() { return '\' + state.text + \'\' + state.id + \''; } protected function getItemsQuery() { $db = $this->db; $query = $this->getQuery() ->order($db->quoteName($this->column_id) . ' DESC'); if ($this->limit > 0) { // Joomla uses offset $page = $this->page - 1; $query->setLimit($this->limit, $page * $this->limit); } return $query; } protected function getItems() { $db = $this->db; $db->setQuery($this->getItemsQuery()); return $db->loadObjectList(); } protected function getItemsTotal() { $db = $this->db; $query = $this->getQuery() ->clear('select') ->select('count(*)'); $db->setQuery($query); return (int) $db->loadResult(); } protected function getQuery() { $db = $this->db; $query = $db->getQuery(true) ->select([ $db->quoteName($this->column_id, 'id'), $db->quoteName($this->column_title, 'text'), $db->quoteName($this->column_state, 'state') ]) ->from($db->quoteName('#__' . $this->table, 'i')); if (!empty($this->search_term)) { $query->where($db->quoteName($this->column_title) . ' LIKE ' . $db->quote('%' . $this->search_term . '%')); } if ($this->join) { $query->join('INNER', $this->join); } if ($this->where) { $query->where($this->where); } if ($this->query_group) { $query->group($this->query_group); } return $query; } protected function validateOptions($options) { $db = $this->db; $query = $this->getQuery() ->where($db->quoteName($this->column_id) . ' IN (' . implode(',', $options) . ')'); $db->setQuery($query); return $db->loadAssocList('id', 'text'); } }