hook_menu [Решено]

Главные вкладки

Аватар пользователя stamzevel stamzevel 16 марта 2010 в 20:27

Всем доброго времени суток.
Недавно познакомился с Друпал.
Никак не могу разобраться с хуком 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
}
?>

но мне так не надо.
Где я ошибаюсь, помогите пожалуйста кто знает.

Комментарии

Аватар пользователя stamzevel stamzevel 16 марта 2010 в 21:16

"RxB" wrote:
Такой путь из hook_init() лучше реализовывайте, у вас все страницы под него попадают

Может подскажете как правильно реализовать это из hook_init() ? Я с таким хуком еще не знаком, посмотрел API, он ничего не принимает и ничего не возвращает. Как сказать системе, что бы не делал 404-ый редирект?

Аватар пользователя stamzevel stamzevel 16 марта 2010 в 21:29

"RxB" wrote:
Давайте начнём с того что вам вообще надо получить

У меня есть страницы
/магазин_цветов_1.html
/магазин_цветов_2.html
/магазин_цветов_3.html
...

В каждом магазине есть галереи букетов:
/магазин_цветов_1/букеты_цветов.html
/магазин_цветов_1/свадебные_букеты.html
/магазин_цветов_1/кактысы.html
....

/магазин_цветов_2/букеты_цветов.html
/магазин_цветов_2/свадебные_букеты.html
/магазин_цветов_2/кактысы.html
....

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

Вот такой сценарий.

Аватар пользователя stamzevel stamzevel 16 марта 2010 в 21:42

"RxB" wrote:
Это лучше через алиасы сделать

Со страницами типа:
/магазин_цветов_1.html
/магазин_цветов_2.html
/магазин_цветов_3.html
...
так и делается потому, что это обычные ноды, а вот эти ссылки:
/магазин_цветов_1/букеты_цветов.html
/магазин_цветов_1/свадебные_букеты.html
/магазин_цветов_1/кактысы.html
....
/магазин_цветов_2/букеты_цветов.html
/магазин_цветов_2/свадебные_букеты.html
/магазин_цветов_2/кактысы.html
....
создаются динамически модулем, который приклеплен к страницам с этим type-ом.

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 16 марта 2010 в 21:49

"stamzevel" wrote:

так и делается потому, что это обычные ноды, а вот эти ссылки:

Так если это ноды, то зачем вам путь %/%?
Вам надо цепляться на node/%/букеты цветов
Посмотрите как это сделано в модуле node, для того же пункта меню с ревизиями

Аватар пользователя stamzevel stamzevel 16 марта 2010 в 21:57

я делаю вот так:

<?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.

где у меня ошибка?

Аватар пользователя stamzevel stamzevel 16 марта 2010 в 23:06

"RxB" wrote:
Начнём с того, что пересобирали ли вы меню?

Я не совсем понимаю вопрос.
У меня есть основное меню, которое не меняется на протяжении всего сайта.
Плюс, на некоторых страницах, я строю дополнительное меню. логически это выглядит так:
в каждом цветочном магазине есть галереи букетов, цветов... всего таких галерей, на данный момент 8, но их колличество может измениться.
Страница цветочного магазина - это node с url alias => /магазин_цветов_1.html
на ней, модулем строится динамическое меню галерей этого магазина. и ссылки на галереи должны выгляадеть следующим образом:
/магазин_цветов_1/галерея_букетов.html
/магазин_цветов_1/галерея_венков.html
/магазин_цветов_1/галерея_кактусов.html
и т.д.

Аватар пользователя stamzevel stamzevel 17 марта 2010 в 10:27

"stamzevel" wrote:
Я не совсем понимаю вопрос.
У меня есть основное меню, которое не меняется на протяжении всего сайта.
Плюс, на некоторых страницах, я строю дополнительное меню. логически это выглядит так:
в каждом цветочном магазине есть галереи букетов, цветов... всего таких галерей, на данный момент 8, но их колличество может измениться.
Страница цветочного магазина - это node с url alias => /магазин_цветов_1.html
на ней, модулем строится динамическое меню галерей этого магазина. и ссылки на галереи должны выгляадеть следующим образом:
/магазин_цветов_1/галерея_букетов.html
/магазин_цветов_1/галерея_венков.html
/магазин_цветов_1/галерея_кактусов.html
и т.д.

Так что, неужели в друпале не возможна реализация такого сценария?

Аватар пользователя wolfXXXL wolfXXXL 17 марта 2010 в 11:54

Ну раз Вы уже строите ссылку вида:

"stamzevel" wrote:
<?php
$items["node/%/%"] = array(
'title' => t("qweqweqew"),
'access arguments' => array('access content'),
'page callback' => 'categories_menu_sidurei_prahim',
);
?>

То тогда уже чтоб не было проблем и пишите:

$items['shop/%/%'] = array(
    '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) {
// тут Ваши действия
}

Аватар пользователя stamzevel stamzevel 17 марта 2010 в 15:08

"wolfXXXL" wrote:
Ну раз Вы уже строите ссылку вида:
"stamzevel" написал(а):
<?php
$items["node/%/%"] = array(
        'title' => t("qweqweqew"),
        'access arguments' => array('access content'),
        'page callback' => 'categories_menu_sidurei_prahim',
    );
?>
То тогда уже чтоб не было проблем и пишите:
$items['shop/%/%'] = array(
'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(12),
    
'access arguments' => array('access content'),
    
'type' => MENU_CALLBACK,
  );
?>

неужели все так сложно или никто не знает как такое реализовывается?

Аватар пользователя Siegfrid@drupal.org Siegfrid@drupal.org 17 марта 2010 в 17:45

<?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ть с чаепитием, так что удачи.

Аватар пользователя stamzevel stamzevel 17 марта 2010 в 22:38

всем большое спасибо за ответы, но они не совсем то, что я спрашиваю.

Можно привязать такие ссылки
/магазин_цветов_1/букеты_цветов.html
/магазин_цветов_1/свадебные_букеты.html
/магазин_цветов_1/кактысы.html
....
/магазин_цветов_2/букеты_цветов.html
/магазин_цветов_2/свадебные_букеты.html
/магазин_цветов_2/кактысы.html
к этому коду:?

"<a href="mailto:Siegfrid@drupal.org">Siegfrid@drupal.org</a>" wrote:

$items["/%your_function/%myurl"] = array(
        'title' => t("qweqweqew"),
        'access arguments' => array('access content'),
        'page callback' => 'categories_menu_sidurei_prahim',
    );
?>
function your_function(){
return ...;
}

Аватар пользователя Siegfrid@drupal.org Siegfrid@drupal.org 18 марта 2010 в 8:25

Для тех, кто на подводной лодке - все, что вы хотите сдалать, уже реализовано с помощью модулей node, taxonomy, pathauto и views (создание каталогов и блоков).

Что на счет программинга - читайте книжку drupal web development second edition - для шестерки и только на английском.

Аватар пользователя stamzevel stamzevel 18 марта 2010 в 10:11

"<a href="mailto:Siegfrid@drupal.org">Siegfrid@drupal.org</a>" wrote:
Для тех, кто на подводной лодке

Да ребята, спасибо всем огромное. разобрался в конце-концов сам. Может кому пригодится, так пишу, что сделал. В модуле определил хук hook_init(). там делаю преоверку, если это мой клиент, то ставлю в $_GET['q'] правельный внутрений путь. Вот и все.
Но за попытки помочь - все равно спасибо.