798 lines
23 KiB
PHP
798 lines
23 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Contao Open Source CMS
|
|
* Copyright (C) 2005-2011 Leo Feyer
|
|
*
|
|
* Formerly known as TYPOlight Open Source CMS.
|
|
*
|
|
* This program is free software: you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation, either
|
|
* version 3 of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this program. If not, please visit the Free
|
|
* Software Foundation website at <http://www.gnu.org/licenses/>.
|
|
*
|
|
* PHP version 5
|
|
* @copyright cgo IT, 2013
|
|
* @author Carsten Götzinger (info@cgo-it.de)
|
|
* @package rateit
|
|
* @license GNU/LGPL
|
|
* @filesource
|
|
*/
|
|
|
|
namespace cgoIT\rateit;
|
|
|
|
class rateitBackendModule extends \BackendModule
|
|
{
|
|
protected $strTemplate;
|
|
protected $actions = array();
|
|
|
|
protected $rateit;
|
|
|
|
protected $tl_root;
|
|
protected $tl_files;
|
|
protected $languages;
|
|
|
|
private $compiler;
|
|
private $action = '';
|
|
private $parameter = '';
|
|
|
|
private $arrExportHeader;
|
|
private $arrExportHeaderDetails;
|
|
|
|
/**
|
|
* Anzahl der Herzen/Sterne
|
|
* @var int
|
|
*/
|
|
protected $intStars = 5;
|
|
|
|
protected $label;
|
|
protected $labels;
|
|
|
|
/**
|
|
* Initialize the controller
|
|
*/
|
|
public function __construct($objElement=array()) {
|
|
parent::__construct($objElement);
|
|
|
|
$this->label = $GLOBALS['TL_CONFIG']['rating_type'] == 'hearts' ? $GLOBALS['TL_LANG']['rateit']['heart'] : $GLOBALS['TL_LANG']['rateit']['star'];
|
|
$this->labels = $GLOBALS['TL_CONFIG']['rating_type'] == 'hearts' ? $GLOBALS['TL_LANG']['rateit']['hearts'] : $GLOBALS['TL_LANG']['rateit']['stars'];
|
|
|
|
$this->actions = array(
|
|
// act[0] strTemplate compiler
|
|
array('', 'rateitbe_ratinglist', 'listRatings' ),
|
|
array('reset_ratings', '', 'resetRatings' ),
|
|
array('view', 'rateitbe_ratingview', 'viewRating' ),
|
|
array('export', '', 'exportRatings' ),
|
|
array('exportDetails', '', 'exportRatingDetails' ),
|
|
);
|
|
|
|
$this->loadLanguageFile('rateit_backend');
|
|
$this->arrExportHeader = &$GLOBALS['TL_LANG']['tl_rateit']['xls_headers'];
|
|
$this->arrExportHeaderDetails = &$GLOBALS['TL_LANG']['tl_rateit']['xls_headers_detail'];
|
|
}
|
|
|
|
/**
|
|
* Generate module:
|
|
* - Display a wildcard in the back end
|
|
* - Select the template and compiler in the front end
|
|
* @return string
|
|
*/
|
|
public function generate()
|
|
{
|
|
$this->rateit = new \stdClass();
|
|
$rateit = &$this->rateit;
|
|
$rateit->username = $this->BackendUser->username;
|
|
$rateit->isadmin = $this->BackendUser->isAdmin;
|
|
|
|
$this->strTemplate = $this->actions[0][1];
|
|
$this->compiler = $this->actions[0][2];
|
|
|
|
$act = \Input::get('act');
|
|
if (!$act) $act = \Input::post('act');
|
|
foreach ($this->actions as $action) {
|
|
if ($act == $action[0]) {
|
|
$this->parameter = $act;
|
|
$this->action = $action[0];
|
|
$this->strTemplate = $action[1];
|
|
$this->compiler = $action[2];
|
|
break;
|
|
}
|
|
}
|
|
|
|
$stars = intval($GLOBALS['TL_CONFIG']['rating_count']);
|
|
if ($stars > 0) {
|
|
$this->intStars = $stars;
|
|
}
|
|
|
|
return str_replace(array('{{', '}}'), array('[{]', '[}]'), parent::generate());
|
|
} // generate
|
|
|
|
/**
|
|
* Compile module: common initializations and forwarding to distinct function compiler
|
|
*/
|
|
protected function compile()
|
|
{
|
|
// hide module?
|
|
$compiler = $this->compiler;
|
|
if ($compiler=='hide') return;
|
|
|
|
// load other helpers
|
|
$this->tl_root = str_replace("\\",'/',TL_ROOT).'/';
|
|
$this->tl_files = str_replace("\\",'/',$GLOBALS['TL_CONFIG']['uploadPath']).'/';
|
|
$this->Template->rateit = $this->rateit;
|
|
|
|
// complete rateit initialization
|
|
$rateit = &$this->rateit;
|
|
$rateit->f_link = $this->createUrl(array($this->action => $this->parameter));
|
|
$rateit->f_action = $this->compiler;
|
|
$rateit->f_mode = $this->action;
|
|
$rateit->theme = new RateItBackend();
|
|
$rateit->backLink = $this->getReferer(true);
|
|
$rateit->homeLink = $this->createUrl();
|
|
|
|
// execute compiler
|
|
$this->$compiler($this->parameter);
|
|
} // compile
|
|
|
|
/**
|
|
* List the ratings
|
|
*/
|
|
protected function listRatings()
|
|
{
|
|
$rateit = &$this->Template->rateit;
|
|
$rateit->f_page = 0;
|
|
|
|
// returning from submit?
|
|
if ($this->filterPost('rateit_action') == $rateit->f_action) {
|
|
// get url parameters
|
|
$rateit->f_typ = trim(\Input::post('rateit_typ'));
|
|
$rateit->f_active = trim(\Input::post('rateit_active'));
|
|
$rateit->f_order = trim(\Input::post('rateit_order'));
|
|
$rateit->f_page = trim(\Input::post('rateit_page'));
|
|
$rateit->f_find = trim(\Input::post('rateit_find'));
|
|
$this->Session->set(
|
|
'rateit_settings',
|
|
array(
|
|
'rateit_typ' => $rateit->f_typ,
|
|
'rateit_order' => $rateit->f_order,
|
|
'rateit_page' => $rateit->f_page,
|
|
'rateit_find' => $rateit->f_find
|
|
)
|
|
);
|
|
} else {
|
|
$stg = $this->Session->get('rateit_settings');
|
|
if (is_array($stg)) {
|
|
$rateit->f_typ = trim($stg['rateit_typ']);
|
|
$rateit->f_active = trim($stg['rateit_active']);
|
|
$rateit->f_order = trim($stg['rateit_order']);
|
|
$rateit->f_page = trim($stg['rateit_page']);
|
|
$rateit->f_find = trim($stg['rateit_find']);
|
|
} // if
|
|
} // if
|
|
|
|
if ($rateit->f_order=='') $rateit->f_order = 'rating';
|
|
//if (!isset($rateit->f_active)) $rateit->f_active = '-1';
|
|
|
|
if (isset($GLOBALS['TL_CONFIG']['rating_listsize']))
|
|
$perpage = (int)trim($GLOBALS['TL_CONFIG']['rating_listsize']);
|
|
if (!isset($perpage) || $perpage < 0) $perpage = 10;
|
|
|
|
if ($rateit->f_page>=0 && $perpage>0) {
|
|
$options['first'] = $rateit->f_page * $perpage;
|
|
$options['limit'] = $perpage;
|
|
} // if
|
|
if ($rateit->f_typ != '') $options['typ'] = $rateit->f_typ;
|
|
if ($rateit->f_active != '') $options['active'] = $rateit->f_active == '0' ? '' : $rateit->f_active;
|
|
if ($rateit->f_find != '') $options['find'] = $rateit->f_find;
|
|
|
|
switch ($rateit->f_order) {
|
|
case 'title' : $options['order'] = 'title'; break;
|
|
case 'typ' : $options['order'] = 'typ'; break;
|
|
case 'createdat' : $options['order'] = 'createdat'; break;
|
|
default : $options['order'] = 'rating desc';
|
|
} // switch
|
|
|
|
$rateit->exportLink = $this->createUrl(array('act' => 'export'));
|
|
|
|
// query extensions
|
|
$rateit->ratingitems = $this->getRatingItems($options);
|
|
if ($rateit->f_page>=0 && $perpage>0 && count($rateit->ratingitems)==0) {
|
|
$rateit->f_page = 0;
|
|
$options['first'] = 0;
|
|
$rateit->ratingitems = $this->getRatingItems($options);
|
|
} // if
|
|
|
|
// add view links
|
|
foreach ($rateit->ratingitems as &$ext) {
|
|
$ext->viewLink = $this->createUrl(array('act' => 'view', 'rkey' => $ext->rkey, 'typ' => $ext->typ));
|
|
$totrecs = $ext->totcount;
|
|
} // foreach
|
|
|
|
// create pages list
|
|
$rateit->pages = array();
|
|
if ($perpage > 0) {
|
|
$first = 1;
|
|
while ($totrecs > 0) {
|
|
$cnt = $totrecs > $perpage ? $perpage : $totrecs;
|
|
$rateit->pages[] = $first . ' - ' . ($first+$cnt-1);
|
|
$first += $cnt;
|
|
$totrecs -= $cnt;
|
|
} // while
|
|
} // if
|
|
} // listRatings
|
|
|
|
/**
|
|
* Export all ratings as MS-Excel-File
|
|
*/
|
|
protected function exportRatings()
|
|
{
|
|
$this->import('String');
|
|
$rateit = &$this->Template->rateit;
|
|
|
|
$options['order'] = 'rating desc';
|
|
|
|
// query ratings
|
|
$rateit->ratingitems = $this->getRatingItems($options, true);
|
|
|
|
$xls = new \xlsexport();
|
|
$strXlsSheet = $GLOBALS['TL_LANG']['tl_rateit']['xls_sheetname_ratings'];
|
|
$xls->addworksheet($strXlsSheet);
|
|
|
|
$intRowCounter = -1;
|
|
$intColCounter = 0;
|
|
|
|
$intRowCounter++;
|
|
|
|
// Header setzen
|
|
foreach(array_values($this->arrExportHeader) as $header) {
|
|
$xls->setcell(array("sheetname" => $strXlsSheet,"row" => $intRowCounter, "col" => $intColCounter, "data" => $header, "fontweight" => XLSFONT_BOLD, "vallign" => XLSXF_VALLIGN_TOP, "fontfamily" => XLSFONT_FAMILY_NORMAL));
|
|
$xls->setcolwidth($strXlsSheet, $intColCounter, 0x1aff);
|
|
$intColCounter++;
|
|
}
|
|
|
|
$intRowCounter++;
|
|
|
|
// Werte setzen
|
|
foreach($rateit->ratingitems as $item) {
|
|
$arrItem = (array)$item;
|
|
|
|
$intColCounter = 0;
|
|
foreach(array_keys($this->arrExportHeader) as $key) {
|
|
$strVal = $arrItem[$key];
|
|
$strVal = $this->String->decodeEntities($strVal);
|
|
$strVal = preg_replace(array('/<br.*\/*>/si'), array("\n"), $strVal);
|
|
$strVal = $this->convertEncoding($strVal, $GLOBALS['TL_CONFIG']['characterSet'], 'CP1252');
|
|
|
|
$cellType = CELL_STRING;
|
|
switch ($key) {
|
|
case 'typ' :
|
|
$strVal = $GLOBALS['TL_LANG']['tl_rateit_type_options'][$strVal];
|
|
break;
|
|
case 'createdat' :
|
|
$strVal = $strVal ? date($GLOBALS['TL_CONFIG']['datimFormat'], $strVal) : '';
|
|
break;
|
|
case 'active' :
|
|
$strVal = $strVal == '1' ? 'Ja' : 'Nein';
|
|
break;
|
|
case 'rating' :
|
|
if (!isset($strVal) || empty($strVal)) {
|
|
$strVal = '0';
|
|
}
|
|
$cellType = CELL_FLOAT;
|
|
break;
|
|
case 'stars' :
|
|
case 'percent' :
|
|
case 'totalRatings' :
|
|
case 'rkey' :
|
|
$cellType = CELL_FLOAT;
|
|
break;
|
|
}
|
|
$xls->setcell(array("sheetname" => $strXlsSheet,"row" => $intRowCounter, "col" => $intColCounter, "data" => $strVal, "type" => $cellType, "vallign" => XLSXF_VALLIGN_TOP, "fontfamily" => XLSFONT_FAMILY_NORMAL));
|
|
$intColCounter++;
|
|
}
|
|
|
|
$intRowCounter++;
|
|
}
|
|
|
|
$xls->sendfile("export_rateit_" . date("Ymd_His") . ".xls");
|
|
exit;
|
|
} // exportRatings
|
|
|
|
/**
|
|
* Detailed view of one rating.
|
|
* @param string
|
|
*/
|
|
protected function viewRating()
|
|
{
|
|
$rateit = &$this->Template->rateit;
|
|
|
|
$rateit->f_page = 0;
|
|
|
|
// returning from submit?
|
|
if ($this->filterPost('rateit_action') == $rateit->f_action) {
|
|
// get url parameters
|
|
$rateit->f_page = trim(\Input::post('rateit_details_page'));
|
|
$this->Session->set(
|
|
'rateit_settings',
|
|
array(
|
|
'rateit_details_page' => $rateit->f_page
|
|
)
|
|
);
|
|
} else {
|
|
$stg = $this->Session->get('rateit_settings');
|
|
if (is_array($stg)) {
|
|
$rateit->f_page = trim($stg['rateit_details_page']);
|
|
} // if
|
|
} // if
|
|
|
|
$rkey = \Input::get('rkey');
|
|
if (strstr($rkey, '|')) {
|
|
$arrRkey = explode('|', $rkey);
|
|
foreach ($arrRkey as $key) {
|
|
if (!is_numeric($key)) {
|
|
$this->redirect($rateit->homeLink);
|
|
exit;
|
|
}
|
|
$id = $rkey;
|
|
}
|
|
} else {
|
|
if (is_numeric($rkey)) {
|
|
$id = $rkey;
|
|
} else {
|
|
$this->redirect($rateit->homeLink);
|
|
exit;
|
|
}
|
|
}
|
|
|
|
$typ = \Input::get('typ');
|
|
|
|
// compose base options
|
|
$options = array(
|
|
'rkey' => $rkey,
|
|
'typ' => $typ
|
|
);
|
|
|
|
$this->rateit->f_link = $this->createUrl(array('act' => 'view', 'rkey' => $rkey, 'typ' => $typ));
|
|
|
|
if (isset($GLOBALS['TL_CONFIG']['rating_listsize']))
|
|
$perpage = (int)trim($GLOBALS['TL_CONFIG']['rating_listsize']);
|
|
if (!isset($perpage) || $perpage < 0) $perpage = 10;
|
|
|
|
if ($rateit->f_page>=0 && $perpage>0) {
|
|
$options['first'] = $rateit->f_page * $perpage;
|
|
$options['limit'] = $perpage;
|
|
} // if
|
|
|
|
$rateit->ratingitems = $this->getRatingItems($options, true);
|
|
if (count($rateit->ratingitems)<1) $this->redirect($rateit->homeLink);
|
|
$ext = &$rateit->ratingitems[0];
|
|
|
|
$ext->ratings = $this->getRatings($ext, $options);
|
|
if ($rateit->f_page>=0 && $perpage>0 && count($ext->ratings)==0) {
|
|
$rateit->f_page = 0;
|
|
$options['first'] = 0;
|
|
$rateit->ratings = $this->getRatings($ext, $options);
|
|
} // if
|
|
|
|
if (count($ext->ratings) > 0) {
|
|
$totrecs = $ext->ratings[0]->totcount;
|
|
} else {
|
|
$totrecs = 0;
|
|
}
|
|
|
|
// create pages list
|
|
$rateit->pages = array();
|
|
if ($perpage > 0) {
|
|
$first = 1;
|
|
while ($totrecs > 0) {
|
|
$cnt = $totrecs > $perpage ? $perpage : $totrecs;
|
|
$rateit->pages[] = $first . ' - ' . ($first+$cnt-1);
|
|
$first += $cnt;
|
|
$totrecs -= $cnt;
|
|
} // while
|
|
} // if
|
|
|
|
$rateit->exportLink = $this->createUrl(array('act' => 'exportDetails', 'rkey' => $rkey, 'typ' => $typ));
|
|
|
|
$ext->statistics = $this->getRatingStatistics($ext->item_id);
|
|
$ext->ratingsChartData = $this->getRatingsChartData($ext->statistics);
|
|
$ext->monthsChartData = $this->getMonthsChartData($ext->item_id);
|
|
} // viewRating
|
|
|
|
protected function resetRatings()
|
|
{
|
|
$rateit = &$this->Template->rateit;
|
|
|
|
// nothing checked?
|
|
$ids0 = \Input::post('selectedids');
|
|
if (!is_array($ids0)) {
|
|
$this->redirect($rep->homeLink); return;
|
|
}
|
|
|
|
foreach ($ids0 as $id) {
|
|
list($rkey, $typ) = explode('__', $id);
|
|
$pid = $this->Database->prepare('SELECT id FROM tl_rateit_items WHERE rkey=? and typ=?')
|
|
->execute($rkey, $typ)
|
|
->fetchRow();
|
|
$this->Database->prepare('DELETE FROM tl_rateit_ratings WHERE pid=?')
|
|
->execute($pid[0]);
|
|
}
|
|
|
|
$this->redirect($rateit->homeLink);
|
|
|
|
} // resetRatings
|
|
|
|
/**
|
|
* Export the details of one rating as MS-Excel-File
|
|
*/
|
|
protected function exportRatingDetails()
|
|
{
|
|
$rkey = \Input::get('rkey');
|
|
if (!is_numeric($rkey))
|
|
$this->redirect($rateit->backLink);
|
|
$typ = \Input::get('typ');
|
|
|
|
$this->rateit->backLink = $this->createUrl(array('act' => 'view', 'rkey' => $rkey, 'typ' => $typ));
|
|
|
|
// compose base options
|
|
$options = array(
|
|
'rkey' => $rkey,
|
|
'typ' => $typ
|
|
);
|
|
|
|
$this->import('String');
|
|
$rateit = &$this->Template->rateit;
|
|
|
|
// query ratings
|
|
$rateit->ratingitems = $this->getRatingItems($options);
|
|
if (count($rateit->ratingitems)<1) $this->redirect($rateit->backLink);
|
|
$ext = &$rateit->ratingitems[0];
|
|
$ext->ratings = $this->getRatings($ext);
|
|
$ext->statistics = $this->getRatingStatistics($ext->item_id);
|
|
|
|
$xls = new \xlsexport();
|
|
$strXlsSheet = $GLOBALS['TL_LANG']['tl_rateit']['xls_sheetname_rating'];
|
|
$xls->addworksheet($strXlsSheet);
|
|
|
|
$intRowCounter = -1;
|
|
$intColCounter = 0;
|
|
|
|
$intRowCounter++;
|
|
|
|
// Header setzen
|
|
foreach(array_values($this->arrExportHeaderDetails) as $header) {
|
|
$xls->setcell(array("sheetname" => $strXlsSheet,"row" => $intRowCounter, "col" => $intColCounter, "data" => $header, "fontweight" => XLSFONT_BOLD, "vallign" => XLSXF_VALLIGN_TOP, "fontfamily" => XLSFONT_FAMILY_NORMAL));
|
|
$xls->setcolwidth($strXlsSheet, $intColCounter, 0x1aff);
|
|
$intColCounter++;
|
|
}
|
|
|
|
$intRowCounter++;
|
|
|
|
// Werte setzen
|
|
foreach($ext->ratings as $item) {
|
|
$arrItem = (array)$item;
|
|
|
|
$intColCounter = 0;
|
|
foreach(array_keys($this->arrExportHeaderDetails) as $key) {
|
|
$strVal = $arrItem[$key];
|
|
$strVal = $this->String->decodeEntities($strVal);
|
|
$strVal = preg_replace(array('/<br.*\/*>/si'), array("\n"), $strVal);
|
|
$strVal = $this->convertEncoding($strVal, $GLOBALS['TL_CONFIG']['characterSet'], 'CP1252');
|
|
|
|
$cellType = CELL_STRING;
|
|
switch ($key) {
|
|
case 'createdat' :
|
|
$strVal = $strVal ? date($GLOBALS['TL_CONFIG']['datimFormat'], $strVal) : '';
|
|
break;
|
|
case 'rating' :
|
|
if (!isset($strVal) || empty($strVal)) {
|
|
$strVal = '0';
|
|
}
|
|
$cellType = CELL_FLOAT;
|
|
break;
|
|
case 'stars' :
|
|
case 'percent' :
|
|
case 'totalRatings' :
|
|
case 'rkey' :
|
|
$cellType = CELL_FLOAT;
|
|
break;
|
|
}
|
|
$xls->setcell(array("sheetname" => $strXlsSheet,"row" => $intRowCounter, "col" => $intColCounter, "data" => $strVal, "type" => $cellType, "vallign" => XLSXF_VALLIGN_TOP, "fontfamily" => XLSFONT_FAMILY_NORMAL));
|
|
$intColCounter++;
|
|
}
|
|
|
|
$intRowCounter++;
|
|
}
|
|
|
|
$xls->sendfile("export_rateit_" . date("Ymd_His") . ".xls");
|
|
exit;
|
|
} // exportRatingDetails
|
|
|
|
/**
|
|
* Create url for hyperlink to the current page.
|
|
* @param array $aParams Assiciative array with key/value pairs as parameters.
|
|
* @return string The create link.
|
|
*/
|
|
protected function createUrl($aParams = null)
|
|
{
|
|
return $this->createPageUrl(\Input::get('do'), $aParams);
|
|
} // createUrl
|
|
|
|
/**
|
|
* Create url for hyperlink to an arbitrary page.
|
|
* @param string $aPage The page ID.
|
|
* @param array $aParams Assiciative array with key/value pairs as parameters.
|
|
* @return string The create link.
|
|
*/
|
|
protected function createPageUrl($aPage, $aParams = null)
|
|
{
|
|
$url = \Environment::get('script') . '?do='.$aPage;
|
|
if (is_array($aParams)) {
|
|
foreach ($aParams as $key => $val)
|
|
if ($val!='')
|
|
$url .= '&'.$key .'='.$val;
|
|
}
|
|
return $url;
|
|
} // createPageUrl
|
|
|
|
/**
|
|
* Get post parameter and filter value.
|
|
* @param string $aKey The post key. When filtering html, remove all attribs and
|
|
* keep the plain tags.
|
|
* @param string $aMode '': no filtering
|
|
* 'nohtml': strip all html
|
|
* 'text': Keep tags p br ul li em
|
|
* @return string The filtered input.
|
|
*/
|
|
protected function filterPost($aKey, $aMode = '')
|
|
{
|
|
$v = trim(\Input::postRaw($aKey));
|
|
if ($v == '' || $aMode=='') return $v;
|
|
switch ($aMode) {
|
|
case 'nohtml':
|
|
$v = strip_tags($v);
|
|
break;
|
|
case 'text':
|
|
$v = strip_tags($v, rateit_TEXTTAGS);
|
|
break;
|
|
} // switch
|
|
$v = preg_replace('/<(\w+) .*>/U', '<$1>', $v);
|
|
return $v;
|
|
} // filterPost
|
|
|
|
protected function getRatingItems($aOptions, $noLimit=false) {
|
|
$sql = "SELECT i.id as item_id,
|
|
i.rkey AS rkey,
|
|
i.title as title,
|
|
i.typ as typ,
|
|
i.createdat as createdat,
|
|
i.active as active,
|
|
IFNULL(AVG(r.rating),0) AS rating,
|
|
COUNT( r.rating ) AS totalRatings
|
|
FROM tl_rateit_items i
|
|
LEFT OUTER JOIN tl_rateit_ratings r
|
|
ON (i.id = r.pid)
|
|
%w
|
|
GROUP BY rkey, title, item_id, typ, createdat, active
|
|
%o
|
|
%l";
|
|
|
|
$cntSql = "SELECT COUNT(*) FROM tl_rateit_items i %s";
|
|
|
|
$where = '';
|
|
$firstWhere = true;
|
|
$limit = '';
|
|
$order = '';
|
|
|
|
foreach ($aOptions as $k=>$v) {
|
|
if ($k == 'find') {
|
|
if (!$firstWhere) {
|
|
$where .= " AND";
|
|
}
|
|
$where .= " title like '%$v%'";
|
|
$firstWhere = false;
|
|
}
|
|
else if ($k != 'order' && $k != 'limit' && $k != 'first') {
|
|
if (!$firstWhere) {
|
|
$where .= " AND";
|
|
}
|
|
$where .= " $k='$v'";
|
|
$firstWhere = false;
|
|
} else {
|
|
if ($k == 'limit' && !$noLimit) {
|
|
$cntRows = $v;
|
|
} else if ($k == 'first' && !$noLimit) {
|
|
$first = $v;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (isset($cntRows) && isset($first)) {
|
|
$limit = "LIMIT $first, $cntRows";
|
|
}
|
|
|
|
if (strlen($where) > 0) {
|
|
$where = "WHERE ".$where;
|
|
}
|
|
|
|
if (isset($aOptions['order']) && !empty($aOptions['order']))
|
|
$order = "ORDER BY ".$aOptions['order'];
|
|
|
|
$sql = str_replace('%o', $order, $sql);
|
|
$sql = str_replace('%w', $where, $sql);
|
|
$sql = str_replace('%l', $limit, $sql);
|
|
|
|
$cntSql = str_replace('%s', $where, $cntSql);
|
|
|
|
$count = $this->Database->query($cntSql)->fetchRow();
|
|
|
|
$arrRatingItems = $this->Database->query($sql)->fetchAllAssoc();
|
|
$arrReturn = array();
|
|
foreach ($arrRatingItems as $rating) {
|
|
if ($rating['active'] != '1') $rating['active'] = '0';
|
|
$rating['percent'] = $rating['rating'];
|
|
$rating['rating'] = $this->percentToStars($rating['percent']);
|
|
$rating['stars'] = $this->intStars;
|
|
$rating['totcount'] = $count[0];
|
|
$arrReturn[] = (object) $rating;
|
|
}
|
|
return $arrReturn;
|
|
} // getRatingItems
|
|
|
|
protected function getRatings($ext, $options = array()) {
|
|
// Gesamtanzahl (für Paging wichtig) ermitteln
|
|
$cntSql = "SELECT COUNT(*) FROM tl_rateit_ratings r WHERE r.pid=$ext->item_id";
|
|
$count = $this->Database->prepare($cntSql)
|
|
->execute()
|
|
->fetchRow();
|
|
|
|
foreach ($options as $k=>$v) {
|
|
if ($k == 'limit') {
|
|
$cntRows = $v;
|
|
} else if ($k == 'first') {
|
|
$first = $v;
|
|
}
|
|
}
|
|
|
|
if (isset($cntRows) && isset($first)) {
|
|
$limit = "LIMIT $first, $cntRows";
|
|
}
|
|
|
|
$sql = "SELECT id AS rating_id, ip_address AS ip, memberid, rating, createdat
|
|
FROM tl_rateit_ratings r
|
|
WHERE r.pid=$ext->item_id
|
|
ORDER BY createdat DESC
|
|
%l";
|
|
$sql = str_replace('%l', $limit, $sql);
|
|
|
|
$arrRatings = $this->Database->prepare($sql)
|
|
->execute()
|
|
->fetchAllAssoc();
|
|
$arrReturn = array();
|
|
foreach ($arrRatings as $rating) {
|
|
$rating['percent'] = $rating['rating'];
|
|
$rating['rating'] = $this->percentToStars($rating['percent']);
|
|
$rating['stars'] = $this->intStars;
|
|
$rating['totcount'] = $count[0];
|
|
if ($rating['memberid'] != null) {
|
|
$member = $this->Database->prepare("SELECT firstname, lastname FROM tl_member WHERE id=?")
|
|
->limit(1)
|
|
->execute($rating['memberid'])
|
|
->fetchAssoc();
|
|
$rating['member'] = $member['firstname']." ".$member['lastname'];
|
|
}
|
|
$arrReturn[] = (object) $rating;
|
|
}
|
|
return $arrReturn;
|
|
} // getRatings
|
|
|
|
protected function getRatingStatistics($item_id) {
|
|
$sql = "SELECT rating, count(*) as count
|
|
FROM tl_rateit_ratings r
|
|
WHERE r.pid=$item_id
|
|
GROUP BY rating
|
|
ORDER BY rating";
|
|
|
|
$arrRatingStatistics = $this->Database->prepare($sql)
|
|
->execute()
|
|
->fetchAllAssoc();
|
|
$arrReturn = array();
|
|
foreach ($arrRatingStatistics as $rating) {
|
|
$rating['percent'] = $rating['rating'];
|
|
$rating['rating'] = $this->percentToStars($rating['percent']);
|
|
$arrReturn[$rating['percent']] = (object) $rating;
|
|
}
|
|
return $arrReturn;
|
|
} // getRatings
|
|
|
|
protected function getRatingsChartData($statistics) {
|
|
$arr = array();
|
|
$arr['cols'] = array();
|
|
$arr['rows'] = array();
|
|
|
|
// Spalten anlegen
|
|
$arr['cols'][] = array('id'=>'rating', 'label'=>$GLOBALS['TL_LANG']['tl_rateit']['rating_chart_legend'][2], 'type'=>'string');
|
|
$arr['cols'][] = array('id'=>'count', 'label'=>$GLOBALS['TL_LANG']['tl_rateit']['rating_chart_legend'][3], 'type'=>'number');
|
|
|
|
// Zeilen anlegen
|
|
foreach($statistics as $obj) {
|
|
$arr['rows'][] = array('c'=>array(array('v'=>$obj->rating.' '.($obj->rating == 1 ? $this->label : $this->labels)), array('v'=>(int)$obj->count, 'f'=>$obj->count.' '.$GLOBALS['TL_LANG']['tl_rateit']['vote'][$obj->count == 1 ? 0 : 1])));
|
|
}
|
|
return json_encode($arr);
|
|
}
|
|
|
|
protected function getMonthsChartData($item_id) {
|
|
|
|
$sql = "SELECT count(*) AS anzahl, avg(rating) AS bewertung, month(date(FROM_UNIXTIME(createdat))) AS monat, year(date(FROM_UNIXTIME(createdat))) AS jahr
|
|
FROM tl_rateit_ratings r
|
|
WHERE r.pid=$item_id
|
|
GROUP BY monat, jahr
|
|
ORDER BY jahr DESC , monat DESC
|
|
LIMIT 0 , 12";
|
|
|
|
$arrResult = $this->Database->prepare($sql)
|
|
->execute()
|
|
->fetchAllAssoc();
|
|
|
|
$arrResult = array_reverse($arrResult);
|
|
|
|
$this->loadLanguageFile('default');
|
|
|
|
$arr = array();
|
|
$arr['cols'] = array();
|
|
$arr['rows'] = array();
|
|
|
|
// Spalten anlegen
|
|
$arr['cols'][] = array('id'=>'month', 'label'=>$GLOBALS['TL_LANG']['tl_rateit']['month_chart_legend'][3], 'type'=>'string');
|
|
$arr['cols'][] = array('id'=>'count', 'label'=>$GLOBALS['TL_LANG']['tl_rateit']['month_chart_legend'][4], 'type'=>'number');
|
|
$arr['cols'][] = array('id'=>'avg', 'label'=>$GLOBALS['TL_LANG']['tl_rateit']['month_chart_legend'][2], 'type'=>'number');
|
|
|
|
// Zeilen anlegen
|
|
foreach($arrResult as $result) {
|
|
$month = $GLOBALS['TL_LANG']['MONTHS'][$result['monat']-1].' '.$result['jahr'];
|
|
$avgValue = round((float)(($result['bewertung']*$this->intStars)/100), 1);
|
|
$arr['rows'][] = array('c'=>array(array('v'=>$month),
|
|
array('v'=>(int)$result['anzahl']),
|
|
array('v'=>$avgValue)));
|
|
}
|
|
return json_encode($arr);
|
|
}
|
|
|
|
protected function percentToStars($percent) {
|
|
$modifier = 100 / $this->intStars;
|
|
return round($percent / $modifier, 1);
|
|
}
|
|
|
|
/**
|
|
* Convert encoding
|
|
* @return String
|
|
* @param $strString String to convert
|
|
* @param $from charset to convert from
|
|
* @param $to charset to convert to
|
|
*/
|
|
public function convertEncoding($strString, $from, $to) {
|
|
if (USE_MBSTRING) {
|
|
@mb_substitute_character('none');
|
|
return @mb_convert_encoding($strString, $to, $from);
|
|
}
|
|
elseif (function_exists('iconv')) {
|
|
if (strlen($iconv = @iconv($from, $to . '//IGNORE', $strString))) {
|
|
return $iconv;
|
|
}
|
|
else {
|
|
return @iconv($from, $to, $strString);
|
|
}
|
|
}
|
|
return $strString;
|
|
}
|
|
} // class rateitBackendModule
|