Всем привет.
Пишу с нуля компонент.
Возник вопрос, как сделать поиск и фильтрацию списков в админке.
Текущий вариант взят из рабочей HelloWorld с docs.joomla.org. Немного доработан напильником. Вместо одного приветствия выдает уже заново построенную таблицу с нужными полями.
Путем эмпирических заключений, полазив по простым компонетам content и contact, вынул оттуда куски кода, которые по моему мнению там отвечают за работу нужных мне вещей.
Кнопку Filter утянул из admin -> com_contact
Куски кода для поиска-фильтрации утащил тоже оттуда же.
Самое смешное: видно, что такая схема КАК-ТО работает, только пустой список выдается в итоге.
Мое предположение, что где-то передаются пустые переменные...
Из куска, где я выдрал функция ShowContact($option) получает реквизит $option - что это - я еще не разбирался...
В моем примере в функцию _buildQuery() не передается ничего, т.е. возможно что
команда "getUserStateFromRequest( $option.'search', 'search', '','string' );" будет выдавать чушь, т.к. явно система не знает что такое $option.'search', 'search'...
Вот код...
function _buildQuery()
{
global $mainframe;
$query = ' SELECT * '
. ' FROM #__hello '
;
$search = $mainframe->getUserStateFromRequest( $option.'search', 'search', '', 'string' );
if (strpos($search, '"')!== false) {
$search = str_replace(array('=', '<'), '', $search);
}
$search = JString::strtolower($search);
if ( $search ) {
$query = $query + 'WHERE greeting LIKE ' + $search;
}
return $query;
}
Вот кусок кода admin.contact.php, откуда я собственно пытаюсь пересадить варварским путем несколько строк кода в свой компонент.
function showContacts( $option )
{
global $mainframe;
$db =& JFactory::getDBO();
$filter_order = $mainframe->getUserStateFromRequest( $option.'filter_order', 'filter_order', 'cd.ordering', 'cmd' );
$filter_order_Dir = $mainframe->getUserStateFromRequest( $option.'filter_order_Dir', 'filter_order_Dir', '', 'word' );
$filter_state = $mainframe->getUserStateFromRequest( $option.'filter_state', 'filter_state', '', 'word' );
$filter_catid = $mainframe->getUserStateFromRequest( $option.'filter_catid', 'filter_catid', 0, 'int' );
$search = $mainframe->getUserStateFromRequest( $option.'search', 'search', '', 'string' );
if (strpos($search, '"')!== false) {
$search = str_replace(array('=', '<'), '', $search);
}
$search = JString::strtolower($search);
$limit = $mainframe->getUserStateFromRequest('global.list.limit', 'limit', $mainframe->getCfg('list_limit'), 'int');
$limitstart = $mainframe->getUserStateFromRequest($option.'.limitstart', 'limitstart', 0, 'int');
$where = array();
if ( $search ) {
$where[] = 'cd.name LIKE '.$db->Quote( '%'.$db->getEscaped( $search, true ).'%', false );
}
if ( $filter_catid ) {
$where[] = 'cd.catid = '.(int) $filter_catid;
}
if ( $filter_state ) {
if ( $filter_state == 'P' ) {
$where[] = 'cd.published = 1';
} else if ($filter_state == 'U' ) {
$where[] = 'cd.published = 0';
}
}
// sanitize $filter_order
if (!in_array($filter_order, array('cd.name', 'cd.published', 'cd.ordering', 'cd.access', 'category', 'user', 'cd.id'))) {
$filter_order = 'cd.ordering';
}
$where = ( count( $where )? ' WHERE ' . implode( ' AND ', $where ) : '' );
if ($filter_order == 'cd.ordering'){
$orderby = ' ORDER BY category, cd.ordering';
} else {
$orderby = ' ORDER BY '. $filter_order .' '. $filter_order_Dir .', category, cd.ordering';
}
// get the total number of records
$query = 'SELECT COUNT(*)'
. ' FROM #__contact_details AS cd'
. $where
;
$db->setQuery( $query );
$total = $db->loadResult();
jimport('joomla.html.pagination');
$pageNav = new JPagination( $total, $limitstart, $limit );
// get the subset (based on limits) of required records
$query = 'SELECT cd.*, cc.title AS category, u.name AS user, v.name as editor, g.name AS groupname'
. ' FROM #__contact_details AS cd'
. ' LEFT JOIN #__groups AS g ON g.id = cd.access'
. ' LEFT JOIN #__categories AS cc ON cc.id = cd.catid'
. ' LEFT JOIN #__users AS u ON u.id = cd.user_id'
. ' LEFT JOIN #__users AS v ON v.id = cd.checked_out'
. $where
. $orderby
;
$db->setQuery( $query, $pageNav->limitstart, $pageNav->limit );
$rows = $db->loadObjectList();
// build list of categories
$javascript = 'onchange="document.adminForm.submit();"';
$lists['catid'] = JHTML::_('list.category', 'filter_catid', 'com_contact_details', intval( $filter_catid ), $javascript );
// state filter
$lists['state'] = JHTML::_('grid.state', $filter_state );
// table ordering
$lists['order_Dir'] = $filter_order_Dir;
$lists['order'] = $filter_order;
// search filter
$lists['search']= $search;
HTML_contact::showcontacts( $rows, $pageNav, $option, $lists );
}