%PDF- %PDF-
| Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/polls/models/ |
| Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/polls/models/Poll.php |
<?php
namespace humhub\modules\polls\models;
use humhub\modules\content\widgets\richtext\RichText;
use humhub\modules\polls\permissions\CreatePoll;
use humhub\modules\search\interfaces\Searchable;
use humhub\modules\content\components\ContentActiveRecord;
use Yii;
/**
* This is the model class for table "poll".
*
* The followings are the available columns in table 'poll':
*
* @property integer $id
* @property string $question
* @property string $description
* @property integer $allow_multiple
* @property string $created_at
* @property integer $created_by
* @property string $updated_at
* @property integer $updated_by
* @property integer $is_random
* @property integer $closed
* @property integer $anonymous
* @property integer show_result_after_close
*
* @property-read PollAnswer[] $answers
*
* @package humhub.modules.polls.models
* @since 0.5
* @author Luke
*/
class Poll extends ContentActiveRecord implements Searchable
{
const MIN_REQUIRED_ANSWERS = 2;
const SCENARIO_CREATE = 'create';
const SCENARIO_EDIT = 'edit';
const SCENARIO_CLOSE = 'close';
public $newAnswers;
public $editAnswers;
public $autoAddToWall = true;
public $wallEntryClass = 'humhub\modules\polls\widgets\WallEntry';
/**
* @inheritdoc
*/
protected $createPermission = CreatePoll::class;
/**
* @inheritdoc
*/
public $moduleId = 'polls';
/**
* @return string the associated database table name
*/
public static function tableName()
{
return 'poll';
}
public function scenarios()
{
return [
self::SCENARIO_CLOSE => [],
self::SCENARIO_CREATE => ['question', 'description', 'anonymous', 'is_random', 'show_result_after_close', 'newAnswers', 'allow_multiple'],
self::SCENARIO_EDIT => ['question', 'description', 'anonymous', 'is_random', 'show_result_after_close','newAnswers', 'editAnswers', 'allow_multiple']
];
}
/**
* @return array validation rules for model attributes.
*/
public function rules()
{
return array(
[['question'], 'string', 'max' => 255],
[['question'], 'required'],
[['description'], 'string'],
[['anonymous', 'is_random'], 'boolean'],
[['newAnswers'], 'required', 'on' => self::SCENARIO_CREATE],
[['newAnswers'], 'minTwoNewAnswers', 'on' => self::SCENARIO_CREATE],
//we use the question attribute since its always required, otherwise it would not be called for editAnswers if editAnswers is empty...
[['question'], 'minTwoAnswers', 'on' => self::SCENARIO_EDIT],
[['allow_multiple'], 'integer'],
);
}
public function minTwoNewAnswers($attribute)
{
if(count($this->newAnswers) < self::MIN_REQUIRED_ANSWERS) {
$this->addError($attribute, Yii::t('PollsModule.models_Poll', "Please specify at least {min} answers!", ["{min}" => self::MIN_REQUIRED_ANSWERS]));
}
}
public function minTwoAnswers($attribute)
{
$count = count($this->newAnswers) + count($this->editAnswers);
if ($count < self::MIN_REQUIRED_ANSWERS) {
$this->addError('editAnswers', Yii::t('PollsModule.models_Poll', "Please specify at least {min} answers!", ["{min}" => self::MIN_REQUIRED_ANSWERS]));
}
}
/**
* @return array customized attribute labels (name=>label)
*/
public function attributeLabels()
{
return array(
'newAnswers' => Yii::t('PollsModule.models_Poll', 'Answers'),
'editAnswers' => Yii::t('PollsModule.models_Poll', 'Answers'),
'question' => Yii::t('PollsModule.models_Poll', 'Question'),
'description' => Yii::t('PollsModule.models_Poll', 'Description'),
'allow_multiple' => Yii::t('PollsModule.models_Poll', 'Multiple answers per user'),
'is_random' => Yii::t('PollsModule.widgets_views_pollForm', 'Display answers in random order?'),
'anonymous' => Yii::t('PollsModule.widgets_views_pollForm', 'Anonymous Votes?'),
'show_result_after_close' => Yii::t('PollsModule.widgets_views_pollForm', 'Hide results until poll is closed?')
);
}
public function getIcon()
{
return 'fa-bar-chart';
}
public function isResetAllowed()
{
return $this->hasUserVoted() && !$this->closed;
}
public function isShowResult()
{
return !$this->show_result_after_close || $this->closed;
}
/**
* @return \yii\db\ActiveQuery
*/
public function getAnswers()
{
return $this->hasMany(PollAnswer::class, ['poll_id' => 'id']);;
}
public function getViewAnswers()
{
if ($this->is_random) {
$result = [];
foreach ($this->answers as $key => $value) {
$result[$key] = $value;
}
shuffle($result);
return $result;
} else {
return $this->answers;
}
}
/**
* Saves new answers (if set) and updates answers given editanswers (if set)
* @param $insert
* @param $changedAttributes
* @return bool|void
* @throws \yii\base\InvalidConfigException
*/
public function afterSave($insert, $changedAttributes)
{
parent::afterSave($insert, $changedAttributes);
RichText::postProcess($this->description, $this);
if($this->scenario === static::SCENARIO_EDIT || $this->scenario === static::SCENARIO_CREATE) {
if (!$insert) {
$this->updateAnswers();
}
$this->saveNewAnswers();
}
return true;
}
public function saveNewAnswers()
{
if ($this->newAnswers == null) {
return;
}
foreach ($this->newAnswers as $answerText) {
$this->addAnswer($answerText);
}
// Reset cached answers
unset($this->answers);
}
public function addAnswer($answerText)
{
if (trim($answerText) === '') {
return;
}
$answer = new PollAnswer();
$answer->poll_id = $this->id;
$answer->answer = $answerText;
$answer->save();
return $answer;
}
public function updateAnswers()
{
$answersToEdit = empty($this->editAnswers) ? [] : $this->editAnswers;
foreach ($this->answers as $answer) {
if (!array_key_exists($answer->id, $answersToEdit)) {
$answer->delete();
} else if ($answer->answer !== $answersToEdit[$answer->id]) {
$answer->answer = $this->editAnswers[$answer->id];
$answer->update();
}
}
}
/**
* Sets the newAnswers array, which is used for creating and updating (afterSave)
* the poll, by saving all valid answertexts contained in the given array.
* @param type $newAnswerArr
*/
public function setNewAnswers($newAnswerArr)
{
$this->newAnswers = PollAnswer::filterValidAnswers($newAnswerArr);
}
/**
* Sets the editAnswers array, which is used for updating (afterSave)
* the poll. The given array has to contain poll answer ids as key and an answertext
* as values.
* @param type $newAnswerArr
*/
public function setEditAnswers($editAnswerArr)
{
$this->editAnswers = PollAnswer::filterValidAnswers($editAnswerArr);
}
/**
* Deletes a Poll including its dependencies.
*/
public function beforeDelete()
{
foreach ($this->answers as $answer) {
$answer->delete();
}
return parent::beforeDelete();
}
/**
* Checks if user has voted
*
* @param type $userId
* @return type
*/
public function hasUserVoted($userId = "")
{
if ($userId == "")
$userId = Yii::$app->user->id;
$answer = PollAnswerUser::findOne(array('created_by' => $userId, 'poll_id' => $this->id));
if ($answer == null)
return false;
return true;
}
public function vote($votes = array())
{
if ($this->hasUserVoted()) {
return false;
}
$voted = false;
foreach ($votes as $answerId) {
$answer = PollAnswer::findOne(array('id' => $answerId, 'poll_id' => $this->id));
if ($answer) {
$userVote = new PollAnswerUser();
$userVote->poll_id = $this->id;
$userVote->poll_answer_id = $answer->id;
if ($userVote->save()) {
$voted = true;
}
}
}
if ($voted && !$this->anonymous) {
$activity = new \humhub\modules\polls\activities\NewVote();
$activity->source = $this;
$activity->originator = Yii::$app->user->getIdentity();
$activity->create();
}
return $voted;
}
/**
* Resets all answers from a user only if the poll is not closed yet.
*
* @param type $userId
*/
public function resetAnswer($userId = "")
{
if($this->closed) {
return;
}
if ($userId == "")
$userId = Yii::$app->user->id;
if ($this->hasUserVoted($userId)) {
$answers = PollAnswerUser::findAll(array('created_by' => $userId, 'poll_id' => $this->id));
foreach ($answers as $answer) {
$answer->delete();
}
//ToDo: Delete Activity
}
}
/**
* @inheritdoc
*/
public function getContentName()
{
return Yii::t('PollsModule.models_Poll', 'Poll');
}
/**
* @inheritdoc
*/
public function getContentDescription()
{
return $this->question;
}
/**
* @inheritdoc
*/
public function getSearchAttributes()
{
$itemAnswers = '';
foreach ($this->answers as $answer) {
$itemAnswers .= $answer->answer . ' ';
}
return [
'question' => $this->question,
'description' => $this->description,
'itemAnswers' => trim($itemAnswers)
];
}
/**
* @inheritdoc
*/
public function load($data, $formName = null)
{
// Set newAnswers, and editAnswers which will be saved by afterSave of the poll class
$this->setNewAnswers(isset($data['newAnswers']) && is_array($data['newAnswers']) ? $data['newAnswers'] : []);
$this->setEditAnswers(isset($data['answers']) && is_array($data['answers']) ? $data['answers'] : []);
return parent::load($data, $formName);
}
}