Может кто-нибудь помочь мне в определении URL без hook_menu и связать его с функцией в drupal? - PullRequest
0 голосов
/ 17 августа 2011

В Drupal я хочу определить URL без hook_menu(), чтобы я мог связать URL с функцией, которая будет возвращать JSON (я хочу вызвать его из кода JavaScript).

function(){
  $arr = array('a'=>'one', ..........);

  return json_encode($arr);
}

Дайте мне знать, как я могу определить URL без hook_menu() и связать его с функцией.

Ответы [ 3 ]

2 голосов
/ 18 августа 2011

Да, но нет

Если вам абсолютно необходимо взломать что-то, чтобы вызвать конкретный php-файл.Например, если у вас есть файл /somepath/yourscript.php, он может быть вызван из общей сети.Оттуда вам придется самостоятельно загружать Drupal, если вы хотите что-то в пространстве имен Drupal, или вам придется использовать require или include для каждого файла, где вы хотите что-то вызвать ... , ноэто плохая идея.

Для начальной загрузки Drupal вам понадобится что-то вроде этого:

include_once 'path.to.../includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

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

The Drupal Way

Вместо этого используйте то, что дает вам Drupal ... A menu hook, реализованный как MENU_CALLBACK.Это сразу же заберет запрос и отправит его на ваше усмотрение.В вашей функции ничто не мешает вам просматривать переменные $_POST и $_GET, но вы получаете немного сахара Drupal, поскольку ваш MENU_CALLBACK может принимать параметры URL, проверять их действительность и передавать их в вашу функцию, чтобы вы моглииметь некоторые гарантии того, что вы работаете с действительными данными.

Вам нужно только определить хук меню и функцию обратного вызова.Чтобы использовать проверку, вы можете использовать именованный аргумент, например %arg вместо % в примере ниже.Если вы используете именованные параметры, вы затем создадите функцию с именем arg_load($arg), которая обеспечит наличие у вас действительного параметра, а затем вернет значение, которое будет передано в ваш callback_function.Вот как может выглядеть ваш Drupal-код:

function your_module_menu(){
    $items['js/calls/this/path/%'] = array(
      'title' => 'Some callback',
      'description' => 'Will call callback_function',
      'page callback' => 'callback_function',
      'page arguments' => array(4),
      'access arguments' => array('access content'),
      'type' => MENU_CALLBACK
   );

// moar code here!

return $items;
}

function callback_function($url_var){
  // drupal_json_output manages your content-type header
  // and the json_encode for you.
  drupal_json_output($url_var);
}

Я думаю, что Drupal-путь намного лучше, чем взломанный однофайловый, по нескольким причинам.Во-первых, разработчики поймут, что вы делаете, если вы пойдете по пути Drupal.Во-вторых, вы можете изменить URL-адрес по мере необходимости.

Единственная причина, по которой я бы выбрал автономный файл, заключается в том, что файл не имеет ничего общего с чем-либо необходимым из Drupal И , чтобы действие было чертовски быстрым.Как и так быстро, разница во времени между загрузкой Drupal и не займет слишком много времени.В этом случае я бы, вероятно, использовал apache или nginx для пересылки URL-пути к файлу где-то еще в файловой системе.И если это так, я с удовольствием поеду свой скромный пирог.

1 голос
/ 18 августа 2011

Согласовано. Ты не можешь. В друпале есть несколько способов раскрытия URL.

  • Физический файл существует, и поэтому вы можете получить к нему доступ напрямую ( скорее всего это будет за пределами друпала)
  • Через hook_menu
  • через просмотр страниц обратного вызова
  • через псевдоним URL
  • ... и пара других модулей, которые обрабатывают URL-адреса ...

Причина этого в том, что URL, на которые вы, вероятно, ссылаетесь, на самом деле не существует. Реальный путь path / json на самом деле - index.php? Q = path / json к серверу apache

Если вы хотите получить URL, просто выведите код JSON. Завершите страницу вызовом: drupal_json (..) [http://api.drupal.org/api/drupal/includes--common.inc/function/drupal_json/6]

1 голос
/ 18 августа 2011

Вы не можете.Каждый URL, предоставляемый модулем, отображается через hook_menu().Это единственный способ сообщить Drupal, какие URL-адреса обрабатываются модулем.

Существует множество функций Drupal, которые возвращают объект JSON и связаны с URL-адресами, определенными в hook_menu();например, poll_choice_js () является обратным вызовом страницы для poll / js .Тот факт, что URL-адрес определяется с помощью hook_menu(), не имеет никакого значения для кода JavaScript, который использует URL-адрес для получения необходимого объекта JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...