Как я могу добавить поле в представление, которое вычисляется с использованием других полей?


Как я могу добавить новое поле в представление, которое вычисляется с использованием других полей?

Есть ли способ, присущий представлениям , для достижения этой цели?


Если исходное представление возвращает строку: X | Y | Z

И у меня есть функция, вычисляющая новые данные: $new = do_something(X, Y, Z);

Как я могу включить $new в качестве четвертого столбца, чтобы в результате: X | Y | Z | $new


Я рассмотрел возможность использования шаблона представлений для достижения этой цели, но Мне любопытно, есть ли лучший способ сделать это с помощью крючков представлений или другого модуля.

Какие шаблоны, крючки или модули лучше всего подходят для этого?

 7
Author: Citricguy, 2012-08-22

4 answers

Я думаю, что модуль вычисляемого поля хорошо подходит для этого: http://drupal.org/project/computed_field

С помощью этого вы сможете добавить поле вычисляемого типа в свой тип контента. Вы можете выполнять вычисления на основе значений других полей.

Если вы настроили поле, вам просто нужно добавить это поле в свое представление, как вы сделали с x, y и z.

Я использовал его один раз для поля цены, которое было указано пользователем в долларах США, и мне пришлось создать другое поле с ценой, переведенной в евро, это выглядело примерно так, использовалось из пользовательского модуля:

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
}

Вы можете ввести свой код в администраторе Drupal в настройках своего поля или поместить его в пользовательский модуль, как я сделал выше.

 3
Author: Bálint Deáki, 2012-08-22 14:57:25

Вы можете создать свой собственный обработчик полей представлений в пользовательском модуле. Реализуйте hook_views_api и hook_views_data_alter(&$data), чем вы можете написать свой собственный обработчик полей.

 6
Author: Nicky Vandevoorde, 2017-05-31 09:21:59

Вы можете использовать hook_views_data в пользовательском модуле. Это занимает немного больше времени для реализации, но создает очень модульное решение, потому что вы получаете поле ВИРТУАЛЬНЫХ представлений.

Объявите версию api представлений в своем файле MODULE_NAME.module

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

Добавить файл MODULE_NAME.views.inc с содержимым

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

Добавить файл MODULE_NAME_handlers.inc с содержимым

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

Ваш файл MODULE_NAME.info должен выглядеть примерно так

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"

Включите свой модуль (или очистите свой class registry, если измените существующий/включенный модуль), и вы должен иметь возможность видеть/добавлять свое виртуальное поле под названием Virtual views field from X Y Z

Это может быть использовано и имеет преимущества любого другого поля обычных представлений.

 3
Author: GiorgosK, 2017-10-27 16:05:45

Я думаю, что лучшим вариантом будет использовать модуль views_customfield. Это позволяет вам определять пользовательские поля (включая PHP) для представления, не имея необходимости иметь это поле в другом месте (например, тип контента).

Если вы используете Drupal 7, теперь это называется Представления PHP, так как некоторые функции находятся в более позднем модуле представлений

 2
Author: Rider_X, 2012-08-22 18:55:38