Zeigt benutzerdefinierte Sortierung an

8

Wie kann ich eine benutzerdefinierte Art von Elementen in einer Ansicht erstellen? Zum Beispiel möchte ich Inhalte bestellen nach : (rating * 10) - age in hours. (Die Bewertung beträgt 5-Sterne-Modulprozentsatz.)

Ich habe mir das Computed Field- Modul und die Views-API angesehen, finde aber nicht, was ich brauche.

Owen
quelle

Antworten:

8

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.

Owen
quelle
3

Ich würde das Views PHP- Modul für diese Angelegenheit verwenden.

Mit diesem Modul kann das Administratorkonto (Benutzer 1) Ansichten, Filtern und Sortierungen zu Ansichten hinzufügen, die PHP-Code verwenden.

  • Installieren und aktivieren Sie das Modul (zusammen mit Ansichten)
  • Fügen Sie alle erforderlichen Felder in Ihrer Ansicht hinzu und schließen Sie sie von der Anzeige aus
  • Fügen Sie ein neues Feld Global: PHP hinzu , in dem Sie den Code angeben, den Sie zur Berechnung des gewünschten Ergebnisses benötigen.
  • Fügen Sie im Wertecode Folgendes hinzu: return (($rating * 10) - $age);(Lesen Sie auch den Abschnitt mit reduzierten verfügbaren Variablen ).
  • Fügen Sie im Ausgabecode Folgendes hinzu: <?php print $value; ?>
  • Fügen Sie ein neues Global: PHP- Sortierfeld hinzu mit:if ($row1->php < $row2->php) return -1; else return 1;
Wtower
quelle
Die Bewertung wird vom fivestar-Modul bereitgestellt. Wie kann ich mit $ row-> review auf die Bewertung zugreifen und nur die Knoten-ID zurückgeben, nicht die Knotenbewertung?
Owen
Ich fürchte, ich kenne das Fivestar-Modul nicht. Wenn die Bewertung ein geeignetes Feld ist, das an Ihre Entität angehängt ist (z. B. Knoten), können Sie Ihrer Ansicht einfach eine Bewertung hinzufügen.
Wtower
7
Verwenden Sie Views PHP nicht! Verwenden Sie für die Wartbarkeit echten benutzerdefinierten Ansichtscode.
Digitgopher
0

Sie können die AKTUELLE SEITE nur sortieren, wenn Sie das Global:PHPFeld verwenden. Wenn Sie jedoch einen Pager haben und die Auswahlabfrage benötigen, um nach diesem Ausdruck zu sortieren, müssen hook_views_query_alterSie 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:

function MODULE_NAME_views_query_alter(&$view, &$query){

    if($view->name == 'name' && $view->current_display == 'page'){
        $query->add_field(NULL, 'TABLENAME.rating * 10 - TABLENAME.age', 'sort_field');
        $query->orderby = array(
            array(
                'field' => 'sort_field',
                'direction' => 'DESC',
            ),
        );

    }
}

Suchen Sie nach Details im Dokument add_field vonviews_plugin_query_default

Leetom
quelle
0

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:

  • Eine berechnete Spalte mit Ihrem Sortierwert: (Bewertung * 10) - Alter in Stunden
  • ORDER BY-Satz unter Verwendung dieser Spalte.

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.

Sanzante
quelle
Vielen Dank für die Antwort. Ich denke, ich werde mich mit dem Views Sort Handler befassen, da das computed_field nicht bei jeder Abfrage in Echtzeit aktualisiert zu werden scheint und den Server etwas belasten könnte.
Owen