| 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/coopiak/amisdesseniors-fr/administrator/components/com_jlexreview/models/ |
Upload File : |
<?php
/**
* @package JLex Review
* @version 4.2.3
* @copyright Copyright (c) 2013-2018 JLexArt. All rights reserved
* @license GNU General Public License version 2 or later;
* @author www.jlexart.com
*/
defined('_JEXEC') or die;
class JLexReviewModelRating extends JModelLegacy
{
public $id = 0;
public $entry_id = 0;
public $form_id = 0;
protected $fields_type = array();
public function getRating()
{
$query = $this->_db->getQuery(true);
$query->select("r.*, entry.section_file")
->from("#__jlexreview AS r")
->innerJoin("#__jlexreview_entry AS entry ON r.entry_id=entry.id")
->where("r.id=" . $this->id);
$row = $this->_db->setQuery($query)->loadObject();
if(!$row) return null;
$row->user_type = $row->created_by>0?1:0;
$row->fields = new stdClass();
// get fields
$query->clear()
->select("*")
->from("#__jlexreview_fields")
->where("review_id=" . $row->id);
$fields = $this->_db->setQuery($query)->loadObjectList();
if($fields)
{
foreach($fields as $field)
{
$id = $field->field_id;
$row->fields->$id = $field->field_multiple==1 ? explode("|", $field->field_value) : $field->field_value;
}
}
$row->media = $this->_getMedia();
$row->params = json_decode($row->params);
return $row;
}
public function _getMedia($cid=array())
{
$app = JFactory::getApplication();
$session = JFactory::getSession();
if($this->id<1 && !count($cid)) return null;
$query = $this->_db->getQuery(true);
$query->select('*')
->from('#__jlexreview_attachment');
if(count($cid))
{
$cidSafe = [];
foreach($cid as $id)
{
if(preg_match("/^[1-9][0-9]*$/", $id)) $cidSafe[] = (int) $id;
}
if(!count($cidSafe)) return null;
$query->where('id IN('.implode(',', $cidSafe).')');
} else {
$query->where('review_id=' . $this->id);
}
$items = $this->_db->setQuery($query)->loadObjectList();
if(!$items) return null;
foreach($items as $k=>&$item)
{
$item->preview = "";
if($item->file_type=="image")
{
$url = JUri::root(true)."/".$item->path;
$thumb = JUri::root(true)."/media/jlexreview/thumb/".$item->file_name;
if($app->isClient("site"))
{
$item->preview = $thumb;
} else {
$item->preview = '<a href="'.$url.'" target="_blank"><img src="'.$thumb.'" /></a>';
}
}
$item->type = $item->file_type." (".$item->file_ext.")";
// format size
$item->size = $item->file_size;
$item->status = "_completed";
unset($item->file_type);
unset($item->file_size);
unset($item->file_ext);
unset($item->created);
unset($item->created_by);
$session->set("item_" . $item->id, true, "jreview_media");
}
return $items;
}
public function getFormEntry()
{
$query = $this->_db->getQuery(true);
$query->select("section_file")
->from("#__jlexreview_entry")
->where("id=".$this->entry_id);
$form_id = $this->_db->setQuery($query)->loadResult();
if(!$form_id)
{
throw new Exception(JText::_("JR_PAGE_NOT_FOUND"), 404);
return false;
}
return $form_id;
}
public function getForm($prefix_key="")
{
$app = JFactory::getApplication();
$user = JFactory::getUser();
if($this->form_id<1) return null;
$query = $this->_db->getQuery(true);
$query->select("params")
->from("#__jlexreview_form")
->where("id=".$this->_db->quote($this->form_id));
$params = $this->_db->setQuery($query)->loadResult();
if(!$params) return null;
$params = json_decode($params);
$config = JLexReviewHelperAdmin::getConfig();
$halfStar = $config->get("half_star",0);
$ratingRels = array();
$advanced = $app->isClient("administrator") && $config->get("u_edit_any_review",false)==true;
// build review form
$xml = '<form>';
if($user->guest)
{
$xml.= '<fieldset name="author">';
$xml.= '<field type="text" name="author_name" label="JR_AUTHOR_NAME" required="true" />';
if($config->get("email_field",1)) $xml.= '<field type="text" name="author_email" label="JR_AUTHOR_EMAIL" required="true" />';
$xml.= '</fieldset>';
}
$xml.= '<fieldset name="basic">';
if(@$params->fs_subject_field!=0)
{
$xml.= '<field type="text" name="title" label="JR_SUBJECT_FIELD" '.(in_array($config->get("emoticon", "4"), ["3", "4"])?' class="input-emoji" ':'').' hint="JR_SUBJECT_FIELD_DESC" '.($params->fs_subject_field==1?'required="true"':'').' />';
}
if(@$params->fs_summary_rating==1)
{
$xml.= '<field type="jrating"
name="rating" label="JR_SUMMARY_RATING"
max="'.$config->get("rate_max",5).'"
first="'.$config->get("rate_default",5).'"
half="'.$halfStar.'"
required="true"
validate="jrating" />';
}
$xml.= '<field type="hidden" name="id" default="0" />';
$xml.= '<field type="hidden" name="form_id" />';
// advanced fields
if($advanced)
{
$xml.= '<field type="Modal_JObject" name="entry_id" label="JR_ITEM" section_file="'.$this->form_id.'" />';
} else {
$xml.= '<field type="hidden" name="entry_id" />';
}
$xml.= '</fieldset>';
$xml.= '<fields name="fields">';
$xml.= '<fieldset name="fields">';
foreach($params->fs_data as $field)
{
// escape
$field->label = htmlspecialchars($field->label);
if (isset($field->placeholder))
{
$field->placeholder = htmlspecialchars($field->placeholder);
}
$extra = ' ratingid="0" ';
if (isset($field->rating) && $field->rating==1)
{
// rating embed
$rating = $field->rating_data;
$ratingRels[] = '<field
type="jrating"
name="'.$rating->id.'"
label="'.$field->label.'"
max="'.$rating->max.'"
first="'.$rating->default.'"
half="'.$halfStar.'"
'.($rating->require?'required="true"':'').'
style="'.$params->fs_criteria_style.'"
validate="jrating"
message="" />';
$extra = ' ratingid="'.$rating->id.'" ';
$rating->type = "rating";
$this->fields_type[$rating->id] = $rating;
}
switch ($field->type)
{
case 'textarea':
$editor_type = !isset($field->editor)||$field->editor=='0'?'textarea':'editor';
$xml.= '<field
type="'.$editor_type.'"
name="'.$field->id.'"
label="'.$field->label.'" ';
if($editor_type=='textarea')
{
$xml .= 'hint="'.htmlspecialchars($field->placeholder).'" ';
if(in_array($config->get("emoticon", "4"), ["1", "4"])) $xml.=' class="input-emoji" ';
} elseif ($editor_type=='editor' && $field->editor!='0') {
$xml.= 'editor="'.htmlspecialchars($field->editor).'" ';
$xml.= 'filter="safehtml" ';
}
if ($field->maxlength>0 || $field->minlength>0)
{
$xml.= 'validate="jtext" message="" ';
if ($field->maxlength>0)
{
$xml.= 'maxlength="'. $field->maxlength .'" ';
}
if ($field->minlength>0)
{
$xml.= 'minlength="'. $field->minlength .'" ';
}
}
$xml.= ($field->require?'required="true"':'').' '.$extra.' />';
break;
case 'text':
$xml.= '<field
type="text"
name="'.$field->id.'"
label="'.$field->label.'"
hint="'.$field->placeholder.'" ';
if(isset($field->format) && $field->format!="no")
{
$xml.= 'format="'.$field->format.'" ';
if ($field->format=="custom")
{
$xml.= 'regex="'.htmlspecialchars($field->custom_format).'" ';
}
} elseif ($config->get("emoticon", "4")=="4") {
$xml.= 'class="input-emoji" ';
}
if ($field->maxlength>0)
{
$xml.= 'maxlength="'. $field->maxlength .'" ';
}
if ($field->minlength>0)
{
$xml.= 'minlength="'. $field->minlength .'" ';
}
$xml.= 'validate="jtext" message="" ';
$xml.= ($field->require?'required="true"':'').' '.$extra.' />';
break;
case 'rating':
$xml.= '<field
type="jrating"
name="'.$field->id.'"
label="'.$field->label.'"
'.($field->require?'required="true"':'').'
max="'.$field->max.'"
first="'.$field->default.'"
half="'.$halfStar.'"
style="'.$params->fs_criteria_style.'"
validate="jrating"
message="" />';
break;
case 'select':
case 'radio':
case 'checkbox':
$options_data = preg_split("/(\r\n|\n|\r)/", $field->options);
$options = array();
foreach ($options_data as $line)
{
$line = explode("|", $line);
$options[] = '<option value="'.$line[0].'">'.$line[1].'</option>';
}
$options = implode("", $options);
$type = "list";
if ($field->type=="select")
{
$type = "list";
} elseif ($field->type=="radio") {
$type = "radio";
} elseif ($field->type=="checkbox") {
$type = "checkboxes";
}
$xml.= '<field
type="'.$type.'"
name="'.$field->id.'"
default="'.$field->default.'"
label="'.$field->label.'"
'.($field->require?'required="true"':'').' '.$extra.'>';
$xml.= $options;
$xml.= '</field>';
break;
case 'html':
$xml.= '<field
type="jhtml"
name="'.$field->id.'"
default="'.htmlspecialchars($field->html).'"
label="'.$field->label.'" />';
break;
}
$this->fields_type[$field->id] = $field;
}
// Joomla! captcha
if($app->isClient("site") && $config->get('joomla_captcha',0)==1)
{
$xml.= '<field name="captcha" type="captcha" validate="captcha" label="JR_CAPTCHA_YOU_NOT_ROBOT" />';
}
$xml.= '</fieldset>';
if (count($ratingRels))
{
$xml.= '<fieldset name="criteria">';
$xml.= implode("", $ratingRels);
$xml.= '</fieldset>';
}
$xml.= '</fields>';
// params
$xml.= '<fields name="params">';
$xml.= '<fieldset name="params">';
$xml.= '<field type="text" name="map_address" label="JR_LOCATION_ADDR" />';
$xml.= '<field type="text" name="map_lat" label="JR_LAT_COOR" />';
$xml.= '<field type="text" name="map_lng" label="JR_LONG_COOR" />';
$xml.= '<field type="text" name="map_name" label="JR_NAME" />';
$xml.= '<field type="text" name="map_icon" label="JR_ICON" />';
$xml.= '</fieldset>';
$xml.= '</fields>';
$xml.= '</form>';
$form = JForm::getInstance("jreview_item_" . $prefix_key, $xml, array('control' => 'jform'));
$form->addFieldPath(dirname(__FILE__) . "/fields");
$form->addRulePath(dirname(__FILE__) . "/rules");
if ($advanced)
{
// advanced fields
$form->loadFile(dirname(__FILE__) . "/forms/rating.xml");
if(!$config->get("email_field",1))
{
// remove email field
$form->removeField("author_email");
}
}
$form->bind(array("form_id" => $this->form_id));
return $form;
}
protected $import_index = 0;
public function save($data=null)
{
$app = JFactory::getApplication();
$session = JFactory::getSession();
$user = JFactory::getUser();
$config = JLexReviewHelperAdmin::getConfig();
$isAdmin = $app->isClient("administrator") && $config->get("u_edit_any_review",false)==true;
$sQuery = $this->_db->getQuery(true);
$data = !$data ? $app->getInput()->get("jform", null, "array") : $data;
$form_id = array_key_exists("form_id", $data)&&preg_match('/^[1-9][0-9]*$/', $data["form_id"])?intval($data["form_id"]):0;
$row = $this->getTable("Review", "TableJR");
$id = array_key_exists("id", $data)&&preg_match('/^[1-9][0-9]*$/', $data["id"])?intval($data["id"]):0;
// load item
$row->load($id);
$isNew = !$row->id>0;
if($isNew) $id=0;
// permission to post review
if($isNew && $config->get("u_post_review",false)==false)
{
$this->setError(JText::_("JR_PERMISSION_DENIED"));
return false;
}
// the guest can't edit a review
if(!$isNew && $user->guest)
{
$this->setError(JText::_("JR_PERMISSION_DENIED"));
return false;
}
// permission to edit review
if (!$isNew && $config->get("u_edit_own_review",false)==false && !$isAdmin && $row->created_by!=$user->id)
{
$this->setError(JText::_("JR_PERMISSION_DENIED"));
return false;
}
// load form
if($form_id<1)
{
$this->setError(JText::_("JR_FORM_NOT_FOUND").' - 1');
return false;
}
$this->form_id = $form_id;
$form = $this->getForm($this->import_index);
$this->import_index++;
if(!$form instanceof JForm)
{
$this->setError(JText::_("JR_FORM_NOT_FOUND").' -2');
return false;
}
// adjust admin form
if($isAdmin)
{
$user_type = array_key_exists("user_type", $data) ? $data["user_type"] : 1;
if(!$data["user_type"])
{
// make two field author_name and author_email is require.
$form->setFieldAttribute("author_name", "required", "true");
$form->setFieldAttribute("author_email", "required", "true");
$form->removeField("created_by");
} else {
// remove these fields.
$form->removeField("author_email");
$form->removeField("author_name");
$form->setFieldAttribute("created_by", "required", "true");
}
}
// restriction
if($app->isClient("site") && $config->get("u_edit_any_review",false)==false && $isNew)
{
$second = (int) $config->get("between_review_post", 30);
$ip_address = JLexReviewHelperAdmin::ip_address();
// time between post
if($second>0)
{
$sQuery->clear()
->select('MAX(created)')
->from('#__jlexreview');
if($user->guest){
$sQuery->where('ip_address='.$this->_db->quote($ip_address));
} else {
$sQuery->where('created_by='.$this->_db->quote($user->id));
}
$lastpost = $this->_db->setQuery($sQuery)->loadResult();
if($lastpost)
{
$delta = JFactory::getDate()->toUnix() - JFactory::getDate($lastpost)->toUnix();
if($delta<=$second)
{
$left_time = $second<60?JText::plural("JR_SECONDS_COUNT", $second):JText::plural("JR_MIN_COUNT", intval($second/60));
$this->setError(JText::sprintf("JR_BETWEEN_TWO_TIMES_POST", $left_time));
return false;
}
}
}
// limit post
$limit_post = (int) $config->get("review_limit_user",1)*1;
if($limit_post>0)
{
$sQuery->clear()
->select('COUNT(id)')
->from('#__jlexreview')
->where(array(
'entry_id='.$this->_db->quote(intval(@$data["entry_id"])),
$user->guest?('ip_address='.$this->_db->quote($ip_address)):('created_by='.$this->_db->quote($user->id)),
));
$count_post = $this->_db->setQuery($sQuery)->loadResult();
if($count_post>=$limit_post)
{
$this->setError(JText::sprintf("JR_YOU_POSTED_MAXIMUM_RATING_ALLOWED", $limit_post));
return false;
}
}
// check guest name
if($user->guest && $config->get("check_guest_name",1)==1)
{
$deniedNames = explode(",", $config->get("forbidden_name",""));
if (count($deniedNames) && in_array(strtolower(@$data["author_name"]), $deniedNames))
{
$this->setError(JText::_("JR_CHOOSE_ANOTHER_NAME"));
return false;
}
}
}
$data = $form->filter($data);
$return = $form->validate($data);
if($app->isClient("site") && $isNew)
{
$langset = isset($_POST['jlang']) && preg_match('/^[A-z]{2}\-[A-z]{2}$/', $_POST['jlang'])?$_POST['jlang']:null;
$data['language'] = $langset!=null?$langset:JFactory::getLanguage()->getTag();
}
if(!$isNew && $app->isClient('site') && !in_array(3, $user->getAuthorisedViewLevels()))
{
$data['modified'] = JFactory::getDate()->toSql();
if((int) $config->get('edit_after',0)>0)
{
$point_date = preg_match('/^20/', $row->get('modified'))?$row->get('modified'):$row->get('created');
$delta = JFactory::getDate()->toUnix() - JFactory::getDate($point_date)->toUnix();
if($delta<=(int) $config->get('edit_after')*60)
{
$this->setError(jtext::sprintf("JR_YOU_DONT_PERMISSION_TO_EDIT_REVIEW_AFTER_TIME", (int) $config->get('edit_after')));
return false;
}
}
}
/* plugin onBeforeSave event */
try
{
$events = JLexReviewHelperAdmin::dispatcherPlugin("onBeforeSave", array(
&$data, $isNew,
"com_jlexreview.rating.save"
), "checking");
} catch(Exception $e) {
$this->setError($e->getMessage());
return false;
}
if($return===false)
{
// Get the validation messages.
$errors = $form->getErrors();
foreach($errors as $error)
{
if ($error instanceof Exception)
{
$this->setError($error->getMessage());
} else {
$this->setError($error);
}
}
return false;
}
/* Fields system */
$fields = $data["fields"];
unset($data["fields"]);
if($isAdmin)
{
if(array_key_exists("created_by", $data))
{
$data["author_name"] = "";
$data["author_email"] = "";
} else {
$data["created_by"] = 0;
}
} else {
if($isNew)
{
$data["created_by"] = $user->id;
$data["published"] = $config->get("u_auto_publish_review",false)==false?0:1;
}
}
/* Other parameters */
if(array_key_exists("params", $data) && is_array($data["params"]))
{
$data["params"] = json_encode($data["params"]);
}
/* Format rating match */
if(isset($data["rating"]) && $data["rating"]>0)
{
if($config->get("half_star",1)==1)
{
$ratingRound = round($data["rating"]*2)/2;
if ($ratingRound<0.5)
{
$ratingRound = 0.5;
}
} else {
$ratingRound = round($data["rating"]);
if ($ratingRound<1)
{
$ratingRound = 1;
}
}
$data["rating"] = $ratingRound;
}
$row->bind($data);
if(!$row->check())
{
$this->setError($row->getError());
return false;
}
if(!$row->store())
{
$this->setError($row->getError());
//$this->setError("An error appear when saving.");
return false;
}
/* save fields */
$summary_caption = array_key_exists('title', $data)?$data['title']:'';
$ratingPoint = 0;
$ratingTotal = 0;
$isVoting = true;
$fieldCid = [];
foreach ($fields as $key => $field)
{
$fieldMeta = $this->fields_type[$key];
$fieldrow = $this->getTable("Field", "TableJR");
$fieldrow->load(array(
"review_id" => $row->id,
"field_id" => $key
));
if (!$fieldrow->id)
{
$fieldrow->set("review_id", $row->id);
$fieldrow->set("field_id", $key);
}
$fieldrow->set("entry_id", $row->entry_id);
$fieldrow->set("field_value", is_array($field)?implode("|", $field):$field);
$fieldrow->set("field_multiple", is_array($field)?"1":"0");
$fieldrow->set("field_type", $fieldMeta->type);
if($fieldrow->store())
{
switch ($fieldMeta->type)
{
case "rating":
if ($field>0)
{
$ratingPoint+= intval($field);
$ratingTotal+= $fieldMeta->max;
}
break;
case "textarea":
case "text":
if (!preg_match("/^\s*$/", $field))
{
$isVoting = false;
if(@$fieldMeta->hidden==0 && (empty($summary_caption) || preg_match("/^\s*$/", $summary_caption)))
{
//$summary_caption = JLexReviewHelperAdmin::subwords($field);
}
}
break;
}
$fieldCid[] = $fieldrow->id;
}
}
if (!isset($data["rating"]) && $ratingTotal>0)
{
if ($ratingTotal>0)
{
$ratingSummary = ($ratingPoint/$ratingTotal)*$config->get("rate_max",5);
if ($config->get("half_star",0)==1)
{
$ratingRound = round($ratingSummary*2)/2;
if ($ratingRound<0.5)
{
$ratingRound = 0.5;
}
} else {
$ratingRound = round($ratingSummary);
if ($ratingRound<1)
{
$ratingRound = 1;
}
}
} else {
$ratingRound = 0;
}
$data["rating"] = $ratingRound;
// update rating
$sQuery->clear()
->update("#__jlexreview")
->set("rating=".$this->_db->quote($ratingRound))
->where("id=".$this->_db->quote($row->id));
$this->_db->setQuery($sQuery)->execute();
}
if($isVoting==true)
{
$sQuery->clear()
->update("#__jlexreview")
->set("voting=1")
->where("id=".$this->_db->quote($row->id));
$this->_db->setQuery($sQuery)->execute();
} else {
// (empty($row->title) || preg_match("/^\s*$/", $row->title)) &&
if(!preg_match("/^\s*$/",$summary_caption))
{
$row->title = $summary_caption;
$sQuery->clear()
->update("#__jlexreview")
->set("title=".$this->_db->quote($summary_caption))
->where("id=".$this->_db->quote($row->id));
$this->_db->setQuery($sQuery)->execute();
}
}
/* File attachment */
$media_cid = $app->getInput()->get("media_cid", null, "array");
$media_cid_safe = array();
// reset media
$sQuery->clear()
->update("#__jlexreview_attachment")
->set([
"review_id=0",
"entry_id=0"
])
->where([
"review_id=".$this->_db->quote($row->id),
"entry_id=".$this->_db->quote($row->entry_id)
]);
$this->_db->setQuery($sQuery)->execute();
if(!empty($media_cid) && is_array($media_cid))
{
foreach ($media_cid as $mid)
{
$permission = $session->get("item_" . $mid, false, "jreview_media");
if ($permission==true)
{
$media_cid_safe[] = $mid;
$session->clear("item_" . $mid, "jreview_media");
}
}
if(count($media_cid_safe))
{
$sQuery->clear()
->update("#__jlexreview_attachment")
->set([
"review_id=".$this->_db->quote($row->id),
"entry_id=".$this->_db->quote($row->entry_id)
])
->where("id IN(".implode(",", $media_cid_safe).")");
$this->_db->setQuery($sQuery)->execute();
}
}
/* Update entry statistic */
JLexReviewHelperAdmin::updateReviewParams($row->id);
JLexReviewHelperAdmin::updateUserParams($row->created_by);
JLexReviewHelperAdmin::updateEntryParams($row->entry_id);
/* Admin notification */
if($app->isClient("site") && $config->get("admin_alert",1)==1)
{
$alertTable = $this->getTable("notification", "TableJR");
$alertData = array(
"entry_id" => $row->entry_id,
"type_id" => $row->id,
"created_time" => JFactory::getDate()->toSql(),
"created_by" => $row->created_by,
"guest_name" => $row->author_name,
"action_type" => $isNew ? "REVIEW_ADDED" : "REVIEW_MODIFIED"
);
$alertRatingStatus = $config->get("admin_alert_review","both");
if($alertRatingStatus=="both" || ($alertRatingStatus=="added" && $isNew) || ($alertRatingStatus=="modified" && !$isNew && $row->published==1))
{
$alertTable->bind($alertData);
$alertTable->store();
$alertTable->alert();
}
}
/* User notification & Thanks email! */
if($app->isClient("site") && $isNew && $config->get('thanks_email',0)==1)
{
$eOptions = array(
'email' => $row->author_email,
'name' => $row->author_name,
'id' => $row->id,
'caption' => JText::_('JR_EMAIL_THANKS_TO_USER_CAPTION'),
);
$sQuery->clear()
->select('*')
->from('#__jlexreview_entry')
->where('id=' . $row->entry_id);
$eOptions['entry'] = $this->_db->setQuery($sQuery)->loadObject();
if($eOptions['entry'])
{
if($config->get("link_type",0)=="1")
{
$up = JLexReviewHelperAdmin::getItemDetail($eOptions['entry']->object, $eOptions['entry']->object_id, $eOptions['entry']->object_name, $eOptions['entry']->url);
$eOptions['entry']->url = $up->url;
$eOptions['entry']->object_name = $up->title;
} else {
$eOptions['entry']->url = urldecode($eOptions['entry']->url);
}
$eOptions['entry']->url = trim($eOptions['entry']->url, '/');
$eOptions['entry']->url = preg_match("/^https?:\/\//", $eOptions['entry']->url) ? $eOptions['entry']->url : JUri::root() . $eOptions['entry']->url;
}
if($row->created_by>0)
{
$tmpUser = JFactory::getUser($row->created_by);
$eOptions['email'] = $tmpUser->email;
$eOptions['name'] = $tmpUser->name;
$eOptions['username'] = $tmpUser->username;
}
JLexReviewHelperAdmin::getAlert()->freeSend($eOptions['email'], 'thanks', $eOptions);
}
/* plugin onAfterSave event */
try
{
$events = JLexReviewHelperAdmin::dispatcherPlugin("onAfterSave", array(
$row, $isNew,
"com_jlexreview.rating.save"
), "checking");
JPluginHelper::importPlugin("finder");
JFactory::getApplication()->triggerEvent('onFinderAfterSave', ['com_jlexreview.review', $row, $isNew]);
} catch(Exception $e) {
$this->setError($e->getMessage());
return false;
}
/* clear cache */
if($config->get("cache",1)==0) JLexReviewHelperAdmin::clear_cache();
if($isNew) $session->set('jreview_id_passed', $row->id);
return $row->id;
}
protected $login_action = 0;
public $edit_quick_rating = false;
public function rating($obj, $obj_id, $score=5, $section_id=0, $name='', $url='')
{
$app = JFactory::getApplication();
$session = JFactory::getSession();
$user = JFactory::getUser();
$config = JLexReviewHelperAdmin::getConfig();
$query = $this->_db->getQuery(true);
if($app->isClient("administrator"))
{
$this->setError('FRONT-END ONLY');
return false;
}
// permission to post review
if($config->get("u_post_review",false)==false)
{
$this->setError(jtext::_($user->guest?'JR_YOU_MUST_LOGIN_TO_VOTE':'JR_PERMISSION_DENIED'));
if($user->guest)
$this->login_action = 1;
return false;
}
// find entry id
$itemConfig = new stdClass();
$itemConfig->object = $obj;
$itemConfig->object_id = $obj_id;
$itemConfig->name = $name;
$itemConfig->url = $url;
$itemConfig->section_id = $section_id;
JModelLegacy::addIncludePath(JPATH_SITE.'/components/com_jlexreview/models');
$modelHelper = JModelLegacy::getInstance('reviews', 'JLexReviewModel');
$modelHelper->set('itemConfig', $itemConfig);
$entry = $modelHelper->getItem();
if(!$entry)
{
$this->setError('Item not found!');
return false;
}
$entry_id = $entry->id;
// restriction
$second = (int) $config->get("between_review_post", 30);
$ip_address = JLexReviewHelperAdmin::ip_address();
// time between post
if($second>0)
{
$query->clear()
->select('MAX(created)')
->from('#__jlexreview');
if($user->guest){
$query->where('ip_address='.$this->_db->quote($ip_address));
} else {
$query->where('created_by='.$this->_db->quote($user->id));
}
$lastpost = $this->_db->setQuery($query)->loadResult();
if($lastpost)
{
$delta = JFactory::getDate()->toUnix() - JFactory::getDate($lastpost)->toUnix();
if($delta<=$second)
{
$left_time = $second<60?JText::sprintf("JR_SECONDS_COUNT", $second):JText::sprintf("JR_MIN_COUNT", intval($second/60));
$this->setError(JText::sprintf("JR_BETWEEN_TWO_TIMES_POST", $left_time));
return false;
}
}
}
// limit post
$limit_post = (int) $config->get("review_limit_user",1)*1;
if($limit_post>0)
{
$query->clear()
->select('COUNT(id)')
->from('#__jlexreview')
->where(array(
'entry_id='.$this->_db->quote($entry_id),
$user->guest?('ip_address='.$this->_db->quote($ip_address)):('created_by='.$this->_db->quote($user->id)),
));
$count_post = $this->_db->setQuery($query)->loadResult();
if($count_post>=$limit_post)
{
$this->setError(JText::sprintf("JR_YOU_POSTED_MAXIMUM_RATING_ALLOWED", $limit_post));
return false;
}
}
//plugin events
try {
$events = JLexReviewHelperAdmin::dispatcherPlugin("onBeforeSave", array(
&$data, true,
"com_jlexreview.rating.save"
), "checking");
} catch(Exception $e){};
$row = $this->getTable("Review", "TableJR");
$data = [
'entry_id' => $entry_id,
'title' => '.',
'created' => JFactory::getDate()->toSql(),
'ip_address' => $ip_address,
'featured' => 0,
'count_cm' => 0,
'count_help' => 0,
'count_unhelp' => 0,
'count_media' => 0,
'language' => '*',
'params' => '{}',
'published' => 1
];
if($section_id>0) $data["section_id"] = $section_id;
if($user->guest)
{
$data["author_name"] = "";
$data["author_email"] = "";
$data["created_by"] = 0;
} else {
$data["created_by"] = $user->id;
}
if($config->get("half_star",1)==1)
{
$score = round($score*2)/2;
if($score<0.5) $score=0.5;
} else {
$score = round($score);
if($score<1) $score=1;
}
if($score<=0 || $score>1*$config->get('rate_max', 5))
{
$this->setError(jtext::_('JR_PERMISSION_DENIED'));
return false;
}
$data["rating"] = $score;
$data["voting"] = 1;
$row->bind($data);
if(!$row->check())
{
$this->setError($row->getError());
return false;
}
if(!$row->store())
{
$this->setError($row->getError());
return false;
}
/* Update entry statistic */
JLexReviewHelperAdmin::updateReviewParams($row->id);
if(!$user->guest) JLexReviewHelperAdmin::updateUserParams($user->id);
JLexReviewHelperAdmin::updateEntryParams($row->entry_id);
// plugin event onAfterSave
try {
$events = JLexReviewHelperAdmin::dispatcherPlugin("onAfterSave", array(
$row, true,
"com_jlexreview.rating.save"
), "checking");
} catch(Exception $e){};
//$session->set('jreview_id_passed', $row->id);
// get item info
$query->clear()
->select('rating, count_rating, count_review')
->from('#__jlexreview_entry')
->where('id='.$this->_db->quote($entry_id));
$return = $this->_db->setQuery($query)->loadObject();
return $return;
}
public function unvote($obj, $obj_id)
{
$app = JFactory::getApplication();
$session = JFactory::getSession();
$user = JFactory::getUser();
$config = JLexReviewHelperAdmin::getConfig();
$query = $this->_db->getQuery(true);
$ip_address = JLexReviewHelperAdmin::ip_address();
if($app->isClient("administrator"))
{
$this->setError('FRONT-END ONLY');
return false;
}
// permission to post review
if(!$config->get("quick_rate_change",0))
{
$this->setError('JR_PERMISSION_DENIED');
return false;
}
// check item exist
$query->clear()
->select("id")
->from("#__jlexreview_entry")
->where([
"object=".$this->_db->quote($obj),
"object_id=".$this->_db->quote($obj_id)
]);
$entryId = $this->_db->setQuery($query)->loadResult();
if(!$entryId)
{
$this->setError('Not Found.');
return false;
}
// check rating
$wClauses = [
"entry_id=".$this->_db->quote($entryId),
$user->guest?("ip_address=".$this->_db->quote($ip_address)):("created_by=".$this->_db->quote($user->id)),
"voting=1"
];
$query->clear()
->select("id")
->from("#__jlexreview")
->where($wClauses);
$votingId = $this->_db->setQuery($query)->loadResult();
if(!$votingId)
{
$this->setError('Not Found.');
return false;
}
$query->clear()
->delete("#__jlexreview")
->where($wClauses);
$this->_db->setQuery($query)->execute();
/* Update entry statistic */
if(!$user->guest) JLexReviewHelperAdmin::updateUserParams($user->id);
JLexReviewHelperAdmin::updateEntryParams($entryId);
// get item info
$query->clear()
->select('rating, count_rating, count_review')
->from('#__jlexreview_entry')
->where('id='.$this->_db->quote($entryId));
$return = $this->_db->setQuery($query)->loadObject();
return $return;
}
public function needLogin()
{
return $this->login_action;
}
public function update_rate_point($id, $value)
{
$config = JLexReviewHelperAdmin::getConfig();
$half = $config->get("half_star", 0)==1;
$max = (int) $config->get("rate_max", 5);
if($value>$max)
{
$this->setError(jtext::sprintf("JR_UPDATE_RATE_ERROR_1", $max));
return false;
}
if($half && ($value<0.5 || (10*$value)%5!=0))
{
$this->setError(jtext::_("JR_UPDATE_RATE_ERROR_2"));
return false;
}
if(!$half && $value<1)
{
$this->setError(jtext::_("JR_UPDATE_RATE_ERROR_3"));
return false;
}
$query = $this->_db->getQuery(true);
$query->select("*")
->from("#__jlexreview")
->where("id=".$this->_db->quote($id));
$item = $this->_db->setQuery($query)->loadObject();
if(!$item)
{
$this->setError(jtext::_("JR_UPDATE_RATE_ERROR_4"));
return false;
}
$query->clear()
->update("#__jlexreview")
->set("rating=".$this->_db->quote($value))
->where("id=".$this->_db->quote($id));
$this->_db->setQuery($query)->execute();
JLexReviewHelperAdmin::updateEntryParams($item->entry_id);
return true;
}
public function preview($id)
{
$query = $this->_db->getQuery(true);
$query->select("r.title, e.section_file")
->from("#__jlexreview r")
->leftJoin("#__jlexreview_entry e ON r.entry_id=e.id")
->where([
"e.id IS NOT NULL",
"r.id=".$this->_db->quote($id)
]);
$row = $this->_db->setQuery($query)->loadObject();
if(!$row)
{
$this->setError("Item not found.");
return false;
}
// get form
$query->clear()
->select("params")
->from("#__jlexreview_form")
->where("id=".$this->_db->quote($row->section_file));
$form = $this->_db->setQuery($query)->loadResult();
if(!$form)
{
$this->setError("Form not found.");
return false;
}
// get fields
$query->clear()
->select("*")
->from("#__jlexreview_fields")
->where("review_id=".$this->_db->quote($id));
$fields = $this->_db->setQuery($query)->loadObjectList();
if(!$fields)
{
return "No preview";
}
$output = [];
foreach($fields as $field)
{
$output[$field->field_id] = $field;
}
// process
$form = json_decode($form);
$html = "";
foreach($form->fs_data as $field)
{
$html.='<div class="jr-field-group">';
$html.='<div class="jr-field-label">'.$field->label.'</div>';
$html.='<div class="jr-field-value">';
if(array_key_exists($field->id, $output))
{
$value = $output[$field->id];
// found
if($field->rating==1 && array_key_exists($field->rating_data->id, $output))
{
$html.='<div class="jr-field-rating">';
$html.=$output[$field->rating_data->id]->field_value.'/'.$field->rating_data->max;
$html.='</div>';
}
switch($field->type)
{
case "textarea":
case "text":
$html.=$value->field_value;
break;
case "checkbox":
case "select":
case "radio":
$lines = explode("\n", $field->options);
$vs=[];
foreach($lines as $line)
{
if(preg_match("/^\s*$/", $line)) continue;
$o_parse = explode("|", $line);
$vs[$o_parse[0]]=$o_parse[1];
}
$ls = explode("|", $value->field_value);
$ls1 = [];
foreach($ls as $i)
{
$ls1[]=$vs[$i];
}
$html.=implode(', ', $ls1);
break;
case "rating":
$html.=$value->field_value.'/'.$field->max;
break;
}
} else {
$html.='n/a';
}
$html.='</div>';
$html.='</div>';
}
return $html;
}
}