Um einige Leistungsprobleme von Views zu beheben und Best Practices zu respektieren, möchte ich einige Views PHP ersetzen, die ich vor einiger Zeit durch meine eigenen benutzerdefinierten Handler konfiguriert habe .
Zum Beispiel habe ich ein PHP-Feld für Ansichten, das von der Anzeige ausgeschlossen ist , mit diesem Setup:
Wertecode:
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;
}
}
Ausgabecode :
<?php print $value ; ?>`
Dann verwende ich dieses Feld als erstes Sortierkriterium ( aufsteigend ) in einem globalen PHP-Sortierkriterium:
if ($row1->php> $row2->php) return -1; else return 1;
Ich wäre Ihnen sehr dankbar, wenn Sie mich auf den richtigen Weg bringen könnten: In welchen Funktionen soll ich denselben Code erstellen, um PHP in der Datenbank zu erhalten?
Zusammenfassung :
Nach der Suche und dem Fortschritt sowie der @ Renrahf-Hilfe scheint der größte Teil der Implementierung in Ordnung zu sein (siehe unten). Aber ich kämpfe immer noch mit einem Punkt : Ich habe einen benutzerdefinierten Feldhandler hinzugefügt, um einen Wert zu berechnen, aber wie kann ich nach diesem Handler bestellen?
Bearbeitungen:
Was ich bisher gemacht habe:
.info Datei
files[] = views_handler_vts_products_sort.inc
files[] = includes/views_handler_vts_count_depconf_field.inc
Moduldatei
/**
* 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
Datei
/**
* 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
Datei
/*
* 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;
}
}
Verbleibende Frage:
Wie bestelle ich mit dem benutzerdefinierten Feldhandler? Ich habe versucht,
'click sortable'=> TRUE,
OR'sort' => array('handler' => 'views_handler_sort',),
OR$this->query->add_orderby('custom', 'count_depconf_field', 'DESC');
in einen benutzerdefinierten Sortierhandler einzufügen. Keine funktioniert, aber unbekannte Spalte in 'order-Klausel' zurückgebenFERTIG : Wie komme ich hinein
$row->product_id
und$row->nid
hineinquery()
? Ich brauche es, um die Unterabfrage zu erstellen. : Ein Views-Handler-Feld wurde hinzugefügt und die Zeilenwerte in render ($ values) gefunden ...- FERTIG : Welchen Teil des Beispiel- Handlers muss ich bearbeiten? Nur die Abfragefunktion? Muss ich den gesamten Beispielcode oder nur die benutzerdefinierten Teile behalten?
Vielen Dank
Im Folgenden wird die vollständige Implementierung erläutert, wie ich die PHP-Sortierung für Ansichten durch einen benutzerdefinierten Ansichtshandler ersetzt habe .
.info Datei
Moduldatei
Datei views_handler_my_custom_sort.inc
Eine kleine Erklärung: Nachdem ich verstanden hatte, wie Views-Handler implementiert werden, wurde ich mit der Unterabfrage verwechselt:
WHERE nod.nid = node.nid
add_orderby
:$this->query->add_orderby(NULL, $sub_query, 'DESC', 'subquery');
funktioniert, funktioniert aber$this->query->add_orderby(NULL, $sub_query, 'DESC');
nichtDieser letzte Punkt war überraschend, da er zwar
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 )
in der direkten SQL-Eingabe funktioniert, jedoch nicht im aktuellen Setup.Sie müssen den Unterabfrage-Alias angeben, und die endgültige Abfrage lautet ungefähr so
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
Die Versuche, die Werte zum Sortieren des Ergebnisses in einem benutzerdefinierten Handlerfeld zu berechnen, haben nicht funktioniert, da die Sortierung der Ansichten auf DB-Basis erfolgt und der benutzerdefinierte Feldhandler eine Art Dummy-Feld ist ... zumindest war dies meine Schlussfolgerung.
quelle