0 Пользователей и 1 Гость просматривают эту тему.
  • 6 Ответов
  • 3253 Просмотров
*

passat

  • Осваиваюсь на форуме
  • 12
  • 0 / 0
Всем привет.
Пишу с нуля компонент.
Возник вопрос, как сделать поиск и фильтрацию списков в админке.
Текущий вариант взят из рабочей 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 );
}
*

b2z

  • Глобальный модератор
  • 7212
  • 777 / 0
  • Разраблю понемногу
Вот тут есть про фильтр.

А вообще я сейчас порыскал в сети и практически ничего путного не нашел по этому вопросу. В связи с чем я планирую в самое ближайшее время пополнить свой блог статьями на тему фильтр/поиск. Но это после того, как я допишу про Joomla pagination и возможность сделать pagination в режиме AJAX.
*

passat

  • Осваиваюсь на форуме
  • 12
  • 0 / 0
Вот тут есть про фильтр.

А вообще я сейчас порыскал в сети и практически ничего путного не нашел по этому вопросу. В связи с чем я планирую в самое ближайшее время пополнить свой блог статьями на тему фильтр/поиск. Но это после того, как я допишу про Joomla pagination и возможность сделать pagination в режиме AJAX.

Гранд мерси... Почитаю, посмотрю... Хочется по уму сделать, а не одноразово. Ковыряю два стандартных компонента: контакт и контент... в обоих случаях кардинально разный подход. Башка трещит... Привык писать на высоких уровнях, где отладка есть и можно посмотреть в реал тайме... а тут блин пошаговая стратегия, исправил-залил-посмотрел-исправил-залил-посмотрел (локальный денвер есть, но лень каждый раз флэшку тыкать)
*

passat

  • Осваиваюсь на форуме
  • 12
  • 0 / 0
А вообще я сейчас порыскал в сети и практически ничего путного не нашел по этому вопросу.
Вот и я рыскал по сети и вменяемых вещей не нашел. Собственно, потому и запостил тему...
У приведенного выше грека, вроде более менее толково расписано. Потыркаю - скажу что получилось...
*

passat

  • Осваиваюсь на форуме
  • 12
  • 0 / 0
 :D
В общем поиск победил.
С помощью var_dump() тупо задебагил, что и как получается в запросе.  yes!
Думаю, победить контекстные фильтры по списку из базы (для отбора по столбикам)  :laugh:
*

klubnichkaaa

  • Захожу иногда
  • 302
  • 16 / 2
А я ещё в процессе реализации, вроде как привязал фильтрацию, но всё остаётся как и было. А вы не приведёте пример как это реализовать раз у вас получилось!
Делай с другими то же, что они собираются сделать с тобой: бей первым.
*

yunoshev

  • Завсегдатай
  • 1271
  • 179 / 1
Вы просто забыли посмотреть HTML код страницы с таблицей (списком статей), где у каждого заголовка (столбца) имеется свой обработчик по-нажатию. Именно там и задается управление сортировкой (фильтры) таблицы.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Надо переделать готовый компонент Генератор Купонов J2.5 на J1.5

Автор mkoff

Ответов: 3
Просмотров: 1638
Последний ответ 18.12.2014, 10:22:04
от assa1988
Реализация программы ТВ передач на сайте

Автор Evlampii

Ответов: 20
Просмотров: 9377
Последний ответ 04.11.2014, 22:18:01
от palexa
Компонент вывода информации из внешней базы данных

Автор rambeer

Ответов: 33
Просмотров: 9238
Последний ответ 12.09.2014, 05:01:34
от Mad_Doc
XML-RPC (реализация взаимодействия программы и сайта)

Автор ivankuprin

Ответов: 15
Просмотров: 13302
Последний ответ 17.02.2012, 11:55:22
от Physicist
Модифицировать компонент

Автор karabert

Ответов: 0
Просмотров: 980
Последний ответ 28.11.2011, 22:39:04
от karabert