|
|
|
| Ответ 002 на задачу N 14.
С условиями задачи можно ознакомится по ссылке.
Обычно такие задачи оформляют в виде класса. Я так и поступил.
Класс полностью готов к употреблению. Все настройки вынесены отдельно.
Каждый метод снабжён кратким описанием. Класс легко масштабируется
и может быть дополнен новыми фильтрами.
Настройки
<?
mysql_connect('localhost','root');
mysql_select_db('test');
define("_TAB_NAME","name");// Таблица для навигации
define("_FIELD_NAME","name");// поле для навигации
define("_ID_NAME","id_name");// Ключевое поле для идентификации
define("_ORDER_BY","id_name"); // Поле для сортировки
define("_NUM_ON_PAGE",5); // Сколько строчек списка выводить на страницу
?>
|
Класс
<?
class alphaPages{
// Задаём алфавит
var $ALPHA = 'АБВГДЕЖЗИКЛМНОПРСТУФХЦЧЩШЭЮЯ';
// Инициализация объекта. Установка начальных условий списка
function alphaPages(){
$this->sql = "SELECT * FROM "._TAB_NAME;
}
// Метод выводит "карточку" человека
function profile(){
$this->sql .= " WHERE "._ID_NAME."=".$_GET['id'];
$query = mysql_query($this->sql);
$r = mysql_fetch_assoc($query);
$ret='<table>';
foreach($r as $field=>$value){
$ret .= "<tr><td>".$field."</td><td>".$value."</td></tr>";
}
$ret.='</table>';
return $ret;
}
// метод строит панель алфавитной навигации
function makeAlphaNavBar(){
$sql = 'select DISTINCT(LEFT(UPPER('._FIELD_NAME.'),1)) as letter from '._TAB_NAME;
$query = mysql_query($sql);
while($r = mysql_fetch_assoc($query)){
$this->ALPHA = str_replace($r['letter'],'<a href="?letter='.$r['letter'].'">'.$r['letter'].'</a>',$this->ALPHA);
}
return $this->ALPHA;
}
// метод строит панель постраничной навигации
function makePageNavBar(){
$query = mysql_query($this->sql);
$maxpage = ceil(mysql_num_rows($query)/_NUM_ON_PAGE);
for($i=1;$i<$maxpage;$i++){
$ret.='|<a href="?letter='.$_GET['letter'].'&page='.$i.'">'.$i.'</a>';
}
return $ret;
}
######### Набор фильтрующих список методов ##############
// Метод фильтрует список по букве
function setLetter(){
$this->sql .= " WHERE "._FIELD_NAME." like '".$_GET['letter']."%'";
}
// Метод ставит ограничения по странице
function setPage(){
$this->setOrder();
if(empty($_GET['page'])) $page=0;
else $page = $_GET['page'];
$this->sql .= " LIMIT ".$page*_NUM_ON_PAGE.",".(_NUM_ON_PAGE);
}
// метод задаёт порядок сортировки
function setOrder(){
$this->sql .= " ORDER BY "._ORDER_BY;
}
#########################################################
// метод строит итоговый список
function getList(){
$query = mysql_query($this->sql);
while($r = mysql_fetch_assoc($query)){
$ret .= '<a href="?id='.$r[_ID_NAME].'">'.$r[_FIELD_NAME].'</a><br>';
}
return $ret;
}
}
// the end of class
?>
|
Пример использования
$nav = new alphaPages();
// Выводим алфавит
$navBar = $nav->makeAlphaNavBar();
// Ставим букву
if(!empty($_GET['letter'])) $nav->setLetter();
// Вычисляем сколько страниц. Обязательно после фильтрации по букве
$pageBar = $nav->makePageNavBar();
// Что будем показывать
if(!empty($_GET['id'])) $out = $nav->profile();
else{
$nav->setPage();
$out = $nav->getList();
}
// показываем
?>
<table>
<tr><td><?=$navBar?></td></tr>
<tr><td><?=$pageBar?></td></tr>
<tr><td><?=$out?></td></tr>
<tr><td><?=$pageBar?></td></tr>
</table>
|
Axxil
http://www.softtime.ru/info/task.php?id_article=86 | |
|
|
|
|
|
|
|
для: SoftTime
(30.03.2006 в 15:11)
| | Очень неплохой скрипт, прекрасно справляется со своей задачей. Я не являюсь сторонником применения ООП в PHP
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=9847
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=6076
главным образом из-за того, что "Обязательно после фильтрации по букве" - PHP и сеть так устроены, что очень сложно создать код, элементы которого не зависили бы от порядка их вызова, а это очень большой грех с позиции ООП и в таких случаях лучше придерживаться стандартных функций, которые всем известны.
Но повторюсь, что скрипт очень хороший - а представление данных выше всяких похвал. | |
|
|
|