AnonSec Shell
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 :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ HOME ]     

Current File : /home/coopiak/amisdesseniors-fr/administrator/components/com_jlexreview/models/rating.php
<?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;
	}
}

Anon7 - 2022
AnonSec Team