web-dev-qa-db-ja.com

ビューの画像からURI値を抽出する-インデックスエラーの取得

ビューを使用してカスタムスライドショーを作成しようとしています。 ビュースライドショーモジュールを使用していないことに注意してください

私が達成する必要があるのは、コンテナー内の画像の相対URLをラップすることです。したがって、私のフィールドテンプレートは

/sites/default/files/background.jpg

私が抱えている問題は、URIにアクセスして生の値をいくつかのdivタグに書き込むことができるようにすることです。つまり、それが私が苦労している領域なので、すべてのdivコンテナーではなく、URLのみを書くことに焦点を当てています。それは後で来るでしょう。

画像については、タイトルと画像自体の2つのフィールドのみを持つ単純なコンテンツタイプがあります。探している画像を一覧表示するビューを作成しました。次に、ビュー内のフィールドテンプレートをカスタマイズします。これが私のコードです:

<?php
    $node = node_load($row->nid);
    $field_name = "field_image";
    $delta = 0;

    $field = field_get_items('node', $node, $field_name);
    $output = field_view_value('node', $node, $field_name, $field[$delta]);

    print ($output['#item']['uri']);

/* Everything below is for Debugging Purposes */  
    print "<br><br>";
    print "Field:  ";
    print_r($field);                    
    print "<br><br>";
    print "Output:  ";
    print_r($output);
    print "<br><br>";
?>

以下の出力を見ると、次のようなURIが表示されます。

public://public://sandy_beach_banner.jpg

これは正しいです。絶対ではなく相対リンクにする方法がわかったらすぐに、file_create_Url()を使用して実行します。

ただし、次のエラーメッセージが表示されます。

Notice: Undefined index: #item in include() (line 11 of 
/var/www2/html/annex/sites/all/themes/mytheme/templates/views-
view-field--banner-slide-show--field-image.tpl.php)

ファイル参照の11行目

print ($output['#item']['uri']);

これは理解できません。正しく参照していないと、探しているURI値を取得できません。それで...これは私を非常に混乱させます。私がここで見つけた例に従うようにしています: Rendering Drupal 7 Fields The Right Way 私が知ることができることから、これはD8(Iそれは間違っているかもしれません。それと、これを正しい方法で行う方法を合法的に学びたいと思います。

ここで何かアドバイスをいただければ幸いです。

出力

public://public://sandy_beach_banner.jpg

Field: Array ( [0] => Array ( [fid] => 5 [uid] => 1 [filename] => sandy_beach_banner.jpg [uri] => public://sandy_beach_banner.jpg [filemime] => image/jpeg [filesize] => 30663 [status] => 1 [timestamp] => 1444690263 [alt] => Sandy Beach [title] => Sandy Beach [width] => 800 [height] => 200 ) ) 

Output: Array ( [#theme] => image_formatter [#item] => Array ( [fid] => 5 [uid] => 1 [filename] => sandy_beach_banner.jpg [uri] => public://sandy_beach_banner.jpg [filemime] => image/jpeg [filesize] => 30663 [status] => 1 [timestamp] => 1444690263 [alt] => Sandy Beach [title] => Sandy Beach [width] => 800 [height] => 200 ) [#image_style] => [#path] => [#access] => 1 ) 

public://public://nyc_banner.jpg

Field: Array ( [0] => Array ( [fid] => 4 [uid] => 1 [filename] => nyc_banner.jpg [uri] => public://nyc_banner.jpg [filemime] => image/jpeg [filesize] => 480360 [status] => 1 [timestamp] => 1444690227 [alt] => NYC Banner [title] => NYC Banner [width] => 1200 [height] => 492 ) ) 

Output: Array ( [#theme] => image_formatter [#item] => Array ( [fid] => 4 [uid] => 1 [filename] => nyc_banner.jpg [uri] => public://nyc_banner.jpg [filemime] => image/jpeg [filesize] => 480360 [status] => 1 [timestamp] => 1444690227 [alt] => NYC Banner [title] => NYC Banner [width] => 1200 [height] => 492 ) [#image_style] => [#path] => [#access] => 1 ) 

public://public://hindu_banner.jpg

Field: Array ( [0] => Array ( [fid] => 3 [uid] => 1 [filename] => hindu_banner.jpg [uri] => public://hindu_banner.jpg [filemime] => image/jpeg [filesize] => 508630 [status] => 1 [timestamp] => 1444690189 [alt] => Hindu Banner [title] => Hindu Banner [width] => 2000 [height] => 560 ) ) 

Output: Array ( [#theme] => image_formatter [#item] => Array ( [fid] => 3 [uid] => 1 [filename] => hindu_banner.jpg [uri] => public://hindu_banner.jpg [filemime] => image/jpeg [filesize] => 508630 [status] => 1 [timestamp] => 1444690189 [alt] => Hindu Banner [title] => Hindu Banner [width] => 2000 [height] => 560 ) [#image_style] => [#path] => [#access] => 1 ) 
3
Allan

画像(または任意のファイル)からURLを取得する

なんらかの理由で、ファイル(おそらく画像)のURLを取得し、それをドキュメントのマークアップに挿入するとします。たぶん、あなたはそれをスライドショーで使いたいので、出力を書き直す必要があるので、それをいくつかのdivタグ内に埋め込み、CSSのいくつかのクラスに割り当てることができます。

テンプレートファイルを変更したり、コードを1行書き込んだりせずに Viewsで実行できます。そして、このモジュールはDrupal 8(D7とは異なり))、箱から出してこれを行うことができます。

クレジットの期限が到来する場所でクレジットを与えると、この単純なソリューションを示したのはDrupal Relativity Data Modelの作成者である www.jay-epstien.com のジェイでした。このHOWTOを読んだ後、彼のサイトにアクセスすることをお勧めします。


バックグラウンド

このチュートリアルを書いたのは、日間を費やして調査し、同様の状況にある人の正気を守りたかったからです。 StackexchangeDrupal API には、これを実現する方法を示す大量の投稿があります。私はこれらの指示に従ってテンプレートファイルを書き直し、それが機能する(私の元の質問)間、エラーを生成しましたが、答えはありませんでした。 URLフォーマッタモジュールを使用するように言う別の投稿があります。

「そのためのモジュールがあります」という方法論のサブスクライバーではないため、モジュールの使用は避けたいものです。また、そのURLフォーマッターにも注意してください。モジュールはD8互換ではないため、書き換える必要があります。このソリューションはそうである必要はありません。

方法

Viewsモジュールがインストールされていて、目的のコンテンツを表示するためのビューを作成済みであるという前提で作業を進めています。これだけのチュートリアルはたくさんあるので、ここでは取り上げません。

フィールドには、任意のフォーマット、フォーマットされていないリスト、HTMLリスト、グリッドなどを使用できます。この例では、フォーマットされていないリストを使用します。ビューを最初から作成する場合は、[タイトル]フィールドがデフォルトとしてすでに設定されているはずです。下の図のようになります。

最初に行う必要がある最も重要なことは、ファイルエンティティとの関係を作成することです。ビュー表示の[詳細設定]タブで、関係を参照してください。 1つ追加しましょう。

Relationships

「ファイル使用:ファイル」を選択します


enter image description here

この関係を要求する必要はないので、このチェックブロックを空白のままにしてください。 「ファイル」の識別子は問題ありませんが、参照しやすくなれば、これを別のものに変更できます。


enter image description here




別のフィールドを追加してみましょう。選択ダイアログボックスの[ファイル]フィルターを使用して、現在使用可能なすべての選択肢を表示します。パスを選択します。


enter image description here


次の画面は、すべての魔法が発生する場所です。通常、次のようなURIを取得します

public://sites/default/files/somepicture.jpg

必要に応じて、ここでは何も選択せずに試してみて、ビューのプレビューペインに何が表示されるかを確認してください。ただし、「ファイルストレージURIではなくダウンロードパスを表示する」の横のボックスをオンにすると、

http://www.foobar.com/sites/default/files/somepicture.jpg


enter image description here


これで、フィールドとリンクの出力を書き換えて、好きなようにスタイルを設定できます。その方法についての投稿やチュートリアルはたくさんあるので、ここでは説明しません。完了すると、ビューの表示は次のようになります。

enter image description here

7
Allan