Вопрос. Голосование за юзера раз в сутки.

Пытаюсь осуществить возможность голосование за юзера раз в сутки. Пока безуспешно. Может кто на скорую руку подскажет?

Вот код voteUser.php редактированный под данную задачу


<?php

set_include_path(get_include_path().PATH_SEPARATOR.dirname(dirname(dirname(__FILE__))));
$sDirRoot=dirname(dirname(dirname(__FILE__)));
require_once($sDirRoot."/config/config.ajax.php");

$iValue=getRequest('value',null,'post');
$bStateError=true;
$sMsg='';
$sMsgTitle='';
$iRating=0;
$iSkill=0;
$iCountVote=0;
if ($oEngine->User_IsAuthorization()) {
	if ($oUser=$oEngine->User_GetUserById(getRequest('idUser',null,'post'))) {
		$oUserCurrent=$oEngine->User_GetUserCurrent();
		if ($oUser->getId()!=$oUserCurrent->getId()) {
			if (!($oUserVote=$oEngine->Vote_GetVote($oUser->getId(),'user',$oUserCurrent->getId()->getVote_date())<time()-60*60*24*1)))) {
				
				if ($oEngine->ACL_CanVoteUser($oUserCurrent,$oUser)) {
					if (in_array($iValue,array('1','-1'))) {
						$oUserVote=Engine::GetEntity('Vote');
						$oUserVote->setTargetId($oUser->getId());
						$oUserVote->setTargetType('user');
						$oUserVote->setVoterId($oUserCurrent->getId());
						$oUserVote->setDirection($iValue);
						$oUserVote->setDate(date("Y-m-d H:i:s"));
						$iVal=(float)$oEngine->Rating_VoteUser($oUserCurrent,$oUser,$iValue);
						$oUserVote->setValue($iVal);
						//$oUser->setRating($oUser->getRating()+$iValue);
						$oUser->setCountVote($oUser->getCountVote()+1);
						if ($oEngine->Vote_AddVote($oUserVote) and $oEngine->User_Update($oUser)) {
							$bStateError=false;
							$sMsgTitle=$oEngine->Lang_Get('attention');
							$sMsg=$oEngine->Lang_Get('user_vote_ok');
							$iRating=$oUser->getRating();
							$iSkill=$oUser->getSkill();
							$iCountVote=$oUser->getCountVote();
						} else {
							$sMsgTitle=$oEngine->Lang_Get('error');
							$sMsg=$oEngine->Lang_Get('system_error');
						}
					} else {
						$sMsgTitle=$oEngine->Lang_Get('attention');
						$sMsg=$oEngine->Lang_Get('system_error');
					}
				} else {
					$sMsgTitle=$oEngine->Lang_Get('attention');
					$sMsg=$oEngine->Lang_Get('user_vote_error_acl');
				}
			} else {
				$sMsgTitle=$oEngine->Lang_Get('attention');
				$sMsg=$oEngine->Lang_Get('user_vote_error_already');
			}
		} else {
			$sMsgTitle=$oEngine->Lang_Get('attention');
			$sMsg=$oEngine->Lang_Get('user_vote_error_self');
		}
	} else {
		$sMsgTitle=$oEngine->Lang_Get('error');
		$sMsg=$oEngine->Lang_Get('system_error');
	}
} else {
	$sMsgTitle=$oEngine->Lang_Get('error');
	$sMsg=$oEngine->Lang_Get('need_authorization');
}


$GLOBALS['_RESULT'] = array(
"bStateError"     => $bStateError,
"iRating"   => $iRating,
"iSkill" => $iSkill,
"iCountVote" => $iCountVote,
"sMsgTitle"   => $sMsgTitle,
"sMsg"   => $sMsg,
);

?>



Из всего этого я понял, что проблема только в этом условии:


if (!($oUserVote=$oEngine->Vote_GetVote($oUser->getId(),'user',$oUserCurrent->getId()->getVote_date())<time()-60*60*24*1)))) {

Я так понял "$oUser->getId()" это за кого голосуют, "$oUserCurrent->getId()" кто голосует. Правильно? Если да, правильно ли я получаю дату голосования голосующего и ставлю занчок меньше и дату?
Как правильно его прописать чтобы все зароботало?

12 комментариев

avatar
посмотрите этот топик может поможет, замение условие проверки админа на условие проверки даты голоса пользователя, + при повторном готоловании поставить обновление даты последнего голоса
avatar
При таком раскладе появились хотя бы какие то движения(Please try again later):

if ($oEngine->User_IsAuthorization()) {
	if ($oUser=$oEngine->User_GetUserById(getRequest('idUser',null,'post'))) {
		$oUserCurrent=$oEngine->User_GetUserCurrent();
		if ($oUser->getId()!=$oUserCurrent->getId() or $oUserCurrent->getId()->getVote_date()<time()-60*60*24*1) {
			if (!($oUserVote=$oEngine->Vote_GetVote($oUser->getId(),'user',$oUserCurrent->getId())) or $oUserCurrent->getId()->getVote_date()<time()-60*60*24*1) {
        if ($oUserCurrent->$oUserCurrent->getId()->getVote_date()<time()-60*60*24*1){
		$oUserVote->setDate(date("Y-m-d H:i:s"));
          $iTargetId = $oUser->getId();
          $oUserVote = null;
        }

Скажите, я праильно делаю что дублирую одно и тоже вместо изадминистратор, проверка даты голоса?
avatar
Нет. Сущности getVote_date() не существует.
avatar
Попробуйте это:
if ($oUserCurrent->$oUserCurrent->getId()->getVote_date()<time()-60*60*24*1){

Заменить на это:
if ($oUserCurrent->$oUserCurrent->getId()->getVote()->getDate()<time()-60*60*24*1){

Работоспособность не гарантирую, но грубую ошибку исправит.
avatar
заменил как вы сказали в редактируемом мной ранее userVote.php(где брал код от голосования админа скокахошь раз) та же ошибка.

взял нулевый userVote.php(какой есть в движке) заменил строчку
if (!($oUserVote=$oEngine->Vote_GetVote($oUser->getId(),'user',$oUserCurrent->getId()))) {

На

if (!($oUserVote=$oEngine->Vote_GetVote($oUser->getId(),'user',$oUserCurrent->getId() or $oUserCurrent->getId()->getVote()->getDate()<time()-60*1*1*1))) {

время для проверки поставил 1 минуту(60*1*1*1). первый раз голосует уже прогресс!!! но второй раз, через минуту выдает опять выдает Please try again later. Что еще нужно добавить, изменить?
avatar
Потому-что так устроено голосование, здесь одной строчкой не обойтись.
Есть связка «Кто голосовал» — «За кого голосовал» — вот это и надо ковырять после замены проверки.
И это 60*1*1*1 — вообще ни в какие ворота не лезет =D
avatar
И это 60*1*1*1 — вообще ни в какие ворота не лезет =D
а как тогда проверять зачисляется ли голос? просто если все получиться, ошибка то вылезет, если прописать после этого елса вы сегодня уже голосовали, но как я тогда узнаю зачислился ли голос.

Есть связка «Кто голосовал» — «За кого голосовал»
Я это уже понял. Но я думал, что именно «Кто голосовал» добавить тогда то и через сколько он будет голосовать еще раз, то это как раз решается вот этой строчкой
if (!($oUserVote=$oEngine->Vote_GetVote($oUser->getId(),'user',$oUserCurrent->getId() or $oUserCurrent->getId()->getVote()->getDate()<time()-60*60*24*1)))


Потому-что так устроено голосование, здесь одной строчкой не обойтись.
Хорошо, одним voteUser.php хотя бы можно обойтись?

Я очень плохо разбираюсь в программировании и попросил помощи, не потому, что мне лень самому делать, а потому что я не знаю как уже можно сделать так, чтобы приблизить желаемый результат.
avatar
Посмотрите классы модуля Vote (/classes/modules/vote) — там найдете много интересного, там и лежит продолжение решения вашей проблемы :)
Можете посмотреть функцию GetVote в этом классе.
avatar
честно говоря я так и не понял, как функция GetVote может решить мою проблему. сколько я не смотрел, даже не знаю за что взяться в этом файле vote.class.php
avatar
Советы:
1. Лучше копаться не в voteUser.php, а Vote.class.php
2. Сообрази, что делать со строчкой
PRIMARY KEY (`target_id`,`target_type`,`user_voter_id`)
avatar
у меня нет этой строчки в Vote.class.php. в базе есть.
Вот функция на которую мне указали в Vote.class.php

public function GetVote($sTargetId,$sTargetType,$sUserId) {
		$data=$this->GetVoteByArray($sTargetId,$sTargetType,$sUserId);
		if (isset($data[$sTargetId])) {
			return $data[$sTargetId];
		}
		return null;
	}

но там нет того самого Voter'a.
я понимаю, TargetId за кого голосуют, TargetType тип голоса, VoterId голосоующий. Вот как этому вотеру разрешить еще раз голосовать через сутки? Просто я не совсем понимаю как правильно их поставить и что добавить.
avatar
Изучай MVC. В классах ты не найдешь SQL запросов, все запросы в мапперах /classes/modules/vote/mapper/Vote.mapper.class.php
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.