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

b2z

  • Глобальный модератор
  • 7059
  • 766 / 0
  • Разраблю понемногу
Привет всем!

При написании комопонента столкнулся с проблемой - у меня есть запрос, который выводит большой список. Есть желание его разбить на несколько страниц, но вот как это сделать? Есть ли в Joomla! стандартные средства или для этого необходимо написать что-то своё?

Спасибо!
*

smart

  • Администратор
  • 6485
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Думал писать с нуля, а оказалось, я уже это один раз описывал: Функции для постраничной навигации
*

b2z

  • Глобальный модератор
  • 7059
  • 766 / 0
  • Разраблю понемногу
*

b2z

  • Глобальный модератор
  • 7059
  • 766 / 0
  • Разраблю понемногу
Такс, что-то у меня не получается... Может кто глянет свежим взглядом, поможет.

Вот вывод списка (пока всего 3 записи), но pagination не срабатывает:
http://demo.contra.lv/index.php?option=com_contrashop&task=manage&mode=slotlist&limitstart=0&limit=1

Код вывода:
Код
if ($mode == "slotlist") {
require_once( $GLOBALS['mosConfig_absolute_path'] . '/includes/pageNavigation.php' );
$limit = intval( mosGetParam( $_REQUEST, 'limit', 1 ) );
$limitstart = intval( mosGetParam( $_REQUEST, 'limitstart', 0 ) );
$database->setQuery("SELECT * FROM #__contrashop_slots WHERE expired=0 LIMIT {$limitstart}, {$limit}");
$rows = $database->loadObjectList();
$total = COUNT($rows);

?>  <div id="mainContainer" style="">
<legend><h3><?php echo _ALL_SLOTS; ?></h3></legend>
<table width="100%">
<tr>
<td><b><?php echo _SERVER; ?></b></td>
<td><b><?php echo _NICK; ?></b></td>
<td><b><?php echo _PASSW; ?></b></td>
<td><b><?php echo _BOUGHT; ?></b></td>
<td><b><?php echo _EXPIRES; ?></b></td>
<td></td>
</tr>
<?php foreach ($rows as $row) {
if ($row->server == "dd2") {
$servername = "dust2 only";
}
if ($row->server == "gg") {
$servername = "Gun Game";
}
if ($row->server == "ggdm") {
$servername = "Gun Game DM";
}
if ($row->server == "conq") {
$servername = "Conquest";
}
if ($row->server == "dm") {
$servername = "Death Match";
}
if ($row->server == "zm") {
$servername = "Zombie Mod";
}
if ($row->server == "all") {
$servername = "All";
}
echo '<tr>
<td width="20%">'.$servername.'</td>
<td width="20%">'.$row->nick.'</td>
<td width="20%">'.$row->pass.'</td>
<td width="20%">'.$row->start_str.'</td>
<td width="20%">'.$row->end_str.'</td>';
}
echo "</tr></table></div>";
$pageNav = new mosPageNav( $total, $limitstart, $limit );
$link = "index.php?option=com_contrashop&task=manage&mode=slotlist";
echo $pageNav->writePagesLinks( $link );
}
Где чего я попутал? Наставьте на путь истинный :) Спасибо.
*

smart

  • Администратор
  • 6485
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Ошибься ты вот в чем. Ты делаешь запрос, ограничиваешь выборку, и потом считаешь количество по выбранному - а оно всегда одно и то же будет. Нужно же, несколько иначе. Простенький пример из компонента баннеров:


	
$limit 
	
	
intval$mainframe->getUserStateFromRequest"viewlistlimit"'limit'$mosConfig_list_limit ) );
	
$limitstart intval$mainframe->getUserStateFromRequest"viewban{$option}limitstart"'limitstart') );

	
// get the total number of records
	
$query "SELECT COUNT(*)"
	
"\n FROM #__banner"
	
;
	
$database->setQuery$query );
	
$total $database->loadResult();

	
require_once( 
$GLOBALS['mosConfig_absolute_path'] . '/administrator/includes/pageNavigation.php' );
	
$pageNav = new mosPageNav$total$limitstart$limit );

	
$query "SELECT b.*, u.name AS editor"
	
"\n FROM #__banner AS b "
	
"\n LEFT JOIN #__users AS u ON u.id = b.checked_out"
	
;
	
$database->setQuery$query$pageNav->limitstart$pageNav->limit );
	
$rows $database->loadObjectList();


Т.е. сначла делается запрос, возвращающий количество элементов, получаем $total, потом формируем объект страничной навигации, в него передаем 3 параметра, а затем уже делаем запрос на выборку данных, и ограничиваем ее значениями из объекта страничной навигации.

1. Ограничиваем значениями объекта потому, что параметры переданные запросом могут быть неверны (например нет такого смещения), а в объекте это ве корретируется
2. В указанном примере ограничение делается не путем добавления LIMIT в сам текст запроса, а в функцию setQuery. По сути, произойдет то же самое, просто выглядит аккуратнее.

*

b2z

  • Глобальный модератор
  • 7059
  • 766 / 0
  • Разраблю понемногу
Серж, спасибо огромное. Снова выручил!

В итоге у меня получилось так:

	
	
	
$limit intvalmosGetParam$_REQUEST'limit'10 ) );
	
	
	
$limitstart intvalmosGetParam$_REQUEST'limitstart') );
	
	
	

	
	
	
$database->setQuery("SELECT COUNT(*) FROM #__contrashop_slots WHERE expired=0");
	
	
	

	
	
	
$total $database->loadResult();
	
	
	

	
	
	
require_once( 
$GLOBALS['mosConfig_absolute_path'] . '/includes/pageNavigation.php' );
	
	
	
$pageNav = new mosPageNav$total$limitstart$limit );

                        
$database->setQuery("SELECT * FROM #__contrashop_slots WHERE expired=0 LIMIT {$pageNav->limitstart}{$pageNav->limit}");
	
	
	
$rows $database->loadObjectList();


Всё замечательно работает.
*

b2z

  • Глобальный модератор
  • 7059
  • 766 / 0
  • Разраблю понемногу
Блин, захотел привести вывод постраничной навигации к sefRelToAbs таким способом:

$link 
'index.php?option=com_contraadmins';
echo 
sefRelToAbs($pageNav->writePagesLinks$link ));

Но получается в итоге http://www.contra.lv/<< [Первая] < [Предыдущая] 1 2 [Следующая] > [Последняя] >>
хотя при этом ссылки навигации приводятся к sefRelToAbs... Откуда тут появилось http://www.contra.lv/ вот в чём вопрос.

Что неверно в коде?
*

smart

  • Администратор
  • 6485
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Блин, захотел привести вывод постраничной навигации к sefRelToAbs таким способом
а нафига? они и так выводятся в правильном формате, посмотри внимательнее код в файле includes/pageNavigation.php - ты увидишь там все необходимые вызовы метода sefRelToAbs
*

b2z

  • Глобальный модератор
  • 7059
  • 766 / 0
  • Разраблю понемногу
Хмм... Что-то мне показалось, что выводилось без sef. Ещё раз перепроверюсь.

Update: да , всё в порядке... я чего-то не углядел
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Вывод статистики по всем проектам в один roster

Автор r0m4n

Ответов: 4
Просмотров: 122
Последний ответ 18.12.2019, 18:47:57
от r0m4n
Вывод таблицы, деление на страницы

Автор March Cat

Ответов: 6
Просмотров: 331
Последний ответ 09.01.2019, 18:49:15
от dmitry_stas
Меню схлопывается после перезагрузки страницы

Автор onelawyer

Ответов: 10
Просмотров: 575
Последний ответ 11.10.2017, 14:50:48
от effrit
Модификация модуля lastet_news вывод времени перед заголовком

Автор Morphiss

Ответов: 9
Просмотров: 1394
Последний ответ 19.04.2016, 12:41:55
от spsyper
Как вставить модуль в код нужной страницы php?

Автор zvi

Ответов: 7
Просмотров: 2280
Последний ответ 12.04.2016, 19:36:55
от AlekVolsk