Làm cách nào tôi có thể thêm một trường vào chế độ xem được tính bằng các trường khác?


7

Làm cách nào tôi có thể thêm trường mới vào chế độ xem được tính bằng các trường khác?

Có cách nào riêng cho Lượt xem để thực hiện việc này không?


Nếu chế độ xem ban đầu trả về hàng: X | Y | Z

Và tôi có một chức năng tính toán dữ liệu mới: $new = do_something(X, Y, Z);

Làm cách nào tôi có thể bao gồm $ new dưới dạng cột thứ tư để dẫn đến: X | Y | Z | $new


Tôi đã xem xét việc sử dụng một mẫu khung nhìn để thực hiện điều này, nhưng tôi tò mò liệu có cách nào tốt hơn để làm điều này bằng cách sử dụng các khung nhìn hay một mô-đun khác.

Những mẫu, móc hoặc mô-đun nào sẽ phù hợp nhất để thực hiện điều này?

Câu trả lời:


3

Tôi nghĩ rằng mô-đun Trường được tính toán phù hợp cho việc này: http://drupal.org/project/computing_field

Với điều này, bạn sẽ có thể thêm trường loại được tính vào loại nội dung của mình. Bạn có thể thực hiện các phép tính dựa trên các giá trị của trường khác.

Nếu bạn thiết lập trường, bạn chỉ cần thêm trường đó vào chế độ xem của mình, giống như bạn đã làm với x, y và z.

Tôi đã sử dụng nó một lần cho một trường giá được đưa ra bởi người dùng bằng USD và hơn tôi phải tạo một trường khác với giá được chuyển đổi thành EUR, nó trông giống như thế này, được sử dụng từ một mô-đun tùy chỉnh:

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
}

Bạn có thể nhập mã của mình vào quản trị viên Drupal trong cài đặt của trường hoặc bạn có thể đặt mã đó vào một mô-đun tùy chỉnh như tôi đã làm ở trên.


1
Trường được tính toán đến gần, nhưng trước khi Chế độ xem có thể truy cập dữ liệu, có vẻ như trước tiên nó phải được lưu vào cơ sở dữ liệu. drupal.org/node/126522 Các giá trị được tính toán trong hàm do_s Something () sẽ không bao giờ giống nhau hai lần khiến việc lưu trước không phải là một tùy chọn. Tôi có thể thấy một số nơi khác để sử dụng mô-đun này, cảm ơn bạn vì đoạn mã!
Citricguy

6

Bạn có thể tạo trình xử lý trường khung nhìn của riêng bạn trong một mô-đun tùy chỉnh. Triển khai hook_view_apihook_view_data_alter (& $ data) hơn là bạn có thể viết trình xử lý trường của riêng bạn.


1
Vì câu trả lời được bình chọn cao nhất, một ví dụ sẽ rất tuyệt
frazras

3

Bạn có thể sử dụng hook_views_datatrong một mô-đun tùy chỉnh. Phải mất một chút thời gian để thực hiện nhưng tạo ra một giải pháp rất mô-đun vì bạn có được trường xem VIRTUAL.

khai báo phiên bản api trong MODULE_NAME.moduletập tin của bạn

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

thêm tập tin MODULE_NAME.views.incvới nội dung

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

thêm tập tin MODULE_NAME_handlers.incvới nội dung

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

Tệp của bạn MODULE_NAME.infosẽ trông giống như thế này

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"

Kích hoạt mô-đun của bạn (hoặc dọn dẹp class registrynếu sửa đổi mô-đun hiện có / đã bật) và bạn sẽ có thể thấy / thêm trường ảo được gọi làVirtual views field from X Y Z

Điều này có thể được sử dụng và có những ưu điểm của bất kỳ trường xem thông thường nào khác.


2

Tôi nghĩ tùy chọn tốt nhất của bạn sẽ là sử dụng mô-đun Views_customfield . Điều này cho phép bạn xác định các trường tùy chỉnh (bao gồm PHP) cho chế độ xem mà không cần phải có trường đó ở nơi khác (ví dụ: loại nội dung).

Nếu bạn đang sử dụng Drupal 7 thì bây giờ được gọi là Views PHP vì một số chức năng nằm trong mô-đun Lượt xem gần đây


1
Lượt xem PHP có vẻ như có thể hoạt động. Tôi muốn tránh bộ lọc đầu vào PHP mặc dù nếu có thể. Cảm ơn bạn cho các mô-đun bạn liệt kê. Tôi sẽ xem qua chúng để xem chúng đã thu hút mọi người xem như thế nào.
Citricguy

2
Tôi sẽ tránh nó, dựa trên "bản in đẹp" trên trang Lượt xem PHP. "Mặc dù mô-đun này cho phép bạn sử dụng trực tiếp PHP bên trong các khung nhìn có thể hữu ích cho các giải pháp nhanh chóng và dễ dàng, nhưng rất nên sử dụng các trình xử lý và plugin thông thường khi có sẵn (hoặc thậm chí để tự tạo một)."
biển 26.2

1
@ user908998 - Tôi đồng ý rằng nói chung PHP trong cơ sở dữ liệu không phải là cách thực hành tốt nhất (tôi đã bị cắn bởi điều đó một lần). Nhưng điều này có thể hữu ích cho mục đích mockup hoặc triển khai nhanh chóng. Đó là rất nhiều công việc để tạo ra một trình xử lý lượt xem mới chỉ để thử nghiệm một ý tưởng.
Rider_X
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.