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


10

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

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


@irishbuzzには以下のDrupal 6の回避策がありますが、Drupal 7ではこれを回避できることを望んでいました。
Martin Duys

DrupalはWebサーバーのルートディレクトリにインストールされていますか?
kiamlaluno

私のlocalhostバージョンではありませんが、最終的に稼働すると、public_htmlフォルダーのルートになります。これは「Webサーバーのルート」としてカウントされますか?
Martin Duys

「Webサーバーのルートディレクトリ」とは、Apacheで「DocumentRoot」ディレクティブを使用して設定されたディレクトリで、デフォルトではpublic_htmlディレクトリです。のようなURLを使用する場合のApacheアクセスディレクトリですhttp://example.com/
kiamlaluno

次に:はい、最終的にサイトはルートディレクトリに配置されます
Martin Duys

回答:


4

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フォルダー(およびサブフォルダー)内のファイルを提供できます。 sites/d8/files/Documents/MyFile.pdf

メニューシステムは、次のようなリンクを生成します href="/drupal//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 /'load arguments' => array('%map', '%index'), 7。kiamlalunoのコードで$ itemsの定義に追加すると機能します。menu_tail_loadが明示的なロード引数を必要とするかどうかの問題についてもここで説明します:http ://drupal.org/node/298561 )

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


5

新しいリンクを追加すると、リンクがから検証されmenu_edit_item_validate()を呼び出します、drupal_valid_pathを()パスが有効であるかどうかを確認するために、あるいはそれがユーザーからアクセスすることができます。
drupal_valid_path()次のTRUE場合に戻ります

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

絶対URLの使用とは別に、唯一の解決策は、使用するパスに関連付けられたメニューコールバックを定義するカスタムモジュールを用意することです。
ファイルまたはディレクトリを指すURLを使用する場合、WebサーバーはDrupalを呼び出さずにそのファイルまたはディレクトリを表示する必要があります。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;
}

タイトルページのコールバックには任意の値を使用できます。そのメニューコールバックは呼び出さないでください。アクセスコールバックの値は、すべてのユーザーがそのメニューコールバックにアクセスできることをDrupalに伝えます。

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


3

私にとっては、次のことがトリックを行いました(drupal 6)。

同じドメインの別のURLにリダイレクトしたいとします。たとえば、Drupalが実行さhttp://www.example.comれていて、http://www.example.com/frontend

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

http:/frontend

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

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


これが7 /で機能するかどうかのアイデア
Martin Duys

わからない、試してみてください。
ポール、

この方法は、バージョン7.22の時点では機能していません。
Rick

1
これはDrupal 7.23で動作します。私はしばらくこれをやろうとしてきました、もしできればあなたに+10を
賛成し


1

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

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

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


なぜクエリを変更したいのですか?推奨されません。
gerl 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.