Để giải quyết một số vấn đề về hiệu suất của Chế độ xem và tôn trọng các thực tiễn tốt nhất, tôi muốn thay thế một số Chế độ xem PHP mà tôi đã cấu hình trước đây bằng các trình xử lý tùy chỉnh của riêng tôi .
Chẳng hạn, tôi đã có trường PHP Chế độ xem, được loại trừ khỏi màn hình , với thiết lập đó:
Mã giá trị:
if( $row->sticky ==1 ) {
return 100;
} else {
if ( isset($row->product_id) && $row->product_id != "" ){
$query = "SELECT COUNT(statut.entity_id) FROM field_data_field_statut_depart statut"
. " INNER JOIN field_data_field_product product ON statut.entity_id= product.field_product_product_id"
. " INNER JOIN field_data_field_date_depart depart ON statut.entity_id = depart.entity_id"
. " WHERE product.entity_id = ". $row->nid." AND field_statut_depart_value IN (2,3) AND field_date_depart_value > NOW(); ";
$select = db_query($query);
$count = $select->fetchField();
return $count;
}
else {
return -1;
}
}
Mã đầu ra :
<?php print $value ; ?>`
Sau đó, tôi sử dụng trường đó làm tiêu chí sắp xếp đầu tiên ( tăng dần ), trong tiêu chí sắp xếp PHP toàn cầu:
if ($row1->php> $row2->php) return -1; else return 1;
Tôi thực sự biết ơn nếu bạn có thể đưa tôi đi đúng hướng: trong (các) chức năng nào tôi sẽ xây dựng cùng một mã để kết thúc với PHP trong cơ sở dữ liệu?
Tóm lược :
Sau khi tìm kiếm và tiến triển, cộng với sự giúp đỡ của @Renrahf, hầu hết việc thực hiện có vẻ ổn, chi tiết bên dưới. Nhưng tôi vẫn chiến đấu với một điểm : Tôi đã thêm trình xử lý trường tùy chỉnh để tính giá trị, nhưng làm cách nào tôi có thể đặt hàng bằng trình xử lý đó?
Chỉnh sửa:
Những gì tôi đã làm cho đến nay:
tập tin .info
files[] = views_handler_vts_products_sort.inc
files[] = includes/views_handler_vts_count_depconf_field.inc
Tập tin mô-đun
/**
* Implements hook_views_data().
*/
function vts_views_handler_views_data() {
$data['custom']['table']['group'] = t('Custom');
$data['custom']['table']['join'] = array(
// #global is a special flag which let's a table appear all the time.
'#global' => array(),
);
$data['custom']['custom_handler'] = array(
'title' => t('Vts custom Sort Handler'),
'help' => 'Sorts products by sticky first then by custom statut field',
'sort' => array(
'handler' => 'views_handler_vts_products_sort',
),
);
$data['custom']['count_depconf_field'] = array(
'title' => t('Sum of products with status confirmed '),
'help' => t('Calculate Sum of products with status confirmed, to order lists".'),
'field' => array(
'handler' => 'views_handler_vts_count_depconf_field',
'click sortable'=> TRUE,
),
/*'sort' => array(
'handler' => 'views_handler_sort',
), */
);
return $data;
}
function vts_views_handler_views_api() {
return array(
'api' => 3,
'path' => drupal_get_path('module', 'vts_views_handler'),
);
}
views_handler_vts_products_sort
tập tin
/**
* Base sort handler that has no options and performs a simple sort.
*
* @ingroup views_sort_handlers
*/
class views_handler_vts_products_sort extends views_handler_sort {
function query() {
$this->ensure_my_table();
// Add the field.
$this->query->add_orderby('node', 'sticky', 'DESC');
}
}
views_handler_vts_count_depconf_field
tập tin
/*
* A simple field to calculate the value I wish to order by.
*/
class views_handler_vts_count_depconf_field extends views_handler_field {
function query() {
//do nothing
}
function render($values) {
$count = 0;
$product_id = isset($values-> commerce_product_field_data_field_product_product_id)? $values-> commerce_product_field_data_field_product_product_id: NULL;
if(!is_null($product_id)){
$query = "SELECT COUNT(statut.entity_id) FROM field_data_field_statut_depart statut"
. " INNER JOIN field_data_field_product product ON statut.entity_id= product.field_product_product_id"
. " INNER JOIN field_data_field_date_depart depart ON statut.entity_id = depart.entity_id"
. " WHERE product.entity_id = " . $values->nid . " AND field_statut_depart_value IN (2,3) AND field_date_depart_value > NOW(); ";
$select = db_query($query);
$count = $select->fetchField();
}
return $count;
}
}
Câu hỏi còn lại:
Làm thế nào để đặt hàng bởi trình xử lý trường tùy chỉnh? Tôi đã thử thêm
'click sortable'=> TRUE,
OR'sort' => array('handler' => 'views_handler_sort',),
HOẶC$this->query->add_orderby('custom', 'count_depconf_field', 'DESC');
vào trình xử lý sắp xếp tùy chỉnh. Không có tác dụng nào nhưng trả về cột Không xác định trong 'mệnh đề thứ tự'DONE : Làm thế nào tôi có thể vào
$row->product_id
và$row->nid
bên trongquery()
? Tôi cần nó để xây dựng các truy vấn con. : Đã thêm trường xử lý lượt xem và tìm thấy các giá trị hàng trong kết xuất (giá trị $) ...- DONE : Tôi phải chỉnh sửa phần nào của trình xử lý ví dụ? Hàm truy vấn chỉ? Tôi có cần giữ toàn bộ mã ví dụ hay chỉ các phần tùy chỉnh không?
Cảm ơn bạn