例:
私はフィールドを持つビューを持っています:
[field_name] == Field collection item: Name
[field_title] == Field collection item: Title
[field_text] == Field collection item: Text
これらのフィールドのうち最初の2つを表示から除外し、3番目のフィールドの出力をトークンで書き換えることで、これらのフィールドをラップできます。次に例を示します。
<div class="span4">
<div class="some_style">
<blockquote>[field_text]</blockquote>
<h5>[field_name] // [field_title]</h5>
</div>
</div>
それは少しトリッキーに思えるので、ここに私の最初の質問があります:
ビューでフィールドをラップするためのモジュールまたは別の方法はありますか?
わかっています セマンティックビュー 問題を解決するモジュールですが、Drupal 7.の推奨リリースはありません。
質問#2
上記の例のように、すべてのフィールドがdivでラップされていますが、これは1行のみであり、いくつかの行があります。すべてを別のdivでラップする必要があります。
そのためだけにビューテンプレートファイルを作成する必要がありますか?例:
<?php if($rows): ?>
<div class="rows">
<?php print $rows; ?>
</div>
<?php endif; ?>
1つのラッパーだけに特別なテンプレートファイルを作成しなければならないときに、何かを見逃しているような気がします。
ほとんどの人がCSSのカスケード機能を使用して両方の質問に取り組んでいると言ってもかなり安全だと思います。
たとえば、一般的なビューのHTMLは次のようになります。
<div class="view view-NAME view-id-VIEWID view-display-id-VIEW-DISPLAY-id">
<div class="view-content">
<div class="views-row views-row-1 views-row-odd views-row-first">
<div class="views-field views-field-FIELDNAME1">
<span class="field-content">
<!-- field content here -->
</span>
</div>
<div class="views-field views-field-FIELDNAME2">
<span class="field-content">
<!-- field content here -->
</span>
</div>
</div>
<div class="views-row views-row-2 views-row-even">
<!-- etc etc etc -->
</div>
</div>
</div>
したがって、最初の質問に対して、ビューはすでに各行をラップするdivを作成しています。つまり、<div class="views-row ...">
1。次のようにして、ビューごとにスタイルを設定できます。
.view-NAME .views-row {
/* styles for the rows div goes here */
}
そして2番目の質問に対して、Viewsはすでに<div>
すべての行をラップします。つまり、<div class="view-content">
1。特定のビューに合わせてスタイルを設定するには、次のようにします。
.view-NAME .view-content {
/* styles for the div wrapping your rows goes here */
}
さて、明らかに、これはすべてあなたのテーマに依存しています。すべてのマークアップを嫌う人もいますDrupalデフォルトでは、多くの標準テンプレートを作成してオーバーライドし、無駄のないマークアップを作成しています。
インスタンスがそうである場合でも、必要に応じて、ビューに各行にクラスを追加するように指示する必要があります。これには、全体的なスタイル設定を介してアクセスします(特定のビューに使用される各ビューテンプレートを確認することもできます)。
ビューに各フィールドラッパーにクラスを追加するように指示することもできます。これは、各フィールドによって構成ウィジェットからアクセスされます。
解説に基づく追加:
ビューコンテンツdivの出力を作成するビューテンプレートはviews-view.tpl.php
と問題のコードは次のとおりです。
<?php if ($rows): ?>
<div class="view-content">
<?php print $rows; ?>
</div>
<?php elseif ($empty): ?>
<div class="view-empty">
<?php print $empty; ?>
</div>
<?php endif; ?>
そのため、これを変更しないと、そうです、Viewsは、他の変数をそのdivのクラスに挿入するために、Viewをすばやく簡単に前処理することができません。
ただし、ビューの前処理フックを使用して追加の変数を作成できるため、追加のテンプレートを多数作成する必要はなく、1つだけ作成する必要があります。
たとえば、views-view.tpl.php
をテーマ(最も簡単)またはモジュール(特別なViewsテーマの呪文が必要です)に変更し、次のように変更します。
<?php if ($rows): ?>
<div class="view-content <?php print $my_special_content_class; ?>">
<?php print $rows; ?>
</div>
<?php elseif ($empty): ?>
<div class="view-empty">
<?php print $empty; ?>
</div>
<?php endif; ?>
次に、これらの行に沿ってビューの前処理フックを作成します。
function YOURTHEMEORMODULE_preprocess_views_view(&$vars) {
$name=$vars['name'];
$display_id=$vars['display_id'];
if ($name=='VIEWYOUWANT' && $display_id=='DISPLAYYOUWANT') {
$vars['my_special_content_class']='FOO';
} else {
$vars['my_special_content_class']=''; // so we don't have to isset() or !empty() it in our template :)
}
}
すべてを保存してテーマのキャッシュをクリアすると、今すぐあなたのところに行くはずです。
2番目の追加:
さらに考えて、「doh!」次のような前処理で、テンプレートなしでこれを実行できます。
function YOURTHEME_preprocess_views_view(&$vars) {
$name=$vars['name'];
$display_id=$vars['display_id'];
if ($name=='VIEWYOUWANT' && $display_id=='DISPLAYYOUWANT') {
$vars['rows']='<div class="FOO">' . $vars['rows'] . '</div>';
}
}
そこにラップされた別のdivを気にしない場合。そして、私はあなたがこれをモジュールの代わりにあなたのテーマで行う必要がある/そうするべきだと思うので、これが正しい順序で起こることを確認します。フックは常にモジュールフックの後に実行されます。
ビュー内でrewrite
機能を使用することもできます。
field_name
、field_title
、field_text
があり、これらの周りにcontent
というクラスのdivを追加するとします。
FIELDS
の下のビューでfield_name
をクリックしますREWRITE RESULTS
に移動し、Rewrite the output of this field
を確認します<div class="content">[field_name]
[〜#〜] notice [〜#〜]のように入力します。div
は閉じないでくださいFIELDS
の下でfield_text
をクリックしますREWRITE RESULTS
に移動し、Rewrite the output of this field
を確認します</div>
」と入力しますこれによりコンテンツDIVが閉じます上記があなたのフィールドがどんな種類のラッパー要素を持っているかによって必ずしもうまくいくとは思いません。
ビューのフィールドまたは行のテンプレートを使用できますが、すべてのフィールドにテンプレートを作成する必要があります。
多分これ ページ があなたを助けます。これがサンプルコードです:
<?php
/**
* Generic preprocess that is still working on D7
*/
function MYTHEME_preprocess_views_view_fields(&$vars) {
if (isset($vars['view']->name)) {
$function = __FUNCTION__ . '__' . $vars['view']->name . '__' . $vars['view']->current_display;
if (function_exists($function)) {
$function($vars);
}
}
}
/**
* Then the specific preprocess that worked without the above code for D6
*/
function MYTHEME_preprocess_views_view_fields__VIEWNAME__DISPLAY(&$vars) {
// my specific preprocess code
}
?>
関連: テーマフック提案の特定の前処理関数は呼び出されません at Drupal.org
Views Rows Wrapper モジュールを試してください。 N行ごとに、Div/Span要素をカスタムクラスまたはID名でラップします。
Field_collectionsを前処理して出力をオーバーライドするには、 dropbucket にある次の例を試してください @ dane による便利なスニペットが表示されます:
function mytheme_preprocess_field(&$vars) {
if($vars['element']['#field_name'] == "field_your_fc_field"){
$fcs = array();
foreach (element_children($vars['element']) as $key) {
$fcs[] = array_pop($vars['element'][$key]['entity']['field_collection_item']);
}
// now you have all your fcs pulled out of that nasty array
foreach ($fcs as $fc) {
# code... that
}
// I would recommend overrideing items markup for whatever black magic you desire
$vars['items'] = array(
'#markup' => "Whatever you need to render",
);
}
}
フィールドコレクションなどのフィールドにラッパーを追加するには、ロジックを hook_preprocess_HOOK
(HOOKは views_view_field
)、次にこれらの変数をテンプレートファイルに公開します。次に例を示します。
/**
* Implements hook_preprocess_HOOK().
*/
function MYMODULE_preprocess_views_view_field(&$vars) {
$view = $vars['view'];
switch ($view->name) {
case 'my_view':
$node = entity_metadata_wrapper('node', $vars['row']->nid);
$vars['name'] = $node->field_name->value();
$vars['title'] = $node->field_title->value();
$vars['text'] = $node->field_text->value();
break;
} // end: switch
}
これで、これらの変数をテンプレートファイル($name
、$title
および$text
)なので、簡単にラッピングできます。
Semantic Views を使用することもできます。
このビュープラグインを使用すると、テンプレートファイルをオーバーライドする必要なく、フォーマットされていないスタイル、フィールド行スタイル、およびその他の出力をより簡単に構成できます。さまざまなHTML要素(タグ)とクラス属性を指定するビューの行スタイルテンプレートをオーバーライドする代わりに、ビューUI内でこれらを指定して、各ビューのテンプレートをオーバーライドしないようにすることができます。