/portal/class_modul_votings_portal.php
Die Portalklasse der Votings ähnelt vom Aufbau recht stark dem der Admin-Klasse, von daher soll hier auch wirklich nur auf die Besonderheiten eingegangen werden.
[ ... ]
parent::__construct($arrModule, $arrElementData);
// save a cookie to store the voting
$objCookie = new class_cookie();
$this->arrCookieValues = explode(",", $objCookie->getCookie($this->STR_COOKIE_NAME));
}
In den Anforderungen an das Modul wurde definiert, dass bereits getätigte Votings mit Hilfe eines Cookies protokolliert werden. Da dieses an verschiedenen Stellen der Klasse benötigte wird, wird der Wert des Cookies als Klassenvariable gespeichert.
public function action() [...]
Nun ja – steuert das Verhalten der Klasse, siehe Admin-Klasse.
Die eigentliche Arbeit wird in der Methode actionList() gemacht.
public function actionList() {
$strReturn = "";
//load the associated voting
$objVoting = new class_modul_votings_voting($this->arrElementData["char1"]);
//view-permissions given?
if($objVoting->rightView()) {
$strVotingContent = "";
if($this->arrElementData["int1"] == 0) {
Hier erfolgt die Weiche in einen der beiden Modus: Abstimmung oder Ergebnisanzeige. 0 entspricht der Abstimmung, 1 der Ergebnisanzeige.
//voting mode
//permissions sufficient?
if($objVoting->rightRight1()) {
//check the start n end dates
$objDateStart = null;
$objDateEnd = null;
if($objVoting->getLongDateStart() != "" && $objVoting->getLongDateStart() != 0)
$objDateStart = new class_date($objVoting->getLongDateStart() );
if($objVoting->getLongDateEnd() != "" && $objVoting->getLongDateEnd() != 0)
$objDateEnd = new class_date($objVoting->getLongDateEnd() );
$bitDatesAllow = true;
if($objDateStart != null && $objDateStart->getLongTimestamp() > class_date::getCurrentTimestamp())
$bitDatesAllow = false;
if($objDateEnd != null && $objDateEnd->getLongTimestamp() < class_date::getCurrentTimestamp())
$bitDatesAllow = false;
//already voted before?
if(in_array($objVoting->getSystemid(), $this->arrCookieValues)) {
$strVotingContent = $this->getText("error_voted");
}
else if(!$bitDatesAllow ) {
$strVotingContent = $this->getText("error_dates");
}
else {
Um Abstimmen zu können, bedarf es der oben getesteten Bedingungen: Das Voting darf nicht in der Historie erscheinen, es darf hierfür also noch nicht abgestimmt worden sein. Außerdem werden die entsprechenden Rechte „right1“ kontrolliert sowie die ggf. angegeben Start- und Ende-Datumswerte.
$strAnswers = "";
$strAnswerTemplateID = $strListTemplateID = $this->objTemplate->readTemplate("/modul_votings/".$this->arrElementData["char2"], "voting_voting_option");
//load the list of answers
$arrAnswers = $objVoting->getAllAnswers(true);
foreach($arrAnswers as $objOneAnswer) {
$arrTemplate = array();
$arrTemplate["voting_systemid"] = $objVoting->getSystemid();
$arrTemplate["answer_systemid"] = $objOneAnswer->getSystemid();
$arrTemplate["answer_text"] = $objOneAnswer->getStrText();
$strAnswers .= $this->fillTemplate($arrTemplate, $strAnswerTemplateID);
}
Jede einzelne Antwort wird getrennt unter Verwendung des Templateabschnitts „voting_voting_option“ gerendert. Dies ermöglicht die bestmögliche Flexibilität beim Layout. Die einzelnen verfügbaren Platzhalter des Templateabschnitts werden im Array $arrTemplate gesammelt.
//create the wrapper
$strFormTemplateID = $strListTemplateID = $this->objTemplate->readTemplate("/modul_votings/".$this->arrElementData["char2"], "voting_voting");
$arrTemplate = array();
$arrTemplate["voting_answers"] = $strAnswers;
$arrTemplate["voting_systemid"] = $objVoting->getSystemid();
$arrTemplate["voting_action"] = getLinkPortalHref($this->getPagename(), "", "submitVoting");
$strVotingContent .= $this->fillTemplate($arrTemplate, $strFormTemplateID);
Die gesammelten, gerenderten Antworten werden nun in einen Wrapper „ voting_voting“ gerendert, dieser baut das umschließende Formular auf.
}
}
else
$strVotingContent = $this->getText("error_permissions");
}
else if($this->arrElementData["int1"] == 1) {
//result mode
$strAnswers = "";
$intTotalVotes = 0;
$strAnswerTemplateID = $strListTemplateID = $this->objTemplate->readTemplate("/modul_votings/".$this->arrElementData["char2"], "voting_result_answer");
//load the list of answers
$arrAnswers = $objVoting->getAllAnswers(true);
//first run to sum up
foreach($arrAnswers as $objOneAnswer) {
$intTotalVotes += $objOneAnswer->getIntHits();
}
foreach($arrAnswers as /** @var class_modul_votings_answer */$objOneAnswer) {
$arrTemplate = array();
$arrTemplate["answer_text"] = $objOneAnswer->getStrText();
$arrTemplate["answer_hits"] = $objOneAnswer->getIntHits();
$arrTemplate["answer_percent"] = "0";
if($objOneAnswer->getIntHits() > 0) { $arrTemplate["answer_percent"] = (int)(100 / ($intTotalVotes / $objOneAnswer->getIntHits())) ;
}
$strAnswers .= $this->fillTemplate($arrTemplate, $strAnswerTemplateID);
}
$strResultTemplateID = $this->objTemplate->readTemplate("/modul_votings/".$this->arrElementData["char2"], "voting_result");
$arrTemplate = array();
$arrTemplate["voting_answers"] = $strAnswers;
$arrTemplate["voting_hits"] = $intTotalVotes;
$strVotingContent .= $this->fillTemplate($arrTemplate, $strResultTemplateID);
}
Die Funtionsweise der Ergebnisdarstellung erfolgt analog, anstatt eines Formulars wird nun eine grafische Darstellung der Verteilung der Antworten erstellt. Hierfür wird der Anteil an Stimmen pro Antwort prozentual ermittelt und im Templateabschnitt als Platzhalter „answer_percent“ bereitgestellt.
[ ... ]
}
Als letzter relevanter Teil fehlt nun noch das Speichern von abgeschickten Abstimmungen, was Aufgabe der Methode actionSubmitVoting() ist.
private function actionSubmitVoting() {
$objVoting = new class_modul_votings_voting($this->arrElementData["char1"]);
// check if the submitted vote matches the current one -> multiple votings per page
if($objVoting->getSystemid() == $this->getParam("systemid")) {
//recheck permissions
if($objVoting->rightRight1() && !in_array($objVoting->getSystemid(), $this->arrCookieValues)) {
//load the submitted answer
$strAnswerID = $this->getParam("voting_".$objVoting->getSystemid());
if(validateSystemid($strAnswerID)) {
$objAnswer = new class_modul_votings_answer($strAnswerID);
$objAnswer->setIntHits($objAnswer->getIntHits()+1);
$objAnswer->updateObjectToDb();
$this->arrCookieValues[] = $objVoting->getSystemid();
$objCookie = new class_cookie();
$objCookie->setCookie($this->STR_COOKIE_NAME, implode(",", $this->arrCookieValues));
}
}
}
}
Nach dem Prüfen der übermittelten ID wird die entsprechende Antwort geladen, der Wert der Hits wird um eins erhöht. Um den Zustand zu speichern erfolgt der bekannte Aufruf der Objekt-Methode updateObjectToDb(). Zusätzlich wird der Wert des Cookies um das aktuelle Voting ergänzt, nachfolgende Prüfungen ermitteln das aktuelle Voting also als bereits abgestimmt.
/templates/modul_votings/votings.tpl
<voting_wrapper>
<div>
<h3>%%voting_title%%</h3>
%%voting_content%%
</div>
</voting_wrapper>
Der Abschnitt „voting_wrapper“ dient als Rahmen für ein einzelnes Voting. Egal ob Abstimmung oder Anzeige des Ergebnisses, das Voting wird in den Wrapper eingebettet.
<voting_voting>
<form method="post" action="%%voting_action%%" id="voting_%%voting_systemid%%">
<table width="80%">
%%voting_answers%%
</table>
<input type="hidden" name="systemid" value="%%voting_systemid%%" />
<input type="submit" value="%%lang_voting_submit%%" class="button" />
<br />
</form>
</voting_voting>
Das Formular zum Abstimmen wird im Abschnitt „voting_voting“ aufgebaut. Die einzelnen Antworten hingegen werden gesondert gerendert und über den Abschnitt „voting_voting_option“ dargestellt. Jede Antwort wird einmal darin gerendert, alle gerenderten Antworten dann im Abschnitt „voting_voting“ in das Formular eingebettet.
<voting_voting_option>
<tr>
<td width="25">
<input type="radio" name="voting_%%voting_systemid%%" value="%%answer_systemid%%" id="option_%%answer_systemid%%"/>
</td>
<td align="left">
<label for="option_%%answer_systemid%%">%%answer_text%%</label>
</td>
</tr>
</voting_voting_option>
Die Darstellung der Ergebnisse wird analog vorgenommen. Auch hier wird jede einzelne Antwort samt grafischer Darstellung der prozentualen Anteile in einem Abschnitt „voting_result_answer“ gerendert und dann im Abschnitt „voting_result“ komplettiert.
<voting_result>
<table width="80%">
%%voting_answers%%
<tr>
<td colspan="2">%%lang_voting_hits%% %%voting_hits%%</td>
</tr>
</table>
</voting_result>
<voting_result_answer>
<tr>
<td colspan="2">%%answer_text%%</td>
</tr>
<tr>
<td width="80%"><img src="http://www.kajona.de/portal/pics/kajona/icon_progressbar.gif" height="15" width="%%answer_percent%%%" alt="%%answer_percent%%%" /></td>
<td>%%answer_hits%% / %%answer_percent%% %</td>
</tr>
</voting_result_answer>



