web-dev-qa-db-ja.com

相対メニューリンクを作成するにはどうすればよいですか?

Drupalとは別のコンテンツにリンクする必要があるローカルホスト上のサイトでの作業で忙しい。

現在のメニューパスはhttp://mylocalsite/the_folder_for_the_other_contentのように設定されています。 <front>/the_folder_for_the_other_contentまたは/the_folder_for_the_other_contentまたはthe_folder_for_the_other_contentを試してみると、「パス 'whatever_I_use'が無効であるか、アクセス権がありません。」というエラーが表示されます。

ライブに移行するときは、すべてのメニュー項目がhttp://myrealsite/the_folder_for_the_other_contentを指すようにする必要があることは明らかです。

ライブ配信時にすべてのメニューパスを編集する必要がないように設定するにはどうすればよいですか?

10
Martin Duys

kiamlalunoの答えは私にとってはうまくいきませんでした。 %menu_tailを使用すると、大量のエラーが発生し、menu_tail_load関数が引数の欠落に関する問題を抱えていました。

_Warning: Missing argument 2 for menu_tail_load(), called in  ... /includes/menu.inc on line 579 and defined in menu_tail_load() (line 827 of ... /includes/menu.inc).
Warning: Missing argument 3 for menu_tail_load(), called in ... /includes/menu.inc on line 579 and defined in menu_tail_load() (line 827 of ... /includes/menu.inc).
_

私にとって何がうまくいったか

_function allow_menu_links_menu() {
  $items = array();
  $items['sites/d8/files/%'] = array(
    'title' => 'Folder Content',
    'page callback' => 'allow_menu_links_cb', /* never called */
    'access callback' => TRUE,
  );
  return $items;
}
_

次に、_sites/d8/files/Documents/MyFile.pdf_のようなパスを持つメニュー項目を使用して、sites/d8/filesフォルダー(およびサブフォルダー)内のファイルを提供できます。

メニューシステムは、次に_href="/sites/d8/files/Documents/MyFile.pdf"_のようなリンクを生成します。

カスタムメニューモジュールを使用しない場合、メニューシステムは上記で始まるパスを拒否します。

_http:sites/d8/files/Documents/MyFile.pdf_のようなパスを使用しようとすると、_href="http:sites/d8/files/Documents/MyFile.pdf"_のようなリンクが生成されます。これは、サイトのルートにいるときに機能しますが、コンテンツページにいるときは、ブラウザーコンテンツページに関連するURLを解釈しますが、機能しません。

_http:/sites/d8/files/Documents/MyFile.pdf_のようなパスを使用する場合、メニューシステムはそれを受け入れますが、メニューシステムは_href="http:/sites/d8/files/Documents/MyFile.pdf"_のようなリンクを生成し、ブラウザ(少なくともSafari)は_href="http://sites/d8/files/Documents/MyFile.pdf"_として解釈します。 、「sites」という名前のサーバーの検索に失敗しました。

(詳細な調査で、menu_tailを使用するコードが失敗する理由は、ここに記載されているように、「ロード引数」を追加する必要があるためです: http://api.drupal.org/api/drupal/includes--menu .inc/function/menu_tail_load/7 。kiamlalunoのコードで$ itemsの定義に'load arguments' => array('%map', '%index'),を追加すると機能します。menu_tail_loadで明示的なロード引数が必要かどうかの問題についても説明しますここ: http://drupal.org/node/298561

(新しいモジュールを有効にすることを忘れないでください。そうしないと、メニューシステムが新しいリンクを受け入れません)

4
nachbar

新しいリンクを追加すると、リンクは menu_edit_item_validate() から検証され、パスが有効かどうかを確認するために drupal_valid_path() が呼び出されるか、またはユーザー。
drupal_valid_path()TRUEを返します

  • パスは<front><front>/directory、または類似のパスは除外されます)
  • パスは外部パスです(関数 rl_is_external()TRUEを返します)
  • パスはメニューコールバックに関連付けられています

絶対URLの使用とは別に、唯一の解決策は、使用するパスに関連付けられたメニューコールバックを定義するカスタムモジュールを用意することです。
ファイルまたはディレクトリを指すURLを使用すると、Drupalを呼び出さずにWebサーバーがそのファイルまたはディレクトリを表示するはずです。 Drupalに付属する.htaccessファイルには次のディレクティブが含まれているため、Apacheでそれが起こります。

# Pass all requests not referring directly to files in the filesystem to
# index.php. Clean URLs are handled in drupal_environment_initialize().
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^ index.php [L]

あなたの場合、カスタムモジュールには次のようなコードが含まれている必要があります。

function mymodule_menu() {
  $items = array();

  $items['the_folder_for_the_other_content/%menu_tail'] = array(
    'title' => 'Folder content', 
    'page callback' => 'mymodule_view', 
    'access callback' => TRUE,
    'load arguments' => array('%map', '%index'), 
  );

  return $items;
}

titlepage callbackには任意の値を使用できます。そのメニューコールバックは呼び出されないはずです。 access callbackの値は、Drupal=すべてのユーザーがそのメニューコールバックにアクセスできることを示しています。

別の方法として、「alias_for_directory /%menu_tail」に関連付けられたメニューコールバックを定義して、ユーザーに表示したいディレクトリにリダイレクトすることができます( drupal_goto() を使用)。サーバーが.htaccessのコンテンツを使用していないときにこのソリューションを使用し、URLが既存のファイルまたはディレクトリを指している場合でもDrupalを呼び出します。

5
kiamlaluno

私にとっては、次のトリックがありました(drupal 6))。

同じドメインの別のURLにリダイレクトしたい場合、Drupalがhttp://www.example.comで実行されていて、http://www.example.com/frontendへのリンクが欲しい

メニュー項目で、パスとして入力してください:

http:/frontend

drupalメニューは以下にリンクします:http://www.example.com/frontend

Httpsを使用する場合は、メニュー項目のパスフィールドにhttps:/ frontendと入力する必要があります。

3
Paul

次のリンクの問題を解決しました:

http://groups.drupal.org/node/210308 および http://drupal.org/node/372252

私のテーマはメニューを間違って印刷していたため、すべてのアイテムが私の現在の場所(つまり、/ logoutではなくadmin/logout)に関連していることがわかりました。

お役に立てれば。

1
the_dillio

Sqlを使用して、メニュー構造のリンクを置き換えました。

UPDATE menu_links SET link_path = replace(link_path, "livesite.com", "localhost.com");

これが必要かどうかはわかりませんが、メニューキャッシュをフラッシュしました。

1
streamfan