За последние 24 часа нас посетили 19196 программистов и 1643 робота. Сейчас ищут 904 программиста ...

Идеи алгоритмов для системы навигации

Тема в разделе "PHP для новичков", создана пользователем TrogWar, 20 окт 2012.

  1. TrogWar

    TrogWar Активный пользователь

    С нами с:
    20 окт 2012
    Сообщения:
    40
    Симпатии:
    0
    Адрес:
    Ленинград
    Доброго времени суток!

    Расскажите, пожалуйста (или киньтесь годной статьёй по теме), какие существуют распространённые алгоритмы систем навигации по сайту и чем они отличаются?

    Я уже пробовал несколько вариантов:
    1 – Самая банальная, "тупоссылки". Всем отлично, но если на сайте больше 10ти ссылок, то поддержка превращается в адЪ.
    2 – Передавать имя страницы в GET. Звучит, вроде, попроще – смотрим в скрипте index.php запрос, ищем страницу и грузим её. А как быть в случае, если на сайте меняется только контент (шапка, менюшка, подвал, сайдбар статичны)? DRY жёстко нарушается и лень превозмогает. Пробовал так же писать ссылки типа
    Код (Text):
    1. <a href="?active/bowling">bowling</a>
    Этот второй способ чем кардинально отличается от передачи в $_GET[]?
    3 – "Инклудами". То есть, навигация строится по второму способу (передача в $_GET[]), скрипт парсит запрос, достаёт оттуда субдиректорию и название файла, а затем выполняет
    Код (Text):
    1.  
    2. include_once($header);
    3. include_once($menu);
    4. include_once($page);
    5. //... и т.д.
    Но при объёме страниц 30+ становится сложно ими управлять. К тому же, я жёстко разделяю обязанности (html - разметка, css - представление) и появляется проблема подключения не только общих css (для шапки, менюшки, подвала и т.п.), но и для конкретной страницы. А именно – в какую иерархию и как их складывать? Я создал /active/bowling, внутри которой лежит index.php, а так же три субдиректории /img, /css и /js, в которых, собственно, картинки (вида 1.jpg, 2.jpg, ..., xxx.jpg), style.css и script.js. От такого количества файлов и директорий уже при 30 страницах кипит мозг и рябит в глазах при взгляде на боковое меню TextMate.. ):

    Что я делаю криво (понятно, что всё, а конкретнее) и как это поправить? Быть может, я не додумался до какого-то кардинально нового для меня алгоритма? Гугл мне выдаёт только статьи о постраничной навигации, а это абсолютно не то.

    Спасибо!
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    про базу данных слыхал?
     
  3. TrogWar

    TrogWar Активный пользователь

    С нами с:
    20 окт 2012
    Сообщения:
    40
    Симпатии:
    0
    Адрес:
    Ленинград
    Слыхал, с MySQL работал (с остальными не сталкивался на практике), но не строил пользовательских интерфейсов. Каков принцип хранения страниц в таком случае? Какие поля? Для хранения имени и для текста разметки? Но я тогда не понимаю как хранить такие большие тексты в БД, как их резать по частям и как удобно менять стили/скрипты для страниц.
     
  4. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
  5. TrogWar

    TrogWar Активный пользователь

    С нами с:
    20 окт 2012
    Сообщения:
    40
    Симпатии:
    0
    Адрес:
    Ленинград
    Почему тогда это не написано на странице загрузки (там, где форма)? Хорошо, правила так правила, соблюдаем.
     
  6. TrogWar

    TrogWar Активный пользователь

    С нами с:
    20 окт 2012
    Сообщения:
    40
    Симпатии:
    0
    Адрес:
    Ленинград
    Изучить синтаксис и решить конкретно стоящую задачу при помощи mysql несложно.
    Моя проблема заключается в непонимании принципа или алгоритма создания навигации по сайту и принципов хранения разметки страниц — уже закончились все идеи, а чтобы сгенерировать новые опыта разработки интерфейсов не имею. Поэтому и обратился сюда за помощью более опытных специалистов.
     
  7. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Попробуй использовать фреимворк. Там все уже продуманно. А когда поймешь что как работает напишешь свое.
     
  8. TrogWar

    TrogWar Активный пользователь

    С нами с:
    20 окт 2012
    Сообщения:
    40
    Симпатии:
    0
    Адрес:
    Ленинград
    Какой, например, фреймворк для моей задачи посоветуете изучить?

    [offtop]Почему начал изобретать свой велосипед — интересно пройти тот же путь, прочувствовать ошибки, недоработки, возникающие проблемы архитектуры/языка/кода/и т.д.
    Например, не понял чем хорош JQuery пока не написал сам большинство велосипедов на чистом JS.[/offtop]
     
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Задача, над которой ты так мучаешся, называется "маршрутизация" или "роутинг". Посмотри Yii или Code Igniter, там это гладко разруливается.

    А для этого существуют шаблоны, ну или просто include 'header.php'...include 'footer.php' )))
     
  10. TrogWar

    TrogWar Активный пользователь

    С нами с:
    20 окт 2012
    Сообщения:
    40
    Симпатии:
    0
    Адрес:
    Ленинград
    Спасибо, раз это поможет решить проблему, то посмотрю оба и изучу.

    Да :) Именно сейчас так и генерирую страницу (в моём посте это 3й метод). Контент вставляется очень просто — include_once($content), где $content — адрес php страницы, содержащей только контент. Какую именно страницу грузить главный скрипт понимает парсингом из $_SERVER['QUERY_STRING'], а сами ссылки у меня вида
    Код (Text):
    1. <a href="?pages/somearticle/somepage">somepage</a>
    В итоге получается, что в директории pages валяется пара разделов с кучей контентостраниц. Чую, что это можно организовать более разумно, но не знаю как ):
     
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    С любым фреймворком и любым шаблонизатором у тебя будет "папка с кучей страниц". Так что всё не так плохо.
     
  12. Neka

    Neka Активный пользователь

    С нами с:
    16 янв 2010
    Сообщения:
    188
    Симпатии:
    0
    Дабы не тащить весь фреймворк, можно использовать компонент Router из Symfony2 (по сути - этот фреймворк всего лишь набор отдельных библиотек).
    Можно воспользоваться роутером из Silex, что тоже в принципе удобно.

    Можно самому написать

    http://site.ru/some/path с помощью mod_rewrite превращаем в http://site.ru/router.php?path=some/path а дальше
    Код (PHP):
    1. $pathArray = explode("/", $_GET['path']);
    2. $controller = $pathArray[0];
    3. $action = $pathArray[1];
    4. [...]
    5.  
     
  13. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    это лишнее. можно проще
    Код (PHP):
    1. $pathArray = explode("/", $_SERVER['REQUEST_URI'] ); 
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    воистину люди ненавидят почему-то $_SERVER['REQUEST_URI']
     
  15. TrogWar

    TrogWar Активный пользователь

    С нами с:
    20 окт 2012
    Сообщения:
    40
    Симпатии:
    0
    Адрес:
    Ленинград
    Идея понятна, спасибо. Насколько я понял, это ещё один способ определения включаемого файла? То бишь, тоже самое, что у меня, но другой способ обработки пути.

    Почему ненавидят? Чем он плох?

    Добавлено спустя 9 минут 8 секунд:
    Я так понимаю, от кучи html/php страничек с контентом не отделаться. А вот каким образом сортируют, структурируют и собирают вместе сотню таких вот страниц "большие игроки вэба"?
    Есть ли какие-то паттерны проектирования для облегчения жизни верстальщиков в будущем при поддержке проекта или всё зависит от настроения и удобства разработчика?
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    он всем хорош. вероятно, я точно не знаю, когда рождались популярные CMS он не везде работал. Но я на своём веку не встречал каких проблем с этим параметром.

    Добавлено спустя 2 минуты 33 секунды:
    что?

    что? =) куда собирают? зачем собирают?
    они парсят $_SERVER['REQUEST_URI'] и суют запросом в БД. результат на экран. =)

    в обработке урлов? тут только одно правило - чтобы людям нравилось надо юзать ЧПУ.
     
  17. TrogWar

    TrogWar Активный пользователь

    С нами с:
    20 окт 2012
    Сообщения:
    40
    Симпатии:
    0
    Адрес:
    Ленинград
    Вот тут-то и обнаружился мой пробел в понимании, спасибо :)
    Что быстрее: include_once($page) или хранить в БД (использую InnoDB)?
     
  18. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Смотря сколько данных
     
  19. TrogWar

    TrogWar Активный пользователь

    С нами с:
    20 окт 2012
    Сообщения:
    40
    Симпатии:
    0
    Адрес:
    Ленинград
    Данных немного — предполагается система регистрации пользователей (~1000..1500), личные меню. Общее количество страниц (включая личные) ~100. В самой БД больших объёмов данных (таких как транзакции платежей, магазинные "фичи" и прочие) не предполагается ни сейчас, ни в дальнейшем.
     
  20. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    В ваших случаях (любых, каких сможете придумать) лучше использовать бд.
     
  21. TrogWar

    TrogWar Активный пользователь

    С нами с:
    20 окт 2012
    Сообщения:
    40
    Симпатии:
    0
    Адрес:
    Ленинград
    Спасибо за ответы и потраченное время на новичка! Помогли понять основные алгоритмические вещи при построении навигации по сайту :)

    igordata, вопрос из любопытства и интереса к php: почему в моих случаях лучше использовать чтение из ненагруженной БД, чем из файла - они ведь оба лежат на диске сервера (если не настраивать специально кэширование БД)?
     
  22. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    вам будет проще жить с бд. =)
     
  23. TrogWar

    TrogWar Активный пользователь

    С нами с:
    20 окт 2012
    Сообщения:
    40
    Симпатии:
    0
    Адрес:
    Ленинград
    Вот на это и надеюсь!
    Спасибо Вам ещё раз за помощь и адекватное отношение к новичкам :)
     
  24. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я не думал о том что вы новичек. =)

    какие ещё будут вопросы? вы сами планируете это всё кодить или отдавать программистам?
     
  25. TrogWar

    TrogWar Активный пользователь

    С нами с:
    20 окт 2012
    Сообщения:
    40
    Симпатии:
    0
    Адрес:
    Ленинград
    igordata, всё относительно. Пока не смогу написать хотя бы простенькую свою CMS буду считать себя новичком в PHP :)

    Всё это кодить я собираюсь сам. Предполагается, что я – квартет Анатолий :) Только дизайн страниц придумываю не я (только верстаю, но с ней никаких проблем).
    На данный момент уже готовы: система навигации ("инклудами", но сейчас решил, что перепишу запросами к БД – время есть пока дизайнер рисует странички), свёрстано ~70% всех страниц, есть системы регистрации и аутентификации (сессии+печеньки) и простенькое разграничение прав доступа (гости, зарегистрированные пользователи и админы) к меню/ссылкам/материалам/документам сайта.

    Да, вопросы у меня ещё есть, но они не связаны с САБЖем. Подскажите, пожалуйста, каков хроший тон на этом форуме: продолжать тему, даже если она с САБЖем не коррелирует или лучше создать новую тему для другого вопроса?