Для сортировки по рейтингу нужно вывести среднее значение оценки в [[*middlerate]] . Кто знает, есть ли такая функция или что (и куда) дописать в сниппет?
На данный момент не понятно: что у вас за рейтинг, что за мифический сниппет… Я бы внес чуть больше конкретики, а то телепаты в отпуске
Стандартный Star Rating, он единственный в установщике Revo. http://modx.com/extras/package/starrating#__utmzi__1__=1
Это его файл, куда нужно добавить вывод средней оценки в TV <php
/**
The Star Rating class
@package star_rating
*/
class starRating extends xPDOSimpleObject {
public $vote = null;
public $startDate = null;
public $endDate = null;
public $config = array();
public $output = '';
/**
* Initialize default config settings
*/
public function initialize() {
$this->config = array(
'useSession' => false,
'sessionName' => 'starrating',
'useCookie' => false,
'cookieName' => 'starrating',
'cookieExpiry' => 608400,
'theme' => 'default',
'maxStars' => 5,
'imgWidth' => 25,
'cssFile' => 'star',
'urlPrefix' => '',
'starTpl' => 'starTpl',
);
}
/**
* Setup custom config variables
*
* @param array $array An array of configuration properties
*/
public function setConfig($config = array()) {
$this->config = array_merge($this->config,$config);
}
/**
* Render the star rating
*/
public function renderVote() {
if (($this->startDate == null || date('Y-m-d H:i:s',time()) > $this->startDate) && ($this->endDate == null || date('Y-m-d H:i:s', time()) < $this->endDate)) {
$voteAllowed = $this->allowVote();
$voteStats = $this->getVoteStats();
/* TODO: replace with lexicon */
$currentText = round($voteStats['average'].'/'.$this->config['maxStars'], 2);
$listItems = '';
for($i = 0; $i config['maxStars']; $i++) {
if ($i == 0) {
$listItems .= ''.$currentText.'
';
} else {
$starWidth = floor(100 / $this->config['maxStars'] * $i);
$starIndex = ($this->config['maxStars'] - $i) + 2;
if ($voteAllowed) {
$prefix = parse_url($_SERVER['REQUEST_URI'], PHP_URL_QUERY);
if (!empty($this->config['urlPrefix'])) {
$prefix = $this->config['urlPrefix'].'&'.$prefix;
}
$urlParams = $prefix . '&vote='.$i.'&star_id=' . $this->get('star_id');
$listItems .= ''. $i . '
';
} else {
$listItems .= ''. $i .'
';
}
}
}
$listItems .= '';
}
$ph['rating'] = $listItems;
$ph = array_merge($ph, $voteStats);
$chunk = $this->xpdo->getObject('modChunk',array(
'name' => $this->config['starTpl'],
));
if ($chunk) {
$this->output = $chunk->getContent();
} else {
$this->output = '[[+rating]]Votes: [[+vote_count]]';
}
foreach ($ph as $key => $value) {
$this->output = str_replace('[[+' . $key . ']]', $value, $this->output);
}
return $this->output;
}
/**
* Returns an array of the current vote stats
*
* @return array
*/
public function getVoteStats() {
$row = $this->toArray();
$row['average'] = ($row['vote_count'] != 0) ? $row['vote_total'] / $row['vote_count'] : 0;
$row['percentage'] = floor(($row['average']/$this->config['maxStars'])*100);
return $row;
}
/**
* Add vote if necessary permission and validation checks are okay
*
* @return boolean
*/
public function addVote() {
$added = false;
if (is_numeric($this->vote) && $this->allowVote() && $this->validateVote()) {
$vt = $this->get('vote_total') + $this->vote;
$vc = $this->get('vote_count') + 1;
$this->set('vote_total', $vt);
$this->set('vote_count', $vc);
if ($this->save()) {
$this->setVoteRestrictions();
$added = true;
}
}
return false;
}
/**
* Set the vote to a certain value
*
* @param integer $vote
*/
public function setVote($vote) {
$this->vote = $vote;
}
/**
* Check vote is within limits of the star rating
*
* @return boolean
*/
public function validateVote() {
if (!empty($this->vote) && intval($this->vote) > 0 && intval($this->vote) config['maxStars']) {
return true;
}
return false;
}
/**
* Check that the vote is allowed (cookie, session, user permissions)
*
* @return boolean
*/
public function allowVote() {
$uniqueId = ($this->get('group_id') != '' ? $this->get('group_id').'-' : '') . $this->get('star_id');
/* session */
if ($this->config['useSession'] == true
&& array_key_exists($this->config['sessionName'],$_SESSION)) {
$sessionArray = $_SESSION[$this->config['sessionName']];
if (!empty($sessionArray) && in_array($uniqueId, $sessionArray)) {
return false;
}
}
/* cookie */
if ($this->config['useCookie'] == true) {
if (isset ($_COOKIE[$this->config['cookieName'] . $uniqueId])) {
return false;
}
}
return true;
}
/**
* Prevent user from voting twice
*
* @return boolean
*/
public function setVoteRestrictions() {
$uniqueId = ($this->get('group_id') != '' ? $this->get('group_id').'-' : '') . $this->get('star_id');
/* session */
if ($this->config['useSession'] == true) {
if (!array_key_exists($this->config['sessionName'], $_SESSION)) $_SESSION[$this->config['sessionName']] = array();
if (!in_array($uniqueId, $_SESSION[$this->config['sessionName']])) {
array_push($_SESSION[$this->config['sessionName']], $uniqueId);
}
}
/* cookie */
if ($this->config['useCookie'] == true) {
setcookie($this->config['cookieName'] . $uniqueId, 'novote', time() + $this->config['cookieExpiry']);
}
return true;
}
/**
* Load custom theme
*
* @return boolean
*/
public function loadTheme() {
$loaded = false;
$f = $this->xpdo->getOption('base_path').'assets/components/star_rating/themes/'.$this->config['theme'].'/'.$this->config['cssFile'].'.css';
if (file_exists($f)) {
$url = $this->xpdo->getOption('base_url') . 'assets/components/star_rating/themes/' . $this->config['theme'] . '/' . $this->config['cssFile'] . '.css';
$this->xpdo->regClientCSS($url);
$loaded = true;
}
return $loaded;
}
public function getRedirectUrl() {
$qs = parse_url($_SERVER['REQUEST_URI'], PHP_URL_QUERY);
$qsCleansed = array();
if (strlen($qs) > 0) {
$qsParts = explode('&', $qs);
foreach ($qsParts as $key => $part) {
$param = explode('=', $part);
if (!in_array($param[0], array('vote', 'star_id', 'group_id'))) {
$qsCleansed[] = $param[0] . '=' . $param[1];
}
}
}
return $this->xpdo->makeUrl($this->xpdo->resource->get('id'), '', implode('&', $qsCleansed));
}
}
В прошлой версии мне помогли сделать это так: http://community.modx-cms.ru/blog/solutions/7924.html После обновления, точнее этот рейтинг другого издателя, такой трюк не проходит. Помогите, плиз, дописать корректно код!
Стандартный Star Rating, он единственный в установщике Revo. Вообще-то вы имеете ввиду CSS Star Rating. А есть еще starRating, и по запросу Star Rating они выдаются оба. http://joxi.ru/KAgK9pXIEMVkAl Поэтому указать точное наименование модуля никогда не лишнее. Ваш топик вообще лоуконтекстный, просьба больше такие не писать (а то что-то зачастили). Уже который раз говорится, что здесь нет телепатов. Хотите чтобы вам помогли (то есть потратили свои калории на помощь вам) - потрудитесь и вы оформить топик как положено, описав четче задачу, предоставив листинги как и что у вас сделано и где что вообще требуется. А то скоро просто в игнор отправлять будем. По вашей теме: особо копать не буду. Приведу только xPDO-запрос, который позволит отсортировать как хочется. А вы уже смотрите куда и как его применить. <php
$snippetPath = $modx->getOption('core_path').'components/star_rating/';
$modx->addPackage('star_rating',$snippetPath.'model/');
$q = $modx->newQuery('starRating');
$q->select(array(
"starRating.*",
"starRating.vote_total/starRating.vote_count as average",
));
$q->sortby("average", "DESC");
foreach($modx->getCollection('starRating', $q) as $o){
print_r($o->toArray());
}
Спасибо, что отозвались. Не знаю, чем я вас так разозлила, я абсолютно точно написала название (второе по-другому пишется) и сформулировала задачу. Я не знаю куда именно вставлять этот код и что он делает (в PHP полнейший ноль), на этом сайте, я так понимаю, таких вопросов нельзя задавать? Вы бы где-то указали, что сайт только для профи, новичкам здесь делать нечего. Тогда бы и не тратил никто ни своего, ни вашего времени.
Если здесь все такие умные, готова заплатить, кто может помочь это сделать. Очень нужно. (artnet6 sobaka yandex.ru)
Не стоит обижаться. Рабочее решение я вам написал. Но согласен, интеграция этого может потребовать скилов. Направлю к вам человечка, если никто вам вперед не сделает, то завтра вечером он вам поможет.
Не за что. Не знаю, чем я вас так разозлила Нет, еще не разозлили. я абсолютно точно написала название Извините, мы программисты, "Star Rating" != "CSS Star Rating". Отличается на 4 символа (пробел - тоже символ). я так понимаю, таких вопросов нельзя задавать? Вы бы где-то указали, что сайт только для профи, новичкам здесь делать нечего. Тогда бы и не тратил никто ни своего, ни вашего времени. Можно. Но как раз на этот счет очередное обновление на сайте.
Здравствуйте, помогите записать произвольное в TV "$row['percentage']"