Регистрация    Вход    Форум    Поиск    FAQ

  •  Новости
  • Beeline + Twitter = чирикай через SMS!

    Beeline + Twitter = чирикай через SMS! На первой картинке обозначены команды, при помощи которых через SMS Вы сможете кого-либо зафолловить или же отписаться, ретвитнуть чей-либо пост или же написать личное сообщение.

    Open Graph Protocol. От создателей Facebook

    Open Graph Protocol. От создателей Facebook Разбираясь с Facebook API, случайно наткнулся на другую интересную разработку от этих людей.

    Глобальное ускорение Wordpress

    Глобальное ускорение Wordpress Не считая очевидных решений типа отключения некоторых плагинов и перехода на тему попроще, я вижу 2 пути для оптимизации: кэширование и сжатие траффика.




  •  Часы


  •  Поиск

Optimaze » Программирование » Организация навигации по сайту




Организация навигации по сайту

  1. Основные конструкции для хранения данных.
  2. Конструктор класса langSys.
  3. Выглядит это так:


Всем передвижением по сайту управляет два GET – параметра, передаем мы их в адресной строке, как известно. Первый параметр “do” управляет страницами и хранится он в суперглобальном массиве $_SESSION под индексом “langsys_page”.

Второй параметр “lang“ управляет используемым языком на сайте, хранится он в куки (суперглобальный массив $_COOKIE) под индексом “langsys_lang”.

 

Как происходит перенаправление по страницам и языкам? В этом, кстати, был основной интерес. Проблема заключалась в том, что как только пользователь решал изменить язык сайта, то ему показывалась стартовая страница, а не просто изменялась на другой язык та, которую он просматривал. Это хорошо, если сайт маленький, а если в нем бесчисленное количество статей – потом попробуй найти ту, которую читал.

Проблему решил вариант добавления текущей страницы в сессию, то есть наша функция getContentByLang($page, $lang); смотрела в массив сессий, чтобы знать какую страницу показывать, но никак напрямую не общалась с изменение GET – параметра.

 

Размещение текущей страницы в массиве сессий решило первую проблему, но привлекло другую – теперь если мы находились на странице http://site. ru/?do=about и вдруг решили перейти на заглавную страницу http://site. ru/, то мы останемся и никуда не перейдем. Почему? – мы не передали никакого значения $_GET[‘do’], соответственно текущая страница не изменилась в сессии и сайт никак не отреагировал. Делать главную страницу под ссылкой, например http://site. ru/?do=main глупо, поэтому существует еще одно условие в управлении навигацией:

 

  • else if (!isset($_GET['page']) && !isset($_GET['lang'])) {
  •         $_SESSION['langsys_page'] = $langsys->startPage;
  •         $langsys->page = $_SESSION['langsys_page'];
  •     }

То есть, в случае, когда у нас не установлены GET – параметры page и lang, мы присваиваем элементу массива сессий “langsys_page” значение startPage, которое заранее мы объявили в конструкторе наше класса langSys, но об этом уже далее.

 

Основные конструкции для хранения данных.

В этой системе я воспользовался двумя методами хранения данных:

 

1. Ассоциативный массив, где ключ это идентификатор слова, а значение это переведенное слово. Кстати, ключом может быть как целочисленное значение, так и слово, например на русском. Использую я первый вариант, так как пожелания при разработке были таковыми. Выглядит это так:

 

  • //английский
  • <?
  • $this->arr_lang{$lang} = array(
  •     1=>'About us',
  •     2=>'FAQ',
  •     3=>'Advertisement',
  •     4=>'Descript'
  • )
  • ?>
  • //русский
  • <?
  • $this->arr_lang{$lang} = array(
  •     1=>'О нас',
  •     2=>'Частые вопросы',
  •     3=>'Реклама на сайте',
  •     4=>'Описание'
  • )
  • ?>

 

Если вы обратите внимание на шаблон, то можете увидеть, что мы вызывали функцию translate($id). Эта функция как раз и выводит нужное слово, обращаясь в куку за значением текущего языка:

 

  • function translate($id, $lang = '') {
  •     //если язык на передан в функции
  •         if ($lang == '')
  •           $lang = $this->lang;
  •     //загружаем языковой файл
  •         if (!isset($this->loaded[$lang])) {
  •             include_once $this->rootLang. ''. $lang. '/'. $lang. '. php';
  •             $this->loaded[$lang] = true;
  •         }
  •     //дополнительная фишка для показа индекса слова на странице
  •         if (isset($this->arr_lang{$lang}[$id]) && (isset($_GET['show_index']))){
  •             ($_GET['show_index'] == 'true')? print '<font color="red" size="5">'. $id. '</font> '. $this->arr_lang{$lang}[$id] : '';
  •         }
  •     //вывод слова на страницу
  •         else if (isset($this->arr_lang{$lang}[$id])) {
  •             print $this->arr_lang{$lang}[$id];
  •         }
  •     //если перевод по id не найден
  •         else {
  •           print $id;
  •         }
  •     }

Функции так же можно передавать напрямую значение текущего языка, а не брать его из куки. Нужно для того, чтобы программист мог вручную выбирать, на каком языке показывать то или иное слово/фразу.

 

2. Второй вариант хранения информации на сайте предназначен для больших блоков информации, а не отдельных фраз или же слов. По этому методу мы создаем отдельные страницы, например about. php, faq. php и т. д. с обычной html версткой (параграфы, форматирование текста, гиперссылки) и нужным содержимым, которое мы бы хотели видеть на странице.

Его можно брать как из этого же файла, так и подгружать из базы. Взял я первое, потому что в моем случае – чем меньше обращений к базе данных, тем лучше. На самом деле, если вы будете использовать подобную структуру на сайте с небольшой нагрузкой, то можно грузить и из базы, если же у вас на сайте до десятков тысяч посещений в день, то соответственно понимаете, что лишняя нагрузка на базу неуместна.

 

Сама функция, подгружающая нужную страницу:

 

  • function getContentByLang ($page, $lang) {
  •             $file = $page. '_'. $lang. '. php';
  •             include_once $this->rootLang. ''. $lang. '/'. $file;
  •     }

Ничего замысловатого.

 

Смена языка.

В начале этой статьи я рассказывал о том, как организуется навигация по сайту и про то, как меняется язык. Еще раз напоминая, текущий язык записывается в куки под индексом “langsys_lang”, после чего им могут воспользоваться функции, выводящие содержимое сайта, чтобы показать информацию на нужном языке.

 

Для того чтобы изменить язык мы используем простое условие, реагирующее на изменение GET – параметра “lang”:

 

  • (!isset($_GET['lang']))? '' : $langsys->changeLang($_GET['lang']);

Которое, при получении такового вызывает функцию changeLang($lang) (смена текущего языка):

 

  •     function changeLang($lang) {
  •         //устанавливаем текущий язык
  •         $this->lang = $lang;
  •         //записываем в куки его значение
  •         setcookie("langsys_lang", $this->lang, time()+60*60*24*30);
  •         //возвращаемся на ту же страницу
  •         $this->page = $_SESSION['langsys_page'];
  •     }

С языками на этом все, теперь можно перейти к конструктору класса langSys.

 

Конструктор класса langSys.

Когда все вышесказанное было прочитано, можно перейти и к настройкам нашей системы. Для этого используется конструктор, в котором мы можем перечислить все настройки, используемые потом в системе и на сайте в целом, например root – директория или же язык по умолчанию.

 

Выглядит это так:

 

  • function __construct() {
  •         $this->root = $_SERVER['DOCUMENT_ROOT'];
  •         $this->domain = 'http://' . $_SERVER['HTTP_HOST'];
  •         $this->rootLang = $this->root . '/lang/';
  •         $this->startLang = 'ru';
  •         $this->startPage = 'about';
  •         $this->page = $_SESSION['langsys_page'];
  •         if (!isset($_COOKIE['langsys_lang'])) {
  •             setcookie("langsys_lang", $this->startLang, time()+60*60*24*30);
  •             header("Location: " . $this->domain);
  •         }
  •         $this->lang = $_COOKIE['langsys_lang'];
  •     }

    

Я думаю, в этом случае комментарии не нужны. Но скажу, что это все упрощает модификацию, и использование класса в дальнейшем.



Рейтинг: 4.8/5, основан на 25 голосах.


Нравится



Вернутся назад


   

Вам будет интересно:

Подсчет оставшегося времени на PHP

Опишу одну функцию, которая позволяет отсчитать оставшееся время до какой-нибудь даты.

Расширения DOM в Prototype

Большинство расширений DOM содержатся в объекте Element. Methods и дополнительно копируются в объект Element для удобства использования.

Hibernate 3. 1. 3 out

Эта версия, в основном, содержит исправления ранее найденных ошибок, самой неприятной из которых, по моему мнению, является отсутствие отложенной инициализации many-to-one ассоциации в ветке 3.1.

JSR 272 Early Draft Review

Данная спецификация предусматривает создание API для J2ME устройств, с помощью которого они смогут поддерживать широковещательные сервисы, такие как цифровое телевидение.



  •  Публикации


8 методов раскрутки своего форума с нуля

8 методов раскрутки своего форума с нуля Итак, у вас имеется свой собственный форум, но его никто не посещает? Мы готовы помочь вам справиться с этой нелегкой проблемой.

Как привлекать посетителей на проект

Как привлекать посетителей на проект Данная статья в основном рассчитана на тех, кто самостоятельно занимается продвижением своего проекта.

Про MySQL, серверы и PayPal

Про MySQL, серверы и PayPal Проклял все настройки кодировок, проклял DirectAdmin и еле-еле нашел то место где располагается и задается общий пароль для ...

Реклама в Твиттере. Как подать свой продукт

Реклама в Твиттере. Как подать свой продукт Твиттер уже давно стал из нового web 2. 0 сервиса рекламной площадкой с огромным количеством потенциальных пользователей ...

Пока блог на локалхосте

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

Авторитет блоггера притягивает

Авторитет блоггера притягивает Долго не знал с чего начать данную статью. Статья что-то типа мыслей вслух и философии.