私のサイトが質問 drupal.stackexchange.com/questions/105932 のように相対URLのみを使用するようにしようとしています
EDIT 3:Drupal 8.0.3以降では、これがデフォルトで行われます:
https://www.drupal.org/node/2650374
しかし、私はDrupal 8のコードを非推奨の関数を取り除くことによってこれに変更しました:
_function custom_file_url_alter(&$uri) {
global $base_path;
$scheme = file_uri_scheme($uri);
if (!$scheme || $scheme == 'public') {
if (!$scheme) {
$path = $uri;
}
else {
////$wrapper = file_stream_wrapper_get_instance_by_scheme($scheme);
$wrapper = \Drupal::service('stream_wrapper_manager')->getViaScheme($scheme);
$path = $wrapper->getDirectoryPath() . '/' . file_uri_target($uri);
}
// Clean up Windows paths.
$path = str_replace('\\', '/', $path);
$uri = $base_path . ltrim($path, '/');
}
}
_
問題は、画像を含む記事(またはファイルを含むコンテンツタイプ)を追加するたびに、_'Uncaught PHP Exception InvalidArgumentException: "The URI '/sites/default/files/field/image/h.jpg' is invalid. You must use a valid URI scheme." at /srv/www/example/core/lib/Drupal/Core/Url.php line 301, referer: http://example.com/node/add/article
_のようなエラーが発生することです。特定のアップロードされたファイルにリンクしているページにアクセスしたときにも、このエラーが発生します。
ドキュメントには、file_create_urlメソッドが呼び出されるたびにこのフックが呼び出されると記載されていますが、Drupalについて十分に理解していないため、このメソッドが呼び出されてUrl.phpが呼び出されるシナリオを理解できません。 Drupalがfile_create_urlを呼び出す理由は何ですか。また、スキームが使用されていないことに驚かされているのに、ほとんどすべてのシナリオが私のために機能しているのはなぜですか?
これに関する追加の情報やガイダンスはありがたいです。
編集:
関数(1)に入ったとき(2)から出たときの$ uriの例をいくつか示します。
_1: 'core/themes/stable/images/core/icons/5181c6/pencil.svg' 2: '/core/themes/stable/images/core/icons/5181c6/pencil.svg' 1: 'public://css/css_Ys2L0rGQLjkWZQC7f9g5LiLUni8xUQvB1HqJHn3TKK4.css' 2: '/sites/default/files/css/css_Ys2L0rGQLjkWZQC7f9g5LiLUni8xUQvB1HqJHn3TKK4.css' 1: 'public://field/image/h_0.jpg' 2: '/sites/default/files/field/image/h_0.jpg'
_
H_0の例は、h.jpg画像を使用して記事を作成した後に発生したもので、クラッシュして記事の作成を妨げていました。フォームを使用して画像をアップロードすると、このfile_url_alterコードを使用すると、小さなajaxが発生して画像のプレビューが表示されないことに気付きました。つまり、最初に画像を保存するときに、何かがfile_create_urlを呼び出そうとしていて、画像が適切に保存されていないため、ノードのフィールドとして追加できません。
また、バックトレースを出力しましたが、ThemeManager.phpのレンダリング関数が、file.moduleでこれを実行しようとするtemplate_preprocess_file_link()を呼び出した後にクラッシュが発生したようです:$variables['link'] = \Drupal::l($link_text, Url::fromUri($url, $options));
...最初に述べたエラーが発生しました。
編集2:
コアの1行を変更してこの作業を行いました。 file.moduleのtemplate_preprocess_file_link()の最後の行を$variables['link'] = \Drupal::l($link_text, Url::fromUri($url, $options));
から_$variables['link'] = $url;
_に変更しました。これにより、目立った問題なしにすべてのURLが相対的になります。コアをハッキングせずにこれを達成する方法を知っている人はいますか?または、これを行うとどのような悪影響が発生する可能性があるか知っていますか?
Drupal 8の新しい関数を見てみましょう。
uri
からfile_create_url()
を渡すと、絶対url
を取得します。次に、それをfile_url_transform_relative()
に渡すことができます。実際にローカルファイルを指している場合は、相対パスを取得します。