Untuk mengatasi beberapa masalah kinerja Tampilan dan menghormati praktik terbaik, saya ingin mengganti beberapa Tampilan PHP yang saya konfigurasi beberapa waktu lalu oleh penangan kustom saya sendiri .
Misalnya saya punya bidang Views PHP, dikecualikan dari tampilan , dengan pengaturan itu:
Kode nilai:
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;
}
}
Kode output :
<?php print $value ; ?>`
Kemudian saya menggunakan bidang itu sebagai kriteria sortir pertama ( menaik ), dalam kriteria sorting PHP Global:
if ($row1->php> $row2->php) return -1; else return 1;
Saya akan sangat berterima kasih jika Anda bisa menempatkan saya di jalan yang benar: di mana fungsi (s) yang akan saya buat kode yang sama untuk berakhir dengan PHP di database?
Ringkasan:
Setelah pencarian dan kemajuan, ditambah bantuan @Renrahf, sebagian besar implementasinya tampak ok, dirinci di bawah. Tapi saya masih berjuang dengan satu poin : saya menambahkan pawang lapangan kustom untuk menghitung nilai, tetapi bagaimana saya bisa memesan oleh pawang itu?
Suntingan:
Apa yang saya lakukan sejauh ini:
file .info
files[] = views_handler_vts_products_sort.inc
files[] = includes/views_handler_vts_count_depconf_field.inc
File modul
/**
* 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
mengajukan
/**
* 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
mengajukan
/*
* 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;
}
}
Pertanyaan yang tersisa:
cara memesan oleh pawang bidang khusus? Saya mencoba menambahkan
'click sortable'=> TRUE,
ATAU'sort' => array('handler' => 'views_handler_sort',),
ATAU$this->query->add_orderby('custom', 'count_depconf_field', 'DESC');
ke dalam hand sort handler kustom. Tidak ada yang berfungsi selain mengembalikan kolom Tidak Dikenal di 'order clause'DONE : Bagaimana saya bisa masuk
$row->product_id
dan$row->nid
masukquery()
? Saya membutuhkannya untuk membangun subquery. : Menambahkan bidang penangan tampilan dan menemukan nilai baris dalam render ($ values) ...- DIBUAT : Bagian mana dari handler contoh yang harus saya edit? Hanya fungsi kueri? Apakah saya perlu menyimpan seluruh kode contoh atau hanya bagian khusus?
Terima kasih
Saya membagikan di bawah implementasi lengkap tentang bagaimana saya melakukan penggantian sortasi Views PHP oleh handler Views kustom .
file .info
File modul
file views_handler_my_custom_sort.inc
Sedikit penjelasan: setelah memahami bagaimana menerapkan penangan Views, saya bingung dengan subquery:
WHERE nod.nid = node.nid
add_orderby
:$this->query->add_orderby(NULL, $sub_query, 'DESC', 'subquery');
berfungsi, tetapi$this->query->add_orderby(NULL, $sub_query, 'DESC');
tidakPoin terakhir ini mengejutkan karena ketika
SELECT TITLE FROM node ORDER BY (SELECT COUNT(field_product_product_id) FROM field_data_field_product p LEFT JOIN node nod ON nod.nid = p.entity_id WHERE nod.nid = node.nid )
bekerja dalam input langsung SQL, itu tidak melintasi pengaturan saat ini.Anda perlu menentukan alias subquery dan kueri akhir akan seperti itu
SELECT TITLE, (SELECT COUNT(field_product_product_id) FROM field_data_field_product p LEFT JOIN node nod ON nod.nid = p.entity_id WHERE nod.nid = node.nid ) as subquery FROM node ORDER BY subquery
Mencoba menghitung nilai untuk mengurutkan hasil dalam bidang penangan kustom, tidak berfungsi karena pengurutan tampilan dilakukan berdasarkan DB dan penangan bidang kustom adalah jenis bidang dummy ... setidaknya ini adalah kesimpulan saya.
sumber