it-swarm.com.de

Können wir einer Ansicht programmgesteuert eine neue Spalte hinzufügen?

Ich möchte programmgesteuert ein neues Feld in eine vorhandene Ansicht einfügen.

Ich versuche hook_views_pre_render () zu verwenden.

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;   
        }
    }

}

Wenn ich das Feld "Registrierungs-ID" zur Ansichtsseite hinzufüge, kann ich das Feld "Registrierungs-ID" in meiner Ausgabe sehen. Aber ich möchte nicht im Ansichtsfeld Seite hinzufügen hinzufügen. Ich möchte dynamisch hinzufügen.

Laut Vorschlag habe ich das versucht

    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);


          }
        }

Export anzeigen

$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,
);

Vielen Dank.

6
Tushar

Überprüfen Sie die Funktion views_db_object :: add_item () .

Unter https://drupal.stackexchange.com/a/70649/10729 gibt es ein Beispiel für die Verwendung zum Hinzufügen von Kopf-/Fußzeilenelementen, es kann jedoch auch für Felder verwendet werden.

Wohin Ihr Code geht, hängt von Ihrer Situation ab, aber ich würde vorschlagen, dass der pre_render-Hook zu spät ist, da die SQL bereits ausgeführt wurde und Sie das Feld hinzufügen müssen, bevor dies geschieht, sonst erhalten Sie die Daten nicht.

Ein besseres Beispiel für das, was Sie tun möchten, ist http://dropbucket.org/node/1178

Falls dieser Link verschwindet, lautet der Code:

/**
 * 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');
  }
}

Wenn Sie wissen möchten, wie das Array für die Feldeinstellungen erstellt wird, empfehle ich, eine Ansicht über die Benutzeroberfläche mit einem Feld nach Ihren Wünschen zu erstellen. Exportieren Sie dann die Ansicht und sehen Sie, wie dieses Feld ausgegeben wird. Mit diesen Informationen können Sie Ihr Feldarray erstellen.

[EDIT] Ihr aktueller Versuch, die Funktion add_item () zu verwenden, funktioniert nicht, da Sie die falschen Parameter für das übergeben, was Sie tun möchten.

Wenn Sie sich die verknüpfte Dokumentation für add_item () ansehen, wird angezeigt, was für die Parameter erwartet wird (in diesem Fall sind die Dokumente zwar nicht sehr gut, aber die Parameternamen helfen).

Die Funktionsdefinition sieht folgendermaßen aus:

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

Sie gehen also vorbei:

  • $ display_id: Die aktuelle Anzeige - was in Ordnung ist.
  • $ type: "field" - was in Ordnung ist.
  • $ table: "views" - das ist mit ziemlicher Sicherheit nicht richtig. Die Ansichtstabelle ist für spezielle Ansichtsfelder wie "Benutzerdefinierter Text" vorgesehen (was in diesem Beispiel gemäß seinem Kommentar hinzugefügt wird). Sie müssen den Tabellennamen für das Feld übergeben, das Sie hinzufügen möchten. Wenn Sie beispielsweise das Feld nid hinzufügen möchten, lautet die Tabelle "node". Wenn Sie ein Feld mit dem Namen field_firstname haben, möchten Sie wahrscheinlich die Tabelle "field_data_field_firstname".
  • $ field: "nichts" - das ist wahrscheinlich auch nicht richtig. Wieder ist das Nichts-Feld das Ansichtsfeld "Benutzerdefinierter Text". Zu meinen Tabellenbeispielen zu passen wäre so etwas wie "nid" oder "field_firstname".
  • $ options: Dies ist wahrscheinlich auch nicht richtig, da es sich um eine Kopie des Beispiels für ein benutzerdefiniertes Textfeld mit geänderten Werten handelt. Für das Feld, das Sie hinzufügen möchten, sind jedoch möglicherweise andere Optionen für das benutzerdefinierte Textfeld erforderlich. Wie bereits erwähnt, können Sie hier am besten herausfinden, was hier hinzugefügt werden soll, indem Sie eine Ansicht mit dem Feld erstellen, das Sie hinzufügen möchten. Richten Sie die Ansicht so ein, wie Sie es möchten. Exportieren Sie dann die Ansicht und Sie erhalten die Einstellungen. Hier ist beispielsweise ein Teil eines Ansichtsexports für ein Feld:

    /* 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';
    

    Sie können sehen, dass es Informationen zu Tabelle, Feld, ID und anderen Einstellungen enthält, die Sie verwenden können, wenn Sie Ihr Feld programmgesteuert hinzufügen.

Vergleichen Sie also die Werte in diesem Array (lesen Sie die Array-Werte, kopieren Sie sie nicht nur und fügen Sie sie ein, es hilft, die Array-Struktur zu verstehen), indem Sie dieses Feld als Beispiel verwenden. Ihre Optionen wären ungefähr so:

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

Abhängig vom verwendeten Feldtyp gibt es jedoch viele mögliche Optionen. Sie können es auch zunächst mit einem leeren Optionsarray versuchen.

Der Export von Ansichten ist voll mit Array-Syntax in eckigen Klammern, sodass er problemlos in ein Array konvertiert werden kann (weitere Informationen finden Sie unter http://php.net/manual/en/language.types.array.php#language.types). array.syntax.accessing ).

Das programmgesteuerte Ändern von Ansichten kann sehr komplex werden. Ich empfehle daher, viel von PHP docs, Drupal docs und Views docs) zu lesen. Durch Kopieren und Einfügen erhalten Sie nur bisher.

13
rooby