|
|
|
| Значит есть код, постраничный вывод. Решил сделать его как класс pages.class.php. Без класса он работает, с классом - нет.
Вот код без класса:
<?php
$page = intval($_GET['page']);
$number = intval($_SESSION['selectors']);
if(!isset($_GET['page'])) {
$_GET['page'] = 1;
}
if($number <= 0 || $number > 50) {
$number = 10;
}
# выбираем все записи
$query = mysql_num_rows(mysql_query("SELECT * FROM `table`"));
# считаем количество страниц
$numpages = ceil($query/$number);
if($page <= 0 || $page > $numpages) {
$page = 1;
}
# выбираем требуемый промежуток записей на страницу
$query = mysql_query("SELECT * FROM `table` ORDER BY id DESC LIMIT ".($page*$number-$number).", ".$number."");
# узнаем страницу
$url = '?pages='.$_GET['pages'].'&';
# левая сторона
if($page - 3 > 0) $page_begin = '<a href="'.$url.'page=1">1</a>';
if($page - 4 > 0) $page_none_left = '<span>...</span>';
if($page - 2 > 0) $page2left = '<a href="'.$url.'page='.($page - 2).'">'.($page - 2).'</a>';
if($page - 1 > 0) $page1left = '<a href="'.$url.'page='.($page - 1).'">'.($page - 1).'</a>';
# правая сторона
if($page + 1 <= $numpages) $page1right = '<a href="'.$url.'page='.($page + 1).'">'. ($page + 1).'</a>';
if($page + 2 <= $numpages) $page2right = '<a href="'.$url.'page='.($page + 2).'">'.($page + 2).'</a>';
if($page + 4 <= $numpages) $page_none_right = '<span>...</span>';
if($page + 3 <= $numpages) $page_last = '<a href="'.$url.'page='.$numpages.'">'.$numpages.'</a>';
# вывод ссылок
if($numpages >= 1) {
$left = $page_begin.$page_none_left.$page2left.$page1left;
$right = $page1right.$page2right.$page_none_right.$page_last;
}
?>
|
Вот код класса, который я пытался сделать:
<?php
/*
*
* Постраничный вывод
*
*/
session_start();
class Pages {
public $page;
public $number;
public $numpages;
public $url;
public $query;
public function guard() {
# $page - номер страницы
# $number - кол-во значений на страницу (10, 30, 50)
$page = intval($_GET['page']);
$number = intval($_SESSION['selectors']);
if(!isset($_GET['page'])) {
$_GET['page'] = 1;
}
if($number <= 0 || $number > 50) {
$number = 10;
}
if($page <= 0 || $page > $numpages) {
$page = 1;
}
}
public function go() {
# выбираем все записи
$query = mysql_num_rows(mysql_query("SELECT * FROM `table`"));
# считаем количество страниц
$numpages = ceil($query/$number);
$this->guard();
# выбираем требуемый промежуток записей на страницу
$query = mysql_query("SELECT * FROM `table` ORDER BY id DESC LIMIT ".($page*$number-$number).", ".$number."");
# узнаем страницу
$url = '?pages='.$_GET['pages'].'&';
}
public function open() {
$this->guard();
$this->go();
# левая сторона
if($page - 3 > 0) $page_begin = '<a href="'.$url.'page=1">1</a>';
if($page - 4 > 0) $page_none_left = '<span>...</span>';
if($page - 2 > 0) $page2left = '<a href="'.$url.'page='.($page - 2).'">'.($page - 2).'</a>';
if($page - 1 > 0) $page1left = '<a href="'.$url.'page='.($page - 1).'">'.($page - 1).'</a>';
# правая сторона
if($page + 1 <= $numpages) $page1right = '<a href="'.$url.'page='.($page + 1).'">'. ($page + 1).'</a>';
if($page + 2 <= $numpages) $page2right = '<a href="'.$url.'page='.($page + 2).'">'.($page + 2).'</a>';
if($page + 4 <= $numpages) $page_none_right = '<span>...</span>';
if($page + 3 <= $numpages) $page_last = '<a href="'.$url.'page='.$numpages.'">'.$numpages.'</a>';
# вывод ссылок
if($numpages >= 1) {
$left = $page_begin.$page_none_left.$page2left.$page1left;
$right = $page1right.$page2right.$page_none_right.$page_last;
echo $left.'<span class="rightb-selectors-active">'.$page.'</span>'.$right;
}
}
}
$pages = new Pages;
// ВЫЗЫВАТЬСЯ ДОЛЖНО ТАК:
$pages->open();
?>
|
Теперь на счет вопросов и как я хотел, чтобы он работал. Значит вот:
guard() - это метод проверки, тут проверяются все значения. Второй раз он вызывается для проверки страницы, чтобы не ввели меньше 1 и больше всего количества страниц.
go() - тут все формируется.
open() - должен выводить саму навигацию. И тут тоже вывел гуард для проверки )
Теперь проблемы.
Как все-таки работают эти методы и переменные? проблема в том, что метод Go он формирует данные и получает точное количество страниц $numpages, но когда я вызываю его в open(), то $numpages оказывается равняется 0.
И еще не могу понять, почему не передается значение переменной $_SESSION['selectors'] - это количество значений, которые выводятся на страницу(она присваивается $number). Сессия вроде бы открыта, а значение не передается..и поэтому возникает ошибка, что оно делит на 0. | |
|
|
|
|
|
|
|
для: Belkin
(22.01.2012 в 16:12)
| | 1. Вы не приводите как вызываете класс - без этого сложно воспроизвести ситуацию.
2. Для обращения к переменным класса используется либо префикс $this->, либо Pages:: иначе переменные просто остаются переменными. Из-за этого и не работает
3. Если вам интересно, могу покритиковать объектно-ориентированную схему. Это не относится к работоспособности, но относится к извлечению прибыли из использования ООП, если так и дальше будете составлять классы, очень скоро разочаруетесь в ООП и будете считать, что от него одни проблемы, а проблемы не в нем, а в том, что class и this-> это лишь инструменты, вроде for() и function, а вдохнуть жизнь в программу (в том числе объектно-ориентированную) должны вы и ваши знания. | |
|
|
|
|
|
|
|
для: cheops
(22.01.2012 в 16:20)
| | Я же показал вроде бы )
<?php
...
$pages = new Pages;
// ВЫЗЫВАТЬСЯ ДОЛЖНО ТАК:
$pages->open();
?>
|
И если не трудно, его долго к рабочему виду приводить? просто я бы посмотрел, как оно должно быть..если не трудно конечно.
Очень интересно - рассказывайте все, что думаете. Просто я думал, что все так легко будет, уже обрадовался, а он не работает.. | |
|
|
|
|
|
|
|
для: Belkin
(22.01.2012 в 16:21)
| | 1. Да, не заметил, каюсь :)
2. Вот смотрите
public function go() {
# выбираем все записи
$query = mysql_num_rows(mysql_query("SELECT * FROM `table`"));
# считаем количество страниц
$numpages = ceil($query/$number);
$this->guard();
# выбираем требуемый промежуток записей на страницу
$query = mysql_query("SELECT * FROM `table` ORDER BY id DESC LIMIT ".($page*$number-$number).", ".$number."");
# узнаем страницу
$url = '?pages='.$_GET['pages'].'&';
}
| У вас переменная $url локальная, чтобы это новое значение было видно в других методах нужно чтобы вместо $url использовался $this->url | |
|
|
|
|
|
|
|
для: Belkin
(22.01.2012 в 16:12)
| | 3. Вообще просто взять готовый код и распилить его на отдельные методы - это довольно часто встречающаяся ошибка, у программистов только начинающих осваивать ООП. Класс - это не просто хранилище кода, это - инструмент. Причем инструмент, в устройство которого можно не вдаваться.
Смотрите у вас в методе guard() используются глобальные переменные $_GET['page'] и $_SESSION['selectors']. Если разработчик использует другие переменные на странице, он не сможет воспользоваться вашим классом, без анализа его кода, а ведь классы ровно для того и вводились, чтобы внешние разработчики пользовались только интерфейсом, не заглядывая внутрь класса и освобождая мозг под более абстрактные задачи. Т.е. очевидно, что эти параметры лучше передать в конструктор класса при объявлении объекта. Причем когда объект объявляется, ему будут передаваться эти параметры и не будет необходимости проверять их потом на протяжении всего жизненного цикла объекта. Задача конструктора как раз и состоит привести объект в согласованное состояние перед работой. А вы пускаете параметры через черный ход, в результате вынуждены их постоянно контролировать.
Далее метод go(), который я так понимаю должен выполняться между guard() и open(). А зачем вообще заставлять пользователя вызывать метод, который к тому же зависит от порядка вызова остальных методов? Чтобы внешний программист проникся важностью класса и его внутренней работы? Так задача класса ровно обратная - как можно больше скрыть от внешнего , чтобы освободить его мозг для других задач. Да вы и сами это понимаете, поэтому вызывали метод go() в open(), а для каких еще целей может go() потребоваться? Может от него лучше избавиться? Ведь класс не обязательно должен состоять из нескольких методов, метод может быть и один... сила классов в том, что вы можете унаследовать от этого класса новый, добавив новый метод, при этом создание нового класса не приведет к нарушению работы старого кода, обращавшегося к старым классам.
Вы бы лучше ввели метод, который возвращает параметр $number = 10; например, get_number() и везде бы использовали $this->get_number(). Захотите потом извлекать это параметр из базы данных (ну например каждый пользователь сам выставляет себе удобное для него число), унаследовали от текущего класса новый, и переопределили там ровно один метод get_number(), вам не придется даже вспоминать, как там у вас постраничная навигация работает, достаточно просто изменить работу одного метода. При этом старый класс останется без изменений и код, его используются не пострадает от внесения правок путем наследования. | |
|
|
|
|
|
|
|
для: cheops
(22.01.2012 в 17:05)
| | Все, теперь понял, как работает )
Получилось!
Вот код, правда я тут примитивно поставил $this- почти везде, не знаю правильно это и нужно ли так делать?
<?php
/*
*
* Постраничный вывод
*
*/
session_start();
class Pages {
public $page;
public $number;
public $numpages;
public $url;
public $query;
public function guard() {
# $page - номер страницы
# $number - кол-во значений на страницу (10, 30, 50)
$this->page = intval($_GET['page']);
$this->number = intval($_SESSION['selectors']);
if(!isset($_GET['page'])) {
$_GET['page'] = 1;
}
if($this->number <= 0 || $this->number > 50) {
$this->number = 10;
}
if($this->page <= 0 || $this->page > $this->numpages) {
$this->page = 1;
}
}
public function go() {
# выбираем все записи
$this->query = mysql_num_rows(mysql_query("SELECT * FROM `lessons`"));
# считаем количество страниц
$this->numpages = ceil($this->query/$this->number);
$this->guard();
# выбираем требуемый промежуток записей на страницу
$this->query = mysql_query("SELECT * FROM `lessons` ORDER BY id DESC LIMIT ".($this->page*$this->number-$this->number).", ".$this->number."");
# узнаем страницу
$this->url = '?pages='.$_GET['pages'].'&';
}
public function open() {
$this->guard();
$this->go();
# левая сторона
if($this->page - 3 > 0) $page_begin = '<a href="'.$this->url.'page=1">1</a>';
if($this->page - 4 > 0) $page_none_left = '<span>...</span>';
if($this->page - 2 > 0) $page2left = '<a href="'.$this->url.'page='.($this->page - 2).'">'.($this->page - 2).'</a>';
if($this->page - 1 > 0) $page1left = '<a href="'.$this->url.'page='.($this->page - 1).'">'.($this->page - 1).'</a>';
# правая сторона
if($this->page + 1 <= $this->numpages) $page1right = '<a href="'.$this->url.'page='.($this->page + 1).'">'. ($this->page + 1).'</a>';
if($this->page + 2 <= $this->numpages) $page2right = '<a href="'.$this->url.'page='.($this->page + 2).'">'.($this->page + 2).'</a>';
if($this->page + 4 <= $this->numpages) $page_none_right = '<span>...</span>';
if($this->page + 3 <= $this->numpages) $page_last = '<a href="'.$this->url.'page='.$this->numpages.'">'.$this->numpages.'</a>';
# вывод ссылок
if($this->numpages >= 1) {
$left = $page_begin.$page_none_left.$page2left.$page1left;
$right = $page1right.$page2right.$page_none_right.$page_last;
echo $left.'<span class="rightb-selectors-active">'.$this->page.'</span>'.$right;
}
}
}
?>
|
Да, так я думал сделать такую штуку, чтобы он гибкий был ) | |
|
|
|
|
|
|
|
для: Belkin
(22.01.2012 в 17:11)
| | >Вот код, правда я тут примитивно поставил $this- почти везде, не знаю правильно это и нужно ли
>так делать?
Вы главное начните :)))
PS Следите за тем, чтобы классами было удобно пользоваться, причем не только вам, но и посторонним людям, желательно, чтобы класс можно было легко вынуть из одного проекта в другой и он не должен за собой тащить пол сайта. Т.е. связи должны быть минимальны, при этом если сам класс создавать сложно и долго - это нормально. Смысл ООП в том, чтобы затратить много времени один раз и потом его больше никогда для решения этой задачи не тратить (даже если нужна не в точности такая же задача, а модификация). | |
|
|
|
|
|
|
|
для: cheops
(22.01.2012 в 17:14)
| | Понял, буду стараться все минимализировать и сделать удобно к пользованию!
И еще, вот допусти такой кусок кода:
# левая сторона
if($this->page - 3 > 0) $page_begin = '<a href="'.$this->url.'page=1">1</a>';
if($this->page - 4 > 0) $page_none_left = '<span>...</span>';
if($this->page - 2 > 0) $page2left = '<a href="'.$this->url.'page='.($this->page - 2).'">'.($this->page - 2).'</a>';
if($this->page - 1 > 0) $page1left = '<a href="'.$this->url.'page='.($this->page - 1).'">'.($this->page - 1).'</a>';
# правая сторона
if($this->page + 1 <= $this->numpages) $page1right = '<a href="'.$this->url.'page='.($this->page + 1).'">'. ($this->page + 1).'</a>';
if($this->page + 2 <= $this->numpages) $page2right = '<a href="'.$this->url.'page='.($this->page + 2).'">'.($this->page + 2).'</a>';
if($this->page + 4 <= $this->numpages) $page_none_right = '<span>...</span>';
if($this->page + 3 <= $this->numpages) $page_last = '<a href="'.$this->url.'page='.$this->numpages.'">'.$this->numpages.'</a>';
|
нельзя присвоить с самого начала $page - $this-page? так и наглядней вроде бы.
И вот еще один вопрос и все )) я ухожу ))
Как подключают все эти классы? не отдельно же каждый?
у меня появилась идея в папке где будут храниться классы > class, создал файл clasess.hpp и в нем уже подключаю все классы, а уже его подключаю к основной странице. | |
|
|
|
|