web-dev-qa-db-fra.com

pouvons-nous ajouter une nouvelle colonne à une vue par programme?

Je veux ajouter un nouveau champ dans une vue existante par programme.

J'essaie d'utiliser 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;   
        }
    }

}

Si j'ajoute le champ "ID d'enregistrement" à la page d'affichage, je peux voir le champ ID d'enregistrement dans ma sortie. Mais je ne veux pas ajouter de page d'ajout de champ de vue. Je souhaite ajouter dynamiquement un champ.

Selon la suggestion, j'ai essayé cela

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


          }
        }

Afficher l'exportation

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

Merci beaucoup.

6
Tushar

Découvrez la fonction views_db_object :: add_item () .

Il y a un exemple à https://drupal.stackexchange.com/a/70649/10729 de l'utiliser pour ajouter des éléments d'en-tête/pied de page mais il peut également être utilisé pour les champs.

La destination de votre code dépend de votre situation, mais je suggérerais que le hook pre_render est trop tard car le sql a déjà été exécuté et vous devez ajouter le champ avant que cela se produise ou vous n'obtiendrez pas les données.

Un meilleur exemple de ce que vous voulez faire est sur http://dropbucket.org/node/1178

Dans le cas où ce lien disparaît, le code est:

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

Si vous voulez savoir comment construire le tableau pour les paramètres de champ, je suggère de créer une vue via l'interface utilisateur avec un champ comme vous le souhaitez, puis exportez la vue et voyez comment elle génère ce champ. Vous pouvez utiliser ces informations pour créer votre tableau de champs.

[EDIT] Votre tentative actuelle d'utiliser la fonction add_item () ne fonctionne pas car vous passez des paramètres incorrects pour ce que vous voulez faire.

Si vous regardez la documentation liée pour add_item (), elle montre ce qu'elle attend pour les paramètres (certes, dans ce cas, les documents ne sont pas très bons mais les noms des paramètres aident).

La définition de la fonction ressemble à ceci:

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

Vous passez donc:

  • $ display_id: L'affichage actuel - ce qui est bien.
  • $ type: "field" - ce qui est bien.
  • $ table: "vues" - ce n'est certainement pas vrai. Le tableau des vues est destiné aux champs de vues spéciaux tels que "Texte personnalisé" (ce que cet exemple ajoute conformément à son commentaire). Vous devez saisir le nom de la table pour le champ que vous souhaitez ajouter. Par exemple, si vous vouliez ajouter le champ nid, la table serait "nœud". Si vous avez un champ appelé field_firstname, vous voudrez probablement la table "field_data_field_firstname".
  • $ field: "rien" - ce n'est probablement pas le cas non plus. Encore une fois, le champ rien est le champ "Texte personnalisé" des vues. aller avec mes exemples de table serait quelque chose comme "nid" ou "field_firstname".
  • $ options: Cela n'est probablement pas correct non plus car il s'agit d'une copie de l'exemple de champ de texte personnalisé avec des valeurs modifiées, mais le champ que vous souhaitez ajouter nécessite probablement des options différentes pour le champ de texte personnalisé. Comme mentionné précédemment, la meilleure façon de déterminer ce que vous devez ajouter ici est de créer une vue avec le champ que vous souhaitez ajouter, de la configurer comme vous le souhaitez, puis d'exporter la vue et elle vous donnera les paramètres. par exemple, ici fait partie d'une exportation de vue pour un champ:

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

    Vous pouvez voir qu'il donne des informations sur la table, le champ, l'ID et d'autres paramètres que vous pouvez utiliser lorsque vous ajoutez votre champ par programme.

Donc, comparez les valeurs de ce tableau (lisez les valeurs du tableau, ne vous contentez pas de copier-coller, cela aidera à donner un sens à la structure du tableau) en utilisant ce champ comme exemple, vos options seraient quelque chose comme ceci:

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

Mais il existe de nombreuses options possibles selon le type de champ que vous utilisez. Vous pouvez également essayer avec un tableau d'options vide au début.

L'export des vues est plein de syntaxe de tableau entre crochets afin qu'il se convertisse facilement en tableau (pour plus d'informations, voir http://php.net/manual/en/language.types.array.php#language.types). array.syntax.accessing ).

La modification des vues par programme peut devenir assez complexe, donc je recommande beaucoup de lecture de PHP docs, Drupal docs et Views docs. Le copier-coller ne vous donnera que jusque là.

13
rooby