일부 Views 성능 문제를 해결하고 모범 사례를 존중하기 위해 몇 년 전에 내 자체 사용자 지정 처리기로 구성한 일부 Views PHP 를 교체하고 싶습니다 .
예를 들어 display 에서 제외 된 Views PHP 필드가 있습니다 .
가치 코드 :
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;
}
}
출력 코드 :
<?php print $value ; ?>`
그런 다음 전역 PHP 정렬 기준 에서 해당 필드를 첫 번째 정렬 기준 ( 오름차순 ) 으로 사용 합니다.
if ($row1->php> $row2->php) return -1; else return 1;
올바른 방법으로 나를 넣을 수 있다면 정말 감사 할 것입니다 : 데이터베이스에서 PHP로 끝나는 동일한 코드를 어떤 함수에서 빌드해야합니까?
요약 :
검색 및 진행과 @Renrahf 도움말을 사용하면 대부분의 구현이 아래에 자세히 나와 있습니다. 그러나 나는 여전히 한 가지 점으로 싸우고 있습니다 . 값을 계산하기 위해 사용자 정의 필드 핸들러를 추가했지만 해당 핸들러로 어떻게 주문할 수 있습니까?
편집 :
내가 지금까지 한 일 :
.info 파일
files[] = views_handler_vts_products_sort.inc
files[] = includes/views_handler_vts_count_depconf_field.inc
모듈 파일
/**
* 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
파일
/**
* 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
파일
/*
* 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;
}
}
남은 질문 :
사용자 정의 필드 핸들러로 주문하는 방법은 무엇입니까? 나는 추가하는 시도
'click sortable'=> TRUE,
하거나'sort' => array('handler' => 'views_handler_sort',),
또는$this->query->add_orderby('custom', 'count_depconf_field', 'DESC');
사용자 정의 정렬 핸들러로. 작동하지 않지만 'order 절'에서 알 수없는 열을 반환DONE : 어떻게 얻을 수
$row->product_id
및$row->nid
내부query()
? 하위 쿼리를 작성하려면 필요합니다. : 뷰 핸들러 필드를 추가하고 render ($ values)에서 행 값을 찾았습니다 ...- 완료 : 예제 핸들러의 어느 부분을 편집해야합니까? 쿼리 기능 만? 전체 예제 코드 또는 사용자 지정 부분 만 유지해야합니까?
감사합니다