Всем доброго времени суток.
Недавно познакомился с Друпал.
Никак не могу разобраться с хуком hook_menu.
Мне надо реализовать url вот такой конфигурации:
<?php
function mymodule_menu()
{
$items = array();
$items['/%/%'] = array(
'title' => t('My menu item'),
....
);
return
$items
}
?>
Активирую модуль, строю динамический линк, нажимаю и попадаю на 404 редирект.
вот так тоже не работает:
<?php
function mymodule_menu()
{
$items = array();
$items['/%/myurl'] = array(
'title' => t('My menu item'),
....
);
return
$items
}
?>
Вот так работает:
<?php
function mymodule_menu()
{
$items = array();
$items['/myurl/%'] = array(
'title' => t('My menu item'),
....
);
return
$items
}
?>
но мне так не надо.
Где я ошибаюсь, помогите пожалуйста кто знает.
Комментарии
Такой путь из hook_init() лучше реализовывайте, у вас все страницы под него попадают
Может подскажете как правильно реализовать это из hook_init() ? Я с таким хуком еще не знаком, посмотрел API, он ничего не принимает и ничего не возвращает. Как сказать системе, что бы не делал 404-ый редирект?
Давайте начнём с того что вам вообще надо получить
У меня есть страницы
/магазин_цветов_1.html
/магазин_цветов_2.html
/магазин_цветов_3.html
...
В каждом магазине есть галереи букетов:
/магазин_цветов_1/букеты_цветов.html
/магазин_цветов_1/свадебные_букеты.html
/магазин_цветов_1/кактысы.html
....
/магазин_цветов_2/букеты_цветов.html
/магазин_цветов_2/свадебные_букеты.html
/магазин_цветов_2/кактысы.html
....
колличество галерей определено заранее, но может меняться, а колличество магазинов может быть бесконечное множество.
Вот такой сценарий.
Это лучше через алиасы сделать
Со страницами типа:
/магазин_цветов_1.html
/магазин_цветов_2.html
/магазин_цветов_3.html
...
так и делается потому, что это обычные ноды, а вот эти ссылки:
/магазин_цветов_1/букеты_цветов.html
/магазин_цветов_1/свадебные_букеты.html
/магазин_цветов_1/кактысы.html
....
/магазин_цветов_2/букеты_цветов.html
/магазин_цветов_2/свадебные_букеты.html
/магазин_цветов_2/кактысы.html
....
создаются динамически модулем, который приклеплен к страницам с этим type-ом.
Так если это ноды, то зачем вам путь %/%?
Вам надо цепляться на node/%/букеты цветов
Посмотрите как это сделано в модуле node, для того же пункта меню с ревизиями
я делаю вот так:
<?php
$items["node/%/%"] = array(
'title' => t("qweqweqew"),
'access arguments' => array('access content'),
'page callback' => 'categories_menu_sidurei_prahim',
);
?>
и на странице: /магазин_цветов_1.html
строю ссылку: /магазин_цветов_1/букеты_цветов.html
и попадаю с нее на страницу: Page not found.
где у меня ошибка?
Начнём с того, что пересобирали ли вы меню?
Я не совсем понимаю вопрос.
У меня есть основное меню, которое не меняется на протяжении всего сайта.
Плюс, на некоторых страницах, я строю дополнительное меню. логически это выглядит так:
в каждом цветочном магазине есть галереи букетов, цветов... всего таких галерей, на данный момент 8, но их колличество может измениться.
Страница цветочного магазина - это node с url alias => /магазин_цветов_1.html
на ней, модулем строится динамическое меню галерей этого магазина. и ссылки на галереи должны выгляадеть следующим образом:
/магазин_цветов_1/галерея_букетов.html
/магазин_цветов_1/галерея_венков.html
/магазин_цветов_1/галерея_кактусов.html
и т.д.
Так что, неужели в друпале не возможна реализация такого сценария?
Ну раз Вы уже строите ссылку вида:
То тогда уже чтоб не было проблем и пишите:
'title' => 'Shop',
'page callback' => 'categories_menu_sidurei_prahim',
'page arguments' => array(1, 2),
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);
function categories_menu_sidurei_prahim ($url1, $url2) {
// тут Ваши действия
}
Проблема в том, что мне изначально нужно получить ссылку такого формата
<?php
$items['%/%'] = array(
'title' => 'Shop',
'page callback' => 'categories_menu_sidurei_prahim',
'page arguments' => array(1, 2),
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);
?>
неужели все так сложно или никто не знает как такое реализовывается?
АЛИАСЫ
АЛИАСЫ
АЛИАСЫ
И как можно привязать Алиас не к ноду?
<?php
$items["/%your_function/%myurl"] = array(
'title' => t("qweqweqew"),
'access arguments' => array('access content'),
'page callback' => 'categories_menu_sidurei_prahim',
);
?>
function your_function(){
return ...;
}
Таким макаром система будет понимать, куда вы хотите попасть, иначе она действительно будет в заблуждении....
Единственное маленькое замечание:
taxonomy/term/%tid - это каталоги для магазинов (уже есть в системе)
node/%nid - это для цветов в этих магазинов (уже есть в системе)
И что самое главное, ставите модуль pathauto, активируете его и taxonomy, настраиваете словарик - магазины цветов, прописываете туды ваши магазины и создаете материал - node - типа цветы. Далее связываете материал со словарем и вуаля, ничего не надо программить.
В pathauto задаете шаблон для постоения алиасов и имеете свои странички с адресами:
/магазин_цветов_1.html
/магазин_цветов_2.html
/магазин_цветов_3.html
...
так и делается потому, что это обычные ноды, а вот эти ссылки:
/магазин_цветов_1/букеты_цветов.html
/магазин_цветов_1/свадебные_букеты.html
/магазин_цветов_1/кактысы.html
....
/магазин_цветов_2/букеты_цветов.html
/магазин_цветов_2/свадебные_букеты.html
/магазин_цветов_2/кактысы.html
Почитать про модули сможете в сети, настраивается ваша конфигурация минут за 20ть с чаепитием, так что удачи.
всем большое спасибо за ответы, но они не совсем то, что я спрашиваю.
Можно привязать такие ссылки
/магазин_цветов_1/букеты_цветов.html
/магазин_цветов_1/свадебные_букеты.html
/магазин_цветов_1/кактысы.html
....
/магазин_цветов_2/букеты_цветов.html
/магазин_цветов_2/свадебные_букеты.html
/магазин_цветов_2/кактысы.html
к этому коду:?
Для тех, кто на подводной лодке - все, что вы хотите сдалать, уже реализовано с помощью модулей node, taxonomy, pathauto и views (создание каталогов и блоков).
Что на счет программинга - читайте книжку drupal web development second edition - для шестерки и только на английском.
Да ребята, спасибо всем огромное. разобрался в конце-концов сам. Может кому пригодится, так пишу, что сделал. В модуле определил хук hook_init(). там делаю преоверку, если это мой клиент, то ставлю в $_GET['q'] правельный внутрений путь. Вот и все.
Но за попытки помочь - все равно спасибо.