web-dev-qa-db-ja.com

検索モジュールアクションのURLエイリアスの変更

「検索/ノード」用に作成したURLエイリアスの存在を検索モジュールに認識させるのに苦労しています。ただし、頑固にデフォルトパスを使用します。

私のテンプレートでは、次のようなものを使用しています:

function mytheme_form_alter(&$form, &$form_state, $form_id) {
  switch($form_id){    
  case 'search_form':
    $form['#action'] = drupal_get_path_alias('/search/node'); // = '/' . drupal_get_path_alias('search/node') does not work either
    break;

  }
}

結果が表示されても、URLは次のようになります。

/search/node/[search-string]

パスがハードコードされており、エイリアス関数が省略されているかどうか誰かが知っていますか?

6
Artur

私は検索モジュールのURLをカスタマイズしようとする多くの悲惨さを経験したので、あなたの痛みを感じました!

これは_search/node_ページにリダイレクトする送信ハンドラなので、リダイレクトをオーバーライドするには独自のハンドラを追加する必要があります。

_function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'search_form') {
    $form['#action'] = 'search';
    $form['#submit'][] = 'MYMODULE_search_form_submit';
  }
  else if ($form_id == 'search_box_form' || $form_id == 'search_theme_form') {
    $form['#submit'][] = 'MYMODULE_search_form_submit';
  }
}

function MYMODULE_search_form_submit(&$form, &$form_state) {
  $default = search_get_default_module_info();
  $form_state['redirect'] = str_replace("$default[module]/", '', $form_state['redirect']);
}
_

そのコードは、ユーザーが_search/string_ではなく_search/node/string_で検索できるようにすることを唯一の目的とするモジュールからのものであるため、エイリアス設定と一致するようにいくつか変更する必要がありますが、役立つ場合がありますあなたを始めます。

hook_menu_alter()を使用して検索URLをオーバーライドするために使用される追加のコードを次に示します。

_function MYMODULE_menu_alter(&$items) {
  drupal_static_reset('search_get_info');
  $default_info = search_get_default_module_info();
  if ($default_info) {
    foreach (search_get_info() as $module => $search_info) {
      $path = 'search/' . $search_info['path'];
      unset($items[$path]);
      unset($items["$path/%menu_tail"]);
    }

    $items['search/%menu_tail'] = array(
      'title' => 'Search',
      'load arguments' => array('%map', '%index'),
      'page callback' => 'search_view',
      'page arguments' => array($default_info['module'], 1),
      'access callback' => '_search_menu_access',
      'access arguments' => array($default_info['module']),
      'type' => MENU_CALLBACK,
      'file' => drupal_get_path('module', 'search') . '/search.pages.inc'
    );
  }
}
_

基本的に、検索パスのメニュー項目を削除し、それらを単一のものに置き換えます。これは非常に特定の条件(つまり、1つの検索タイプしか有効にしていない場合)でのみ役立ちますが、少なくともうまくいくものではありません。

3
Clive

Cliveのおかげで、別の検索パスを追加する独自の検索モジュールを作成できたので、mysite.com/searchpathの下で、使用するSEARCH_MODULEから検索結果を取得します。

「変数」の例:
MYMODULE-以下のフックを実装するカスタムモジュール
SEARCH_MODULE-使用したい検索モジュール
searchpath-検索結果のパス

// Custom search path alias
function MYMODULE_form_search_form_alter(&$form, &$form_state, $form_id) {
  $form['#action'] = 'searchpath';
  $form_state['action'] = 'searchpath';
  $form['#submit'][] = '_MYMODULE_search_form_submit';
}

function MYMODULE_form_search_block_form_alter(&$form, &$form_state, $form_id) {
  $form['#submit'][] = '_MYMODULE_search_form_submit';
}

function _MYMODULE_search_form_submit(&$form, &$form_state) {
  $form_state['redirect'] = 'searchpath/'.$form_state['values']['search_block_form'];
}

// Add searchpath to available paths
function MYMODULE_menu_alter(&$items) {
  $path = 'searchpath';
  $items[$path] = array(
    'title' => t('Search'),
    'page callback' => 'search_view',
    'page arguments' => array('SEARCH_MODULE', 1),
    'access callback' => '_search_menu_access',
    'access arguments' => array('SEARCH_MODULE'),
    'type' => MENU_LOCAL_TASK,
    'file' => drupal_get_path('module', 'search') . '/search.pages.inc',
    'weight' => -10, //Don't know what is it for
  );
  $items["$path/%menu_tail"] = array(
    'title' => t('Search'),
    'load arguments' => array('%map', '%index'),
    'page callback' => 'search_view',
    'page arguments' => array('SEARCH_MODULE', 1),
    'access callback' => '_search_menu_access',
    'access arguments' => array('SEARCH_MODULE'),

    // The default local task points to its parent, but this item points to
    // where it should so it should not be changed.
    'type' => MENU_LOCAL_TASK,
    'file' => drupal_get_path('module', 'search') . '/search.pages.inc',
    'weight' => 0,

    // These tabs are not subtabs.
    'tab_root' => 'searchpath/%',

    // These tabs need to display at the same level.
    'tab_parent' => 'searchpath',
  );
}

この例が役立つことを願っています。

2
jmarceli