2

モジュールの子ノードをコンテンツに表示する Drupal 7 モジュールを作成しています。parent_nodesノードには、 1 つ以上のノードが親として選択されるフィールド(ノード参照) があります。

まず、projectsブロック ビュー display を使用してビューを作成し、コンテキスト フィルターを使用してsubprojectsタイプのノードを表示します。projectfield_parent_project

これは私のモジュールです:

<?php

function projects_preprocess_node(&$variables) {
  if ($variables['type'] == 'project') {
    if (isset($variables['view_mode']) && $variables['view_mode'] == 'full') {
      _projects_add_subprojects($variables);
    }
  }
}

function _projects_add_subprojects(&$variables) {
  $nid = $variables['nid'];
  $view = views_get_view('projects');
  $preview = $view->preview('subprojects', array($nid));
  $subprojects = array(
      '#title' => t('Subprojects'),
      '#label_display' => 'above',
      '#weight' => 10,
      //'#theme' => 'field',
      '#markup' => $preview,
  );
  if (!isset($variables['content']['subprojects'])) {
    $variables['content']['subprojects'] = array();
  }
  $variables['content']['subprojects'][] = $subprojects;
  dpm($variables['content']);
}

これは機能しており、ビュー表示出力をノードのコンテンツに追加しています。

いくつかのことだけが機能していません:

  • タイトル(ラベル)
  • weight は、他のコンテンツでレンダリングされたときに表示位置を変更しません (常に body の上にある最初の位置です)。

行のコメントを外すと'#theme' => 'field'、タイトルはラベルとして表示されますが、何もレンダリングされません。#itemsこれは、フィールドのテーマが使用されているためであり、要素が必要であり、使用されていないと思います#markup

子ノードを参照として使用することはできませんが、親ノードのみを使用できます。

解決策はテーマに依存しない必要があるため、「テーマ テンプレートを変更する」などの回答は避けてください。

ノードに子ノードを表示するにはどうすればよいですか? それがどのようにフィールドであったかを解釈できるものを取得する方法を探しています

4

2 に答える 2

1

まだ知らなかった場合は、Viewfieldモジュールを使用して、コンテンツタイプのフィールドとしてビューを指定できます。これにより、コーディングを節約できる場合がありますが、モジュール全体でこのような特定のタスクを実行したくない場合があります...

作成したカスタムコードを続行する場合は、追加したコンテンツをDrupalが期待する正しいレンダリング配列構造に再構築する必要があります。次のようなものを試してください。

  $subprojects_view_output = array(
      '#type' => 'markup',
      '#markup' => $preview,
  );
  $subprojects = array(
      '#theme' => 'field',  
      '#weight' => 10,
      '#title' => t('Subprojects'),
      '#items' => $subprojects_view_output,
  );

上記を使用すると、フィールドのタイトル/ラベルとフィールドのコンテンツ(ビュー自体)が表示されます。コードはテストされていないため、構文に関して100%正確ではない可能性がありますが、うまくいけば、ソリューションへのパスが提供されます。

編集:私は上記をテストしましたが、既存のtheme_field関数を使用するために、Drupalは、警告メッセージに表示されるように、、、など#field_name#field_typeフィールドをレンダリングするために必要なより多くの情報を期待しているようです。#entity_type

基本的に、フィールドを偽造しているため、組み込みのtheme_field関数を引き続き使用する場合は、前処理関数で期待されるすべての変数を含め、Drupalに期待されるすべての情報を提供する必要があります。

または、元のコードを引き続き使用し、を追加し#prefixて、タイトル/ラベルを次のようにレンダリングすることもできます。

  $subprojects = array(
      '#weight' => 10,
      '#prefix' => '<div id="subprojects-view">asdf:</div>',
      //'#theme' => 'field',
      '#markup' => $preview,
  );

次に、それに応じてCSSでタイトル/ラベルのスタイルを設定します。あなたが説明したように、私は重み付けに問題はありませんでした。

于 2012-11-16T14:59:20.947 に答える
1

@nmc のおかげで、これが私の最終的な解決策です。結果が見つからない場合、タイトルは表示されません。結果のチェックは によって行われif (count($view->result) == 0)ます。重りが効いています。

<?php

function projects_preprocess_node(&$variables) {
  $type = $variables['type'];
  if ($type == 'project' || $type == 'customer') {
    if (isset($variables['view_mode']) && $variables['view_mode'] == 'full') {
      _projects_add_subprojects_markup($variables);
    }
  }
}

function _projects_add_subprojects_markup(&$variables) {
  $nid = $variables['nid'];
  $view = views_get_view('projects');
  $preview = $view->preview('subprojects', array($nid));
  if (count($view->result) == 0) {
    return;
  }
  $variables['content']['subprojects'] = array(
      '#weight' => 10,
      '#prefix' => '<h2>' . t('Subprojects') . '</h2>',
      '#markup' => $preview,
  );
}
于 2012-11-19T16:13:42.170 に答える