Am Ende habe ich ein benutzerdefiniertes Modul mit einem Views Sort-Handler erstellt, um die benutzerdefinierte ORDER-SQL zu schreiben.
function custom_module_views_query_alter(&$view, &$query) {
if($view->name === 'viewname') {
/**
* Order = (rating * 10) – (hours old / 2)
* Note: the rating field is divided by 2 because in the DB the rating is out of 100
*/
$view->query->orderby[0]['field'] = "(if(field_data_field_rating.field_rating_rating, field_data_field_rating.field_rating_rating,0) / 2) - ROUND((UNIX_TIMESTAMP(NOW())-created)/60/60/2)";
$view->query->orderby[0]['direction'] = "DESC";
$view->query->orderby[1]['field'] = "created";
$view->query->orderby[1]['direction'] = "DESC";
}
}
Damit dies funktioniert, müssen Sie entweder die SQL JOINS in diesem Modul hinzufügen oder die Felder Bewertung und veröffentlichtes Datum als 'Sortierung' in Ihrer Ansicht hinzufügen.
Sie können die AKTUELLE SEITE nur sortieren, wenn Sie das
Global:PHP
Feld verwenden. Wenn Sie jedoch einen Pager haben und die Auswahlabfrage benötigen, um nach diesem Ausdruck zu sortieren, müssenhook_views_query_alter
Sie das benutzerdefinierte Feld implementieren und hinzufügen.Zuerst müssen Sie diese Felder in Ihren Ausdruck im Abschnitt FELDER der Ansicht einfügen und dann den Hook wie folgt hinzufügen:
Suchen Sie nach Details im Dokument add_field von
views_plugin_query_default
quelle
Die Verwendung eines Felds mit dem Sortierwert ((Bewertung * 10) - Alter in Stunden) funktioniert nur, wenn Sie diesen Feldwert kontinuierlich aktualisieren (da er sich im Laufe der Zeit ändern sollte).
Wahrscheinlich sollten Sie Ihren eigenen Views Sort-Handler schreiben. Mit einem Views-Sortierhandler können Sie die Sortierreihenfolge in SQL festlegen.
In Ihrem SQL benötigen Sie:
Ich habe noch nie einen Sortierhandler geschrieben, aber ich denke, er könnte Ihr Problem lösen.
Überprüfen Sie Contrib-Module, die ihre eigenen Sortierhandler verwenden.
quelle