[gelöst]Durchschnittswert mehrerer Fivestar Felder berechnen
am 31.07.2013 - 10:14 Uhr in
Moinsen zusammen,
ich habe einen Inhaltstyp, mit dem User andere User nach vier Kriterien mittels Fivestar bewerten können. Felder: Kriterium1, Kriterium2, Kriterium3, Kriterium4 . Es soll ein fünftes Feld "Gesamt" erstellt werden, das den Durchschnittswert der einzelnen Felder K1, K2, K3 und K4 wiederum mit Fivestar ausgibt.
Mein Ansatz ist das Modul computed_field mit einem kleinen Hilfsmodul, das den entsprechenden Code enthält:
<?php
//holen und berechnen der Werte
function computed_field_field_gesamt_compute(&$entity_field, $entity_type, $entity, $field, $instance, $langcode, $items) {
$entity_type = 'node';
$id = $entity->nid;
//fivestar_get_votes() liefert ein Array mit drei Elementen
$k1 = fivestar_get_votes($entity_type, $id, $tag = 'vote', 'field_kriterium_1');
$k2 = fivestar_get_votes($entity_type, $id, $tag = 'vote','field_kriterium_2');
$k3 = fivestar_get_votes($entity_type, $id, $tag = 'vote', 'field_kriterium_3');
$k4 = fivestar_get_votes($entity_type, $id, $tag = 'vote', 'field_kriterium_4');
$wert1 = $k1['average']['value'];
$wert2 = $k2['average']['value'];
$wert3 = $k3['average']['value'];
$wert4 = $k4['average']['value'];
$total = $wert1 + $wert2 + $wert3 + $wert4;
$ave = $total / 4;
$entity_field[0]['value'] = $ave;
}
//Ausgabe computed_field "Gesamt"
function computed_field_field_gesamt_display($field, $entity_field_item, $entity_lang, $langcode){
$ave = $entity_field_item['value'];
$variables = array("rating" => $ave, "stars" => 5);
$variables["widget"]["name"] = "basic";
$variables["widget"]["css"] = "sites/all/modules/fivestar/widgets/basic/basic.css";
//Fivestar CSS hinzufügen
drupal_add_css(drupal_get_path('module', 'fivestar') .'/css/fivestar.css');
return theme('fivestar_static', $variables);
}
Das funktioniert auch wunderbar mit dem Fivestar Steuerelement "rated while viewing". Jedoch nicht, wenn als Steuerelement der Fivestar- Felder "rated while editing" ausgewählt wird, das rating also auf der node/add Seite erfolgt. In dem Fall kann fivestar_get_votes() die Feldwerte nicht holen und das Array ist leer.
Alternativ hab ich versucht, die Feldwerte mit field_get_items()
und field_view_field()
zu bekommen. Da ergibt sich jedoch das Problem, das PHP beim speichern der Node mit der Fehlermeldung, es stehe nicht genug memory_limit zur Verfügung, abbricht. Es ist auch egal, wie hoch das Limit setze, der Fehler bleibt. Ich denke, es hängt eher damit zusammen, das field_get_items()
und field_view_field()
innerhalb der Funktion computed_field_field_gesamt_compute()
ausgeführt wird.
Danke an alle, die sich die Mühe machen, das hier alles zu lesen. Vielleicht hat ja jemand eine Idee, wie das Problem für das Fivestar Steuerelement rated while editing zu lösen sein könnte.
- Anmelden oder Registrieren um Kommentare zu schreiben
Habe bereits eine
am 31.07.2013 - 20:38 Uhr
Habe bereits eine Durchschnittsberechnung von Fivestar in einem Projekt gelöst.
Jedoch nicht, wenn als Steuerelement der Fivestar- Felder "rated while editing" ausgewählt wird, das rating also auf der node/add Seite erfolgt. In dem Fall kann fivestar_get_votes() die Feldwerte nicht holen und das Array ist leer.
Kannst du einen Screenshot von dem Steuerelement machen? Verstehe nicht ganz, was das ist und wozu du das brauchst.
- Mein Profil auf Drupal.org
- Mein Profil auf LinkedIn
Moin Jepster, danke für Deine
am 31.07.2013 - 21:37 Uhr
Moin Jepster,
danke für Deine Antwort. Das Steuerelement, in der englischen Oberfläche "Widget" genannt, findest Du bei den Feldeinstellungen. "rated while editing" bedeutet, dass die User ihre Bewertung auf der node/add oder node/[nid]/edit Seite des betreffenden Inhaltstypen vornehmen können. Ist "rated while viewing" ausgewählt, können die Bewertungen erst nach dem Speichern des Nodes erfolgen.
Also wenn der
am 31.07.2013 - 22:08 Uhr
Also wenn der Durchschnittswert bereits angezeigt wird, verfällt die Möglichkeit, dass anhand des Klicks innerhalb der Sterne ein Rateing aufgenommen wird, ja?
- Mein Profil auf Drupal.org
- Mein Profil auf LinkedIn
Ja
am 31.07.2013 - 22:22 Uhr
Ja
Sind in der JavaScript
am 01.08.2013 - 09:06 Uhr
Sind in der JavaScript Konsole von z.B. Chrome irgendwelche Fehler zu sehen?
- Mein Profil auf Drupal.org
- Mein Profil auf LinkedIn
Nein, keine JS Fehler. Alle
am 03.08.2013 - 05:53 Uhr
Nein, keine JS Fehler. Alle Fehler, die auftreten, sind im ersten Post beschrieben. Das Frage ist doch, wie komme ich an die Rating- Werte, die vor dem Speichern der Node per Fivestar gesetzt werden.
du könntest doch per js die
am 03.08.2013 - 07:29 Uhr
du könntest doch per js die Rating-Werte abfragen, den Durchschnitt berechnen und an ein Formularelement übergeben, das du per js/css oder hiddem-Property ausgeblendet hast ....
Sepp
Vielleicht hilft dir dieser
am 03.08.2013 - 11:26 Uhr
Vielleicht hilft dir dieser Patch: https://drupal.org/node/1911706
Wenn du Probleme hast, die stark modulspezifisch sind, wie in diesem Falle, dann suche am Besten zuerst in der Issue Queue des jeweiligen Projektes. Ansonsten poste deine Frage in die Issue Queue des jeweiligen Projekts an die Maintainer bzw. die Community.
- Mein Profil auf Drupal.org
- Mein Profil auf LinkedIn
Vielen Dank euch
am 06.08.2013 - 14:56 Uhr
Vielen Dank euch Beiden!
@Jepster: Der Patch behebt einen Fehler, der bei mir nicht auftritt. Die Issue Queue's hatte ich schon durchgesehen.
@ sepp: Die JavaScript Variante hat neben der Umständlichkeit natürlich den Nachteil, dass es nicht funktioniert, wenn im Browser JS deaktiviert ist. Es muss schon serverseitig berechnet werden.
Allerdings funktioniert es jetzt einwandfrei bei "rating while editing" mittels der Funktion field_get_items(). Warum es bei meinem ersten Entwurf damit nicht klappte, kann ich jetzt nicht mehr sagen. Wahrscheinlich hatte ich einen Fehler drin, den ich immer wieder übersehen hatte. Hab's neu geschrieben und alles ist gut.
Für den Fall, dass jemand diese Funktionalität in gleicher oder ähnlicher Weise benötigt, schreib ich noch mal kurz auf, wie ich es gelöst hab:
Der Code für die MODULNAME.module Datei:
<?php
//holen und berechnen der Werte
function computed_field_field_gesamt_compute(&$entity_field, $entity_type, $entity, $field, $instance, $langcode, $items) {
$k1 = field_get_items('node', $entity, 'field_kriterium_1');
$k2 = field_get_items('node', $entity, 'field_kriterium_2');
$k3 = field_get_items('node', $entity, 'field_kriterium_3');
$k4 = field_get_items('node', $entity, 'field_kriterium_4');
$wert1 = $k1[0]['rating'];
$wert2 = $k2[0]['rating'];
$wert3 = $k3[0]['rating'];
$wert4 = $k4[0]['rating'];
$total = $wert1 + $wert2 + $wert3 + $wert4;
$ave = $total / 4;
$entity_field[0]['value'] = $ave;
}
//Ausgabe computed_field "Gesamt"
function computed_field_field_gesamt_display($field, $entity_field_item, $entity_lang, $langcode){
$ave = $entity_field_item['value'];
$variables = array("rating" => $ave, "stars" => 5);
$variables["widget"]["name"] = "basic";
$variables["widget"]["css"] = "sites/all/modules/fivestar/widgets/basic/basic.css";
//Fivestar CSS hinzufügen
drupal_add_css(drupal_get_path('module', 'fivestar') .'/css/fivestar.css');
return theme('fivestar_static', $variables);
}
?>