プログラムで既存のビューに新しいフィールドを追加したい。
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,
);
どうもありがとうございました。
関数 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)
だからあなたは渡しています:
$ 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を参照することをお勧めします。コピーと貼り付けでは、これまでのところ。