From 258f337d596f291faf50bc45f53e23346a54f531 Mon Sep 17 00:00:00 2001 From: andrepereiradasilva Date: Tue, 28 Jun 2016 10:45:18 +0100 Subject: [PATCH] Implements searchtools, filters, dropdown actions and counting (#208) * implements searchtools, filters and merge the other two PR * just to force travis to run * revert * filter is published * filter is published 2 * modify filter test thanks to yvesh * code style * elseif , not else if --- .../com_weblinks/helpers/weblinks.php | 53 +++++++++ .../models/forms/filter_weblinks.xml | 106 +++++++++++++++++ .../com_weblinks/models/weblinks.php | 88 +++++++------- .../views/weblinks/tmpl/default.php | 109 ++++++------------ .../views/weblinks/tmpl/default_batch.php | 2 +- .../com_weblinks/views/weblinks/view.html.php | 43 +------ .../language/en-GB/en-GB.com_weblinks.ini | 2 + .../AdministratorWeblinksCest.php | 4 +- 8 files changed, 252 insertions(+), 155 deletions(-) create mode 100644 src/administrator/components/com_weblinks/models/forms/filter_weblinks.xml diff --git a/src/administrator/components/com_weblinks/helpers/weblinks.php b/src/administrator/components/com_weblinks/helpers/weblinks.php index 97da0bf..449754c 100644 --- a/src/administrator/components/com_weblinks/helpers/weblinks.php +++ b/src/administrator/components/com_weblinks/helpers/weblinks.php @@ -39,4 +39,57 @@ class WeblinksHelper extends JHelperContent $vName == 'categories' ); } + + /** + * Adds Count Items for WebLinks Category Manager. + * + * @param stdClass[] &$items The weblinks category objects. + * + * @return stdClass[] The weblinks category objects. + * + * @since 3.6.0 + */ + public static function countItems(&$items) + { + $db = JFactory::getDbo(); + + foreach ($items as $item) + { + $item->count_trashed = 0; + $item->count_archived = 0; + $item->count_unpublished = 0; + $item->count_published = 0; + + $query = $db->getQuery(true) + ->select('state, COUNT(*) AS count') + ->from($db->qn('#__weblinks')) + ->where($db->qn('catid') . ' = ' . (int) $item->id) + ->group('state'); + + $db->setQuery($query); + $weblinks = $db->loadObjectList(); + + foreach ($weblinks as $weblink) + { + if ($weblink->state == 1) + { + $item->count_published = $weblink->count; + } + elseif ($weblink->state == 0) + { + $item->count_unpublished = $weblink->count; + } + elseif ($weblink->state == 2) + { + $item->count_archived = $weblink->count; + } + elseif ($weblink->state == -2) + { + $item->count_trashed = $weblink->count; + } + } + } + + return $items; + } } diff --git a/src/administrator/components/com_weblinks/models/forms/filter_weblinks.xml b/src/administrator/components/com_weblinks/models/forms/filter_weblinks.xml new file mode 100644 index 0000000..0a09af3 --- /dev/null +++ b/src/administrator/components/com_weblinks/models/forms/filter_weblinks.xml @@ -0,0 +1,106 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/administrator/components/com_weblinks/models/weblinks.php b/src/administrator/components/com_weblinks/models/weblinks.php index 50c8eb2..86829d9 100644 --- a/src/administrator/components/com_weblinks/models/weblinks.php +++ b/src/administrator/components/com_weblinks/models/weblinks.php @@ -34,18 +34,23 @@ class WeblinksModelWeblinks extends JModelList 'alias', 'a.alias', 'checked_out', 'a.checked_out', 'checked_out_time', 'a.checked_out_time', - 'catid', 'a.catid', 'category_title', - 'state', 'a.state', - 'access', 'a.access', 'access_level', + 'catid', 'a.catid', 'category_id', + 'c.title', 'category_title', + 'state', 'a.state', 'published', + 'access', 'a.access', + 'ag.title', 'access_level', 'created', 'a.created', 'created_by', 'a.created_by', 'ordering', 'a.ordering', 'featured', 'a.featured', 'language', 'a.language', + 'l.title', 'language_title', 'hits', 'a.hits', 'publish_up', 'a.publish_up', 'publish_down', 'a.publish_down', 'url', 'a.url', + 'tag', + 'level', 'c.level', ); } @@ -60,33 +65,23 @@ class WeblinksModelWeblinks extends JModelList * @note Calling getState in this method will result in recursion. * @since 1.6 */ - protected function populateState($ordering = null, $direction = null) + protected function populateState($ordering = 'a.title', $direction = 'asc') { // Load the filter state. - $search = $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search'); - $this->setState('filter.search', $search); - - $accessId = $this->getUserStateFromRequest($this->context . '.filter.access', 'filter_access', null, 'int'); - $this->setState('filter.access', $accessId); - - $published = $this->getUserStateFromRequest($this->context . '.filter.state', 'filter_state', '', 'string'); - $this->setState('filter.state', $published); - - $categoryId = $this->getUserStateFromRequest($this->context . '.filter.category_id', 'filter_category_id', ''); - $this->setState('filter.category_id', $categoryId); - - $language = $this->getUserStateFromRequest($this->context . '.filter.language', 'filter_language', ''); - $this->setState('filter.language', $language); - - $tag = $this->getUserStateFromRequest($this->context . '.filter.tag', 'filter_tag', ''); - $this->setState('filter.tag', $tag); + $this->setState('filter.search', $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search', '', 'string')); + $this->setState('filter.access', $this->getUserStateFromRequest($this->context . '.filter.access', 'filter_access', '', 'cmd')); + $this->setState('filter.published', $this->getUserStateFromRequest($this->context . '.filter.published', 'filter_published', '', 'string')); + $this->setState('filter.category_id', $this->getUserStateFromRequest($this->context . '.filter.category_id', 'filter_category_id', '', 'cmd')); + $this->setState('filter.language', $this->getUserStateFromRequest($this->context . '.filter.language', 'filter_language', '', 'string')); + $this->setState('filter.tag', $this->getUserStateFromRequest($this->context . '.filter.tag', 'filter_tag', '', 'string')); + $this->setState('filter.level', $this->getUserStateFromRequest($this->context . '.filter.level', 'filter_level', '', 'cmd')); // Load the parameters. $params = JComponentHelper::getParams('com_weblinks'); $this->setState('params', $params); // List state information. - parent::populateState('a.title', 'asc'); + parent::populateState($ordering, $direction); } /** @@ -107,9 +102,11 @@ class WeblinksModelWeblinks extends JModelList // Compile the store id. $id .= ':' . $this->getState('filter.search'); $id .= ':' . $this->getState('filter.access'); - $id .= ':' . $this->getState('filter.state'); + $id .= ':' . $this->getState('filter.published'); $id .= ':' . $this->getState('filter.category_id'); $id .= ':' . $this->getState('filter.language'); + $id .= ':' . $this->getState('filter.tag'); + $id .= ':' . $this->getState('filter.level'); return parent::getStoreId($id); } @@ -136,47 +133,48 @@ class WeblinksModelWeblinks extends JModelList 'a.hits, a.state, a.access, a.ordering, a.language, a.publish_up, a.publish_down' ) ); - $query->from($db->quoteName('#__weblinks') . ' AS a'); + $query->from($db->quoteName('#__weblinks', 'a')); // Join over the language - $query->select('l.title AS language_title, l.image AS language_image') - ->join('LEFT', $db->quoteName('#__languages') . ' AS l ON l.lang_code = a.language'); + $query->select($db->quoteName('l.title', 'language_title')) + ->select($db->quoteName('l.image', 'language_image')) + ->join('LEFT', $db->quoteName('#__languages', 'l') . ' ON ' . $db->qn('l.lang_code') . ' = ' . $db->qn('a.language')); // Join over the users for the checked out user. - $query->select('uc.name AS editor') - ->join('LEFT', '#__users AS uc ON uc.id=a.checked_out'); + $query->select($db->quoteName('uc.name', 'editor')) + ->join('LEFT', $db->quoteName('#__users', 'uc') . ' ON ' . $db->qn('uc.id') . ' = ' . $db->qn('a.checked_out')); // Join over the asset groups. - $query->select('ag.title AS access_level') - ->join('LEFT', '#__viewlevels AS ag ON ag.id = a.access'); + $query->select($db->quoteName('ag.title', 'access_level')) + ->join('LEFT', $db->quoteName('#__viewlevels', 'ag') . ' ON ' . $db->qn('ag.id') . ' = ' . $db->qn('a.access')); // Join over the categories. $query->select('c.title AS category_title') - ->join('LEFT', '#__categories AS c ON c.id = a.catid'); + ->join('LEFT', $db->quoteName('#__categories', 'c') . ' ON ' . $db->qn('c.id') . ' = ' . $db->qn('a.catid')); // Filter by access level. if ($access = $this->getState('filter.access')) { - $query->where('a.access = ' . (int) $access); + $query->where($db->quoteName('a.access') . ' = ' . (int) $access); } // Implement View Level Access if (!$user->authorise('core.admin')) { $groups = implode(',', $user->getAuthorisedViewLevels()); - $query->where('a.access IN (' . $groups . ')'); + $query->where($db->quoteName('a.access') . ' IN (' . $groups . ')'); } // Filter by published state - $published = $this->getState('filter.state'); + $published = $this->getState('filter.published'); if (is_numeric($published)) { - $query->where('a.state = ' . (int) $published); + $query->where($db->quoteName('a.state') . ' = ' . (int) $published); } elseif ($published === '') { - $query->where('(a.state IN (0, 1))'); + $query->where('(' . $db->quoteName('a.state') . ' IN (0, 1))'); } // Filter by category. @@ -184,7 +182,13 @@ class WeblinksModelWeblinks extends JModelList if (is_numeric($categoryId)) { - $query->where('a.catid = ' . (int) $categoryId); + $query->where($db->quoteName('a.catid') . ' = ' . (int) $categoryId); + } + + // Filter on the level. + if ($level = $this->getState('filter.level')) + { + $query->where($db->quoteName('c.level') . ' <= ' . (int) $level); } // Filter by search in title @@ -194,19 +198,19 @@ class WeblinksModelWeblinks extends JModelList { if (stripos($search, 'id:') === 0) { - $query->where('a.id = ' . (int) substr($search, 3)); + $query->where($db->quoteName('a.id') . ' = ' . (int) substr($search, 3)); } else { $search = $db->quote('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%')); - $query->where('(a.title LIKE ' . $search . ' OR a.alias LIKE ' . $search . ')'); + $query->where('(' . $db->quoteName('a.title') . ' LIKE ' . $search . ' OR ' . $db->quoteName('a.alias') . ' LIKE ' . $search . ')'); } } // Filter on the language. if ($language = $this->getState('filter.language')) { - $query->where('a.language = ' . $db->quote($language)); + $query->where($db->quoteName('a.language') . ' = ' . $db->quote($language)); } $tagId = $this->getState('filter.tag'); @@ -223,8 +227,8 @@ class WeblinksModelWeblinks extends JModelList } // Add the list ordering clause. - $orderCol = $this->state->get('list.ordering'); - $orderDirn = $this->state->get('list.direction'); + $orderCol = $this->state->get('list.ordering', 'a.title'); + $orderDirn = $this->state->get('list.direction', 'ASC'); if ($orderCol == 'a.ordering' || $orderCol == 'category_title') { diff --git a/src/administrator/components/com_weblinks/views/weblinks/tmpl/default.php b/src/administrator/components/com_weblinks/views/weblinks/tmpl/default.php index fb8978c..0801f94 100644 --- a/src/administrator/components/com_weblinks/views/weblinks/tmpl/default.php +++ b/src/administrator/components/com_weblinks/views/weblinks/tmpl/default.php @@ -26,64 +26,17 @@ if ($saveOrder) $saveOrderingUrl = 'index.php?option=com_weblinks&task=weblinks.saveOrderAjax&tmpl=component'; JHtml::_('sortablelist.sortable', 'weblinkList', 'adminForm', strtolower($listDirn), $saveOrderingUrl); } -$sortFields = $this->getSortFields(); - -JFactory::getDocument()->addScriptDeclaration(' - Joomla.orderTable = function() - { - table = document.getElementById("sortTable"); - direction = document.getElementById("directionTable"); - order = table.options[table.selectedIndex].value; - if (order != "' . $listOrder . '") - { - dirn = "asc"; - } - else - { - dirn = direction.options[direction.selectedIndex].value; - } - Joomla.tableOrdering(order, dirn, ""); - }; -'); ?>
-sidebar)) : ?> + sidebar)) : ?>
sidebar; ?>
- +
- -
- -
- - -
-
- - pagination->getLimitBox(); ?> -
-
- - -
-
- - -
-
+ + $this)); ?>
items)) : ?>
@@ -94,34 +47,34 @@ JFactory::getDocument()->addScriptDeclaration(' - ', 'a.ordering', $listDirn, $listOrder, null, 'asc', 'JGRID_HEADING_ORDERING'); ?> + - + - - + + - - - - - - - + - + + + + + + + - + - + pagination->getListFooter(); ?> @@ -135,7 +88,7 @@ JFactory::getDocument()->addScriptDeclaration(' $canCheckin = $user->authorise('core.manage', 'com_checkin') || $item->checked_out == $user->get('id') || $item->checked_out == 0; $canChange = $user->authorise('core.edit.state', 'com_weblinks.category.' . $item->catid) && $canCheckin; ?> - + addScriptDeclaration(' - + - + id); ?> - state, $i, 'weblinks.', $canChange, 'cb', $item->publish_up, $item->publish_down); ?> +
+ state, $i, 'weblinks.', $canChange, 'cb', $item->publish_up, $item->publish_down); ?> + state === 2 ? 'un' : '') . 'archive', 'cb' . $i, 'weblinks'); + JHtml::_('actionsdropdown.' . ((int) $item->state === -2 ? 'un' : '') . 'trash', 'cb' . $i, 'weblinks'); + echo JHtml::_('actionsdropdown.render', $this->escape($item->title)); + } + ?> +
checked_out) : ?> @@ -172,10 +135,10 @@ JFactory::getDocument()->addScriptDeclaration(' escape($item->title); ?> - escape($item->alias));?> + escape($item->alias)); ?>
- escape($item->category_title); ?> + escape($item->category_title); ?>
@@ -185,7 +148,7 @@ JFactory::getDocument()->addScriptDeclaration(' hits; ?> - language == '*'):?> + language == '*') : ?> language_title ? JHtml::_('image', 'mod_languages/' . $item->language_image . '.gif', $item->language_title, array('title' => $item->language_title), true) . ' ' . $this->escape($item->language_title) : JText::_('JUNDEFINED'); ?> @@ -205,8 +168,6 @@ JFactory::getDocument()->addScriptDeclaration(' - -
diff --git a/src/administrator/components/com_weblinks/views/weblinks/tmpl/default_batch.php b/src/administrator/components/com_weblinks/views/weblinks/tmpl/default_batch.php index 3c9844e..9598929 100644 --- a/src/administrator/components/com_weblinks/views/weblinks/tmpl/default_batch.php +++ b/src/administrator/components/com_weblinks/views/weblinks/tmpl/default_batch.php @@ -9,7 +9,7 @@ defined('_JEXEC') or die; -$published = $this->state->get('filter.state'); +$published = $this->state->get('filter.published'); ?>