| Server IP : 54.36.91.62 / Your IP : 216.73.217.112 Web Server : Apache System : Linux webm013.cluster127.gra.hosting.ovh.net 5.15.206-ovh-vps-grsec-zfs-classid #1 SMP Fri May 15 02:41:25 UTC 2026 x86_64 User : coopiak ( 151928) PHP Version : 8.3.23 Disable Function : _dyuweyrj4,_dyuweyrj4r,dl MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /home/c/o/o/coopiak/amisdesseniors-fr/nice/components/com_rsfeedback/models/ |
Upload File : |
<?php
/**
* @package RSFeedback!
* @copyright (C) 2010-2018 www.rsjoomla.com
* @license GPL, http://www.gnu.org/copyleft/gpl.html
*/
use Joomla\CMS\MVC\Model\AdminModel;
use Joomla\CMS\Mail\MailHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Table\Table;
use Joomla\CMS\Factory;
defined('_JEXEC') or die('Restricted access');
class RSFeedbackModelFeedback extends AdminModel
{
/**
* Model context string.
*
* @var string
*/
protected $_context = 'com_rsfeedback.feedback';
public function getTable($type = 'Feedback', $prefix = 'RSFeedbackTable', $config = array()) {
return Table::getInstance($type, $prefix, $config);
}
protected function populateState() {
$app = Factory::getApplication();
// Load the parameters.
$params = $app->getParams();
$this->setState('params', $params);
$param_id = $params->get('feedback_id');
$id = $app->input->get('id', '','int');
$feedback_id= !empty($param_id) ? $param_id : $id;
$this->setState('feedback.id',$feedback_id);
}
public function getItem($pk = null) {
$pk = !empty($pk) ? (int) $pk : (int) $this->getState('feedback.id');
$item = parent::getItem($pk);
$item->id = $item->id ? $item->id : 0;
if ($item->user_id) {
$user = Factory::getUser($item->user_id);
$item->username = RSFeedbackHelper::getConfig('user_display') ? $user->get('name') : $user->get('username');
} else {
$item->username = empty($item->name) ? Text::_( 'COM_RSFEEDBACK_USER_ANONYMOUS') : $item->name;
}
$item->nr_votes = $this->getFeedbackVotes($item->id);
if (!empty($item->cat_id)) {
$CategoryDetails = RSFeedbackHelper::getCategoryDetails($item->cat_id);
$item->max_votes_allowed = $CategoryDetails->max_votes_allowed;
$item->category_name = $CategoryDetails->name;
}
$StatusDetails = $this->getStatusDetails($item->status_id);
$item->status_name = $StatusDetails->name;
$item->status_icon = $StatusDetails->icon;
$item->status_default = $StatusDetails->default;
$item->comments = RSFeedbackHelper::getFeedbackCommentsCount($item->id);
return $item;
}
public function getForm($data = array(), $loadData = true) {
$form = $this->loadForm('com_rsfeedback.feedback', 'feedback', array('control' => 'jform', 'load_data' => $loadData));
if (empty($form))
return false;
return $form;
}
protected function loadFormData() {
// Check the session for previously entered form data.
$app = Factory::getApplication();
$data = $app->getUserState('com_rsfeedback.edit.feedback.data', array());
$id = $app->input->get('id', 0, 'int');
if (!empty($id))
$data = $this->getItem();
return $data;
}
public function save($data) {
$permissions = RSFeedbackHelper::getPermissions();
$config = RSFeedbackHelper::getConfig();
$jconfig = Factory::getConfig();
$user = Factory::getUser();
$allowed_categories = RSFeedbackHelper::getAllowedCategories();
$category_is_allowed = false;
foreach ($allowed_categories as $cat)
if ($data['cat_id'] == $cat->id)
$category_is_allowed = true;
// do not permit to add feedback in other categories
if (!$category_is_allowed ) {
$this->setError(Text::_('COM_RSFEEDBACK_NOT_ALLOWED_CATEGORY'));
return false;
}
// Need to check consent
if (empty($data['consent'])) {
$this->setError(Text::_('COM_RSFEEDBACK_FEEDBACK_CONSENT_NEEDED_ERROR'));
return false;
}
// if feedback_moderation is on, set published=0 for new & updated feedbacks before saving
if ($permissions['feedback_moderation'])
$data['published'] = 0;
// send moderation emails if save returned true
if (parent::save($data)) {
if ($permissions['feedback_moderation']) {
// send mail to the feedback_moderation_emails in the config
$emails = $config->feedback_moderation_emails;
$emails = str_replace("\r", "", $emails);
if (!empty($emails)) {
$from_email = $jconfig->get('mailfrom');
$from_name = $jconfig->get('fromname');
if ($data['id'] == 0) {
$subject = Text::sprintf('COM_RSFEEDBACK_SUBJECT_REQUIRE_MODERATION_FEEDBACK',$user->name);
$body = Text::sprintf('COM_RSFEEDBACK_BODY_REQUIRE_MODERATION_FEEDBACK', $user->name, $data['title']);
} else {
$subject = Text::sprintf('COM_RSFEEDBACK_SUBJECT_REQUIRE_MODERATION_UPDATED_FEEDBACK',$user->name);
$body = Text::sprintf('COM_RSFEEDBACK_BODY_REQUIRE_MODERATION_UPDATED_FEEDBACK', $user->name, $data['title']);
}
$emails = explode("\n",$emails);
foreach ($emails as $email)
if (MailHelper::isEmailAddress(trim($email))) {
try {
Factory::getMailer()->sendMail($from_email, $from_name, $email, $subject, $body, 1);
} catch (Exception $e) {}
}
}
}
return true;
}
}
public function getStatusDetails($status_id) {
$status = new stdClass();
$status->name = '';
$status->default = '';
$status->icon = '';
if ($status_id) {
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query->select($db->qn('name').', '.$db->qn('icon').', '.$db->qn('default'))
->from($db->qn('#__rsfeedback_statuses'))
->where($db->qn('id') .' = '.$db->q((int) $status_id));
$db->setQuery($query);
$status = $db->loadObject();
}
return $status;
}
public function getHits() {
$db = Factory::getDbo();
$query = $db->getQuery(true);
$id = $this->getState('feedback.id');
if (!empty($id)) {
$query->update($db->qn('#__rsfeedback_feedbacks'));
$query->set($db->qn('hits') . ' = hits + 1');
$query->where($db->qn('id').' = '.$db->q($id));
$db->setQuery($query);
$db->execute();
}
return true;
}
public function getFeedbackVotes($id) {
if (!empty($id)) {
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query->select('COALESCE(SUM('.$db->qn('number_points').'),0) as nr_votes')
->from($db->qn('#__rsfeedback_user_votes'))
->where($db->qn('feedback_id') .' = '.$db->q((int) $id));
$db->setQuery($query);
$votes = $db->loadResult();
} else
$votes = 0;
return $votes;
}
public function getUserRemainingVotes() {
$user = Factory::getUser();
$db = Factory::getDbo();
$query = $db->getQuery(true);
$config = RSFeedbackHelper::getConfig();
$statuses = RSFeedbackHelper::getStatuses();
$disabled_voting_statuses = array();
foreach ($statuses as $status)
if ($status->permissions->allow_voting == 0) $disabled_voting_statuses[] = $status->id;
if ($user->guest) {
$max_votes = 1;
$user_id = '-1';
$ip_address = Factory::getApplication()->input->server->get('REMOTE_ADDR', '','string');
if ($ip_address == '::1') $ip_address = '127.0.0.1';
// Create a hash for the IP address
$hash = md5($ip_address);
$query->where($db->qn('uv.hash').' = '.$db->q($hash));
} else {
$max_votes = (int) $config->user_maxvotes;
$user_id = $user->id;
}
$query->select('SUM('.$db->qn('uv.number_points').')')
->from($db->qn('#__rsfeedback_user_votes').' uv')
->join('left', $db->qn('#__rsfeedback_feedbacks').' f ON '.$db->qn('uv.feedback_id').' = '.$db->qn('f.id'))
->where($db->qn('uv.user_id').' = '.$db->q($user_id))
->where($db->qn('f.published').' = '.$db->q('1'))
->where($db->qn('f.status_id').' NOT IN ('.implode(',', $disabled_voting_statuses).')');
if (isset($config->user_reset_period) && !empty($config->user_reset_period)) {
$query->where($db->qn('uv.date_voted').' >= ' . $db->q(Factory::getDate('-' . (int) $config->user_reset_period . ' day ' . date('Y-m-d H:i:s'))->toSql()));
}
$db->setQuery($query);
$total_voted = (int) $db->loadResult();
return $total_voted > $max_votes ? 0 : $max_votes - $total_voted;
}
public function getUserVotesOnFeedback($feedback_id) {
$db = Factory::getDbo();
$query = $db->getQuery(true);
$user = Factory::getUser();
$config = RSFeedbackHelper::getConfig();
if ($user->guest) {
$ip_address = Factory::getApplication()->input->server->get('REMOTE_ADDR', '','string');
if ($ip_address == '::1') $ip_address = '127.0.0.1';
// Create a hash for the IP address
$hash = md5($ip_address);
$query->select($db->qn('number_points'))->from($db->qn('#__rsfeedback_user_votes'))->where($db->qn('feedback_id').' = '.$db->q($feedback_id))->where($db->qn('user_id').' = '.$db->q('-1'))->where($db->qn('hash').' = '.$db->q($hash));
} else {
$query->select($db->qn('number_points'))->from($db->qn('#__rsfeedback_user_votes'))->where($db->qn('feedback_id').' = '.$db->q($feedback_id))->where($db->qn('user_id').' = '.$db->q($user->id));
}
if (isset($config->user_reset_period) && !empty($config->user_reset_period))
$query->where($db->qn('date_voted').' >= ' . $db->q(Factory::getDate('-' . (int) $config->user_reset_period . ' day ' . date('Y-m-d H:i:s'))->toSql()));
$db->setQuery($query);
$votes = (int) $db->loadResult();
return $votes;
}
public function SendVotes() {
$db = Factory::getDbo();
$query = $db->getQuery(true);
$user = Factory::getUser();
$app = Factory::getApplication();
$date_voted = RSFeedbackHelper::showDate(time(), 'Y-m-d H:i:s');
$feedback_id = $app->input->get('feedback_id', 0, 'int');
$sent_votes = $app->input->get('votes', 0, 'int'); // Desired number of points that the user wants to assign to the selected feedback
$config = RSFeedbackHelper::getConfig();
if (empty($feedback_id)) exit();
$feedback = $this->getItem($feedback_id);
$category = RSFeedbackHelper::getCategoryDetails($feedback->cat_id);
$statuses = RSFeedbackHelper::getStatuses();
$allow_voting = $statuses[$feedback->status_id]->permissions->allow_voting;
//Get the IP address to prevent spam from anonymous visitors
$ip_address = $app->input->server->get('REMOTE_ADDR', '','string');
if ($ip_address == '::1') $ip_address = '127.0.0.1';
// Create a hash for the IP address
$hash = md5($ip_address);
if (!RSFeedbackHelper::getConfig('store_ip')) {
$ip_address = '0.0.0.0';
}
$return = new stdClass();
$return->message = Text::_('COM_RSFEEDBACK_VOTE_POSTED_SUCCESSFULLY',true);
$return->message_type = 'success';
//check if we have anonymous voting
$anonymous = $category->anonymous_voting;
if ($allow_voting) {
//case 1 : guest and allowed anonymous voting
if ($user->guest && $anonymous) {
// check to see if the user has already voted
$query->clear();
$query->select('SUM(number_points)')->from($db->qn('#__rsfeedback_user_votes'))->where($db->qn('hash').' = '.$db->q($hash))->where($db->qn('user_id').' = '.$db->q('-1'));
// ignore expired voting points ones
if (isset($config->user_reset_period) && !empty($config->user_reset_period))
$query->where($db->qn('date_voted').' >= ' . $db->q(Factory::getDate('-' . (int) $config->user_reset_period . ' day ' . date('Y-m-d H:i:s'))->toSql()));
$db->setQuery($query);
$voted = (int) $db->loadResult();
if ($voted == 0) {
$query->clear()->insert($db->qn('#__rsfeedback_user_votes'))
->columns(array($db->qn('feedback_id'), $db->qn('user_id'), $db->qn('number_points'), $db->qn('date_voted'), $db->qn('ip'), $db->qn('hash')))
->values($db->q($feedback_id).', '.$db->q('-1').', '.$db->q('1').', '.$db->q($date_voted).', '.$db->q($ip_address).', '.$db->q($hash));
$db->setQuery($query);
$db->execute();
}
if ($sent_votes == 0) {
$query->clear();
$query->delete($db->qn('#__rsfeedback_user_votes'))->where($db->qn('hash').' = '.$db->q($hash))->where($db->qn('user_id').' = '.$db->q('-1'))->where($db->qn('feedback_id').' = '.$db->q($feedback_id));
// keep the expired votes
if (isset($config->user_reset_period) && !empty($config->user_reset_period))
$query->where($db->qn('date_voted').' >= ' . $db->q(Factory::getDate('-' . (int) $config->user_reset_period . ' day ' . date('Y-m-d H:i:s'))->toSql()));
$db->setQuery($query);
$db->execute();
}
}
//case 2 : guest and anonymous voting is not allowed
if ($user->guest && !$anonymous) {
$return->message = Text::_('COM_RSFEEDBACK_NOT_ALLOWED_TO_VOTE');
$return->message_type = 'error';
}
//case 3 : user logged in
if (!$user->guest) {
// see if the user has voted on this feedback
$query->clear();
$query->select($db->qn('id'))->from($db->qn('#__rsfeedback_user_votes'))->where($db->qn('feedback_id').' = '.$db->q($feedback_id))->where($db->qn('user_id').' = '.$user->id);
// and votes are not expired
if (isset($config->user_reset_period) && !empty($config->user_reset_period))
$query->where($db->qn('date_voted').' >= ' . $db->q(Factory::getDate('-' . (int) $config->user_reset_period . ' day ' . date('Y-m-d H:i:s'))->toSql()));
$db->setQuery($query);
$voted = $db->loadResult();
$user_votes_on_feedback = $this->getUserVotesOnFeedback($feedback_id);
$user_remaining_votes = $this->getUserRemainingVotes();
$votes = $sent_votes;
if ($sent_votes > ($user_votes_on_feedback + $user_remaining_votes) && ($user_votes_on_feedback + $user_remaining_votes) <= $category->max_votes_allowed)
$votes = abs($user_votes_on_feedback + $user_remaining_votes);
if ($sent_votes > $category->max_votes_allowed)
$votes = $category->max_votes_allowed;
if ($category->max_votes_allowed > $user_remaining_votes && $sent_votes > $user_remaining_votes && $sent_votes > ($user_votes_on_feedback + $user_remaining_votes))
$votes = $user_remaining_votes;
if (empty($voted)) {
// insert
$query->clear();
$query ->insert($db->qn('#__rsfeedback_user_votes'))
->columns(array($db->qn('feedback_id'), $db->qn('user_id'), $db->qn('number_points'), $db->qn('date_voted'), $db->qn('ip'), $db->qn('hash')))
->values($db->q($feedback_id).', '.$db->q($user->id).', '.$db->q($votes).', '.$db->q($date_voted).', '.$db->q($ip_address).', '.$db->q($hash));
$db->setQuery($query);
$db->execute();
} else {
if ($sent_votes == 0) {
$query->clear();
$query->delete($db->qn('#__rsfeedback_user_votes'))->where($db->qn('id').' = '.$db->q($voted));
// keep the expired votes
if (isset($config->user_reset_period) && !empty($config->user_reset_period))
$query->where($db->qn('date_voted').' >= ' . $db->q(Factory::getDate('-' . (int) $config->user_reset_period . ' day ' . date('Y-m-d H:i:s'))->toSql()));
$db->setQuery($query);
$db->execute();
} else {
// update user's votes on feedback
$query->clear();
$query->update($db->qn('#__rsfeedback_user_votes'));
$query->set($db->qn('number_points') . ' = '.$db->q($votes));
$query->set($db->qn('date_voted') . ' = '.$db->q($date_voted));
$query->where($db->qn('id').' = '.$db->q($voted));
$db->setQuery($query);
$db->execute();
}
}
}
} else {
$return->message = Text::_('COM_RSFEEDBACK_NOT_ALLOWED_TO_VOTE');
$return->message_type = 'error';
}
$return->feedback_votes = $this->getFeedbackVotes($feedback_id); // return the number of voted number_points on this feedback
$return->user_remaining_votes = $this->getUserRemainingVotes(); // return the remaining number of votes for this user
$return->user_votes_on_feedback = $this->getUserVotesOnFeedback($feedback_id);
echo json_encode($return);
exit();
}
public function Subscribe() {
$db = Factory::getDbo();
$query = $db->getQuery(true);
$input = Factory::getApplication()->input;
$feedback_id = $input->get('id', '','int');
$name = $input->get('name', '','string');
$consent = $input->get('consent', 0,'int');
$email = $input->get('email', '','sting');
$return = new stdClass();
$return->message = '';
$return->success = false;
if(empty($name)) {
$return->message = Text::_('COM_RSFEEDBACK_NO_NAME');
$return->success = false;
} elseif (empty($email) || !MailHelper::isEmailAddress(trim($email))) {
$return->message = Text::_('COM_RSFEEDBACK_NO_INVALID_EMAIL');
$return->success = false;
} elseif (empty($consent)) {
$return->message = Text::_('COM_RSFEEDBACK_FEEDBACK_CONSENT_NEEDED_ERROR');
$return->success = false;
} else {
// check if is already subscribed with this email
$query->select('COUNT('.$db->qn('id').')')->from($db->qn('#__rsfeedback_subscriptions'))->where($db->qn('feedback_id').' = '.$db->q($feedback_id))->where($db->qn('email') .' = '.$db->q($email));
$db->setQuery($query);
if ($db->loadResult()) {
$return->message = Text::_('COM_RSFEEDBACK_ALREADY_SUBSCRIBED');
$return->success = false;
} else {
// add subscriber to database
$query->clear();
$query->insert('#__rsfeedback_subscriptions')
->set($db->qn('feedback_id').' = '. $db->q($feedback_id))
->set($db->qn('name').' = '. $db->q($name))
->set($db->qn('email').' = '. $db->q($email));
$db->setQuery($query);
$db->execute();
$return->message = Text::_('COM_RSFEEDBACK_SUBSCRIBED');
$return->success = true;
}
}
return $return;
}
public function Unsubscribe() {
$db = Factory::getDbo();
$query = $db->getQuery(true);
$input = Factory::getApplication()->input;
$feedback_id = $input->get('id', '','int');
$email = $input->get('email', '','sting');
$consent = $input->get('consent', 0,'int');
$return = new stdClass();
$return->message = '';
$return->success = false;
if (empty($email) || !MailHelper::isEmailAddress(trim($email))) {
$return->message = Text::_('COM_RSFEEDBACK_NO_INVALID_EMAIL');
$return->success = false;
} else {
// check if is already subscribed with this email
$query->select('COUNT('.$db->qn('id').')')->from($db->qn('#__rsfeedback_subscriptions'))->where($db->qn('feedback_id').' = '.$db->q($feedback_id))->where($db->qn('email') .' = '.$db->q($email));
$db->setQuery($query);
if ($db->loadResult()) {
// add subscriber to database
$query->clear();
$query->delete('#__rsfeedback_subscriptions')
->where($db->qn('feedback_id').' = '. $db->q($feedback_id))
->where($db->qn('email').' = '. $db->q($email));
$db->setQuery($query);
$db->execute();
$return->message = Text::_('COM_RSFEEDBACK_UNSUBSCRIBED');
$return->success = true;
} else {
$return->message = Text::_('COM_RSFEEDBACK_NOT_SUBSCRIBED');
$return->success = false;
}
}
return $return;
}
public function getFeedbackFlags($feedback_id) {
$db = Factory::getDbo();
$query = $db->getQuery(true);
$feedback_id = (int) $feedback_id;
$flags = array();
$tmp = array();
if ($feedback_id) {
$query->select('uf.*, '. $db->qn('fl.name', 'flag_name'))->from($db->qn('#__rsfeedback_user_flags').' uf')->join('left', $db->qn('#__rsfeedback_flags').' fl ON '.$db->qn('uf.flag_id').' = '.$db->qn('fl.id'))->where($db->qn('uf.feedback_id').' = '.$db->q($feedback_id));
$db->setQuery($query);
$flags = $db->loadObjectList();
foreach ($flags as $flag) {
$flag->username = !empty($flag->user_id) ? Factory::getUser($flag->user_id)->username : Text::_('COM_RSFEEDBACK_USER_ANONYMOUS');
$tmp[] = $flag;
}
$flags = $tmp;
}
return $flags;
}
//Add flags to the feedback
public function Flag() {
$db = Factory::getDbo();
$query = $db->getQuery(true);
$user = Factory::getUser();
$input = Factory::getApplication()->input;
$session = Factory::getSession();
$id = $input->get('id', 0, 'int');
$flag_id = $session->get('com_rsfeedback.flagform.flag_id', '');
$comment = $session->get('com_rsfeedback.flagform.comment', '');
$columns = array('feedback_id', 'user_id', 'flag_id', 'comment');
$values = array($db->q($id), $user->id, $db->q($flag_id), $db->q($comment));
$query->clear();
$query->insert($db->qn('#__rsfeedback_user_flags'))
->columns($columns)
->values(implode(', ', $values));
$db->setQuery($query);
return $db->execute();
}
public function DeleteFlag($flag_id) {
$msg = new stdClass();
$msg->success = false;
$permissions = RSFeedbackHelper::getPermissions();
if ( $permissions['feedback_moderate_flags'] ) {
if (!empty($flag_id)) {
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query->delete($db->qn('#__rsfeedback_user_flags'))->where($db->qn('id').' = '.$db->q($flag_id));
$db->setQuery($query);
if ($db->execute())
$msg->success = true;
else
$msg->message = Text::_('COM_RSFEEDBACK_FEEDBACK_FLAG_DELETE_ERROR');
}
} else $msg->message = Text::_('COM_RSFEEDBACK_FEEDBACK_FLAG_DELETE_PERMISSION_ERROR');
return $msg;
}
}