web-dev-qa-db-ja.com

プログラムでビューに新しい列を追加できますか?

プログラムで既存のビューに新しいフィールドを追加したい。

Hook_views_pre_render()を使用しようとしています。

function registration_export_views_pre_render(&$view) {
    if ($view->name=='registrations_export') {
        foreach($view->result as $r => $result) {
        //dpm($result->registration_id);
        $result->registration_id = 1;   
        }
    }

}

ページを表示するために「登録ID」フィールドを追加すると、出力に登録IDフィールドが表示されます。しかし、私はビューフィールドにページを追加したくありません。動的にフィールド追加したい。

提案に従って、私はこれを試しました

    function registration_export_views_pre_view(&$view, &$display_id, &$args) {
          if ($view->name == 'registrations_export') {
            views_db_object::add_item($view->current_display, 'field', 
    'field_data_field_first_name_1', 'field_first_name_1', 
$options = array(
            $handler->display->display_options['fields']['field_first_name_1']['id'] = 'field_first_name_1',
            $handler->display->display_options['fields']['field_first_name_1']['table'] = 'field_data_field_first_name_1',
            $handler->display->display_options['fields']['field_first_name_1']['field'] = 'field_first_name_1',

            ), $id = NULL);


          }
        }

エクスポートを表示

$view = new view();
$view->name = 'registrations_export';
$view->description = '';
$view->tag = 'default';
$view->base_table = 'registration';
$view->human_name = 'registrations_export';
$view->core = 7;
$view->api_version = '3.0';
$view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */

/* Display: Master */
$handler = $view->new_display('default', 'Master', 'default');
$handler->display->display_options['title'] = 'List of Event Registrations';
$handler->display->display_options['use_more_always'] = FALSE;
$handler->display->display_options['access']['type'] = 'none';
$handler->display->display_options['cache']['type'] = 'none';
$handler->display->display_options['query']['type'] = 'views_query';
$handler->display->display_options['exposed_form']['type'] = 'basic';
$handler->display->display_options['pager']['type'] = 'full';
$handler->display->display_options['pager']['options']['items_per_page'] = '10';
$handler->display->display_options['style_plugin'] = 'table';
$handler->display->display_options['style_options']['grouping'] = array(
  0 => array(
    'field' => 'title',
    'rendered' => 1,
    'rendered_strip' => 1,
  ),
);
$handler->display->display_options['style_options']['columns'] = array(
  'registration_id' => 'registration_id',
  'nid' => 'nid',
  'title' => 'title',
  'field_first_name_1' => 'field_first_name_1',
);
$handler->display->display_options['style_options']['default'] = '-1';
$handler->display->display_options['style_options']['info'] = array(
  'registration_id' => array(
    'sortable' => 1,
    'default_sort_order' => 'asc',
    'align' => '',
    'separator' => '',
    'empty_column' => 0,
  ),
  'nid' => array(
    'sortable' => 1,
    'default_sort_order' => 'asc',
    'align' => '',
    'separator' => '',
    'empty_column' => 0,
  ),
  'title' => array(
    'sortable' => 1,
    'default_sort_order' => 'asc',
    'align' => '',
    'separator' => '',
    'empty_column' => 0,
  ),
  'field_first_name_1' => array(
    'sortable' => 0,
    'default_sort_order' => 'asc',
    'align' => '',
    'separator' => '',
    'empty_column' => 0,
  ),
);
/* Relationship: Registration: Registration to Node */
$handler->display->display_options['relationships']['registration_related_node']['id'] = 'registration_related_node';
$handler->display->display_options['relationships']['registration_related_node']['table'] = 'registration';
$handler->display->display_options['relationships']['registration_related_node']['field'] = 'registration_related_node';
/* Field: Field: Salutation */
$handler->display->display_options['fields']['field_salutation_new']['id'] = 'field_salutation_new';
$handler->display->display_options['fields']['field_salutation_new']['table'] = 'field_data_field_salutation_new';
$handler->display->display_options['fields']['field_salutation_new']['field'] = 'field_salutation_new';
$handler->display->display_options['fields']['field_salutation_new']['exclude'] = TRUE;
/* Field: Field: State */
$handler->display->display_options['fields']['field_state']['id'] = 'field_state';
$handler->display->display_options['fields']['field_state']['table'] = 'field_data_field_state';
$handler->display->display_options['fields']['field_state']['field'] = 'field_state';
$handler->display->display_options['fields']['field_state']['exclude'] = TRUE;
/* Field: Field: Payment Type */
$handler->display->display_options['fields']['field_payment_type']['id'] = 'field_payment_type';
$handler->display->display_options['fields']['field_payment_type']['table'] = 'field_data_field_payment_type';
$handler->display->display_options['fields']['field_payment_type']['field'] = 'field_payment_type';
/* Field: Global: PHP */
$handler->display->display_options['fields']['php']['id'] = 'php';
$handler->display->display_options['fields']['php']['table'] = 'views';
$handler->display->display_options['fields']['php']['field'] = 'php';
$handler->display->display_options['fields']['php']['use_php_setup'] = 0;
$handler->display->display_options['fields']['php']['php_output'] = '<?php 
//echo \'<pre>\';
//print_r($view->result[0]->_field_data[\'registration_id\'][\'entity\']);
//print_r($data);
//print_r($row->title);
?>';
$handler->display->display_options['fields']['php']['use_php_click_sortable'] = '0';
$handler->display->display_options['fields']['php']['php_click_sortable'] = '';
/* Filter criterion: Content: Title */
$handler->display->display_options['filters']['title']['id'] = 'title';
$handler->display->display_options['filters']['title']['table'] = 'node';
$handler->display->display_options['filters']['title']['field'] = 'title';
$handler->display->display_options['filters']['title']['relationship'] = 'registration_related_node';
$handler->display->display_options['filters']['title']['operator'] = 'contains';
$handler->display->display_options['filters']['title']['exposed'] = TRUE;
$handler->display->display_options['filters']['title']['expose']['operator_id'] = 'title_op';
$handler->display->display_options['filters']['title']['expose']['label'] = 'Event Name';
$handler->display->display_options['filters']['title']['expose']['operator'] = 'title_op';
$handler->display->display_options['filters']['title']['expose']['identifier'] = 'title';
$handler->display->display_options['filters']['title']['expose']['remember_roles'] = array(
  2 => '2',
  1 => 0,
  3 => 0,
  4 => 0,
  5 => 0,
  7 => 0,
  9 => 0,
  10 => 0,
);

/* Display: Page */
$handler = $view->new_display('page', 'Page', 'page');
$handler->display->display_options['path'] = 'registrations-list';

/* Display: Data export */
$handler = $view->new_display('views_data_export', 'Data export', 'views_data_export_1');
$handler->display->display_options['pager']['type'] = 'some';
$handler->display->display_options['pager']['options']['items_per_page'] = '0';
$handler->display->display_options['pager']['options']['offset'] = '0';
$handler->display->display_options['style_plugin'] = 'views_data_export_csv';
$handler->display->display_options['style_options']['provide_file'] = 1;
$handler->display->display_options['style_options']['filename'] = '%timestamp-dd - %timestamp-mmm %view.csv';
$handler->display->display_options['style_options']['parent_sort'] = 0;
$handler->display->display_options['style_options']['quote'] = 1;
$handler->display->display_options['style_options']['trim'] = 0;
$handler->display->display_options['style_options']['replace_newlines'] = 0;
$handler->display->display_options['style_options']['header'] = 1;
$handler->display->display_options['style_options']['keep_html'] = 0;
$handler->display->display_options['defaults']['filter_groups'] = FALSE;
$handler->display->display_options['defaults']['filters'] = FALSE;
/* Filter criterion: Content: Title */
$handler->display->display_options['filters']['title']['id'] = 'title';
$handler->display->display_options['filters']['title']['table'] = 'node';
$handler->display->display_options['filters']['title']['field'] = 'title';
$handler->display->display_options['filters']['title']['relationship'] = 'registration_related_node';
$handler->display->display_options['filters']['title']['operator'] = 'contains';
$handler->display->display_options['filters']['title']['exposed'] = TRUE;
$handler->display->display_options['filters']['title']['expose']['operator_id'] = 'title_op';
$handler->display->display_options['filters']['title']['expose']['label'] = 'Event Name';
$handler->display->display_options['filters']['title']['expose']['operator'] = 'title_op';
$handler->display->display_options['filters']['title']['expose']['identifier'] = 'title';
$handler->display->display_options['filters']['title']['expose']['remember_roles'] = array(
  2 => '2',
  1 => 0,
  3 => 0,
  4 => 0,
  5 => 0,
  7 => 0,
  9 => 0,
  10 => 0,
);
$handler->display->display_options['path'] = 'registrations-list-export-csv';
$handler->display->display_options['displays'] = array(
  'page' => 'page',
  'default' => 0,
);

/* Display: Data export 2 */
$handler = $view->new_display('views_data_export', 'Data export 2', 'views_data_export_2');
$handler->display->display_options['pager']['type'] = 'some';
$handler->display->display_options['style_plugin'] = 'views_data_export_xls';
$handler->display->display_options['style_options']['provide_file'] = 1;
$handler->display->display_options['style_options']['parent_sort'] = 0;
$handler->display->display_options['path'] = 'registrations-list-export-xls';
$handler->display->display_options['displays'] = array(
  'page' => 'page',
  'default' => 0,
);

どうもありがとうございました。

6
Tushar

関数 views_db_object :: add_item() を確認してください。

https://drupal.stackexchange.com/a/70649/10729 を使用してヘッダー/フッターアイテムを追加する例がありますが、フィールドにも使用できます。

コードの配置先は状況によって異なりますが、SQLがすでに実行されており、それが発生する前にフィールドを追加する必要があるか、データを取得できないため、pre_renderフックが遅すぎることをお勧めします。

あなたがしたいことのより良い例は http://dropbucket.org/node/1178 です

そのリンクが消えた場合のコードは次のとおりです。

/**
 * Implements hook_views_pre_view().
 *
 * Add 'Custom text' field.
 */
function hook_views_pre_view(&$view, &$display_id, &$args) {
  if ($view->name == 'my_view') {
    $view->add_item($view->current_display, 'field', 'views', 'nothing', array(
      'label' => 'My field',
      'alter' => array('text' => 'My field text'),
      'element_class' => 'my-field',
      'element_default_classes' => 0,
    ), 'my_field');
  }
}

フィールド設定の配列を作成する方法を知りたい場合は、UIを使用して目的のフィールドでビューを作成し、ビューをエクスポートして、そのフィールドがどのように出力されるかを確認することをお勧めします。その情報を使用してフィールド配列を作成できます。

[EDIT]やりたいことに対して間違ったパラメータを渡しているため、現在のadd_item()関数の使用は機能していません。

Add_item()のリンクされたドキュメントを見ると、パラメーターに期待されることが示されています(確かに、この場合、ドキュメントはあまり良くありませんが、パラメーター名は役立ちます)。

関数定義は次のようになります。

views_db_object::add_item($display_id, $type, $table, $field, $options = array(), $id = NULL)

だからあなたは渡しています:

  • $ display_id:現在のディスプレイ-結構です。
  • $ type: "field"-結構です。
  • $ table: "views"-これは間違いなく正しくありません。ビューテーブルは、「カスタムテキスト」などの特別なビューフィールド用です(この例では、コメントに従って追加されています)。追加するフィールドのテーブル名を渡す必要があります。たとえば、nidフィールドを追加する場合、テーブルは「ノード」になります。 field_firstnameという名前のフィールドがある場合は、おそらく「field_data_field_firstname」というテーブルが必要です。
  • $ field: "nothing"-これもおそらく正しくありません。この場合も、何もないフィールドはビューの「カスタムテキスト」フィールドです。私のテーブルの例で行くと、「nid」や「field_firstname」のようなものになります。
  • $ options:これは、値が変更されたカスタムテキストフィールドの例のコピーであるため、おそらく正しくありませんが、追加するフィールドでは、カスタムテキストフィールドに異なるオプションが必要になる可能性があります。前に述べたように、ここで何を追加するかを決定する最良の方法は、追加したいフィールドでビューを作成し、それを希望どおりにセットアップしてから、ビューをエクスポートして設定を提供することです。たとえば、以下はフィールドのビューエクスポートの一部です。

    /* Field: Content: Contact Email */
    $handler->display->display_options['fields']['field_contact_email']['id'] = 'field_contact_email';
    $handler->display->display_options['fields']['field_contact_email']['table'] = 'field_data_field_contact_email';
    $handler->display->display_options['fields']['field_contact_email']['field'] = 'field_contact_email';
    $handler->display->display_options['fields']['field_contact_email']['label'] = '';
    $handler->display->display_options['fields']['field_contact_email'] ['element_label_colon'] = FALSE;
    $handler->display->display_options['fields']['field_contact_email']['type'] = 'email_spamspan';
    

    プログラムでフィールドを追加するときに使用できるテーブル、フィールド、ID、その他の設定に関する情報が表示されます。

したがって、このフィールドを例としてこのフィールドを使用して、この配列の値を比較します(配列の値を読み取り、コピーして貼り付けるだけでなく、配列の構造を理解するのに役立ちます)。オプションは次のようになります。

array(
  'label' => '',
  'element_label_colon' => FALSE,
  'type' => 'email_spamspan',
)

ただし、使用しているフィールドタイプに応じて、多くの可能なオプションがあります。最初は空のオプション配列を試すこともできます。

ビューのエクスポートは角括弧配列構文でいっぱいなので、簡単に配列に変換されます(詳細については、 http://php.net/manual/en/language.types.array.php#language.types。 array.syntax.accessing )。

プログラムによるビューの変更はかなり複雑になる可能性があるため、PHP docs、Drupal docs、およびViews docsを参照することをお勧めします。コピーと貼り付けでは、これまでのところ。

13
rooby