Форум программистов, компьютерный форум, киберфорум
Наши страницы

PHP для начинающих

Войти
Регистрация
Восстановить пароль
 
__PION__
954 / 795 / 12
Регистрация: 21.07.2010
Сообщений: 3,521
#1

Вывод категории и материала - PHP

24.02.2014, 02:54. Просмотров 1115. Ответов 11
Метки нет (Все метки)

Чет не пойму как определить вывод категории или материала.
Вот есть 2 таблицы - category, с вложенными категориями и связанная с ней табл. материалов - material.
Когда делаю запрос site.ru/category/ - вывожу категории (срабатывает метод index в соответствующем контроллере), а если site.ru/category/realty/ - то уже не знаю как быть, как понять, что realty это тоже категория, а не материал?
Как это решается?
Первый параметр в url у меня - метод по умолчанию, остальные - параметры (через /). Как понять, что до какого-то параметра - это категории, а после - материал?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.02.2014, 02:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вывод категории и материала (PHP):

Вывод материала на сайт из txt-файла - PHP
Здравствуйте! подскажите пожалуйста - на коде это я добился вывод материала на сайт из ТХТ файла, а как сделать чтоб материал выводился...

Вывод названия категории - PHP
Доброго времени суток. Помогите пожалуйста, есть доска объявлений, все как положено, город, фото, улица, область, цена. И в базе есть...

Категории, под категории, под под категории, добавление товара - PHP
Не мог бы кто мне помочь с категориями, под категориями и под под категориями. Проблема в том, что в админке сделано добавление товара с...

Редактирование материала - PHP
Я хочу купить тему на theme forest но они статические,нету такого скрипка (админка) чтобы можно было управлять содержимым...

Выбор обучающего материала - PHP
Здравствуйте, Хотелось бы узнать у "ГУРУ", какой, лучше всего, обучающий материал выбрать для PHP? Посмотрел раздел "Учебники по...

Добавление материала на сайт - PHP
Всем привет помогите пожалуйста ! помогите написать код php который будет добавлять на сайт то что впишет пользователь а именно...

11
ads
363 / 370 / 65
Регистрация: 01.12.2013
Сообщений: 1,629
24.02.2014, 10:45 #2
хранить категории и материалы не в двух таблицах, а в одной. в которой завести поле, напр. class. хранить в нем имена классов отвечающие за обработку конкретной записи. Получите легко расширяемую с помощью наследования систему, в которой можно хранить хоть категории, хоть материалы, да все что в голову может придти в будущем. Правда с ваш способ построения url.. неоправданно неудобный чтоли..
1
__PION__
954 / 795 / 12
Регистрация: 21.07.2010
Сообщений: 3,521
24.02.2014, 15:25  [ТС] #3
интересное решение. А как url будет строится? И как через url понять какой именно класс брать?
И такой момент, вот к примеру, я делаю доску объявлений, естественно есть категории и сами объявления, Как можно в одну таблицу пихать и категории и объявления? У объявлений могут быть много параметров, а у категорий их нет, нельзя же все в кучу, нет?
0
ads
363 / 370 / 65
Регистрация: 01.12.2013
Сообщений: 1,629
24.02.2014, 16:02 #4
Цитата Сообщение от Love_and_Peace Посмотреть сообщение
А как url будет строится?
для себя урлы строю такого вида:http://sitename.de/122345/che-pe-u здесь цифры это id контента, неважно какого типа, а буквы -это просто текст для пользователя, чтобы ему не скучно было на ссылку смотреть и значение этого текста никакого влияния на навигацию не оказывает..
Цитата Сообщение от Love_and_Peace Посмотреть сообщение
У объявлений могут быть много параметров, а у категорий их нет,
если интересно, можете поискать "наследование с одной таблицей". Неоднозначное решение, но самое простое. Для себя использую другой подход. Когда я сказал что используется одна таблица, имелось ввиду что одна таблица является основой навигации(дерева) сайта. А сам контент размещается в другой таблице записи в которой связаны внешним ключом с таблицей дерева.. И вот в этой таблице хранится контент. Дальше расширяемость - бесконечна. Хотите храните свойства в текстовом поле в json. Дубовый, но простой вариант. Хотите заведите дополнительную таблицу свойств(самое правильное решение). У категорий, например свойств нет, у ботинок может быть размер, а у машины мощность. Название класса контента можно хранить в таблице дерева.. можно долго еще рассказывать, главное что если вы сейчас потратите на это некоторое время, то на будущее вы получите универсальную заготовку для любых проектов..
1
__PION__
954 / 795 / 12
Регистрация: 21.07.2010
Сообщений: 3,521
24.02.2014, 16:32  [ТС] #5
Цитата Сообщение от ads Посмотреть сообщение
Когда я сказал что используется одна таблица, имелось ввиду что одна таблица является основой навигации(дерева) сайта. А сам контент размещается в другой таблице записи в которой связаны внешним ключом с таблицей дерева.. И вот в этой таблице хранится контент. Дальше расширяемость - бесконечна.
я тоже хочу так сделать. Нужен пример, вот допустим у меня категории
Код
- auto
-- legkovie
-- gruzovie
- realty
-- kvartiri
--- odnokomnatnie
--- dvuhkomnatnie
-- doma
- job
Здесь я привел дерево в виде их урлов. Это реальное дерево из моего текущего примера, оно выводится слева, генерируется в главном контроллере (пока) - controller_page.php, т.к., выводится на всех страницах. Эти категории берутся из таблицы - category, а с ней связана таблица - ads, через внешний ключ. Планировал ссылки делать такими -
Код
site.ru/auto/legkovie/
или если выбрали объявление -
Код
site.ru/auto/121.html (site.ru/auto/legkovie/121.html)
Вот куда здесь классы прописать? И зачем тут много классов, когда все делается в одном файле-контроллере?
Объясни пожалста на этом примере. Хочу
Цитата Сообщение от ads Посмотреть сообщение
универсальную заготовку для любых проектов..
0
ads
363 / 370 / 65
Регистрация: 01.12.2013
Сообщений: 1,629
24.02.2014, 18:36 #6
В двух словах, наверно не получится. Приведу фрагмент скрипта создания рабочей базы данных. Надеюсь разберетесь. Таблица content - содержимое страницы, property - список дополнительных свойств контента. И node - дерево сайта.

SQL
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
CREATE TABLE `content` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `hidden` INT(1) DEFAULT '0' COMMENT 'Скрыть',
  `class` VARCHAR(16) NOT NULL COMMENT 'Класс контента, по нему определяются дефолтные шаблоны и формы',
  `view` VARCHAR(16) DEFAULT NULL COMMENT 'Альтернативный шаблон для вывода',
  `form` VARCHAR(16) DEFAULT NULL COMMENT 'Альтернативная форма',
  `show_child` INT(1) DEFAULT '1' COMMENT 'Показывать меню для выбора дочерних записей, или ссылки находятся в тексте',
  `header` VARCHAR(128) NOT NULL,
  `author_id` INT(11) DEFAULT NULL,
  `created` datetime DEFAULT NULL,
  `updated` datetime DEFAULT NULL,
  `vcount` INT(11) DEFAULT '0' COMMENT 'Счетчик просмотров',
  `text` mediumtext,
  PRIMARY KEY (`id`),
  KEY `author_cnt_fk_idx` (`author_id`),
  CONSTRAINT `author_cnt_fk` FOREIGN KEY (`author_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
CREATE TABLE `property` (
  `name` VARCHAR(8) NOT NULL,
  `content_id` INT(11) NOT NULL,
  `title` VARCHAR(128) NOT NULL,
  `data` VARCHAR(255) DEFAULT NULL,
  PRIMARY KEY (`content_id`,`name`),
  KEY(`data`(32)),
  CONSTRAINT `content_prop_fk` FOREIGN KEY (`content_id`) REFERENCES `content` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Дополнительные свойства страницы';
 
 
CREATE TABLE `node` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `content_id` INT(11) DEFAULT NULL COMMENT 'Идентификатор страницы(используется как фрагмент URL в запросах). id использовать нельзя т.к. будут дубли страниц',
  `url_text` VARCHAR(128) DEFAULT NULL COMMENT 'Текст ссылки. Как подсказка пользователю, для навигации не имеет значения',
  `parent_id` INT(11) DEFAULT NULL COMMENT 'Родительский узел',
  `title` VARCHAR(128) NOT NULL COMMENT 'Текст в меню и заголовок окна браузера',
  `tooltip` VARCHAR(128) DEFAULT NULL COMMENT 'Всплывающая подсказка меню',
  `view_order` tinyint(4) NOT NULL DEFAULT '0' COMMENT 'Сортировка для вывода меню',
  `chld_header` VARCHAR(128) DEFAULT NULL COMMENT 'Заголовок меню дочерних записей',
  `chld_menu_type` tinyint(4) DEFAULT 1 COMMENT 'Тип виджета меню',  
  PRIMARY KEY (`id`),
  KEY `content_n_idx` (`content_id`),
  KEY `parent_idx` (`parent_id`),
  CONSTRAINT `content_node_fk` FOREIGN KEY (`content_id`) REFERENCES `content` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `parent_node_fk` FOREIGN KEY (`parent_id`) REFERENCES `node` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Навигация, узлы сайта';
Данная схема немного отличается от той абстрактной, что я описал раньше. Основной элемент здесь таблица content. По id контента в url отображается страница. По полю class определяется тот класс который будет выводить страницу. Страница ботинка или страница машины. Заниматься этим будут классы соответственно boot и car. Эти классы имеют одинаковые методы render, но которые работают по разному. Т.е. в контроллере мы один раз напишем, к примеру, $varMyClassObject->render() и забудем.. полиформизм все сделает сам. Машина будет отображатся своим шаблоном, ботинок своим.. Чтобы добавить продажу таблеток достаточно будет добавить класс Drugstore вообще не трогая остальной код.
Цитата Сообщение от Love_and_Peace Посмотреть сообщение
Здесь я привел дерево в виде их урлов. Это реальное дерево из моего текущего примера,
не стоит привязывать урлы к размещению в дереве сайтов. Когда вы решите продавать ботинки в разделах "обувь" и "все для туризма" то они будут доступны по двум разным url что не очень уважают поисковики. А указать пользователю в каком разделе он сейчас находится можно с помощью "хлебных крошек", а не с помощью url.. все.. устал.
1
__PION__
954 / 795 / 12
Регистрация: 21.07.2010
Сообщений: 3,521
25.02.2014, 00:26  [ТС] #7
Цитата Сообщение от ads Посмотреть сообщение
все.. устал.
хохмач)
У меня вопрос скорее был в формировании самих url'ов. Щас у меня есть роутер, который определяет какой подключать контроллер по тому, чему равен первый элемент в url, например site.ru/news/ - контроллер Controller_News, остальные параметры в url указывают на то, какой метод вызывать. Естественно, если ничего не передано срабатывают класс и метод по умолчанию. Все затрудняется когда приходится брать инфу из 2-х и более таблиц (в примере с новостями - все в одной таблице), поэтому и поднял эту тему.
Сам движок растет модульно (в папке modules есть папки с названием и скриптами соответствующего модуля. подключаются все автоматом в bootstrap).

Теперь мне хотелось бы понять как здесь все это формируется, там, построение файлов самого движка, как устроен роутер и т.п.
Я понимаю в 2-х словах не скажешь, может дашь ссылку на пример, где я смогу покапаться и разобраться?
0
ads
363 / 370 / 65
Регистрация: 01.12.2013
Сообщений: 1,629
25.02.2014, 17:09 #8
Цитата Сообщение от Love_and_Peace Посмотреть сообщение
может дашь ссылку на пример, где я смогу покапаться и разобраться?
тут я в тупике, конкретной ссылки не могу дать, наверно это какие-то обобщенные знания...
Цитата Сообщение от Love_and_Peace Посмотреть сообщение
мне хотелось бы понять как здесь все это формируется,
Вобщем у меня не так как у вас. Разделение по контроллерам осуществляется по задачам для этих контроллеров, а не для вывода разного содержания разными контроллерами. Один контроллер для админки, другой для стандартных разделов сайта, таких как главная страница, контакты, форма обратной связи... Для вывода основного пользовательского содержания сайта используется еще один контроллер, который имеет действие view принимающий единственный параметр, и это id контента... Любой контент, будь то категория или материал и все что еще пришло пользователю в голову запихнуть в свой сайт, выводится одним и тем же контроллером Content с помощью одного и того же действия view...Т.е. на уровне роутинга или обработки url я не разделяю основное содержание. Контроллер один и действие одно. Уже потом, получив данные для модели(класс модели определяется по полю class) мы создаем нужный объект этой модели и модель говорит контроллеру какую "правильную" вьюху нужно использовать чтобы ее нарисовать.. Причем класс модели может работать хоть с десятком дополнительных таблиц если они ей нужны.. Зависит от конкретной реализации(класса) модели. Получается, что расположение материала в дереве сайта определяется на уровне базы данных, а не на уровне url. как-то так
1
__PION__
954 / 795 / 12
Регистрация: 21.07.2010
Сообщений: 3,521
25.02.2014, 17:38  [ТС] #9
кажется понял твою мысль, спасибо.
3 момента еще -
1. Как же выглядят в твоем движке url'ы? (например, такой вложенности - недвижимость/квартиры/однокомнатные)
2. Получается, если вы добавляете в админке какую-то категорию или ветку, вам приходится писать каждый раз новую модель для него, так?
3.
Цитата Сообщение от ads Посмотреть сообщение
Когда вы решите продавать ботинки в разделах "обувь" и "все для туризма" то они будут доступны по двум разным url что не очень уважают поисковики.
правильно ли я понимаю, если у меня объявление (одно и то же, например под id = 100) доступно по ссылкам
- недвижимость/квартиры/однокомнатные/101.html
и
- недвижимость/новостройки/однокомнатные/101.html
, то это может не понравится поисковикам, так?

Добавлено через 2 минуты
я пытаюсь построить связи ч/з url по аналогии с hostcms
Например - http://demo.hostcms.ru/board/auto/buses/123123/
Возможно там логика другая, вот я пытаюсь поймать ее)
0
ads
363 / 370 / 65
Регистрация: 01.12.2013
Сообщений: 1,629
25.02.2014, 18:15 #10
Цитата Сообщение от Love_and_Peace Посмотреть сообщение
1. Как же выглядят в твоем движке url'ы? (например, такой вложенности - недвижимость/квартиры/однокомнатные)
в зависимости от настроек сервера и чпу, например
без чпу sitename.com?r=content/view&id=101&text=novostroyka-odnokomnatnaya-v-tzarskom-sele
c включенным чпу: sitename.com/101/novostroyka-odnokomnatnaya-v-tzarskom-sele Повторюсь что текст после цифр вообще ни чего не значит для движка. Только для красоты пользователю
Цитата Сообщение от Love_and_Peace Посмотреть сообщение
2. Получается, если вы добавляете в админке какую-то категорию или ветку, вам приходится писать каждый раз новую модель для него, так?
категории это одна и та же модель. Ничего добавлять не надо. И можете их насоздавать сколько душе угодно. Но если вы хотите писать объявления о продаже домов и статьи способах размножения кактусов, пожалуй что лучше создать две модели, одну для статьи другую для объявления. Хотя скорее всего модель для статьи подойдет и для объявлений.. Вобщем смотреть по месту.
Цитата Сообщение от Love_and_Peace Посмотреть сообщение
- недвижимость/квартиры/однокомнатные/101.html
и
- недвижимость/новостройки/однокомнатные/101.html
, то это может не понравится поисковикам, так?
однозначно.
Используйте всегда один url для одного материала. Специально консультировался у сеошников. А уж попасть на эту старницу пользователь может из разных категорий. Что бы у него небыло непоняток, хлебные крошки на странице рисуете в зависимости от того каким путем он сюда попал: либо
недвижимость/квартиры/однокомнатные
либо
недвижимость/новостройки/однокомнатные
.. тут уже задействуются сессии, но это другая песня. сам сейчас с этим бьюсь
1
__PION__
954 / 795 / 12
Регистрация: 21.07.2010
Сообщений: 3,521
25.02.2014, 18:52  [ТС] #11
Цитата Сообщение от ads Посмотреть сообщение
категории это одна и та же модель.
а.. ну да, так и получается. Меня с толку сбила статья (может я не так понял), которую я вчера читал, там объясняли - наследование с одной таблицей. и говорилось, что для категории авто надо создать модель car и записать в поле class, для подкатегории легковые автомобили - модель passenger_car и так же записать в поле class. Отсюда и вопрос возник.

Опять же в вашем методе я тоже не могу понять в какой момент вы ищете данные в таблице категорий по id, а в какой в той же таблице объявлений. У тя же объявления ведь не в таблице content, а в node, так ведь?
0
ads
363 / 370 / 65
Регистрация: 01.12.2013
Сообщений: 1,629
25.02.2014, 19:12 #12
Цитата Сообщение от Love_and_Peace Посмотреть сообщение
что для категории авто надо создать модель car и записать в поле class, для подкатегории легковые автомобили - модель passenger_car
это наследование с одной таблицей. есть супертаблица которая содержит в себе все поля всех моделей. каждая модель берет только свои
Цитата Сообщение от Love_and_Peace Посмотреть сообщение
У тя же объявления ведь не в таблице content, а в node, так ведь?
вся начальная(или общая)для всех моделей инфа хранится в таблице content. header, например, может понадобится любому типу контента. Далее, в зависимости от указанного класса, догружаются дополнительные свойства, если они есть. в url используется id контента. А таблица node, это лишь ассоциативная таблица создающее дерево сайта. Если обратили внимание, то там два внешних ключа parent_id ссылка на родительский узел в этой же таблице и content_id - ссылка на запись в таблице content. Так мы обеспечим целостность данных и плюс можем нескольким узлам node "дать" один и тот же контент. Получается что в разных категориях может располагаться один материал. Материал может иметь "под собой" другой материал или даже категорию. Что в joomla, например, напрочь отсутствует и эмулируется тегами или достигается сторонними костылями гордо именуемыми расширениями...
1
25.02.2014, 19:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2014, 19:12
Привет! Вот еще темы с ответами:

MVC закрепление материала - PHP
Написал простецкую гостевую, используя MVC паттерн(на мой взгляд используя). Хотелось бы услышать мнение опытных товарищей, насколько мой...

Счётчик уникальных просмотров материала - PHP
Поискал по форуму, не нашёл ничего годного, думаю этот тред будет полезен многим кто ищет ответ в рамках этого сайта. Есть у меня...

Обновление материала в БД из админки (не открывается форма) - PHP
Почему после выбора статьи не открывается форма ? <?php if (!isset($id)) { $result = mysql_query("SELECT id, title FROM...

Добавление материала на страницу при опускании скролла вниз - PHP
Не могу понять, как это реализовывается. Догадываюсь, что необходимо подключать ajax. Не хочется изобретать велосипед. Может, кто-нибудь...


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

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

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