Artikel bewerten

_wiewo_
Beiträge: 358
Registriert: Mo 8. Sep 2008, 11:12

Artikel bewerten

Beitrag von _wiewo_ » Mi 4. Nov 2009, 11:30

Tagchen :)

So heute schmeiß ich gleich mal noch nen Modul hinterher. :)

Gestern gabs ja mein "Anwesensheitsmodul" und heute gibts etwas was man so aus WordPress kennt, unzwar die Artikelbewertung. :)

Einstellen braucht Ihr nur Zeile 13 und 14

Code: Alles auswählen

$iSperrzeit = 24*60*60;
$iMaxSterne = 5;
Dort gebt Ihr an, wieviel Sterne maximal vergeben werden dürfen, und wie lange eine IP davon ausgeschlossen ist den gleichen Artikel nochmal zu bewerten (in Sekunden).
Den Rest erledigt das Script ganz von alleine.

Hier mal der Code

Code: Alles auswählen

<?php
/*************************************************************
 * CONTENIDO MODUL - OUTPUT
 *
 * @name 		wtArtikelbewertung
 * @version 	1.0.1
 * @author 		Christian Kehres
 * @copyright 	webtischlerei.de <www.webtischlerei.de>
 * @license 	http://www.gnu.org/licenses/gpl-3.0.txt
 *************************************************************/

// Configuration
$iSperrzeit = 24*60*60;
$iMaxSterne = 5;

// neues Objekte zur Templateverwendung initialisieren
(!isset($oTemplate) ? $oTemplate = new Template() : $oTemplate->reset());

// Objekt zur Artikelbewertung initialisieren
$oArtikelbewertung = new wtArtikelbewertung($iSperrzeit, $iMaxSterne);

// dem Artikel eine Bewertung geben
$oArtikelbewertung->rate(Contenido_Security::toInteger($_GET['article_rate']));

// Sterne ausgeben
for ($i = 1; $i <= $oArtikelbewertung->getMaxSterne(); $i++) {
	$oTemplate->set('d', 'bewertungslink', 	Contenido_Url::getInstance()->build(array('idart' => $idart, 'lang' => $lang, 'client' => $client, 'article_rate' => $i)));
	$oTemplate->set('d', 'empty_full', 		($i <= $oArtikelbewertung->getGesamtbewertung() ? 'full' : 'empty'));
	$oTemplate->next();
}

// Anzahl der maximalen Sterneanzahl ans Template übergeben
$oTemplate->set('s', 'maxsterne', 			$iMaxSterne);

// Bewertung des Artikels an das Template übergeben
$oTemplate->set('s', 'gesamtbewertung', 	$oArtikelbewertung->getGesamtbewertung());

// das Template generieren und ausgeben
$oTemplate->generate('templates/artikelbewertung.html', false, true);


###############################
### die dazugehörige Klasse ###
###############################

class wtArtikelbewertung {

	private $_oArticle 		= null;
	private $_iSperrzeit 	= null;
	private $_sRemoteAddr 	= null;
	private $_iTimestamp 	= null;
	private $_iLastRate 	= null;
	private $_iMaxSterne 	= null;

	public function wtArtikelbewertung($iSperrzeit, $iMaxSterne) {
		$this->_setArticle();
		$this->_setSperrzeit($iSperrzeit);
		$this->_setRemoteAddr($_SERVER['REMOTE_ADDR']);
		$this->_setTimestamp();
		$this->_setMaxSterne($iMaxSterne);
	}

	private function _setArticle() {
		global $idart;

		$this->_oArticle = new cApiArticle($idart);
	}

	private function _getArticle() {
		return $this->_oArticle;
	}

	private function _setSperrzeit($iSperrzeit) {
		$this->_iSperrzeit = $iSperrzeit;
	}

	private function _getSperrzeit() {
		return $this->_iSperrzeit;
	}

	private function _setRemoteAddr($sRemoteAddr) {
		$this->_sRemoteAddr = $sRemoteAddr;
	}

	private function _getRemoteAddr() {
		return $this->_sRemoteAddr;
	}

	private function _setTimestamp() {
		$this->_iTimestamp = time();
	}

	private function _getTimestamp() {
		return $this->_iTimestamp;
	}

	private function _setBewerter() {
		$aBewerter = $this->_getBewerter();

		$aBewerter[$this->_getRemoteAddr()] = $this->_getTimestamp();

		$this->_getArticle()->setProperty('artikelbewertung', 'bewerter', base64_encode(serialize($aBewerter)));
	}

	private function _getBewerter() {
		return unserialize(base64_decode($this->_getArticle()->getProperty('artikelbewertung', 'bewerter')));
	}

	private function _setSterne($iSterne) {
		$this->_getArticle()->setProperty('artikelbewertung', 'sterne', $this->getSterne()+$iSterne);
	}

	public function getSterne() {
		return $this->_getArticle()->getProperty('artikelbewertung', 'sterne');
	}

	private function _setBewertungen() {
		$this->_getArticle()->setProperty('artikelbewertung', 'bewertungen', $this->getBewertungen()+1);
	}

	public function getBewertungen() {
		return $this->_getArticle()->getProperty('artikelbewertung', 'bewertungen');
	}

	private function _setGesamtbewertung() {
		$this->_getArticle()->setProperty('artikelbewertung', 'gesamtbewertung', round(bcdiv($this->getSterne(), $this->getBewertungen(), 2), 0));
	}

	public function getGesamtbewertung() {
		$iGesamtbewertung = $this->_getArticle()->getProperty('artikelbewertung', 'gesamtbewertung');
		
		return ($iGesamtbewertung >= 1 ? $iGesamtbewertung : 0);
	}

	private function _setMaxSterne($iMaxSterne) {
		$this->_iMaxSterne = $iMaxSterne;
	}

	public function getMaxSterne() {
		return $this->_iMaxSterne;
	}

	private function _checkSperre() {
		// Bewerter dieses Artikels auslesen
		$aBewerter = $this->_getBewerter();

		return (bcadd($aBewerter[$this->_getRemoteAddr()], $this->_getSperrzeit()) < $this->_getTimestamp() ? true : false);
	}

	private function _checkSterne($iSterne) {
		return ($iSterne > 0 && $iSterne <= $this->getMaxSterne() ? true : false);
	}

	public function rate($iSterne) {
		// überprüfen ob ein zugelassener Wert übergeben wurde
		if ($this->_checkSterne($iSterne)) {
			// überprüfen ob die letzte Wertung mehr als x Sekunden her ist
			if ($this->_checkSperre()) {

				$this->_setBewerter();
				$this->_setSterne($iSterne);
				$this->_setBewertungen();
				$this->_setGesamtbewertung();

			}
		}
	}

}
?>
Was noch auf meiner Liste steht als Features
  • Bewertung nur für angemeldeten FrontendUser
  • nicht nur die IP 24 Stunden zb sperren, sondern auch einen Cookie setzen
  • wenn es FrontendUser sind Artikelbewertung nur ein einziges mal möglich
  • bewertung per Ajax
passendes Modul-Template

Code: Alles auswählen

<div id="bewertung">
<h2>Bewertung</h2>
<div id="sterne">{gesamtbewertung} von {maxsterne}
<!-- BEGIN:BLOCK -->
	<a href="{bewertungslink}" class="stern_{empty_full}">rate</a>
<!-- END:BLOCK -->
</div>
<div style="clear: both;"></div>
</div>
passendes CSS (Beispiel von meiner Seite)

Code: Alles auswählen

#bewertung #sterne {
	height: 17px;
	width: 65%;
	display: block;
	line-height: 17px;
	font-size: 12px;
	float: right;
	text-align: right;
}

#bewertung #sterne a {
	width: 17px;
	height: 17px;
	display: block;
	float: left;
	margin-right: 3px;
	text-indent: -8000px;
	text-align: justify;
	background-image: url(../images/stars.png);
}

#bewertung #sterne a.stern_full {
	background-position: 0 0;
}

#bewertung #sterne a.stern_empty {
	background-position: 0 17px;
}

#bewertung #sterne a:hover {
	background-position: 0 34px;
}
Die Grafik für die Sterne bekommt ihr hier !

Bei Kritik bitte bedenken, Version 1 :)

Thomas Steger
Beiträge: 27
Registriert: Sa 23. Aug 2008, 09:10
Wohnort: Vilshofen an der Donau
Kontaktdaten:

Re: Artikel bewerten

Beitrag von Thomas Steger » Fr 22. Jan 2010, 14:33

Ersteinmal Danke für diese Modul. Es läuft auch absolut problemlos.

Jetzt habe ich nur eine Frage: lässt sich irgendwo auslesen, wieviele Besucher eine Bewertung für den Artikel abgegeben haben?

Danke

Thomas
==========
Trike fahren - die schönste Art Sprit zu verbrennen!
==========

_wiewo_
Beiträge: 358
Registriert: Mo 8. Sep 2008, 11:12

Re: Artikel bewerten

Beitrag von _wiewo_ » Fr 22. Jan 2010, 17:46

in der klasse findest du folgende 3 Zeilen

Code: Alles auswählen

public function getBewertungen() {
    return $this->_getArticle()->getProperty('artikelbewertung', 'bewertungen');
}
also machst du im modul

Code: Alles auswählen

$oArtikelbewertung = new wtArtikelbewertung($iSperrzeit, $iMaxSterne);
$iBewertungen = $oArtikelbewertung->getBewertungen();

Thomas Steger
Beiträge: 27
Registriert: Sa 23. Aug 2008, 09:10
Wohnort: Vilshofen an der Donau
Kontaktdaten:

Re: Artikel bewerten

Beitrag von Thomas Steger » Fr 22. Jan 2010, 19:11

Vielen Dank - hat funktioniert.

LG

Thomas
==========
Trike fahren - die schönste Art Sprit zu verbrennen!
==========

dosenbrot
Beiträge: 102
Registriert: Fr 27. Aug 2004, 15:37
Kontaktdaten:

Re: Artikel bewerten

Beitrag von dosenbrot » Do 18. Mär 2010, 19:43

Hallo Christian,

deine Subdomain ist derzeit nicht erreichbar bzw. scheint nicht mehr zu existieren?
Könntest du deine Sterchengrafik bitte noch einmal irgendwo zum Download parat stellen, da ich das Modul sehr gerne ausprobieren möchte?

Gibt es zudem die Möglichkeit, aus den Bewertungen Charts zu erstellen?
Also wir nehmen an, es gibt die Rubrik XY mit einem Startartikel, in dem die Charts (Top 10) der am besten bewerteten Artikel erscheinen soll aus den Artikeln, die alle in der Kategorie liegen. Hast du das zufällig für eigene Werke schon umgesetzt und magst es der Community zur Verfügung stellen?

Danke und Grüße
Felix

_wiewo_
Beiträge: 358
Registriert: Mo 8. Sep 2008, 11:12

Re: Artikel bewerten

Beitrag von _wiewo_ » Fr 19. Mär 2010, 14:30

Hey,

also die Klasse/das Modul bekommt bald nochmal nen dickes update,
hatte bisher alles als Propertys gespeichert, von dem weg bin ich jetzt weg, machte die sache zwar relativ simpel, aber schränkt den funktionsumfang dann doch ein

denke mitte april steht v2,

damit sind dann auch solche listen wie "top10" aller kategorien, dieser kategorie oder von kategorie 1,2 und 3, mit / ohne unterkategorien etc möglich

Spider IT
Beiträge: 1416
Registriert: Fr 3. Dez 2004, 10:15

Re: Artikel bewerten

Beitrag von Spider IT » Mo 28. Feb 2011, 18:13

Hey _wiewo_,

meintest du Mitte April 2010, 2011 oder noch später für die Version 2? :D

Aber mal im Ernst, hast du da schon was fertig? Ich brauche nicht unbedingt die Auswertungsseiten, muss aber die Geschichte mit den Frontend-Usern umsetzen und baue natürlich lieber auf die bessere Version auf. Den Frontend-User Scheiß kann ich dir dann auch zuschicken, dann musst du das nicht selbst nochmal entwickeln :)

Gruß
René

MakD42
Beiträge: 103
Registriert: Sa 8. Nov 2003, 19:01
Wohnort: Marburg
Kontaktdaten:

Re: Artikel bewerten

Beitrag von MakD42 » So 13. Mär 2011, 13:50

Hallo Christian

Versuche gerade das Modul zu Installieren. Dabei bekomme ich folgende Fehlermeldung angezeigt:

Code: Alles auswählen

Fatal error: Class 'cApiArticle' not found in /kunden/domain.de/contenido/external/backendedit/front_content.php(981) : eval()'d code on line 447
Was könnte das sein? Freue mich von Dir zu hören.
MakD 42
______________________
Contenido 4.6.8 & 4.8.15
MySQL 5.1.54
Linux/Apache
Meine Contenidoprojekte: art & weise | StadtMedia | aidea

derSteffen
Beiträge: 847
Registriert: Mi 14. Dez 2005, 16:15
Wohnort: Königs Wusterhausen bei Berlin
Kontaktdaten:

Re: Artikel bewerten

Beitrag von derSteffen » Mo 11. Mär 2013, 20:07

Hallo,

ich nutze auch das Modul mit aktivierter IP-Sperre. Dummerweise ist es doch jetzt so, dass ich auch keine anderen Artikel mehr bewerten kann, oder?

Vielen Dank

MfG Steffen

PS: Eine Cookie-Funktin wäre natürlich auch noch eine schöne Ergänzung.

McHubi
Beiträge: 1209
Registriert: Do 18. Nov 2004, 23:06
Wohnort: Mettmann
Kontaktdaten:

Re: Artikel bewerten

Beitrag von McHubi » Di 12. Mär 2013, 07:55

Moin,

ich kenne das Modul zwar nicht, hätte aber eine Idee zur IP-Problematik. Wenn die IP irgendwo hinterlegt wird, und immer nur nach der IP geprüft wird, kann es ja zwangsläufig nur zu einer "Generalsperrung" kommen. Wie wäre es, wenn Du einfach die idart mit an die IP dranpappst? statt 123.456.789.0 würde dann 123.456.789.0-123 gespeichert und Du hättest ein Blocken weiterer Bewertungen nur für einen bestimmten Artikel. Frage mich allerdings beim Querlesen des Moduls, wo die IP überhaupt hinterlegt wird... Evtl. nur "temporär"? Sozusagen wenn die die Seite verlassen oder der Browsercache gelöscht oder ... wie auch immer ist eine neue Bewertung möglich? Sehe auch nirgends eine Abfrage wie denn überhaupt die IP lautet... Hm... :|
seamless-design.de
"Geht nicht!" wohnt in der "Will nicht!"-Strasse.

Das Handbuch zur Version 4.10: CONTENIDO für Einsteiger (4.10)

Das Handbuch zur Version 4.9: CONTENIDO für Einsteiger (4.9)

derSteffen
Beiträge: 847
Registriert: Mi 14. Dez 2005, 16:15
Wohnort: Königs Wusterhausen bei Berlin
Kontaktdaten:

Re: Artikel bewerten

Beitrag von derSteffen » Di 12. Mär 2013, 08:29

Hallo,

also es scheintzu funktioniern mit der IP im Modul. Ach ich kann versuchen einfach die idcatart ranzuhängen und dann ist schon für die IP der Artiekl gesperrt?

MfG Steffen

McHubi
Beiträge: 1209
Registriert: Do 18. Nov 2004, 23:06
Wohnort: Mettmann
Kontaktdaten:

Re: Artikel bewerten

Beitrag von McHubi » Do 14. Mär 2013, 11:22

Wie schon geschrieben, habe ich bislang nicht entdeckt wo und wie die ip gespeichert wird. Nehmen wir einmal an - ich meine es ist nicht so aber als Beispiel zum Erläutern - die IP wird in einer DB hinterlegt. Dann erfolgt bei jedem Seitenaufruf die Prüfung "ist die IP schon in der DB drin oder nicht?". Wenn nicht -> Bewertung zugelassen / Wenn ja -> Bewertung geblockt. Da immer nur ausschließlich auf die IP geprüft wird, gilt diese Aussage generell für alle aufgerufenen Seiten auch wenn nur eine von ihnen bewertet wurde. Packst Du einfach die idart oder ähnliches dran, kannst Du nach IP und dem eindeutigen Schlüssel pro Einzelseite prüfen.
seamless-design.de
"Geht nicht!" wohnt in der "Will nicht!"-Strasse.

Das Handbuch zur Version 4.10: CONTENIDO für Einsteiger (4.10)

Das Handbuch zur Version 4.9: CONTENIDO für Einsteiger (4.9)

derSteffen
Beiträge: 847
Registriert: Mi 14. Dez 2005, 16:15
Wohnort: Königs Wusterhausen bei Berlin
Kontaktdaten:

Kategorie bewerten

Beitrag von derSteffen » Mi 26. Jun 2013, 19:26

Hallo,

also die IP-Sperre des Moduls funktioniert! Auch wenn ich nicht weiß wo das abgespeichert wird und wo die Ergebnisse gespeichert werden?

Ich habe das Modul jetzt so umgebaut, dass man damit nicht einen einzelnen Artikel bewertet, sondern ganze Kategorien. Das macht sich z.B. ganz gut, wenn man eine Kategorie Geschäft XY hat und in der Kategorie sich alle Seiten für dieses Geschäft befinden, kann man auf jeder Seite für dieses Geschäft seine Stimme abgeben (natürlich nur wenn die IP-Sperre abgelaufen ist):

KATEGORIE-BEWERTUNG

Code: Alles auswählen

<?php
    /*************************************************************
    * CONTENIDO MODUL - OUTPUT
    *
    * @name       wtKategoriebewertung
    * @version    1.0.1
    * @author       Christian Kehres
    * @copyright    webtischlerei.de <www.webtischlerei.de>
    * @license    http://www.gnu.org/licenses/gpl-3.0.txt
    *************************************************************/

    // Configuration
    // $iSperrzeit = 24*60*60;
	$iSperrzeit = 60;
    $iMaxSterne = 5;

    // neues Objekte zur Templateverwendung initialisieren
    (!isset($oTemplate) ? $oTemplate = new Template() : $oTemplate->reset());

    // Objekt zur Kategoriebewertung initialisieren
    $oKategoriebewertung = new wtKategoriebewertung($iSperrzeit, $iMaxSterne);

    // dem Artikel eine Bewertung geben
    $oKategoriebewertung->rate(Contenido_Security::toInteger($_GET['category_rate']));

    // Sterne ausgeben
    for ($i = 1; $i <= $oKategoriebewertung->getMaxSterne(); $i++) {
       $oTemplate->set('d', 'bewertungslink',    Contenido_Url::getInstance()->build(array('idcat' => $idcat, 'lang' => $lang, 'client' => $client, 'category_rate' => $i)));
       $oTemplate->set('d', 'empty_full',       ($i <= $oKategoriebewertung->getGesamtbewertung() ? 'full' : 'empty'));
       $oTemplate->next();
    }
	
	// 
	$iBewertungen = $oKategoriebewertung->getBewertungen();
    $oTemplate->set('s', 'bewerteranzahl',          $iBewertungen);

    // Anzahl der maximalen Sterneanzahl ans Template übergeben
    $oTemplate->set('s', 'maxsterne',          $iMaxSterne);

    // Bewertung des Artikels an das Template übergeben
    $oTemplate->set('s', 'gesamtbewertung',    $oKategoriebewertung->getGesamtbewertung());

    // das Template generieren und ausgeben
    $oTemplate->generate('templates/bewertung.html', false, true);


    ###############################
    ### die dazugehörige Klasse ###
    ###############################

    class wtKategoriebewertung {

       private $_oCategory       = null;
       private $_iSperrzeit    = null;
       private $_sRemoteAddr    = null;
       private $_iTimestamp    = null;
       private $_iLastRate    = null;
       private $_iMaxSterne    = null;

       public function wtKategoriebewertung($iSperrzeit, $iMaxSterne) {
          $this->_seCategory();
          $this->_setSperrzeit($iSperrzeit);
          $this->_setRemoteAddr($_SERVER['REMOTE_ADDR']);
          $this->_setTimestamp();
          $this->_setMaxSterne($iMaxSterne);
       }

       private function _seCategory() {
          global $idcat;

          $this->_oCategory = new cApiCategory($idcat);
       }

       private function _getCategory() {
          return $this->_oCategory;
       }

       private function _setSperrzeit($iSperrzeit) {
          $this->_iSperrzeit = $iSperrzeit;
       }

       private function _getSperrzeit() {
          return $this->_iSperrzeit;
       }

       private function _setRemoteAddr($sRemoteAddr) {
          $this->_sRemoteAddr = $sRemoteAddr;
       }

       private function _getRemoteAddr() {
          return $this->_sRemoteAddr;
       }

       private function _setTimestamp() {
          $this->_iTimestamp = time();
       }

       private function _getTimestamp() {
          return $this->_iTimestamp;
       }

       private function _setBewerter() {
          $aBewerter = $this->_getBewerter();

          $aBewerter[$this->_getRemoteAddr()] = $this->_getTimestamp();

          $this->_getCategory()->setProperty('Kategoriebewertung', 'bewerter', base64_encode(serialize($aBewerter)));
       }

       private function _getBewerter() {
          return unserialize(base64_decode($this->_getCategory()->getProperty('Kategoriebewertung', 'bewerter')));
       }

       private function _setSterne($iSterne) {
          $this->_getCategory()->setProperty('Kategoriebewertung', 'sterne', $this->getSterne()+$iSterne);
       }

       public function getSterne() {
          return $this->_getCategory()->getProperty('Kategoriebewertung', 'sterne');
       }

       private function _setBewertungen() {
          $this->_getCategory()->setProperty('Kategoriebewertung', 'bewertungen', $this->getBewertungen()+1);
       }

       public function getBewertungen() {
          return $this->_getCategory()->getProperty('Kategoriebewertung', 'bewertungen');		  
       }

       private function _setGesamtbewertung() {
          $this->_getCategory()->setProperty('Kategoriebewertung', 'gesamtbewertung', round(bcdiv($this->getSterne(), $this->getBewertungen(), 2), 0));
       }

       public function getGesamtbewertung() {
          $iGesamtbewertung = $this->_getCategory()->getProperty('Kategoriebewertung', 'gesamtbewertung');
          
          return ($iGesamtbewertung >= 1 ? $iGesamtbewertung : 0);
       }

       private function _setMaxSterne($iMaxSterne) {
          $this->_iMaxSterne = $iMaxSterne;
       }

       public function getMaxSterne() {
          return $this->_iMaxSterne;
       }

       private function _checkSperre() {
          // Bewerter dieses Artikels auslesen
          $aBewerter = $this->_getBewerter();

          return (bcadd($aBewerter[$this->_getRemoteAddr()], $this->_getSperrzeit()) < $this->_getTimestamp() ? true : false);
       }

       private function _checkSterne($iSterne) {
          return ($iSterne > 0 && $iSterne <= $this->getMaxSterne() ? true : false);
       }

       public function rate($iSterne) {
          // überprüfen ob ein zugelassener Wert übergeben wurde
          if ($this->_checkSterne($iSterne)) {
             // überprüfen ob die letzte Wertung mehr als x Sekunden her ist
             if ($this->_checkSperre()) {

                $this->_setBewerter();
                $this->_setSterne($iSterne);
                $this->_setBewertungen();
                $this->_setGesamtbewertung();

             }
          }
       }

    }
	echo $aBewerter;
?>
MfG Steffen

derSteffen
Beiträge: 847
Registriert: Mi 14. Dez 2005, 16:15
Wohnort: Königs Wusterhausen bei Berlin
Kontaktdaten:

Kategorie bewerten - die Zweite

Beitrag von derSteffen » Mi 26. Jun 2013, 21:32

Hallo,

jetzt noch mal das Kategorie-Bewertungsmodul, wo bei aktiver IP-Sperre ein anderes Template aufgerufen wird und somit das "nicht nochmal voten" besser verdeutlicht wird (mit einer JS-Alert-Ausgabe), außderm wird auch die Anzahl der abgegebenen Stimmen angezeigt und der aktuelle Kategoriename im Modul-Template ausgegeben.

Modul

Code: Alles auswählen

<?php
    /*************************************************************
    * CONTENIDO MODUL - OUTPUT
    *
    * @name       wtKategoriebewertung
    * @version    1.0.1
    * @author       Christian Kehres
    * @copyright    webtischlerei.de <www.webtischlerei.de>
    * @license    http://www.gnu.org/licenses/gpl-3.0.txt
    *************************************************************/

// Kategorienamen erfahren
cInclude('classes', 'class.cat.php');
$ct = new Cat();
$selcatname = $ct -> getCatName($idcat, $lang);

    // Configuration
     $iSperrzeit = 24*60*60; /* Ein Tag */
    // $iSperrzeit = 60; /* Eine Minute */
       $iMaxSterne = 5;

    // neues Objekte zur Templateverwendung initialisieren
    (!isset($oTemplate) ? $oTemplate = new Template() : $oTemplate->reset());

    // Objekt zur Kategoriebewertung initialisieren
    $oKategoriebewertung = new wtKategoriebewertung($iSperrzeit, $iMaxSterne);

    // dem Artikel eine Bewertung geben
    $oKategoriebewertung->rate(Contenido_Security::toInteger($_GET['category_rate']));

    // Sterne ausgeben
    for ($i = 1; $i <= $oKategoriebewertung->getMaxSterne(); $i++) {
       $oTemplate->set('d', 'bewertungslink',    Contenido_Url::getInstance()->build(array('idcat' => $idcat, 'lang' => $lang, 'client' => $client, 'category_rate' => $i)));
       $oTemplate->set('d', 'empty_full',       ($i <= $oKategoriebewertung->getGesamtbewertung() ? 'full' : 'empty'));
       $oTemplate->next();
    }
	
	// Anzahl der Stimmen
	$iBewertungen = $oKategoriebewertung->getBewertungen();
    $oTemplate->set('s', 'bewerteranzahl',          $iBewertungen);

	// Kategorienamen ausgeben
	$oTemplate->set('s', 'kategorie', $selcatname);

    // Anzahl der maximalen Sterneanzahl ans Template übergeben
    $oTemplate->set('s', 'maxsterne',          $iMaxSterne);

    // Bewertung des Artikels an das Template übergeben
    $oTemplate->set('s', 'gesamtbewertung',    $oKategoriebewertung->getGesamtbewertung());
	
	// Überprüfung ob IP-Sperre aktiv ist
	$ipsperreaktiv = $oKategoriebewertung->getcheckSperre();

	if ($ipsperreaktiv == "1") {
	// echo "keine Sperre";
	// Template zum Bewerten
    $oTemplate->generate('templates/bewertung.html', false, true);
	} else {
	// echo "Sperre aktiv";
	// Template - Bewertung nicht möglich
    $oTemplate->generate('templates/bewertung-empty.html', false, true);
	}

    ###############################
    ### die dazugehörige Klasse ###
    ###############################

    class wtKategoriebewertung {

       private $_oCategory       = null;
       private $_iSperrzeit    = null;
       private $_sRemoteAddr    = null;
       private $_iTimestamp    = null;
       private $_iLastRate    = null;
       private $_iMaxSterne    = null;

       public function wtKategoriebewertung($iSperrzeit, $iMaxSterne) {
          $this->_seCategory();
          $this->_setSperrzeit($iSperrzeit);
          $this->_setRemoteAddr($_SERVER['REMOTE_ADDR']);
          $this->_setTimestamp();
          $this->_setMaxSterne($iMaxSterne);
       }

       private function _seCategory() {
          global $idcat;

          $this->_oCategory = new cApiCategory($idcat);
       }

       private function _getCategory() {
          return $this->_oCategory;
       }

       private function _setSperrzeit($iSperrzeit) {
          $this->_iSperrzeit = $iSperrzeit;
       }

       private function _getSperrzeit() {
          return $this->_iSperrzeit;
       }

       private function _setRemoteAddr($sRemoteAddr) {
          $this->_sRemoteAddr = $sRemoteAddr;
       }

       private function _getRemoteAddr() {
          return $this->_sRemoteAddr;
       }

       private function _setTimestamp() {
          $this->_iTimestamp = time();
       }

       private function _getTimestamp() {
          return $this->_iTimestamp;
       }

       private function _setBewerter() {
          $aBewerter = $this->_getBewerter();

          $aBewerter[$this->_getRemoteAddr()] = $this->_getTimestamp();

          $this->_getCategory()->setProperty('Kategoriebewertung', 'bewerter', base64_encode(serialize($aBewerter)));
       }

       private function _getBewerter() {
          return unserialize(base64_decode($this->_getCategory()->getProperty('Kategoriebewertung', 'bewerter')));
       }

       private function _setSterne($iSterne) {
          $this->_getCategory()->setProperty('Kategoriebewertung', 'sterne', $this->getSterne()+$iSterne);
       }

       public function getSterne() {
          return $this->_getCategory()->getProperty('Kategoriebewertung', 'sterne');
       }

       private function _setBewertungen() {
          $this->_getCategory()->setProperty('Kategoriebewertung', 'bewertungen', $this->getBewertungen()+1);
       }

       public function getBewertungen() {
          return $this->_getCategory()->getProperty('Kategoriebewertung', 'bewertungen');		  
       }

       private function _setGesamtbewertung() {
          $this->_getCategory()->setProperty('Kategoriebewertung', 'gesamtbewertung', round(bcdiv($this->getSterne(), $this->getBewertungen(), 2), 0));
       }

       public function getGesamtbewertung() {
          $iGesamtbewertung = $this->_getCategory()->getProperty('Kategoriebewertung', 'gesamtbewertung');
          
          return ($iGesamtbewertung >= 1 ? $iGesamtbewertung : 0);
       }

       private function _setMaxSterne($iMaxSterne) {
          $this->_iMaxSterne = $iMaxSterne;
       }

       public function getMaxSterne() {
          return $this->_iMaxSterne;
       }

       private function _checkSperre() {
          // Bewerter dieses Artikels auslesen
          $aBewerter = $this->_getBewerter();

          return (bcadd($aBewerter[$this->_getRemoteAddr()], $this->_getSperrzeit()) < $this->_getTimestamp() ? true : false);
       }
	   
	   public function getcheckSperre() {
          $aBewerter = $this->_getBewerter();
          return (bcadd($aBewerter[$this->_getRemoteAddr()], $this->_getSperrzeit()) < $this->_getTimestamp() ? true : false);
       }

       private function _checkSterne($iSterne) {
          return ($iSterne > 0 && $iSterne <= $this->getMaxSterne() ? true : false);
       }

       public function rate($iSterne) {
          // überprüfen ob ein zugelassener Wert übergeben wurde
          if ($this->_checkSterne($iSterne)) {
             // überprüfen ob die letzte Wertung mehr als x Sekunden her ist
             if ($this->_checkSperre()) {

                $this->_setBewerter();
                $this->_setSterne($iSterne);
                $this->_setBewertungen();
                $this->_setGesamtbewertung();

             }
          }
       }

    }
?>
Modul-Template bewertung.html

Code: Alles auswählen

<div id="bewertung">
<h2>Bewertung "{kategorie}"</h2>
<div id="sterne">{gesamtbewertung} von {maxsterne}  von {bewerteranzahl} Stimmen.
<!-- BEGIN:BLOCK -->
   <a href="{bewertungslink}" class="stern_{empty_full}">rate</a>
<!-- END:BLOCK -->
</div>
<div style="clear: both;"></div>
</div>
Modul-Template bewertung-empty.html

Code: Alles auswählen

<div id="bewertung">
<h2>Bewertung "{kategorie}"</h2>
<div id="sterne">{gesamtbewertung} von {maxsterne} von {bewerteranzahl} Stimmen.
<!-- BEGIN:BLOCK -->
   <a class="stern_{empty_full}" onClick="alert('Sie haben bereits hier f&uuml;r gewertet. Sie k&ouml;nnen erst in 24h wieder eine Wertung abgeben.')" title="Sie haben bereits hier f&uuml;r gewertet!">rate</a>
<!-- END:BLOCK -->
</div>
<div style="clear: both;"></div>
</div>
MfG Steffen

PS: Um das Modul wieder für Artikl-Bewertungen zu verwenden einfach folgenden Code nehmen:

Code: Alles auswählen

<?php
    /*************************************************************
    * CONTENIDO MODUL - OUTPUT
    *
    * @name       wtArtikelbewertung
    * @version    1.0.1
    * @author       Christian Kehres
    * @copyright    webtischlerei.de <www.webtischlerei.de>
    * @license    http://www.gnu.org/licenses/gpl-3.0.txt
    *************************************************************/

    // Configuration
    // $iSperrzeit = 24*60*60; /* 1 Tag */
	$iSperrzeit = 60; /* 1 Minute */
    $iMaxSterne = 5;

    // neues Objekte zur Templateverwendung initialisieren
    (!isset($oTemplate) ? $oTemplate = new Template() : $oTemplate->reset());

    // Objekt zur Artikelbewertung initialisieren
    $oArtikelbewertung = new wtArtikelbewertung($iSperrzeit, $iMaxSterne);

    // dem Artikel eine Bewertung geben
    $oArtikelbewertung->rate(Contenido_Security::toInteger($_GET['article_rate']));

    // Sterne ausgeben
    for ($i = 1; $i <= $oArtikelbewertung->getMaxSterne(); $i++) {
       $oTemplate->set('d', 'bewertungslink',    Contenido_Url::getInstance()->build(array('idart' => $idart, 'lang' => $lang, 'client' => $client, 'article_rate' => $i)));
       $oTemplate->set('d', 'empty_full',       ($i <= $oArtikelbewertung->getGesamtbewertung() ? 'full' : 'empty'));
       $oTemplate->next();
    }
	
// Anzahl der Stimmen
	$iBewertungen = $oArtikelbewertung->getBewertungen();
    $oTemplate->set('s', 'bewerteranzahl',          $iBewertungen);

// Namen ausgeben
	$headlinedesartikel = "CMS_HTMLHEAD[1]";	
	$oTemplate->set('s', 'kategorie', strip_tags($headlinedesartikel));

    // Anzahl der maximalen Sterneanzahl ans Template übergeben
    $oTemplate->set('s', 'maxsterne',          $iMaxSterne);

    // Bewertung des Artikels an das Template übergeben
    $oTemplate->set('s', 'gesamtbewertung',    $oArtikelbewertung->getGesamtbewertung());
	
	// Überprüfung ob IP-Sperre aktiv ist
	$ipsperreaktiv = $oArtikelbewertung->getcheckSperre();
	// echo $sperresache;	
	if ($ipsperreaktiv == "1") {
	// echo "keine Speere";
	// Template zum Bewerten
    $oTemplate->generate('templates/bewertung.html', false, true);
	} else {
	// echo "Speere aktiv";
	// Template - Bewertung nicht möglich
    $oTemplate->generate('templates/bewertung-empty.html', false, true);
	}

    ###############################
    ### die dazugehörige Klasse ###
    ###############################

    class wtArtikelbewertung {

       private $_oArticle       = null;
       private $_iSperrzeit    = null;
       private $_sRemoteAddr    = null;
       private $_iTimestamp    = null;
       private $_iLastRate    = null;
       private $_iMaxSterne    = null;

       public function wtArtikelbewertung($iSperrzeit, $iMaxSterne) {
          $this->_seArticle();
          $this->_setSperrzeit($iSperrzeit);
          $this->_setRemoteAddr($_SERVER['REMOTE_ADDR']);
          $this->_setTimestamp();
          $this->_setMaxSterne($iMaxSterne);
       }

       private function _seArticle() {
          global $idart;

          $this->_oArticle = new cApiArticle($idart);
       }

       private function _getArticle() {
          return $this->_oArticle;
       }

       private function _setSperrzeit($iSperrzeit) {
          $this->_iSperrzeit = $iSperrzeit;
       }

       private function _getSperrzeit() {
          return $this->_iSperrzeit;
       }

       private function _setRemoteAddr($sRemoteAddr) {
          $this->_sRemoteAddr = $sRemoteAddr;
       }

       private function _getRemoteAddr() {
          return $this->_sRemoteAddr;
       }

       private function _setTimestamp() {
          $this->_iTimestamp = time();
       }

       private function _getTimestamp() {
          return $this->_iTimestamp;
       }

       private function _setBewerter() {
          $aBewerter = $this->_getBewerter();

          $aBewerter[$this->_getRemoteAddr()] = $this->_getTimestamp();

          $this->_getArticle()->setProperty('Artikelbewertung', 'bewerter', base64_encode(serialize($aBewerter)));
       }

       private function _getBewerter() {
          return unserialize(base64_decode($this->_getArticle()->getProperty('Artikelbewertung', 'bewerter')));
       }

       private function _setSterne($iSterne) {
          $this->_getArticle()->setProperty('Artikelbewertung', 'sterne', $this->getSterne()+$iSterne);
       }

       public function getSterne() {
          return $this->_getArticle()->getProperty('Artikelbewertung', 'sterne');
       }

       private function _setBewertungen() {
          $this->_getArticle()->setProperty('Artikelbewertung', 'bewertungen', $this->getBewertungen()+1);
       }

       public function getBewertungen() {
          return $this->_getArticle()->getProperty('Artikelbewertung', 'bewertungen');		  
       }

       private function _setGesamtbewertung() {
          $this->_getArticle()->setProperty('Artikelbewertung', 'gesamtbewertung', round(bcdiv($this->getSterne(), $this->getBewertungen(), 2), 0));
       }

       public function getGesamtbewertung() {
          $iGesamtbewertung = $this->_getArticle()->getProperty('Artikelbewertung', 'gesamtbewertung');
          
          return ($iGesamtbewertung >= 1 ? $iGesamtbewertung : 0);
       }

       private function _setMaxSterne($iMaxSterne) {
          $this->_iMaxSterne = $iMaxSterne;
       }

       public function getMaxSterne() {
          return $this->_iMaxSterne;
       }

       private function _checkSperre() {
          // Bewerter dieses Artikels auslesen
          $aBewerter = $this->_getBewerter();

          return (bcadd($aBewerter[$this->_getRemoteAddr()], $this->_getSperrzeit()) < $this->_getTimestamp() ? true : false);
       }
	   
	   public function getcheckSperre() {
          $aBewerter = $this->_getBewerter();
          return (bcadd($aBewerter[$this->_getRemoteAddr()], $this->_getSperrzeit()) < $this->_getTimestamp() ? true : false);
       }

       private function _checkSterne($iSterne) {
          return ($iSterne > 0 && $iSterne <= $this->getMaxSterne() ? true : false);
       }

       public function rate($iSterne) {
          // überprüfen ob ein zugelassener Wert übergeben wurde
          if ($this->_checkSterne($iSterne)) {
             // überprüfen ob die letzte Wertung mehr als x Sekunden her ist
             if ($this->_checkSperre()) {

                $this->_setBewerter();
                $this->_setSterne($iSterne);
                $this->_setBewertungen();
                $this->_setGesamtbewertung();

             }
          }
       }

    }
?>

stefkey
Beiträge: 556
Registriert: Mi 19. Okt 2005, 16:10
Wohnort: Heidelberg
Kontaktdaten:

Re: Artikel bewerten

Beitrag von stefkey » Di 17. Feb 2015, 21:56

Hallo,

ich habe das Modul auch mal eingebaut.
Wenn ich nun auf einem Computer 3 Sterne vergebe und schaue auf einem anderen Computer (auch andere IP) stehen dort auch die 3 Sterne. Sollte es nicht so sein das jeder Besucher den Artikel bewerten kann und er nur SEINE Sterne sieht? So ist es ja verwirrend wend jemand 2 Sterne setzt und ein anderer überschreibt diese 2 Sterne mit 5 Sternen oder umgekehrt.
Ich nutze Contenido 4.8.12

Wenn das klappen würde wäre es doch ein Hammermodul, oder?

Danke und grüße,
stefkey

Gesperrt