web-dev-qa-db-fra.com

Comment puis-je ajouter un champ à une vue calculée à l'aide d'autres champs?

Comment puis-je ajouter un nouveau champ à une vue calculée à l'aide d'autres champs?

Existe-t-il un moyen natif de Vues pour y parvenir?


Si la vue d'origine renvoie la ligne: X | Y | Z

Et j'ai une fonction qui calcule de nouvelles données: $new = do_something(X, Y, Z);

Comment puis-je inclure $ new comme quatrième colonne pour obtenir: X | Y | Z | $new


J'ai cherché à utiliser un modèle de vues pour y parvenir, mais je suis curieux de savoir s'il existe une meilleure façon de le faire en utilisant des crochets Vues ou un autre module.

Quels modèles, crochets ou modules seraient les mieux adaptés pour y parvenir?

7
Citricguy

Je pense que le module Computed Field est un bon choix pour cela: http://drupal.org/project/computed_field

Avec cela, vous pourrez ajouter un champ de type calculé à votre type de contenu. Vous pouvez effectuer des calculs en fonction des valeurs d'autres champs.

Si vous configurez le champ, il vous suffit simplement d'ajouter ce champ dans votre vue, comme vous l'avez fait avec x, y et z.

Je l'ai utilisé une fois pour un champ de prix donné par l'utilisateur en USD et que j'ai dû créer un autre champ avec le prix converti en EUR, il ressemblait à ceci, utilisé à partir d'un module personnalisé:

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
}

Vous pouvez entrer votre code dans l'administrateur Drupal dans les paramètres de votre champ, ou vous pouvez le mettre dans un module personnalisé comme je l'ai fait ci-dessus.

3
Bálint Deáki

Vous pouvez créer votre propre gestionnaire de champs de vues dans un module personnalisé. Implémentez hook_views_api et hook_views_data_alter (& $ data) que vous pouvez écrire votre propre gestionnaire de champs.

6
Nicky Vandevoorde

Vous pouvez utiliser hook_views_data dans un module personnalisé. Il prend un peu plus de temps à mettre en œuvre mais constitue une solution très modulaire car vous obtenez un champ de vues VIRTUELLES.

déclarer la version api de vues dans votre MODULE_NAME.module fichier

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

ajouter le fichier MODULE_NAME.views.inc avec contenu

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

ajouter le fichier MODULE_NAME_handlers.inc avec contenu

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

Votre MODULE_NAME.info le fichier devrait ressembler à ceci

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"

Activez votre module (ou nettoyez votre class registry si vous modifiez un module existant/activé) et vous devriez pouvoir voir/ajouter votre champ virtuel appelé Virtual views field from X Y Z

Il peut être utilisé et présente les avantages de tout autre champ de vues régulières.

3
GiorgosK

Je pense que votre meilleure option sera d'utiliser le module views_customfield . Cela vous permet de définir des champs personnalisés (y compris PHP) pour une vue, sans avoir à avoir ce champ ailleurs (par exemple, le type de contenu).

Si vous utilisez Drupal 7, cela s'appelle désormais Vues PHP car certaines fonctionnalités se trouvent dans le module Vues plus récent

2
Rider_X