他のフィールドを使用して計算されたビューにフィールドを追加するにはどうすればよいですか?


7

他のフィールドを使用して計算されたビューに新しいフィールドを追加するにはどうすればよいですか?

これを達成するためにビューにネイティブな方法はありますか?


元のビューが行を返す場合: X | Y | Z

そして、私は新しいデータを計算する関数を持っています: $new = do_something(X, Y, Z);

$ newを4番目の列として含めると、次のようになります。 X | Y | Z | $new


ビューテンプレートを使用してこれを実現することを検討しましたが、ビューフックまたは別のモジュールを使用してこれを行うより良い方法があるかどうか知りたいです。

これを達成するためにどのテンプレート、フック、またはモジュールが最も適していますか?

回答:


3

私は計算フィールドモジュールがこれに適していると思います:http : //drupal.org/project/computed_field

これにより、コンテンツタイプに計算タイプフィールドを追加できるようになります。他のフィールドの値に基づいて計算を行うことができます。

フィールドを設定する場合は、x、y、zで行ったように、そのフィールドをビューに追加するだけです。

ユーザーがUSDで指定した価格フィールドに一度使用しましたが、価格をEURに変換して別のフィールドを作成する必要がありましたが、カスタムモジュールから使用すると、次のようになります。

function computed_field_field_euro_compute(&$entity_field, $entity_type, $entity, $field, $instance, $langcode, $items) {
  $value = $entity->field_price;
  // do some calculations with the value of field_price
  $entity_field[0]['value'] = $value; //return your modified value to your computed field
}

Drupal管理者のフィールドの設定でコードを入力するか、上記のようにカスタムモジュールにコードを配置できます。


1
計算フィールドが近づきますが、ビューがデータにアクセスする前に、最初にデータベースに保存する必要があるように見えます。drupal.org/node/126522 do_something()関数で計算された値が2度同じになることはないため、事前保存はオプションではありません。このモジュールを使用する他のいくつかの場所を見ることができますが、コードの抜粋に感謝します!
Citricguy 2012

6

カスタムモジュールで独自のビューフィールドハンドラーを作成できます。独自のフィールドハンドラーを作成するよりも、hook_views_apiおよびhook_views_data_alter(&$ data)を実装し ます。


1
最高の答えを投票としての例では、素晴らしいことだ
frazras

3

hook_views_dataカスタムモジュールで使用できます。実装に少し時間がかかりますが、VIRTUALビューフィールドが表示されるため、非常にモジュール化されたソリューションになります。

MODULE_NAME.moduleファイルでビューのAPIバージョンを宣言する

function MODULE_NAME_views_api($module = NULL, $api = NULL) {
  return array('api' => '3.0');
}

MODULE_NAME.views.inc内容を含むファイルを追加

function MODULE_NAME_views_data() {
  $data = array();

  $data['node']['virtual_views_field'] = array(
    'title' => t('Virtual views field from X Y Z'),
    'help' => t('Virtual views field from X Y Z fields.'),
    'field' => array(
      'handler' => 'MODULE_NAME_virtual_views_field',
    ),
  );    
  return $data;
}

MODULE_NAME_handlers.inc内容を含むファイルを追加

class MODULE_NAME_virtual_views_field extends views_handler_field {

  /**
   * Overrides views_handler_field::render().
   */
  function render($values) {
    //uncomment following to see the actual values available
    //need DEVEL module for this
    //dpm($values);

    $X = $values->field_field_X[0]['raw']['value'];
    $Y = $values->field_field_Y[0]['raw']['value'];
    $Z = $values->field_field_Z[0]['raw']['value'];

    //implement your logic here and get result
    $result = $X . " " . $Y . " " . $Z;
    return $result;
  }

  function query() {
    // do not need to override the parent query.
  }
}

あなたのMODULE_NAME.infoファイルは次のようになります。

name = Custom Virtual Views Field 
description = takes X Y Z fields to create virtual field
core = 7.x
package = custom
dependencies[] = views
files[] = MODULE_NAME_handlers.inc
core = "7.x"

モジュールを有効にし(またはclass registry既存/有効化されたモジュールを変更する場合はクリーンアップ)、呼び出された仮想フィールドを表示/追加できるはずですVirtual views field from X Y Z

これは使用でき、他の通常のビューフィールドの利点があります。


2

私はあなたの最良の選択肢はviews_customfieldモジュールを使用することだと思います。これにより、ビューのカスタムフィールド(PHPを含む)を定義できます。そのフィールドを他の場所(コンテンツタイプなど)にする必要はありません。

Drupal 7を使用している場合、一部の機能は最新のViewsモジュールにあるため、これはViews PHPと呼ばれます。


1
PHPは動作するように見えます。できればPHPの入力フィルターはできるだけ避けたいと思います。あなたがリストしたモジュールをありがとう。それらを調べて、ビューにフックされている方法を確認します。
Citricguy 2012

2
ビューのPHPページの「細字」に基づいて、私はそれを避けます。「このモジュールを使用すると、ビュー内でPHPを直接使用できます。これは迅速かつ簡単なソリューションに役立つ場合がありますが、利用可能な場合は(または自分で作成する場合も)通常のハンドラーおよびプラグインを使用することを強くお勧めします。
sea26.2

1
@ user908998-私は一般に、データベース内のPHPはベストプラクティスではないことに同意します(私はこれに一度かまれました)。ただし、これはモックアップの目的や迅速な展開に役立ちます。アイデアをテストするためだけに新しいビューハンドラを作成するのは大変な作業です。
Rider_X 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.