Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Класс для создания меню
Форумы портала PHP.SU » PHP » Пользовательские функции » Класс для создания меню

Страниц (1): [1]
 

1. Eihwaz - 26 Апреля, 2008 - 17:00:09 - перейти к сообщению
Побочный продукт попыток написать класс для breadcrumbs (хлебных крошек, истории переходов - как угодно)
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. class navigation
  4. {
  5.     private $_navigation;
  6.     public  $_delimiter;
  7.  
  8.     public function new_item($text, $class, $link = null, $target = 'self')
  9.     {
  10.     $i = sizeof($this->_navigation);
  11.     $this->_navigation[$i]['text']    = trim($text);
  12.     $this->_navigation[$i]['class']   = trim($class);
  13.     $this->_navigation[$i]['link']    = trim($link);
  14.     $this->_navigation[$i]['target']  = trim($target);
  15.     }
  16.  
  17.     public function show_navigation()
  18.     {
  19.         $menu_items = '';
  20.         for ($i=0; $i<sizeof($this->_navigation); $i++)
  21.         {
  22.             if ($this->_navigation[$i]['link'])
  23.             {
  24.                 $menu_items .= '<a class="' . $this->_navigation[$i]['class']  . '" href="'
  25.                                             . $this->_navigation[$i]['link']    . '" target="_'
  26.                                             . $this->_navigation[$i]['target'] . '">'
  27.                                             . $this->_navigation[$i]['text']  . '</a>';
  28.             }
  29.             else
  30.             {
  31.                 $menu_items .= '<span class="' . $this->_navigation[$i]['class'] . '">'
  32.                                                . $this->_navigation[$i]['text'] . '</span>';
  33.             }
  34.             $menu_items .= $this->_delimiter;
  35.         }
  36.         return $menu_items;
  37.     }
  38. }
  39. ?>
  40.  

Пользоваться довольно просто:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $navigation = new navigation();
  4. $navigation->_delimiter = '<br>'; // Устанавливаем разделитель для пунктов меню.
  5. $navigation->new_item('Статьи', 'admin_text'); // Название раздела меню (отображается текстом, не ссылкой) и класс для текста (<span class=" ">)
  6. $navigation->new_item('Добавить статью', 'admin_link', 'index.php?action=add_article');
  7. ?>
  8.  

В $navigation->new_item() можно указать еще target для ссылки, т.е., как будет открываться. По умолчанию стоит 'self' - ссылка будет открываться в том же окне.
Приведенный для примера код сгенерирует вертикальное меню:
Пункт 1
Пункт 2
Пункт 3

Если указать, например, $navigation->_delimiter = ' | ';, то меню будет выглядеть так:
Пункт 1 | Пункт 2 | Пункт 3 |
2. -SCHATTEN- - 28 Апреля, 2008 - 11:43:59 - перейти к сообщению
Это не ошибка, но всё-же...
PHP:
скопировать код в буфер обмена
  1. $navigation->_delimiter = ' | ';

Нежелательно использовать если используешь ООП, лучше сделать функцию установки и получения. (Геттер и сеттер)
PHP:
скопировать код в буфер обмена
  1.  
  2. public function setDelimiter( $delim ) {
  3.     $this->_delimiter = $delim;
  4. }
  5.  
  6. public function getDelimiter() {
  7.     return $this->_delimiter;
  8. }
  9.  

(Добавление)
Опять же таких вещей как $class может и небыть.
Как быть с такими вещами как onClick и т.д. их тоже надо вписывать.
3. Eihwaz - 28 Апреля, 2008 - 14:08:33 - перейти к сообщению
-SCHATTEN- - спасибо, я расту над собой Улыбка :
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. class navigation {
  4.     private $_navigation;
  5.     private $_delimiter;
  6.    
  7.     public function set_delimiter($delimiter) {
  8.         $this->_delimiter = htmlspecialchars($delimiter, ENT_QUOTES);
  9.     }
  10.    
  11.     private function get_delimiter() {
  12.         return $this->_delimiter . "\n";
  13.     }
  14.  
  15.     public function new_item($text, $link = null, $class = null, $target = null, $on_click = null) {
  16.     $i = sizeof($this->_navigation);
  17.     $this->_navigation[$i]['text']     = trim($text);
  18.     $this->_navigation[$i]['class']    = trim($class);
  19.     $this->_navigation[$i]['link']     = trim($link);
  20.     $this->_navigation[$i]['target']   = trim($target);
  21.     $this->_navigation[$i]['on_click'] = trim($on_click);
  22.     }
  23.  
  24.     public function show_navigation() {
  25.         $menu_items = '';
  26.         for ($i=0; $i<sizeof($this->_navigation); $i++) {
  27.             $text    = $this->_navigation[$i]['text'];
  28.             $link    = (isset($this->_navigation[$i]['link'])) ? $this->_navigation[$i]['link'] : $link = null;
  29.             $class   = (isset($this->_navigation[$i]['class'])) ? $this->_navigation[$i]['class'] : $class = null;
  30.             $target  = $this->_navigation[$i]['target'];
  31.             $onclick = (isset($this->_navigation[$i]['on_click'])) ? $this->_navigation[$i]['on_click'] : $onclick = null;
  32.             if ($link) {
  33.                 $menu_items .= '<a ';
  34.                 $menu_items .= ($class) ? ' class="' . $class  . '"' : null;
  35.                 $menu_items .= 'href="'. $link   . '" target="_' . $target . '"';
  36.                 $menu_items .= ($onclick) ? ' onClick="' . $onclick  . '"' : null;
  37.                 $menu_items .= '>'. $text   . '</a>';
  38.             } else {
  39.                 $menu_items .= '<span';
  40.                 $menu_items .= ($class) ? ' class="' . $class  . '"' : null;
  41.                 $menu_items .= ($onclick) ? ' onClick="' . $onclick  . '"' : null;
  42.                 $menu_items .= '>' . $text . '</span>';
  43.             }
  44.             $menu_items .= $this->get_delimiter();
  45.         }
  46.         return $menu_items;
  47.     }
  48. }
  49. ?>
  50.  

Пример использования:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $navigation = new navigation();
  4. $navigation->set_delimiter(' > ');
  5. $navigation->new_item('Статьи', null, null, null, 'this.style.color = \'green\'');
  6. $navigation->new_item('Добавить статью', 'index.php', null, 'parent');
  7. echo $navigation->show_navigation();
  8. ?>
  9.  
4. SION-ZENIT - 28 Апреля, 2008 - 15:18:25 - перейти к сообщению
Если ты сделал set_delimiter и get_delimiter то $_delimiter можно сделать private
5. Eihwaz - 28 Апреля, 2008 - 16:06:21 - перейти к сообщению
SION-ZENIT
Верно, спасибо, не заметил Улыбка
6. -SCHATTEN- - 29 Апреля, 2008 - 07:12:01 - перейти к сообщению
Eihwaz
Кроме onclick там ещё много подобных вещей, поэтому лучше просто сделай чтобы последняя переменная вставляла произвольный код.
7. Eihwaz - 29 Апреля, 2008 - 14:05:56 - перейти к сообщению
Тогда имеет смысл в параметрах функции добавления ссылки оставить только текст ссылки и url, а третий параметр содержит уже класс, таргет и т.п., короче, вот так:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. class navigation {
  4.     private $_navigation;
  5.     private $_delimiter;
  6.    
  7.     public function set_delimiter($delimiter) {
  8.         $this->_delimiter = htmlspecialchars($delimiter, ENT_QUOTES);
  9.     }
  10.    
  11.     private function get_delimiter() {
  12.         return $this->_delimiter . "\n";
  13.     }
  14.  
  15.     public function new_item($text, $link = null, $additional = null) {
  16.     $i = sizeof($this->_navigation);
  17.     $this->_navigation[$i]['text']  = trim($text);
  18.     $this->_navigation[$i]['link']  = trim($link);
  19.     $this->_navigation[$i]['add']  = trim($additional);
  20.     }
  21.  
  22.     public function show_navigation() {
  23.         $menu_items = '';
  24.         for ($i=0; $i<sizeof($this->_navigation); $i++) {
  25.             $text    = $this->_navigation[$i]['text'];
  26.             $link     = (isset($this->_navigation[$i]['link'])) ? $this->_navigation[$i]['link'] : $link = null;
  27.             $add    = (isset($this->_navigation[$i]['add'])) ? $this->_navigation[$i]['add'] : $add = null;
  28.             if ($link) {
  29.                 $menu_items .= '<a href="'. $link   . '"';
  30.                 $menu_items .= ($add) ? ' ' . $add : null;
  31.                 $menu_items .= '>'. $text   . '</a>';
  32.             } else {
  33.                 $menu_items .= '<span';
  34.                 $menu_items .= ($add) ? ' ' . $add : null;
  35.                 $menu_items .= '>' . $text . '</span>';
  36.             }
  37.             $menu_items .= $this->get_delimiter();
  38.         }
  39.         return $menu_items;
  40.     }
  41. }
  42. ?>
  43.  
8. -SCHATTEN- - 30 Апреля, 2008 - 07:25:45 - перейти к сообщению
$menu_items .= ($add) ? ' ' . $class : null;
А где переменная $class
9. Eihwaz - 30 Апреля, 2008 - 09:26:18 - перейти к сообщению
-SCHATTEN- Исправлено Улыбка
10. -SCHATTEN- - 06 Мая, 2008 - 08:41:40 - перейти к сообщению
Ну вроде норм =)
11. frol - 02 Февраля, 2009 - 05:00:03 - перейти к сообщению
мне нравится, молодец! Радость
12. Stierus - 02 Февраля, 2009 - 11:56:21 - перейти к сообщению
Я бы добавил метод

PHP:
скопировать код в буфер обмена
  1.     public function fill_menu($data = array()) {
  2.             if(!is_array($data) or $data == array()){
  3.                         return false;
  4.                 }
  5.                 $i = count($this->_navigation);
  6.                 foreach ($data as $nav){
  7.                         /*
  8.                         Я бы сделал более жёсткую проветку, но оставляю как у вас в классе
  9.                         */
  10.                         $this->_navigation[$i]['text']  = trim($nav['text']);
  11.                     $this->_navigation[$i]['link']  = trim($nav['link']);
  12.                     $this->_navigation[$i]['add']  = trim($nav['additional']);
  13.                         ++$i;
  14.                 }
  15.                 return true;
  16.     }

 

Powered by ExBB FM 1.0 RC1