За последние 24 часа нас посетили 18142 программиста и 1650 роботов. Сейчас ищут 1608 программистов ...

Архитектура и реализация каталога

Тема в разделе "Решения, алгоритмы", создана пользователем omickron, 26 май 2010.

  1. omickron

    omickron Guest

    Всем привет.
    Передо мной поставили задачу - реализовать каталог.
    Что такое каталог в моём понимании: это иерархическая структура, имеющая один корень и множество ветвей. У каждой ветви может быть много подветвей. На концах ветвей - листья.
    Лист должен содержать в себе текстовое описание, ссылку на HTML файл с описанием, ссылку на картинку.
    Для каталога должна быть административная часть, позволяющая добавлять/удалять/редактировать ветви и листья.
    Реализация на php + MySQL.

    В чём, собственно, у меня проблема.
    Я могу реализовать структуру, движок и т.п.
    Вопрос в том, как удобно сделать выбор HTML файлов и файлов-картинок для листьев?
    В каталоге может быть больше 100 листьев на одной ветке. Как реализовать в административной части выбор этих файлов для каждого листа? И как организовать хранение этих файлов на сервере? Как организовать каталоги?
     
  2. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    курсач?
     
  3. omickron

    omickron Guest

    Нет, не курсач. Рабочая задача.
    Общий объём каталога - более 10000 листов.
     
  4. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    а какая вложенность у ветвей?
     
  5. omickron

    omickron Guest

    Вложенность средняя - около 10 уровней.
     
  6. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    взял выбрал всё, разбил по страницам. вывел для нужной страници нужные файлы.
    каталоги как удобно.

    если не можете этого сделать, нечего на работу устраиваться.
     
  7. omickron

    omickron Guest

    гм. Я спрашиваю про удобную реализацию административной части.
    Если не умеете читать - нечего советовать.
     
  8. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    Таблица `categories`
    таблица `topics` id|cat_id|parent_id|type|content| и т.д.

    Всё очень просто.
     
  9. omickron

    omickron Guest

    Hight, для хранения иерархической структуры гораздо лучше использовать структуру типа nested sets.
    То, что Вы предложили, подходит для очень маленьких сайтов.

    Меня интересует вопрос связи файлов с листьями
     
  10. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    Ну добавь в таблицу уровень вложенности. В чём проблема.
    Хм. А хранить путь и имя файла в таблице, не?
     
  11. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    С какими листьями?

    Файл это такой же узел дерева. Только он не может иметь потомков в отличии от каталога.
     
  12. omickron

    omickron Guest

    Nested sets - это не только уровни вложенности. Это принципиально другой подход к иерархической структуре.

    Ребят, с созданием таблицы в БД у меня всё просто. Этот вопрос уже решён.

    Листья, как я уже писал - это крайние элементы иерархической структуры. (см. пилотный пост).

    Лист состоит из заголовка (имени), описания, картинки и HTML файла. Конечно, могут быть и другие поля. Но это сейчас не принципиально.
    Т.е. в каждый лист - каждый элемент каталога - администратор может прикрепить картинку и файл.
    В таблице БД будет предусмотрено для них два поля.

    Вот только что хранить в этих полях?

    Самое простое решение - "в лоб" - это хранить пути к нужным файлам относительно папки /upload/, например.
    Но это - потенциальная уязвимость сайта, ибо передавать пути в чистом виде (/upload/images/12.jpg) не рекомендуется, чтобы не раскрывать структуру сайта.
    Да и к тому же, как организовать хранение этих файлов на сервере тогда? В каких папках? Все картинки вместе? Тогда в одной папке может быть несколько тысяч файлов. Как из них выбирать?
     
  13. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Мда, что-то всех пробило.

    Один die() использует чтобы ошибки не показывать. Второй не хочет выдавать путь к картинкам на сайте.

    В чем прикол?


    Вот есть у вас дерево категорий? Вот и отобразите его структуру на файловую систему 1 к 1му.
    Что может быть проще?
     
  14. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    PHP:
    1. <?php
    2. define('_DS', DIRECTORY_SEPARATOR);
    3.  
    4. $path = 'files';
    5. $path .= _DS.((int)($id / 1000))._DS.$id;
    ну вот так, например, храните свои файлы. Путь будет привязан к id и с тормозами ФС не скоро столкнётесь
     
  15. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    1/0.

    /images/parent_id/id.jpg

    ИМХО, еще лучше - повторить иерархию на структуре каталогов, но если узел поменяет родителя, то и каталог с файлами должен переместиться.