Nu3oN » 2010.08.13 00:01

Собственно написал класс постраничной навигации!
Гляньте на факт гомнокода и что и как лучше сделать!

Код:

1
span style="color: #0000BB"><?phpclass Navigation { private $_iEnd; private $_iLast; private $_iOne; private $_iTwo; public function __construct($total, $page, $output, $url) { $this -> total = $total; // колличество эллементов $this -> page = $page; // текщая страница $this -> output = $output; // кол-во выводимых эллементов на страницу $this -> url = $url; // текущая страница $this -> _iEnd = floor(($this->total - 1) / $this->output) * $this->output; // узнаем последнюю страницу } public function setStart() { /// метод указывающий с какой записи выводить эллементы if (!is_numeric($this->page) and $this->page == 'end') { $this -> page = $this -> _iEnd; } if ($this->page > $this->total) { return $this -> page = 0; } else { return $this -> page; } } public function setEnd() { /// метод указывающий по какую запись выводить эллементы if ($this->total < ($this->page + $this->output)) { return $this -> total; } else { return $this -> output; } } public function move() { /// вывод "кнопок" далее, назад if ($this->total > $this->output) { $gather = null; if (trim($this -> page)) { $gather .= '<a href="'.$this -> url.'/page:'.($this -> page - $this -> output).'"><span>&lt;Назад</span></a> '; } else { $gather .= '<span>&lt;Назад</span> '; } $gather .= '|'; if ($this->total > ($this->page + $this->output)){ $gather .= ' <a href="'.$this -> url.'/page:'.($this -> page + $this->output).'"> <span>Далее&gt;</span></a>'; } else { $gather .= ' <span>Далее&gt;</span>'; } return $gather; } else { return null; } } public function list_pages($move = true) { $gather = null; if (trim($move)) { if (trim($this -> page)) { $gather .= '<a href="'.$this -> url.'/page:'.($this -> page - $this -> output).'"><span>&lt;</span></a> '; } else { $gather .= '<span>&lt;</span> '; } } $this -> _iLast = ceil($this->total / $this->output); $this -> _iOne = $this -> page - ($this->output * 2); $this -> _iTwo = $this -> page + ($this->output * 2); if (empty($move)) { $gather .= 'Страницы: '; } if ($this -> _iOne < $this->total and $this -> _iOne > 0) { $gather .= ' <a href="'.$this -> url.'"><span>1</span></a> <span>...</span>'; } for ($i = $this->_iOne; $i < $this->_iTwo;) { if ($i < $this->total and $i >= 0) { $ii = floor(1 + $i / $this->output); if ($this->page == $i) { $gather .= ' <span><b>'.$ii.'</b></span>'; } else { $gather .= ' <a href="'.$this -> url.'/page:'.$i.'"><span>'.$ii.'</span></a>'; } } $i = $i + $this->output; } if ($this->_iTwo < $this->total) { $gather .= ' <span>...</span> <a href="'.$this -> url.'/page:'.$this -> _iEnd.'"><span>'.$this -> _iLast.'</span></a>'; } if (trim($move)) { if ($this->total > ($this->page + $this->output)){ $gather .= ' <a href="'.$this -> url.'/page:'.($this -> page + $this->output).'"> <span>&gt;</span></a>'; } else { $gather .= ' <span>&gt;</span>'; } } return $gather; }}?>

Ну можно еще расписать почему так или иначе лучше :-)

Morgan » 2010.08.13 00:14

расписывай

Gemorroj » 2010.08.13 00:16

$this -> url, наверное через htmlspecialchars пропустить надо бы.
Добавлено спустя   1 минуту  29 секунд:

Morgan написал:

расписывай

имеется виду, нам написать как можно лучше

Nu3oN » 2010.08.13 00:20

Gemorroj написал:

$this -> url, наверное через htmlspecialchars пропустить надо бы.
Добавлено спустя   1 минуту  29 секунд:

Morgan написал:

расписывай

имеется виду, нам написать как можно лучше

пропустил! в шапке сайта!
у меня привычка фильтровать часто используемые переменные в конфигурационном файле, таких как id, page, act и т.д

Morgan » 2010.08.13 00:21

Nu3oN
где же комментарии?

Gemorroj » 2010.08.13 00:25

Nu3oN написал:

у меня привычка фильтровать часто используемые переменные в конфигурационном файле

плохая привычка. кто знает, вдруг тебе потребуется неотфильрованная переменная? для передачи текстом в email, например?

Nu3oN » 2010.08.13 00:28

Gemorroj написал:

Nu3oN написал:

у меня привычка фильтровать часто используемые переменные в конфигурационном файле

плохая привычка. кто знает, вдруг тебе потребуется неотфильрованная переменная? для передачи текстом в email, например?

ну можно ж тогда сделать так...
вот у меня в шапке отфильтрованная переменная id

$id = isset($_GET['id']) ? (int)$_GET['id'] : 0;


а вот например в файле index.php мне она необходима не отфильтрованная

$id = $_GET['id'];
Добавлено спустя   7 минут  59 секунд:

Morgan написал:

Nu3oN
где же комментарии?

прокомментировал! этого достаточно?
или тебе построчно прокомментировать?

Nu3oN » 2010.08.13 00:47

Поправил мелех класс... нашел баг...

Gemorroj » 2010.08.13 00:48

Nu3oN, ну как сказать, не всегда есть возможность обратиться к $_GET. Точнее, не всегда это обращение будет хорошим вариантом. Возьмем твой класс пагинации. По хорошему, он дожен быть отвлечен от верстки, либо она должна быть вынесена в свойство и меняться пользователем. Т.е. ты можешь и не знать в каком элементе $_GET нужные нам данные, они передаются как параметр в методы класса. И там они должны быть не отфильтрованы. т.к. класс не в крусе что у тебя там в конфиге. Есть просто такое правило, что данные в программе должны летать в их первозданном виде, чтобы не повредить их по невнимательности, и только при выводе в браузер должны фильтроваться.
Если не придерживаться таких правил, то никаких PEAR мы бы не видели и каждый бы писал - кто в лес, кто по дрова.

Nu3oN » 2010.08.13 00:59

Gemorroj написал:

Есть просто такое правило, что данные в программе должны летать в их первозданном виде, чтобы не повредить их по невнимательности, и только при выводе в браузер должны фильтроваться.

т.е ты хочешь сказать, если я записываю сообщение(например) в базу, то я это сообщение должен отправить в том виде в котором я его получил? и фильтровать торько при выводе?

ByVlad » 2010.08.13 03:06

Nu3oN написал:

Gemorroj написал:

Есть просто такое правило, что данные в программе должны летать в их первозданном виде, чтобы не повредить их по невнимательности, и только при выводе в браузер должны фильтроваться.

т.е ты хочешь сказать, если я записываю сообщение(например) в базу, то я это сообщение должен отправить в том виде в котором я его получил? и фильтровать торько при выводе?

Именно, кроме того, htmlspecialchars переводит один html символ в грубо говоря 4-5. Это довольно увеличивает вес бд, но выигрывает в оптимизации.

Nu3oN » 2010.08.13 04:51

а теперь представим часто используемый случай, когда мы в цикле выводим данные из базы! стандартное колличество выводимых данных ~10, теперь представим что функция экранирования спец символов берет на себя 0.0005сек, теперь посчитаем сколько в получится в итоге! а получится у нас 0.0050! плюс на странице еще выводятся какие либо данные! это еще ~50 добавляем итого у нас уже 0.0100 не плохо да? и какая тут может идти речь о оптимизации? действительно надо слушать советы которые тебе дают, но нужно иметь свою голову на плечах! надо думать что ты делаешь, и в каких случаях что и как лучше применить! в данном случае я вижу только минусы!

Gemorroj » 2010.08.13 08:34

Nu3oN, собери данные, которые нужно отфильтровать в 1 строку и отфильтруй ее 1 раз. Ничерта ты не выиграешь от того, что запишешь форматированный html в базу. Проблемы, создаваемые этим много серьезнее этой микрооптимизации. Я тебе всегда могу и так показать места, где можно в 10 лучше и быстрее сделать и без htmlspecialchars'а.

Nu3oN » 2010.08.13 11:03

Мы отдалились от темы! по классу есть что сказать?

Morgan » 2010.08.13 11:08

Pirate
весьма спорное удтверждение.
пять символов переводится:
>, <, ', & [,"];
БД выдержит

ByVlad » 2010.08.13 14:55

Morgan написал:

Pirate
весьма спорное удтверждение.
пять символов переводится:
>, <, ', & [,"];
БД выдержит

А если у тебя 100 000 постов на форуме, 50% из них со спец символами (а на вм форумах около 80%), 1символ=1байт, в среднем один пост ~ 30-40 символов/байт, итого выйдет около 3.34 Mb без переобразования, с переобразованием около 4.53 Mb при 5 символах.

Morgan » 2010.08.13 16:56

Не будем холиварить.
Каждый делает так как ему удобно :)

Gemorroj » 2010.08.13 17:55

да размер бд, это вообще последнее на что нужно смотреть

Pirate1 » 2010.08.14 01:49

я так и делаю ;)

Nu3oN » 2010.08.14 01:57

Как бы возьму этот факт во внимание, но пока что как нибудь по старинке! по крайне мере пока не доставляет "неудобств", а потом переписать это дело не долго!

Gemorroj » 2010.08.14 12:13

это сейчас не долго, а если проект развивать будешь, кода много напишешь, то потом и переписывать много придется. ббкоды планируешь делать? или ссылки автоматом подставлять? вот и подумай, как ты будешь это все редактировать, если в бд будет уже готовый html.

ByVlad » 2010.08.19 11:11

Gemorroj написал:

это сейчас не долго, а если проект развивать будешь, кода много напишешь, то потом и переписывать много придется. ббкоды планируешь делать? или ссылки автоматом подставлять? вот и подумай, как ты будешь это все редактировать, если в бд будет уже готовый html.

Ну а функцию обратного перевода уже отменили?

Gemorroj » 2010.08.19 17:42

да, напиши мне такую на все случаи ббкода?)

ByVlad » 2010.08.19 23:00

Gemorroj написал:

да, напиши мне такую на все случаи ббкода?)

У меня в форуме увидишь, функция HTML2BBcode