Организация и разбор ЧПУ. Узел, бренд, товар

gv0zd

Новичок
Организация и разбор ЧПУ. Узел, бренд, товар

С самими чпу проблем нет, вопрос в том как их правильно организовать и разбирать 

Сейчас использую в структуре каталогов nested sets. К каждой строке для удобства разбора ЧПУ добавил 2 поля

Т.е. для
Каталог
--Мобильные телефоны
----Nokia

Таблица nodes имеет след вид
node_id|l|r|parent|title|rewrite|rewrite_path
1|1|6|0|Каталог|catalog|/catalog/
2|2|5|1|Мобильные телефоны|mobile|/catalog/mobile/
3|3|4|2|Nokia|nokia|/catalog/mobile/nokia/

Таблица товаров products имеет след вид
product_id|node|title|rewrite
1|3|E71|e71
2|3|6500 Classic Bronze|6500-classic-bronze

Таким образом, если через чпу приходит запрос /catalog/mobile/nokia/6500-classic-bronze /
И если запрос
SELECT … FROM `nodes`, `products` WHERE `products`.`node` = `nodes`.`node_id` AND `products`.`rewrite` = ‘6500-classic-bronze’ AND `nodes`.`rewrite_path` = ‘/catalog/mobile/nokia/’
возвращает одну строку, значит это товар

Если же прилетает запрос /catalog/mobile/nokia/
То я сначала ищу
SELECT … FROM `nodes`, `products` WHERE `products`.`node` = `nodes`.`node_id` AND `products`.`rewrite` = ‘nokia’ AND `nodes`.`rewrite_path` = ‘/catalog/mobile/’
Естественно ничего не нахожу и тогда отправляю второй запрос
SELECT … FROM `nodes` WHERE `nodes`.`rewrite_path` = ‘/catalog/mobile/’
возвращает только одну строку, значит это узел


Все работает и нет у меня претензий кроме одного, Бренд у меня включен в структуру. Что неправильно и неудобно при поиске

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

Если раньше у нас в чпу были в параметра узел и товар, то сейчас еще и влазит бренд. Значит возрастет количество оперций для определения того что запросили в урл:
-товар
-узел
- либо перечень товаров одного бренда в узле

Так же непонятно как организовать урл если у товара нет бренда, лепить для простоты noname?
 

cyrex

Новичок
Сколько сложностей на пустом месте... Морока с NS имеет смысл в том случае, когда URL может иметь произвольный вид, с любым уровнем вложенности. Так как у вас всего два вида ссылок (по крайней мере, других примеров в посте нет), то нужно оставить только две таблицы: products и brands. В каждой таблице сделать поле url_title, значение которого будет подставляться в URL.

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

gv0zd

Новичок
Так это я только пример привел такой, реально каталог на 500 узлов. Уровни вложенности от 1 до 6

По этой причине и заморачиваюсь
 

cyrex

Новичок
Что значит на 500 узлов? 500 элементов в урле? Приведите примеры какие-нибудь своих ссылок. Может быть я действительно чего-то не понимаю.
 

gv0zd

Новичок
500 общее количество узлов в таблице nodes
А уровни вложенности от 1 до 6
т.е. есть такие
/catalog/aaa/товар или такие /catalog/aaa/бренд/товар

а есть и такие

/catalog/aaa/bbb/ccc/ddd/eee/fff/товар или такие /catalog/aaa/bbb/ccc/ddd/eee/fff/бренд/товар

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

В голову пришел такой вариант

Приходит такой урл
/catalog/aaa/bbb/ccc/ddd/eee/fff/бренд/товар
по первому узлу /aaa/ я через NS собираю всех детей узла в многомерный массив массив по уровням вложенности.

Получаю что-то типа
[level1]
---[parent][rewrite]=node_id
---[parent][rewrite]=node_id
[level2]
---[parent][rewrite]=node_id
---[parent][rewrite]=node_id
---[parent][rewrite]=node_id
---[parent][rewrite]=node_id
и т.д.

Это первый запрос в базу и переборка массива

Потом бью /bbb/ccc/ddd/eee/fff/бренд/товар exploadом на куски в цикле пробегаюсь по массиву который создал ранее.

Что дает мне возможность определеить что /fff/ последний элемент в структуре, раз всего элементов больше на 2 значит предпоследний - бренд, последний - товар

После этого одним запросом выбираю и товар и бренд

Итого всего 2 запроса + 2 перебора небольших массивов
Может выглядит и дико но вполне функционально :) как мне кажется

Но бывают товары, которые нет смысла бить на бренды, они просто лежат в папке (мелочь всякая китайская) как в таком случае оптимальнее подойти?
 

cyrex

Новичок
А что такое aaa, bbb или ccc? У вас в любом случае последний элемент урла это либо бренд, либо товар. По барабану, сколько там перед ним элементов и что они собой представлют.
 

gv0zd

Новичок
>А что такое aaa, bbb или ccc?
/catalog/notebooks/accessories/bags/13inches/бренд/товар

Это так, что в голову сразу приходит
Есть глубже
> У вас в любом случае последний элемент урла это либо бренд, либо товар.

Как раз нет, может быть так:

/catalog/notebooks/accessories/bags/13inches/бренд/товар (собственно товар)
/catalog/notebooks/accessories/bags/13inches/бренд/ (на этой странице перечень товаров)
/catalog/notebooks/accessories/bags/13inches/ (на этой странице перечень брендов)
/catalog/notebooks/accessories/bags/ (на этой странице перечисление подчиненных узлов 12inches, 13 inches и т.д.)
/catalog/notebooks/accessories/ (на этой странице перечисление подчиненных узлов accumulators, bags, doc-station и т.д)
...



/catalog/cables/usb/Товар (товар)
/catalog/cables/usb/ (а тут брендов не будет, сразу желательно товары пускать, чтоб не выводить список из одного "бренда" noname)

А еще забыл вполне реально иметь и телефон и модем с одним названием (значением rewrite)
т.е. в таблице products значения rewrite не будут уникальными, вполне могут повторяться
 

Вурдалак

Продвинутый новичок
Краткость — сестра таланта...

Таблицу категорий можно оставить такой, какая есть, только нужно добавить только колонку "without_brand" для того, чтобы выводить сразу товары, а не бренды, если предполагается, что у товара нет бренда.

В самом начале просто запрос
[sql]SELECT `node_id`, ..., `title` FROM `nodes` WHERE `rewrite_path` = '/catalog/notebooks/accessories/bags'[/sql]
Потом нужно сделать запрос подкатегорий. Если подкатегорий нет, то выводи либо товары, либо бренды в зависимости от значения "without_brand".

-~{}~ 16.12.09 22:18:

Какой-то мерзкий тут обработчик тега [sql] ...
 

gv0zd

Новичок
А если такой урл пришел?
/catalog/notebooks/accessories/bags/13inches/бренд/товар
откусывать по куску и делать в сумме три запроса чтоб только найти узел?
 

Вурдалак

Продвинутый новичок
Да, подобный формат запроса оставляет только такую возможность.
 

gv0zd

Новичок
Получается три запроса на то чтобы определить узел и потом еще удин чтоб опрелелить товар без бренда либо с ним

И чуть выше я предлагал более мутный вариант, с меньшими количеством запросов

Интересно как определить лучший вариант. Тупо сравнивать миллисекунды? Или еще какие критерии есть?
 

Вурдалак

Продвинутый новичок
Автор оригинала: gv0zd
Получается три запроса на то чтобы определить узел и потом еще удин чтоб опрелелить товар без бренда либо с ним
"Потом ещё" не требуется.

1. Запрос "/category/brand/product"
2. Запрос "/category/brand"
3. Запрос "/category" — тут уже ты получишь тип категории: с брендами или без.

Ну и твой вариант возможен.

Но так как запросы простые, то будет ли их 2 или 3 — разницы особой нет.
 

Sigorma

Новичок
у себя использую урлы вида
www.sample.com/path1/path2/pathX/productName.html

"/path1/path2/pathX/" - ищем в таблице каталогов, в таблице два столбца для хранения путей. в первом столбце храню полный путь до страницы например "/path1/path2/pathX/path100/" в другом только часть пути(уровень) относящаяся к данному узлу, т.е. "/path100/"

"productName.html" - ищем в таблице продуктов

в главный обработчик (index.php) приходит массив вида:

Код:
Array
(
    [path] => /path1/path2/pathX/
    [item] => samsung100 (этот элемент может быть пустым)
)
 

gv0zd

Новичок
Sigorma
Мда, что-то про html для товара я как-то не подумал...
Спасибо
 

Sigorma

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

gv0zd

Новичок
решение упрощает, в некотором роде определение того что перед нами, но несколько лишает чпу кошерности :) имхо

наверное все таки осталвлю без хтмл пусть лучше пара лишних запросов на сотую секунды

Тут с Вурдалак соглашусь

Ничего принципиального против html не имею, просто без них больше нравится

Всем спасибо
 
Сверху