Форум программистов, компьютерный форум, киберфорум
PHP
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
197 / 166 / 19
Регистрация: 05.05.2013
Сообщений: 1,228
1

Обсуждение класса постраничной навигации из темы "Обмен готовыми решениями"

24.04.2015, 10:15. Просмотров 657. Ответов 15
Метки нет (Все метки)


 Комментарий модератора 
Выделено из темы: Обмен готовыми решениями

Para bellum, может стоит добавить методу get еще один не обязательный параметр, $css_class, если он задан то то, что там задано будет классом для ссылок, если нет, тогда pagination
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.04.2015, 10:15
Ответы с готовыми решениями:

Обмен готовыми решениями
<?PHP echo getfilesize($_GET); // Функция для определения размера function...

Апгрейд постраничной навигации...
Здраствуйте, вобщем такая ситуация.... есть постраничная навигация 1,2,3,4,5,6,7,8,9.... и так...

Скрипт постраничной навигации
Проблемка такая-задался мыслью переделать свой сайт...в том числе и навигацию постраничную...так...

Многоточие в постраничной навигации
Здравствуйте. Есть небольшой скрипт игровой статы. Количество инфы увеличилось, и страниц стало так...

15
Эксперт PHP
4382 / 3265 / 1061
Регистрация: 06.01.2011
Сообщений: 9,432
24.04.2015, 10:20 2
Цитата Сообщение от VLK Посмотреть сообщение
может стоит добавить методу get еще один не обязательный параметр, $css_class, если он задан то то, что там задано будет классом для ссылок, если нет, тогда pagination
А чем Вас "pagination" не устраивает? Я просто адаптировал его под bootstrap, а в bootstrap блок с классом pagination автоматом оформляется как навигация. Стили готовые уже есть там для класса pagination.
0
197 / 166 / 19
Регистрация: 05.05.2013
Сообщений: 1,228
24.04.2015, 11:04  [ТС] 3
Para bellum, ну так он адаптирован только под bootstrap, а так будет под bootstrap и под что-то еще, а точнее под все что угодно.
0
Эксперт PHP
4382 / 3265 / 1061
Регистрация: 06.01.2011
Сообщений: 9,432
24.04.2015, 11:09 4
VLK, да нет, почему только под bootstrap? Я же показал для каких классов стили прописать, если не используете bootstrap. Просто в Вашем CSS файле пропишите стили и всё, если не используете bootstrap.
0
197 / 166 / 19
Регистрация: 05.05.2013
Сообщений: 1,228
24.04.2015, 12:04  [ТС] 5
Para bellum, ну а если user не хочет лезть в CSS, а хочет это через РНР сделать.
Добавление параметра только расширит функционал, но если не хотите, ваше дело
0
Эксперт PHP
4382 / 3265 / 1061
Регистрация: 06.01.2011
Сообщений: 9,432
24.04.2015, 12:10 6
Цитата Сообщение от VLK Посмотреть сообщение
а если user не хочет лезть в CSS, а хочет это через РНР сделать.
Как такое возможно? Вы имеете в виду писать стили в атрибуте style, вроде этого?
HTML5
1
<a href="#" style="тут переданные параметры"></a>
Это не лучшая идея. Так делать не рекомендуется. Писать стили надо в CSS-файле.
Можно было бы сделать, даже несмотря на рекомендации, но мы-то используем три тега: UL, LI, A. Придётся для каждого из них передавать параметры?
0
197 / 166 / 19
Регистрация: 05.05.2013
Сообщений: 1,228
24.04.2015, 13:53  [ТС] 7
Para bellum, примерно что то такое:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public function get($css_class = 'pagination')
{
    // ...
    # Оборачиваем ссылки
    $pagination = '<ul class="'.$css_class.'">'. $pagination .'</ul>';
    
    # Возвращаем ссылки
    return $pagination;
}
 
// ...
 
# Выводим ссылки навигации
echo $pagination->get('my_pagination');
echo $pagination->get();
0
Эксперт PHP
4382 / 3265 / 1061
Регистрация: 06.01.2011
Сообщений: 9,432
24.04.2015, 13:59 8
VLK, т.е. Вы предлагаете только для UL сделать возможность добавлять пользовательских класс?
Но я не пойму основного: если Вы укажите класс, то у Вас в CSS должно быть его описание, правильно? А если описание по-любому должно быть, то почему бы не не использовать вместо настраиваемого класса класс pagination?
Или Вы клоните к тому, что пользователь уже создал CSS-файл с описанным там своим классом для постраничной навигации, упаковал его и трогать не хочет? А как он тогда этот стили для этого класса создал, если у него ещё не было HTML-кода навигации?
0
197 / 166 / 19
Регистрация: 05.05.2013
Сообщений: 1,228
24.04.2015, 14:08  [ТС] 9
Цитата Сообщение от Para bellum Посмотреть сообщение
Вы предлагаете только для UL сделать возможность добавлять пользовательских класс?
ну желательно не только.

Цитата Сообщение от Para bellum Посмотреть сообщение
Но я не пойму основного: если Вы укажите класс, то у Вас в CSS должно быть его описание, правильно? А если описание по-любому должно быть, то почему бы не не использовать вместо настраиваемого класса класс pagination?
ну допустим у меня была своя постраничная навигация, кривая, я решил воспользоваться вашей, но у меня класс CSS другой, два варианта, первый переделывать CSS, а там же могут быть связи, второй просто добавить один параметр.

Цитата Сообщение от Para bellum Посмотреть сообщение
Или Вы клоните к тому, что пользователь уже создал CSS-файл с описанным там своим классом для постраничной навигации, упаковал его и трогать не хочет? А как он тогда этот стили для этого класса создал, если у него ещё не было HTML-кода навигации?
О, у тех кто учился по курсам попова такое может быть..
PS я не учился.
0
Эксперт PHP
4382 / 3265 / 1061
Регистрация: 06.01.2011
Сообщений: 9,432
24.04.2015, 14:22 10
Цитата Сообщение от VLK Посмотреть сообщение
у меня была своя постраничная навигация, кривая, я решил воспользоваться вашей, но у меня класс CSS другой, два варианта, первый переделывать CSS, а там же могут быть связи
Да, это проблема. Но я не знаю, обычно для навигации существует отдельный класс и он нигде больше не используется. Где его можно использовать? Для меню, где тоже UL обычно используется и нужно обтекание?
В крайнем случае можно не трогать тот класс, а просто добавить в список pagination для этих стилей. Т.е. было:
CSS
1
2
3
.old_style{
    /* Стили */
}
Стало:
CSS
1
2
3
4
.old_style,
.pagination{
    /* Стили */
}
0
197 / 166 / 19
Регистрация: 05.05.2013
Сообщений: 1,228
24.04.2015, 16:18  [ТС] 11
Цитата Сообщение от Para bellum Посмотреть сообщение
В крайнем случае можно не трогать тот класс, а просто добавить в список pagination для этих стилей.
Ну одно дело дописывай в CSS свой класс, другое дело добавь в РНР одно слово (параметр), так же проще.
0
Эксперт PHP
4382 / 3265 / 1061
Регистрация: 06.01.2011
Сообщений: 9,432
24.04.2015, 16:26 12
Цитата Сообщение от VLK Посмотреть сообщение
так же проще.
Для кого? Лично я не вижу проблемы в том, чтобы в CSS файл класс прописать. Это любой верстальщик сможет. PHP код должен формировать навигацию, но он его не должно волновать, какие у верстальщика проблемы со стилизацией. Оговорка: но волновать должны, если он неправильный HTML формирует. Но мой класс правильный HTML формирует.
0
197 / 166 / 19
Регистрация: 05.05.2013
Сообщений: 1,228
24.04.2015, 17:20  [ТС] 13
Цитата Сообщение от Para bellum Посмотреть сообщение
Для кого? Лично я не вижу проблемы в том, чтобы в CSS файл класс прописать. Это любой верстальщик сможет. PHP код должен формировать навигацию, но он его не должно волновать, какие у верстальщика проблемы со стилизацией. Оговорка: но волновать должны, если он неправильный HTML формирует. Но мой класс правильный HTML формирует.

ну а если например человек хорошо знает PHP, но не особо владеет CSS и для него проще дописать одно слово в PHP, чем лезть переписывать CSS.

ладно уж, нет так нет
0
Эксперт PHP
4382 / 3265 / 1061
Регистрация: 06.01.2011
Сообщений: 9,432
24.04.2015, 17:24 14
Цитата Сообщение от VLK Посмотреть сообщение
ладно уж, нет так нет
Да нет, если Вам нужно, я могу и дописать. Только если конкретно для Вас нужно, не так, ради будущих поколений.
А вообще тот, кто работает не в команде, обычно знает и CSS и HTML.
0
197 / 166 / 19
Регистрация: 05.05.2013
Сообщений: 1,228
24.04.2015, 17:38  [ТС] 15
Цитата Сообщение от Para bellum Посмотреть сообщение
Да нет, если Вам нужно, я могу и дописать. Только если конкретно для Вас нужно, не так, ради будущих поколений.
А вообще тот, кто работает не в команде, обычно знает и CSS и HTML.
Ну вообще я и сам могу дописать
Я как раз думал о других, мне просто кажется что так будет правильнее (без особого напряга даст больше возможности, разве это плохо), но видимо мои скудные познания, меня подводят. Не в первый раз.
1
Эксперт PHP
4382 / 3265 / 1061
Регистрация: 06.01.2011
Сообщений: 9,432
24.04.2015, 18:40 16
Ссылка на исходный класс, который адаптирован под bootstrap: Обмен готовыми решениями
Но для тех, кто столкнётся с вопросом, который озвучил VLK, решил доработать. Немного переделал класс навигации:
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
<?php
    /*
    * Класс для генерации постраничной навигации
    */
    class Pagination
    {
        /**
        * 
        * @var Активных ссылок навигации на страницу.
        * Т.е. ссылок, помимо текущей (активной) ссылки и ссылок влево-вправо.
        * 
        */
        private $max = 6;
        
        /**
        * 
        * @var Ключ для GET, в который пишется номер страницы
        * 
        */
        private $index = 'page';
        
        /**
        * 
        * @var Текущий GET-запрос
        * 
        */
        private $query;
        
        /**
        * 
        * @var Текущая страница
        * 
        */
        private $current_page;
        
        /**
        * 
        * @var Общее количество записей
        * 
        */
        private $total; 
        
        /**
        * 
        * @var Записей на страницу
        * 
        */
        private $limit;
        
        /**
        * 
        * @var Массив с классами для элементов
        * 
        */
        private $classes = [
            'ul' => 'pagination',
            'li' => null,
            'a'  => null
        ];
        
        /**
        * Запуск необходимых данных для навигации
        * @param integer $total - общее количество записей
        * @param integer $limit - количество записей на страницу
        * 
        * @return
        */
        public function __construct( $total, $limit, array $classes=[] )
        {
            # Устанавливаем общее количество записей
            $this->total  = $total;
            
            # Устанавливаем количество записей на страницу
            $this->limit  = $limit;
            
            # Устанавливаем количество страниц
            $this->amount = $this->amount();
            
            # Вызываем метод установки текущей страницы
            $this->setCurrentPage();
            
            # Вызываем метод установки текущего GET-запроса
            $this->setQueryString();
            
            # Заполняем массив классов
            $this->classes = array_merge( $this->classes, $classes );
        }
        
        /**
        *  Для вывода ссылок
        * 
        * @return HTML-код со ссылками навигации
        */
        public function get()
        {
            # Для записи ссылок
            $pagination = null;
            
            # Получаем ограничения для цикла
            $limits = $this->limits();
 
            # Генерируем ссылки
            for($page=$limits[0]; $page<=$limits[1]; $page++)
            {
                # Формируем статус ссылки
                $status = $page == $this->current_page ? 'active' : null;
                    
                # Заносим ссылку
                $pagination .= $this->generateHtml($page, null, null, $status);
            }
            
            # Если текущая страница не первая
            if($this->current_page > 1){
                # Создаём ссылку "Предыдущая"
                $pagination = $this->generateHtml($this->current_page - 1, '&lt;', 'Предыдущая') . $pagination;
                
                # Создаём ссылку "Первая"
                $pagination = $this->generateHtml(1, '&lt;&lt;', 'Первая') . $pagination;
            }
            
            # Если текущая страница не первая
            if($this->current_page < $this->amount){
                # Создаём ссылку "Следующая"
                $pagination .= $this->generateHtml($this->current_page + 1, '&gt;', 'Следующая');  
                
                # Создаём ссылку "Следующая"
                $pagination .= $this->generateHtml($this->amount, '&gt;&gt;', 'Последняя');  
            }
            
            # Оборачиваем ссылки
            $pagination = '<ul class="'. $this->classes['ul'] .'">'. $pagination .'</ul>';
 
            # Возвращаем ссылки
            return $pagination;
        }
        
        /**
        * Для получения, откуда начинать выборку
        * 
        * @return integer
        */
        public function skip(){
            return 
                $this->current_page * $this->limit - $this->limit;
        }
        
        /**
        * Для получение ограничения выборки
        * 
        * @return integer
        */
        public function take(){
            # Получаем, откуда начинаем
            $skip = $this->skip();
            
            # Возвращаем ограницение
            return
                $skip + $this->limit > $this->total ? $this->total - $skip : $this->limit;
        }
        
        /**
        * Для генерации HTML-кода ссылки
        * @param string $query - текущий GET-запрос
        * @param integer $page - номер страницы
        * 
        * @return
        */
        private function generateHtml( $page, $text=null, $title=null, $status=null ){
            # Если текст ссылки не указан
            if( is_null($text) )
                # Указываем, что текст - цифра страницы
                $text = $page;
            
            # Формируем ссылку
            $query = $this->index .'='. $page;
            
            # Формируем строку запроса (после вопроса)
            $query = $this->query ? $this->query .'&'. $query : $query;
            
            # Формируем класс для элемента списка
            $li_class = trim( $this->classes['li'] .' '. $status );
            
            # Формируем HTML код ссылки и возвращаем
            return 
                '<li'. ($li_class ? ' class="'. $li_class.'"' : null) .'>
                     <a href="?'. $query .'" '. ($this->classes['a'] ? 'class="'. $this->classes['a'] .'" ' : null) .'title="'. $title .'">'. $text .'</a>
                 </li>';
        }
        
        /**
        *  Для получения, откуда стартовать вывод ссылок
        * 
        * @return массив с началом и концом отсчёта
        */
        private function limits()
        {
            # Вычисляем ссылки слева (чтобы активная ссылка была посередине)
            $left = $this->current_page - round($this->max / 2, 0, PHP_ROUND_HALF_DOWN);
 
            # Вычисляем начало отсчёта
            $start = $left > 0 ? $left : 1;               
 
            # Если впереди есть как минимум $this->max страниц
            if($start + $this->max <= $this->amount)
                # Назначаем конец цикла вперёд на $this->max страниц или просто на минимум
                $end = $start >= 1 ? $start + $this->max : $this->max;
            else{
                # Конец - общее количество страниц
                $end = $this->amount;
 
                # Начало - минус $this->max от конца
                $start = $this->amount - $this->max > 0 ? $this->amount - $this->max : 1;
            }
            
            # Возвращаем
            return [$start, $end];
        }
 
        /**
        * Для установки текущей страницы
        * 
        * @return
        */
        private function setCurrentPage()
        {
            # Получаем номер страницы
            $this->current_page = isset($_GET[$this->index]) ? (int) $_GET[$this->index] : 1;
            
            # Если текущая страница боле нуля
            if($this->current_page > 0)
            {
                # Если текунщая страница меньше общего количества страниц
                if($this->current_page > $this->amount)
                    # Устанавливаем страницу на последнюю
                    $this->current_page = $this->amount;
            }
            else
                # Устанавливаем страницу на первую
                $this->current_page = 1;
        }
        
        /**
        * Для получения и установки текущего GET-запроса
        * 
        * @return
        */
        private function setQueryString(){
            # Получаем параметры текущего запроса
            $query = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_QUERY );
            
            # Разбираем строку запроса
            parse_str( $query, $params );
            
            # Удаляем значение страницы, если есть
            unset( $params[$this->index] );
            
            # Формируем запрос
            $this->query = http_build_query( $params );
        }
        
        /**
        * Для получеия общего числа страниц
        * 
        * @return число страниц
        */
        private function amount()
        {
            # Делим и возвращаем
            return
                ceil( $this->total / $this->limit );
        }
    }

Если Вы захотите применить свои классы к UL, LI или A - тегам, то сделать это можно так:
PHP
1
$pagination = new Pagination(100,5, ['ul'=>'новый класс', 'li'=>'класс для LI', 'a'=>'класс для A']);
Т.е. передав третьим параметром массив с классами для тегов. Внимание: не обязательно писать классы для всех тегов. Ненужные можно опустить. Например, если Вы хотите добавить класс для тега "<a>", делайте так:
PHP
1
$pagination = new Pagination(100,5, ['a'=>'класс для A']);
В таком случае для тега "<a>" добавится класс, LI не будет иметь класса (по умолчанию), UL будет иметь класс "pagination" (по умолчанию).
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.04.2015, 18:40

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Скрипт постраничной навигации
Здрасте всем!! Полазил по форуму и в поиске, нашел кучу всяких тем, но не одна не помогла, поэтому...

Ошибка в постраничной навигации
Здравствуйте! Помогите пожалуйста разобраться, прикручиваю к сайту постраничную навигацию, но...

Посздание постраничной навигации
Подскажите плиз ! Нужна постраничная навигация след вида : Есть например комментарии нужно выодить...

Меню постраничной навигации
Значит, есть меню постраничной навигации, которая выводит номера страниц по порядку. Код выглядит...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.