1613 lines
		
	
	
		
			48 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			1613 lines
		
	
	
		
			48 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
| <?php
 | ||
| 
 | ||
| if (!function_exists('isAjax'))
 | ||
| {
 | ||
| 	function isAjax()
 | ||
| 	{
 | ||
| 		return (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && (strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'));
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| /**
 | ||
|  * Модуль "Контакты New"
 | ||
|  *
 | ||
|  * @package AVE.cms
 | ||
|  * @subpackage module: ContactsNew
 | ||
|  * @since 1.4
 | ||
|  * @author vudaltsov UPD Repellent
 | ||
|  * @filesource
 | ||
|  */
 | ||
| 
 | ||
| class ContactsNew
 | ||
| {
 | ||
| 
 | ||
| /**
 | ||
|  *	Свойства класса
 | ||
|  */
 | ||
| 
 | ||
| 	// папка с шаблонами
 | ||
| 	public $tpl_dir;
 | ||
| 	// основные поля
 | ||
| 	public $fields_main = array();
 | ||
| 	public $fields_main_in_string = array();
 | ||
| 	public $fields_main_data = array(
 | ||
| 		'email' => array(
 | ||
| 			'new'		=> true,
 | ||
| 			'title'		=> 'email',
 | ||
| 			'type'		=> 'input',
 | ||
| 			'main'		=> 1,
 | ||
| 			'setting'	=> 'FILTER_VALIDATE_EMAIL',
 | ||
| 			'required'	=> 1
 | ||
| 		),
 | ||
| 		'subject' => array(
 | ||
| 			'new'		=> true,
 | ||
| 			'title'		=> 'subject',
 | ||
| 			'type'		=> 'input',
 | ||
| 			'main'		=> 1
 | ||
| 		),
 | ||
| 		'receivers' => array(
 | ||
| 			'new'		=> true,
 | ||
| 			'title'		=> 'receivers',
 | ||
| 			'type'		=> 'select',
 | ||
| 			'main'		=> 1,
 | ||
| 			'setting'	=> array()
 | ||
| 		),
 | ||
| 		'copy' => array(
 | ||
| 			'new'		=> true,
 | ||
| 			'title'		=> 'copy',
 | ||
| 			'type'		=> 'checkbox',
 | ||
| 			'main'		=> 1
 | ||
| 		),
 | ||
| 		'captcha' => array(
 | ||
| 			'new'		=> true,
 | ||
| 			'title'		=> 'captcha',
 | ||
| 			'type'		=> 'input',
 | ||
| 			'main'		=> 1,
 | ||
| 			'required'	=> 1
 | ||
| 		)
 | ||
| 	);
 | ||
| 	// переменная для хранения формы
 | ||
| 	public $form = array();
 | ||
| 
 | ||
| /**
 | ||
|  *	Внутренние методы класса
 | ||
|  */
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Конструктор
 | ||
| 	 */
 | ||
| 	function __construct ()
 | ||
| 	{
 | ||
| 		$this->fields_main = array_keys($this->fields_main_data);
 | ||
| 		$this->fields_main_in_string = "'" . implode("','",$this->fields_main) . "'";
 | ||
| 	}
 | ||
| 
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Возвращаем JSON
 | ||
| 	 */
 | ||
| 	function _json($data, $exit = false)
 | ||
| 	{
 | ||
| 		header("Content-Type: application/json;charset=utf-8");
 | ||
| 
 | ||
| 		$json = json_encode($data);
 | ||
| 
 | ||
| 		if ($json === false)
 | ||
| 		{
 | ||
| 			$json = json_encode(array("jsonError", json_last_error_msg()));
 | ||
| 
 | ||
| 			if ($json === false)
 | ||
| 			{
 | ||
| 				$json = '{"jsonError": "unknown"}';
 | ||
| 			}
 | ||
| 
 | ||
| 			http_response_code(500);
 | ||
| 		}
 | ||
| 
 | ||
| 		echo $json;
 | ||
| 
 | ||
| 		if ($exit)
 | ||
| 			exit;
 | ||
| 	}
 | ||
| 
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Метод забирает форму из бд по алиасу/id
 | ||
| 	 */
 | ||
| 	function _form ($alias_id, $_fields = true)
 | ||
| 	{
 | ||
| 		global $AVE_DB, $AVE_Template;
 | ||
| 
 | ||
| 		// иначе забираем из бд форму
 | ||
| 		$form = array();
 | ||
| 
 | ||
| 		// основные параметры
 | ||
| 		$form = $AVE_DB->Query("
 | ||
| 			SELECT * FROM " . PREFIX . "_module_contactsnew_forms
 | ||
| 			WHERE
 | ||
| 				" . (is_numeric($alias_id) ? 'id' : 'alias') . " = '" . $alias_id . "'
 | ||
| 		")->FetchAssocArray();
 | ||
| 
 | ||
| 		// если форма не обнаружена, выходим
 | ||
| 		if (empty($form))
 | ||
| 			return array();
 | ||
| 
 | ||
| 		$form['alias_id'] = $alias_id;
 | ||
| 
 | ||
| 		// получатели
 | ||
| 		$form['mail_set'] = unserialize($form['mail_set']);
 | ||
| 
 | ||
| 		if ($_fields === true)
 | ||
| 		{
 | ||
| 			// поля
 | ||
| 			$sql = $AVE_DB->Query("
 | ||
| 				SELECT * FROM " . PREFIX . "_module_contactsnew_fields
 | ||
| 				WHERE form_id = '" . $form['id'] . "'
 | ||
| 				ORDER BY id ASC
 | ||
| 			");
 | ||
| 
 | ||
| 			$form['fields'] = array();
 | ||
| 
 | ||
| 			while ($field = $sql->FetchAssocArray())
 | ||
| 			{
 | ||
| 				// раскрываем массив настроек для селектов
 | ||
| 				if (in_array($field['type'],array('select','multiselect','doc','multidoc')))
 | ||
| 				{
 | ||
| 					// @fix для v1.0 beta <= 2: поддержка одной рубрики, не массива
 | ||
| 					if (in_array($field['type'],array('doc','multidoc')) && !empty($field['setting']) && is_numeric($field['setting']))
 | ||
| 						$field['setting'] = array(0 => $field['setting']);
 | ||
| 					else
 | ||
| 						$field['setting'] = unserialize($field['setting']) !== false ? unserialize($field['setting']) : array();
 | ||
| 				}
 | ||
| 				// если тип поля поменялся, ставим пустую строку
 | ||
| 				elseif (unserialize($field['setting']) !== false) $field['setting'] = '';
 | ||
| 
 | ||
| 				// раскрываем массив опций по умолчанию для мультиселекта
 | ||
| 				if ($field['type'] == 'multiselect')
 | ||
| 				{
 | ||
| 					$field['defaultval'] = unserialize($field['defaultval']) !== false ? unserialize($field['defaultval']) : array();
 | ||
| 				}
 | ||
| 				// если тип поля поменялся, ставим пустую строку
 | ||
| 				elseif (unserialize($field['defaultval']) !== false) $field['defaultval'] = '';
 | ||
| 
 | ||
| 				// главные поля
 | ||
| 				if (in_array($field['title'],$this->fields_main) && $field['main'])
 | ||
| 				{
 | ||
| 					$form['fields_main'][$field['title']] = $field['id'];
 | ||
| 					$field['title_lang'] = $AVE_Template->get_config_vars('mfld_' . $field['title']);
 | ||
| 				}
 | ||
| 
 | ||
| 				$form['fields'][$field['id']] = $field;
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		// убираем слеши
 | ||
| 		$form = $this->_stripslashes($form);
 | ||
| 
 | ||
| 		// сохраняем форму в переменную класса
 | ||
| 		$this->form = $form;
 | ||
| 
 | ||
| 		return $form;
 | ||
| 	}
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Метод убирает слэши во всей переменной
 | ||
| 	 */
 | ||
| 	function _stripslashes($var)
 | ||
| 	{
 | ||
| 		if (! is_array($var))
 | ||
| 			return stripslashes($var);
 | ||
| 		else
 | ||
| 			return array_map(array($this, '_stripslashes'), $var);
 | ||
| 	}
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Метод тримует всю переменную
 | ||
| 	 */
 | ||
| 	function _trim($var)
 | ||
| 	{
 | ||
| 		if (! is_array($var))
 | ||
| 			return trim($var);
 | ||
| 		else
 | ||
| 			return array_map(array($this, '_trim'), $var);
 | ||
| 	}
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Метод чистит переменную от пустых значений и массивов
 | ||
| 	 */
 | ||
| 	function _cleanvar($var)
 | ||
| 	{
 | ||
| 		if (! is_array($var))
 | ||
| 			return trim($var) > ''
 | ||
| 				? trim($var)
 | ||
| 				: null;
 | ||
| 
 | ||
| 		$narr = array();
 | ||
| 
 | ||
| 		while(list($key, $val) = each($var))
 | ||
| 		{
 | ||
| 			if (is_array($val))
 | ||
| 			{
 | ||
| 				$val = _cleanvar($val);
 | ||
| 
 | ||
| 				if (count($val) > 0)
 | ||
| 					$narr[$key] = $val;
 | ||
| 			}
 | ||
| 			else
 | ||
| 			{
 | ||
| 				if (trim($val) > '')
 | ||
| 					$narr[$key] = $val;
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		unset ($var);
 | ||
| 
 | ||
| 		return $narr;
 | ||
| 	}
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Валидация Email-а
 | ||
| 	 */
 | ||
| 	function _email_validate ($email = '')
 | ||
| 	{
 | ||
| 		return (filter_var($email, FILTER_VALIDATE_EMAIL) === false ? false : true);
 | ||
| 	}
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Проверка алиаса тега на валидность и уникальность
 | ||
| 	 */
 | ||
| 	function _alias_validate ($alias = '', $fid = 0)
 | ||
| 	{
 | ||
| 		global $AVE_DB;
 | ||
| 
 | ||
| 		// соответствие требованиям
 | ||
| 		if (
 | ||
| 			empty ($alias) ||
 | ||
| 			preg_match('/^[A-Za-z0-9-_]{1,20}$/i', $alias) !== 1 ||
 | ||
| 			is_numeric($alias)
 | ||
| 		) return 'syn';
 | ||
| 
 | ||
| 		// уникальность
 | ||
| 		return !(bool)$AVE_DB->Query("
 | ||
| 			SELECT 1 FROM " . PREFIX . "_module_contactsnew_forms
 | ||
| 			WHERE
 | ||
| 				alias	= '" . $alias . "' AND
 | ||
| 				id		!= '" . $fid . "'
 | ||
| 		")->GetCell();
 | ||
| 	}
 | ||
| 
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Получение списка рубрик
 | ||
| 	 */
 | ||
| 	function _rubrics ()
 | ||
| 	{
 | ||
| 		global $AVE_DB;
 | ||
| 
 | ||
| 		$rubs = array();
 | ||
| 
 | ||
| 		$sql = $AVE_DB->Query("
 | ||
| 			SELECT Id, rubric_title FROM " . PREFIX . "_rubrics
 | ||
| 		");
 | ||
| 
 | ||
| 		while ($rub = $sql->FetchAssocArray())
 | ||
| 			$rubs[$rub['Id']] = $rub['rubric_title'];
 | ||
| 
 | ||
| 		return $rubs;
 | ||
| 	}
 | ||
| 
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Получение списка документов
 | ||
| 	 */
 | ||
| 	function _docs ($rubs_id = array())
 | ||
| 	{
 | ||
| 		global $AVE_DB;
 | ||
| 
 | ||
| 		if (empty($rubs_id))
 | ||
| 			return array();
 | ||
| 
 | ||
| 		// @fix для v1.0 beta <= 2: поддержка одной рубрики, не массива
 | ||
| 		if (! is_array($rubs_id))
 | ||
| 			$rubs_id = array(0 => $rubs_id);
 | ||
| 
 | ||
| 		$docs = array();
 | ||
| 
 | ||
| 		$sql = $AVE_DB->Query("
 | ||
| 			SELECT Id, document_title FROM " . PREFIX . "_documents
 | ||
| 			WHERE rubric_id IN (" . implode(',',$rubs_id) . ")
 | ||
| 		");
 | ||
| 
 | ||
| 		while ($doc = $sql->FetchAssocArray())
 | ||
| 			$docs[$doc['Id']] = $doc['document_title'];
 | ||
| 
 | ||
| 		return $docs;
 | ||
| 	}
 | ||
| 
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Парсинг главных тегов
 | ||
| 	 */
 | ||
| 	function _parse_tags ($str)
 | ||
| 	{
 | ||
| 		global $AVE_Core, $AVE_DB;
 | ||
| 
 | ||
| 		if (empty($_SESSION['user_login']))
 | ||
| 			$_SESSION['user_login'] = (UGROUP != 2)
 | ||
| 				? $AVE_DB->Query("SELECT user_name FROM " . PREFIX . "_users WHERE Id = '" . UID . "'")->GetCell()
 | ||
| 				: '';
 | ||
| 
 | ||
| 		$str = preg_replace_callback('/\[tag:(css|js):([^ :\/]+):?(\S+)*\]/', array($AVE_Core, '_parse_combine'), $str);
 | ||
| 
 | ||
| 		$str = parse_hide($str);
 | ||
| 
 | ||
| 		return str_replace(array(
 | ||
| 				'[tag:docid]',
 | ||
| 				'[tag:formtitle]',
 | ||
| 				// @fix для v1.0 beta <= 2: поддержка тега formaction
 | ||
| 				'[tag:formaction]',
 | ||
| 				'[tag:document]',
 | ||
| 				'[tag:formalias]',
 | ||
| 				'[tag:path]',
 | ||
| 				'[tag:mediapath]',
 | ||
| 				'[tag:captcha]',
 | ||
| 				'[tag:uname]',
 | ||
| 				'[tag:ufname]',
 | ||
| 				'[tag:ulname]',
 | ||
| 				'[tag:ulogin]',
 | ||
| 				'[tag:uemail]',
 | ||
| 				'[tag:sitename]',
 | ||
| 				'[tag:sitehost]',
 | ||
| 			),array(
 | ||
| 				$AVE_Core->curentdoc->Id,
 | ||
| 				$this->form['title'],
 | ||
| 				$_SERVER['REQUEST_URI'],
 | ||
| 				$_SERVER['REQUEST_URI'],
 | ||
| 				$this->form['alias'] ? $this->form['alias'] : $this->form['id'],
 | ||
| 				ABS_PATH,
 | ||
| 				ABS_PATH . 'templates/' . THEME_FOLDER . '/',
 | ||
| 				'inc/captcha.php',
 | ||
| 				$_SESSION['user_name'],
 | ||
| 				get_user_rec_by_id(UID)->firstname,
 | ||
| 				get_user_rec_by_id(UID)->lastname,
 | ||
| 				$_SESSION['user_login'],
 | ||
| 				$_SESSION['user_email'],
 | ||
| 				htmlspecialchars(get_settings('site_name'), ENT_QUOTES),
 | ||
| 				$_SERVER['HTTP_HOST'],
 | ||
| 		), $str);
 | ||
| 	}
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Внутренний PHP-парсер
 | ||
| 	 */
 | ||
| 	function _eval2var($code)
 | ||
| 	{
 | ||
| 		global $AVE_DB, $AVE_Core, $AVE_Template;
 | ||
| 
 | ||
| 		ob_start();
 | ||
| 
 | ||
| 		eval($code);
 | ||
| 
 | ||
| 		return ob_get_clean();
 | ||
| 	}
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Приведение тегов главных полей к стандартной форме
 | ||
| 	 */
 | ||
| 	function _parse_tag_fld_main ($tpl='', $save_is=false)
 | ||
| 	{
 | ||
| 		foreach ($this->fields_main as $field_title)
 | ||
| 		{
 | ||
| 			$count = 0;
 | ||
| 
 | ||
| 			$tpl = str_replace(array(
 | ||
| 				'[tag:fld:' . $field_title . ']',
 | ||
| 				'[tag:if_fld:' . $field_title,
 | ||
| 				'[tag:elseif_fld:' . $field_title,
 | ||
| 			), array(
 | ||
| 				'[tag:fld:' . $this->form['fields_main'][$field_title] . ']',
 | ||
| 				'[tag:if_fld:' . $this->form['fields_main'][$field_title],
 | ||
| 				'[tag:elseif_fld:' . $this->form['fields_main'][$field_title],
 | ||
| 			),$tpl,$count);
 | ||
| 
 | ||
| 			if ($save_is)
 | ||
| 				$this->form['is_' . $field_title] = $count > 0 ? true : false;
 | ||
| 		}
 | ||
| 
 | ||
| 		return $tpl;
 | ||
| 	}
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Замена тега условия
 | ||
| 	 */
 | ||
| 	function _parse_tag_if (&$tpl,$tag='',$open = true)
 | ||
| 	{
 | ||
| 		if ($open)
 | ||
| 			$tpl = str_replace(array('[tag:' . $tag . ']','[/tag:' . $tag . ']'),'',$tpl);
 | ||
| 		else
 | ||
| 			$tpl = preg_replace('/\[tag:' . $tag . '](.*?)\[\/tag:' . $tag . ']/si','',$tpl);
 | ||
| 	}
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Замена тега названия поля
 | ||
| 	 */
 | ||
| 	function _parse_tag_title ($matches)
 | ||
| 	{
 | ||
| 		$field_id = $matches[1];
 | ||
| 
 | ||
| 		return !$this->form['fields'][$field_id]['main']
 | ||
| 			? $this->form['fields'][$field_id]['title']
 | ||
| 			: $this->form['fields'][$field_id]['title_lang'];
 | ||
| 	}
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Замена тега поля на значение $_POST
 | ||
| 	 */
 | ||
| 	function _parse_tag_fld_post ($matches)
 | ||
| 	{
 | ||
| 		return $_POST['form-' . $this->form['alias_id']][$matches[1]];
 | ||
| 	}
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Замена тега поля при выводе формы
 | ||
| 	 */
 | ||
| 	function _parse_tag_fld_form ($matches)
 | ||
| 	{
 | ||
| 		$field_id = (int)$matches[1];
 | ||
| 
 | ||
| 		// забираем массив поля
 | ||
| 		$field = $this->form['fields'][$field_id];
 | ||
| 
 | ||
| 		// если поля нет, возвращаем тег обратно
 | ||
| 		if (empty($field))
 | ||
| 			return $matches[0];
 | ||
| 
 | ||
| 		// если поле выключено, возвращаем пустую строку
 | ||
| 		if (empty($field['active']))
 | ||
| 			return '';
 | ||
| 
 | ||
| 		$alias_id = $this->form['alias_id'];
 | ||
| 
 | ||
| 		$fld_val = $this->form['is_submited']
 | ||
| 			? $this->_stripslashes($_POST['form-' . $alias_id][$field_id])
 | ||
| 			: (in_array($field['type'],array('input','textarea'))
 | ||
| 				? $this->_eval2var('?>' . $field['defaultval'] . '<?')
 | ||
| 				: $field['defaultval']);
 | ||
| 
 | ||
| 		$attributes = trim($field['attributes']);
 | ||
| 
 | ||
| 		$this->form['fields'][$field_id]['is_used'] = true;
 | ||
| 
 | ||
| 		$input = '';
 | ||
| 		$return = '';
 | ||
| 
 | ||
| 		switch ($field['type'])
 | ||
| 		{
 | ||
| 				case 'input':
 | ||
| 				$input = '<input ' . (strpos(strtolower($attributes),'type=') === false ? ' type="text" ' : ' ') . '
 | ||
| 				 name="form-' . $alias_id . '[' . $field['id'] . ']"
 | ||
| 				 ' . (strpos(strtolower($attributes),'value=') === false ? ' value="' . ($field['title'] == 'captcha' ? '' : htmlspecialchars($fld_val,ENT_QUOTES)) . '" ' : ' ') . ' ' . $attributes . '>';
 | ||
| 				break;
 | ||
| 
 | ||
| 			case 'textarea':
 | ||
| 				$input = '<textarea name="form-' . $alias_id . '[' . $field['id'] . ']" ' . $attributes . '>' . htmlspecialchars($fld_val,ENT_QUOTES) . '</textarea>';
 | ||
| 				break;
 | ||
| 
 | ||
| 			case 'select':
 | ||
| 				$input = '<select name="form-' . $alias_id . '[' . $field['id'] . ']" ' . $attributes . '>';
 | ||
| 				foreach ($field['setting'] as $val => $title)
 | ||
| 				{
 | ||
| 					$input .= '<option value="' . $val . '"' . ($val == $fld_val ? ' selected="selected"' : '') . '>' . (is_array($title) ? $title['name'] : $title) . '</option>';
 | ||
| 				}
 | ||
| 				$input .= '</select>';
 | ||
| 				break;
 | ||
| 
 | ||
| 			case 'multiselect':
 | ||
| 				$input = '<select multiple="multiple" name="form-' . $alias_id . '[' . $field['id'] . '][]" ' . $attributes . '>';
 | ||
| 				foreach ($field['setting'] as $val => $title)
 | ||
| 				{
 | ||
| 					$input .= '<option value="' . $val . '"' . (in_array($val,$fld_val) ? ' selected="selected"' : '') . '>' . $title . '</option>';
 | ||
| 				}
 | ||
| 				$input .= '</select>';
 | ||
| 				break;
 | ||
| 
 | ||
| 			case 'checkbox':
 | ||
| 				$input = '
 | ||
| 					<input type="hidden" name="form-' . $alias_id . '[' . $field['id'] . ']" value="0">
 | ||
| 					<input type="checkbox" name="form-' . $alias_id . '[' . $field['id'] . ']"' . ($fld_val ? ' checked="checked"' : '') . ' value="1"	 ' . $attributes . '>';
 | ||
| 				break;
 | ||
| 
 | ||
| 			case 'file':
 | ||
| 				$input = '<input type="file" name="form-' . $alias_id . '[' . $field['id'] . ']" ' . $attributes . '>';
 | ||
| 				break;
 | ||
| 
 | ||
| 			case 'doc':
 | ||
| 				$input = '<select name="form-' . $alias_id . '[' . $field['id'] . ']" ' . $attributes . '>';
 | ||
| 				$docs = $this->_docs($field['setting']);
 | ||
| 				foreach ($docs as $val => $title)
 | ||
| 				{
 | ||
| 					$input .= '<option value="' . $val . '"' . ($val == $fld_val ? ' selected="selected"' : '') . '>' . $title . '</option>';
 | ||
| 				}
 | ||
| 				$input .= '</select>';
 | ||
| 				break;
 | ||
| 
 | ||
| 			case 'multidoc':
 | ||
| 				$input = '<select multiple="multiple" name="form-' . $alias_id . '[' . $field['id'] . '][]" ' . $attributes . '>';
 | ||
| 				$docs = $this->_docs($field['setting']);
 | ||
| 				foreach ($docs as $val => $title)
 | ||
| 				{
 | ||
| 					$input .= '<option value="' . $val . '"' . (in_array($val,$fld_val) ? ' selected="selected"' : '') . '>' . $title . '</option>';
 | ||
| 				}
 | ||
| 				$input .= '</select>';
 | ||
| 				break;
 | ||
| 		}
 | ||
| 
 | ||
| 		// вставляем поле в шаблон поля
 | ||
| 		$return = trim($field['tpl']) > ''
 | ||
| 			? str_replace('[tag:fld]',$input,$field['tpl'])
 | ||
| 			: $input;
 | ||
| 
 | ||
| 		// парсим теги названия и id
 | ||
| 		$return = str_replace(array(
 | ||
| 			'[tag:id]',
 | ||
| 			'[tag:title]',
 | ||
| 		), array(
 | ||
| 			$field['id'],
 | ||
| 			'[tag:title:' . $field_id . ']',
 | ||
| 		), $return);
 | ||
| 
 | ||
| 		// если попытка отправить форму, обрабатываем валидацию и пустоту
 | ||
| 		if ($this->form['is_submited'])
 | ||
| 		{
 | ||
| 			// валидация (только для капчи, input, textarea и file)
 | ||
| 			if (
 | ||
| 				($field['title'] == 'captcha' && $field['main'] && $this->form['is_captcha'] === true) ||
 | ||
| 				(in_array($field['type'],array('input','textarea','file')) && !empty($field['setting']))
 | ||
| 			)
 | ||
| 			{
 | ||
| 				$valid = false;
 | ||
| 				// если капча
 | ||
| 				if ($field['title'] == 'captcha') $valid = (empty($_SESSION['captcha_keystring']) || empty($fld_val) || $_SESSION['captcha_keystring'] != $fld_val) ? false : true;
 | ||
| 				// если файл
 | ||
| 				elseif ($field['type'] == 'file') $valid = ($_FILES['form-' . $alias_id]['size'][$field_id] / 1024 / 1024) <= $field['setting'];
 | ||
| 				// если передали регулярку
 | ||
| 				elseif ($field['setting']{0} == '/') $valid = preg_match($field['setting'],$fld_val) === 1 ? true : false;
 | ||
| 				// если константу
 | ||
| 				elseif (defined($field['setting'])) $valid = filter_var($fld_val,constant($field['setting'])) !== false ? true : false;
 | ||
| 				// иначе, ничего не делаем
 | ||
| 				else return 'Неверные параметры валидации!';
 | ||
| 				// парсим теги валидности
 | ||
| 				$this->_parse_tag_if($return,'if_valid',$valid);
 | ||
| 				$this->_parse_tag_if($return,'if_invalid',!$valid);
 | ||
| 				// записываем результаты
 | ||
| 				$this->form['ajax']['fields'][$field_id]['validate'] = true;
 | ||
| 				$this->form['ajax']['fields'][$field_id]['pattern'] = $field['setting'];
 | ||
| 				$this->form['ajax']['fields'][$field_id]['is_valid'] = $valid;
 | ||
| 				if (!$valid)
 | ||
| 				{
 | ||
| 					$this->form['is_valid'] = false;
 | ||
| 					$this->form['ajax']['form']['is_valid'] = false;
 | ||
| 				}
 | ||
| 			}
 | ||
| 			else
 | ||
| 			{
 | ||
| 				$this->form['ajax']['fields'][$field_id]['validate'] = false;
 | ||
| 				$this->form['ajax']['fields'][$field_id]['is_valid'] = null;
 | ||
| 			}
 | ||
| 
 | ||
| 			// пустота (для любых обязательных полей)
 | ||
| 			if (! empty($field['required']) && $field['required'])
 | ||
| 			{
 | ||
| 				if ($field['type'] == 'file')
 | ||
| 					$empty = (
 | ||
| 						 empty($_FILES['form-' . $alias_id]['tmp_name'][$field_id]) ||
 | ||
| 						!empty($_FILES['form-' . $alias_id]['error'][$field_id])
 | ||
| 					);
 | ||
| 				else
 | ||
| 				{
 | ||
| 					$clean_fld_val = $this->_cleanvar($fld_val);
 | ||
| 					$empty = empty($clean_fld_val);
 | ||
| 				}
 | ||
| 				// парсим теги
 | ||
| 				$this->_parse_tag_if($return,'if_empty',$empty);
 | ||
| 				$this->_parse_tag_if($return,'if_notempty',!$empty);
 | ||
| 				// записываем результаты
 | ||
| 				$this->form['ajax']['fields'][$field_id]['required'] = true;
 | ||
| 				$this->form['ajax']['fields'][$field_id]['is_empty'] = $empty;
 | ||
| 				if ($empty)
 | ||
| 				{
 | ||
| 					$this->form['is_valid'] = false;
 | ||
| 					$this->form['ajax']['form']['is_valid'] = false;
 | ||
| 				}
 | ||
| 			}
 | ||
| 			else
 | ||
| 			{
 | ||
| 				$this->form['ajax']['fields'][$field_id]['required'] = false;
 | ||
| 				$this->form['ajax']['fields'][$field_id]['is_empty'] = null;
 | ||
| 			}
 | ||
| 		}
 | ||
| 		// удаляем оставшиеся теги
 | ||
| 		$this->_parse_tag_if($return,'if_valid',false);
 | ||
| 		$this->_parse_tag_if($return,'if_invalid',false);
 | ||
| 		$this->_parse_tag_if($return,'if_empty',false);
 | ||
| 		$this->_parse_tag_if($return,'if_notempty',false);
 | ||
| 
 | ||
| 		return $return;
 | ||
| 	}
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Замена тега поля в шаблоне письма
 | ||
| 	 */
 | ||
| 	function _parse_tag_fld_mail ($matches)
 | ||
| 	{
 | ||
| 		global $AVE_DB, $AVE_Template;
 | ||
| 
 | ||
| 		$field_id = (int)$matches[1];
 | ||
| 		// забираем массив поля
 | ||
| 		$field = $this->form['fields'][$field_id];
 | ||
| 		// если поля нет, возвращаем тег обратно
 | ||
| 		if (empty($field)) return $matches[0];
 | ||
| 		// если поля не было в шаблоне формы, убираем тег
 | ||
| 		if ($field['is_used'] !== true || empty($field['active'])) return '';
 | ||
| 		// иначе, продолжаем
 | ||
| 		$alias_id = $this->form['alias_id'];
 | ||
| 		$val = $_POST['form-' . $alias_id][$field_id];
 | ||
| 		$newval = '';
 | ||
| 		$tag_mail_empty = ($this->form['mail_set']['format'] === 'text' ? '<' : '<') . $AVE_Template->get_config_vars('tag_mail_empty') . ($this->form['mail_set']['format'] === 'text' ? '>' : '>');
 | ||
| 
 | ||
| 		// делаем поправки для типов
 | ||
| 		switch ($field['type'])
 | ||
| 		{
 | ||
| 			case 'select':
 | ||
| 				$newval = $field['setting'][$val];
 | ||
| 				if ($field['title'] == 'receivers') $newval = $newval['name'];
 | ||
| 				break;
 | ||
| 
 | ||
| 			case 'multiselect':
 | ||
| 				foreach ($val as $val1) $newval .= $field['setting'][$val1] . ',';
 | ||
| 				$newval = rtrim($newval,',');
 | ||
| 				break;
 | ||
| 
 | ||
| 			case 'checkbox':
 | ||
| 				$newval = ($val ? $AVE_Template->get_config_vars('yes') : $AVE_Template->get_config_vars('no'));
 | ||
| 				break;
 | ||
| 
 | ||
| 			case 'doc':
 | ||
| 				if (!empty($val)) $newval = $AVE_DB->Query("SELECT document_title FROM " . PREFIX . "_documents WHERE Id='" . $val . "'")->GetCell();
 | ||
| 				break;
 | ||
| 
 | ||
| 			case 'multidoc':
 | ||
| 				if (!empty($val))
 | ||
| 				{
 | ||
| 					$sql = $AVE_DB->Query("SELECT document_title FROM " . PREFIX . "_documents WHERE Id IN (" . implode(',',$val) . ")");
 | ||
| 					while ($titl = $sql->GetCell()) $titls[] = $titl;
 | ||
| 					$newval = implode(', ',$titls);
 | ||
| 				}
 | ||
| 				break;
 | ||
| 
 | ||
| 			case 'file':
 | ||
| 				$newval = implode(', ',$_FILES['form-' . $alias_id]['name']);
 | ||
| 				break;
 | ||
| 
 | ||
| 			default:
 | ||
| 				$newval = $val;
 | ||
| 		}
 | ||
| 		return (empty($newval) ? $tag_mail_empty : $newval);
 | ||
| 	}
 | ||
| 
 | ||
| /**
 | ||
|  *	Внешние методы класса
 | ||
|  */
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Вывод списка форм
 | ||
| 	 */
 | ||
| 	function forms_list ()
 | ||
| 	{
 | ||
| 		global $AVE_DB, $AVE_Template;
 | ||
| 		$assign = array();
 | ||
| 
 | ||
| 		$limit = 20;
 | ||
| 		$start = get_current_page() * $limit - $limit;
 | ||
| 		$sql = $AVE_DB->Query("
 | ||
| 			SELECT SQL_CALC_FOUND_ROWS
 | ||
| 				f.*,
 | ||
| 				SUM(IF(h.status='new',1,0)) AS history_new,
 | ||
| 				SUM(IF(h.status='viewed',1,0)) AS history_viewed,
 | ||
| 				SUM(IF(h.status='replied',1,0)) AS history_replied
 | ||
| 			FROM " . PREFIX . "_module_contactsnew_forms AS f
 | ||
| 			LEFT OUTER JOIN " . PREFIX . "_module_contactsnew_history AS h ON f.id = h.form_id
 | ||
| 			GROUP BY f.id
 | ||
| 			ORDER BY f.id ASC
 | ||
| 			LIMIT " . $start . "," . $limit . "
 | ||
| 		");
 | ||
| 		$num = (int)$AVE_DB->Query("SELECT FOUND_ROWS()")->GetCell();
 | ||
| 		$pages = @ceil($num / $limit);
 | ||
| 		if ($num > $limit)
 | ||
| 		{
 | ||
| 			$page_nav = '<a class="pnav" href="index.php?do=modules&action=modedit&mod=contactsnew&moduleaction=1&page={s}&cp=' . SESSION . '">{t}</a>';
 | ||
| 			$page_nav = get_pagination($pages, 'page', $page_nav);
 | ||
| 			$AVE_Template->assign('page_nav', $page_nav);
 | ||
| 		}
 | ||
| 
 | ||
| 		while ($row = $sql->FetchAssocArray())
 | ||
| 		{
 | ||
| 			$assign['forms'][] = $row;
 | ||
| 		}
 | ||
| 
 | ||
| 		$AVE_Template->assign($assign);
 | ||
| 		$AVE_Template->assign('content', $AVE_Template->fetch($this->tpl_dir . 'forms.tpl'));
 | ||
| 	}
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Создание/редактирование формы
 | ||
| 	 */
 | ||
| 	function form_edit ()
 | ||
| 	{
 | ||
| 		global $AVE_DB, $AVE_Template;
 | ||
| 		$form = array();
 | ||
| 		$assign = array();
 | ||
| 		$fid = $assign['fid'] = !empty($_REQUEST['fid']) ? (int)$_REQUEST['fid'] : 0;
 | ||
| 
 | ||
| 		if ($fid)
 | ||
| 		{
 | ||
| 			$form = $this->_form($fid);
 | ||
| 
 | ||
| 			// для правильного вывода селектов
 | ||
| 			if (empty($form['mail_set']['receivers'])) $form['mail_set']['receivers'] = array(0 => array());
 | ||
| 			foreach ($form['fields'] as &$field)
 | ||
| 			{
 | ||
| 				if (($field['type'] == 'select' || $field['type'] == 'multiselect') && empty($field['setting']))
 | ||
| 				{
 | ||
| 					$field['setting'] = array(0 => '');
 | ||
| 					$field['setting_empty'] = true;
 | ||
| 				}
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		// алерт при открытии правки
 | ||
| 		if (!empty($_SESSION['module_contactsnew_admin'][$fid]['edit_alert']))
 | ||
| 		{
 | ||
| 			$assign['alert']['text'] = $AVE_Template->get_config_vars($_SESSION['module_contactsnew_admin'][$fid]['edit_alert']['text']);
 | ||
| 			$assign['alert']['theme'] = $_SESSION['module_contactsnew_admin'][$fid]['edit_alert']['theme'];
 | ||
| 			unset($_SESSION['module_contactsnew_admin'][$fid]['edit_alert']);
 | ||
| 		}
 | ||
| 		$assign['form'] = $form;
 | ||
| 		$assign['form_fields_tpl'] = $this->tpl_dir . 'form_fields.tpl';
 | ||
| 		$assign['rubrics'] = $this->_rubrics();
 | ||
| 
 | ||
| 		// назначаем массив CodeMirror
 | ||
| 		$assign['codemirror'] = array(
 | ||
| 			'rubheader'			=> 200,
 | ||
| 			'from_name'			=> 60,
 | ||
| 			'from_email'		=> 60,
 | ||
| 			'subject_tpl'		=> 60,
 | ||
| 			'form_tpl'			=> 460,
 | ||
| 			'mail_tpl'			=> 460,
 | ||
| 			'finish_tpl'		=> 320,
 | ||
| 			'code_onsubmit'		=> 200,
 | ||
| 			'code_onvalidate'	=> 200,
 | ||
| 			'code_onsend'		=> 200
 | ||
| 		);
 | ||
| 
 | ||
| 		$AVE_Template->assign($assign);
 | ||
| 		$AVE_Template->assign('content', $AVE_Template->fetch($this->tpl_dir . 'form_edit.tpl'));
 | ||
| 	}
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Получение полей через аякс
 | ||
| 	 */
 | ||
| 	function form_fields_fetch ()
 | ||
| 	{
 | ||
| 		global $AVE_DB, $AVE_Template;
 | ||
| 		$fid = $assign['fid'] = !empty($_REQUEST['fid']) ? (int)$_REQUEST['fid'] : 0;
 | ||
| 		if (!$fid) return;
 | ||
| 		$form = $this->_form($fid);
 | ||
| 		// для правильного вывода селектов
 | ||
| 		if (empty($form['mail_set']['receivers'])) $form['mail_set']['receivers'] = array(0 => array());
 | ||
| 		foreach ($form['fields'] as &$field)
 | ||
| 		{
 | ||
| 			if (($field['type'] == 'select' || $field['type'] == 'multiselect') && empty($field['setting']))
 | ||
| 			{
 | ||
| 				$field['setting'] = array(0 => '');
 | ||
| 				$field['setting_empty'] = true;
 | ||
| 			}
 | ||
| 		}
 | ||
| 		$AVE_Template->assign('fields',$form['fields']);
 | ||
| 		$AVE_Template->assign('rubrics',$this->_rubrics());
 | ||
| 		$AVE_Template->assign('field_tpl_open',$_REQUEST['field_tpl_open']);
 | ||
| 
 | ||
| 		return $AVE_Template->fetch($this->tpl_dir . 'form_fields.tpl');
 | ||
| 	}
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Сохранение формы
 | ||
| 	 */
 | ||
| 	function form_save ($fid)
 | ||
| 	{
 | ||
| 		global $AVE_DB;
 | ||
| 
 | ||
| 		// проверяем Email-ы получателей
 | ||
| 		$receivers = array();
 | ||
| 		foreach ($_REQUEST['mail_set']['receivers'] as $receiver)
 | ||
| 		{
 | ||
| 			if ($this->_email_validate($receiver['email'])) $receivers[] = $receiver;
 | ||
| 		}
 | ||
| 		$_REQUEST['mail_set']['receivers'] = $receivers;
 | ||
| 		// параметры отправителя
 | ||
| 		if (!trim($_REQUEST['mail_set']['from_email']) > '') $_REQUEST['mail_set']['from_email'] = get_settings('mail_from');
 | ||
| 		if (!trim($_REQUEST['mail_set']['from_name']) > '') $_REQUEST['mail_set']['from_name'] = get_settings('mail_from_name');
 | ||
| 
 | ||
| 		if ($fid)
 | ||
| 		{
 | ||
| 			$AVE_DB->Query("
 | ||
| 				UPDATE " . PREFIX . "_module_contactsnew_forms
 | ||
| 				SET
 | ||
| 					title			= '" . addslashes($_REQUEST['title']) . "',
 | ||
| 					protection		= '" . (int)$_REQUEST['protection'] . "',
 | ||
| 					" . (($_REQUEST['alias'] === '' || $this->_alias_validate($_REQUEST['alias'],$fid) === true) ? " alias = '" . $_REQUEST['alias'] . "'," : '') . "
 | ||
| 					mail_set		= '" . addslashes(serialize($_REQUEST['mail_set'])) . "',
 | ||
| 					rubheader		= '" . addslashes($_REQUEST['rubheader']) . "',
 | ||
| 					form_tpl		= '" . addslashes($_REQUEST['form_tpl']) . "',
 | ||
| 					mail_tpl		= '" . addslashes($_REQUEST['mail_tpl']) . "',
 | ||
| 					finish_tpl		= '" . addslashes($_REQUEST['finish_tpl']) . "',
 | ||
| 					code_onsubmit	= '" . addslashes($_REQUEST['code_onsubmit']) . "',
 | ||
| 					code_onvalidate	= '" . addslashes($_REQUEST['code_onvalidate']) . "',
 | ||
| 					code_onsend		= '" . addslashes($_REQUEST['code_onsend']) . "'
 | ||
| 				WHERE
 | ||
| 					id = '" . $fid . "'
 | ||
| 			");
 | ||
| 		}
 | ||
| 		else
 | ||
| 		{
 | ||
| 			$mail_set = array(
 | ||
| 				'from_name'		=> get_settings('mail_from_name'),
 | ||
| 				'from_email'	=> get_settings('mail_from'),
 | ||
| 				'receivers' 	=> array(0 => array(
 | ||
| 						'name'	=> get_settings('mail_from_name'),
 | ||
| 						'email'	=> get_settings('mail_from')
 | ||
| 					),
 | ||
| 				),
 | ||
| 				'subject_tpl'	=> '[tag:formtitle]',
 | ||
| 				'format'		=> 'text'
 | ||
| 			);
 | ||
| 			$AVE_DB->Query("
 | ||
| 				INSERT INTO " . PREFIX . "_module_contactsnew_forms
 | ||
| 				SET
 | ||
| 					title		= '" . addslashes($_REQUEST['title']) . "',
 | ||
| 					" . (($this->_alias_validate($_REQUEST['alias'],$fid) === true || $_REQUEST['alias'] === '') ? " alias = '" . $_REQUEST['alias'] . "'," : '') . "
 | ||
| 					mail_set	= '" . addslashes(serialize($mail_set)) . "'
 | ||
| 			");
 | ||
| 			$fid = (int)$AVE_DB->InsertId();
 | ||
| 			$_REQUEST['fields'] = $this->fields_main_data;
 | ||
| 			// прописываем алерт об успешном создании
 | ||
| 			if ($fid > 0) $_SESSION['module_contactsnew_admin'][$fid]['edit_alert'] = array('text' => 'created', 'theme' => 'accept');
 | ||
| 
 | ||
| 			// если устанавливаем пример
 | ||
| 			if (!empty($_REQUEST['demo']))
 | ||
| 			{
 | ||
| 				$demo = array();
 | ||
| 			// если выбрана демоформа jQuery Validation Plugin и reCAPTCHA v3
 | ||
|             if ($_REQUEST['demo'] == 'jqval_cap') { 
 | ||
|                 include(BASE_DIR . '/modules/contactsnew/demo/demo_jqval.php');
 | ||
|             } else {
 | ||
|                 include(BASE_DIR . '/modules/contactsnew/demo/demo.php');
 | ||
|             }
 | ||
| 				$_REQUEST = array_merge($_REQUEST,$demo);
 | ||
| 				// обновляем форму с данными примера
 | ||
| 				$this->form_save($fid);
 | ||
| 				// подставляем в шаблон новые id полей
 | ||
| 				$demo['form_tpl'] = preg_replace_callback('/\[tag:fld:(\d+)]/', create_function('$matches','return "[tag:fld:" . $_REQUEST["demo_change"][(int)$matches[1]] . "]";'),$demo['form_tpl']);
 | ||
| 				// если выбрана демоформа jQuery Validation Plugin и reCAPTCHA v3
 | ||
| 			if ($_REQUEST['demo'] == 'jqval_cap') {	
 | ||
| 				// подставляем в шаблон новые значения атрибутов name
 | ||
| 				$demo['form_tpl'] = preg_replace_callback('/form-jqval_cap\[(\d+)]/', create_function('$matches','return "form-jqval_cap[" . $_REQUEST["demo_change"][(int)$matches[1]] . "]";'),$demo['form_tpl']);
 | ||
| 			}
 | ||
| 				$AVE_DB->Query("
 | ||
| 					UPDATE " . PREFIX . "_module_contactsnew_forms
 | ||
| 					SET
 | ||
| 						form_tpl = '" . addslashes($demo['form_tpl']) . "'
 | ||
| 					WHERE id = '" . $fid . "'
 | ||
| 				");
 | ||
|             return $fid;
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		// сохраняем поля
 | ||
| 		foreach ($_REQUEST['fields'] as $field_id => $field)
 | ||
| 		{
 | ||
| 			if (!trim($field['title'])) continue;
 | ||
| 			if (is_array($field['setting']))
 | ||
| 			{
 | ||
| 				$settings = array();
 | ||
| 				foreach ($field['setting'] as $setting)
 | ||
| 				{
 | ||
| 					// если получатели
 | ||
| 					if ($field['title'] == 'receivers' && is_array($setting) && trim($setting['name']) > '' && trim($setting['email']) > '' && $this->_email_validate($setting['email']))
 | ||
| 						$settings[] = $setting;
 | ||
| 					// другое
 | ||
| 					elseif (!is_array($setting) && trim($setting) > '')
 | ||
| 						$settings[] = $setting;
 | ||
| 				}
 | ||
| 				$field['setting'] = serialize($settings);
 | ||
| 			}
 | ||
| 			elseif ($field['type'] == 'file') $field['setting'] = (int)$field['setting'];
 | ||
| 
 | ||
| 			if (is_array($field['defaultval'])) $field['defaultval'] = serialize($field['defaultval']);
 | ||
| 
 | ||
| 			$sql = 	"
 | ||
| 				title		= '" . addslashes($field['title']) . "',
 | ||
| 				active		= '" . (int)$field['active'] . "',
 | ||
| 				type		= '" . $field['type'] . "',
 | ||
| 				setting		= '" . addslashes($field['setting']) . "',
 | ||
| 				required	= '" . (int)$field['required'] . "',
 | ||
| 				defaultval	= '" . addslashes($field['defaultval']) . "',
 | ||
| 				attributes	= '" . addslashes(trim($field['attributes'])) . "',
 | ||
| 				tpl			= '" . addslashes($field['tpl']) . "'
 | ||
| 			";
 | ||
| 			if ($field['new'])
 | ||
| 			{
 | ||
| 				$AVE_DB->Query("
 | ||
| 					INSERT INTO " . PREFIX . "_module_contactsnew_fields
 | ||
| 					SET
 | ||
| 						form_id	= '" . (int)$fid . "',
 | ||
| 						main	= '" . (int)$field['main'] . "',
 | ||
| 						" . $sql . "
 | ||
| 				");
 | ||
| 				if ($_REQUEST['demo']) $_REQUEST['demo_change'][$field_id] = (int)$AVE_DB->InsertId();
 | ||
| 			}
 | ||
| 			else
 | ||
| 			{
 | ||
| 				$AVE_DB->Query("
 | ||
| 					UPDATE " . PREFIX . "_module_contactsnew_fields
 | ||
| 					SET
 | ||
| 						" . $sql . "
 | ||
| 					WHERE
 | ||
| 						id			= '" . (int)$field_id . "' AND
 | ||
| 						form_id		= '" . $fid . "'
 | ||
| 				");
 | ||
| 			}
 | ||
| 		}
 | ||
| 		foreach ($_REQUEST['field_del'] as $field_id => $delete)
 | ||
| 		{
 | ||
| 			if (empty($delete)) continue;
 | ||
| 			$AVE_DB->Query("
 | ||
| 				DELETE FROM " . PREFIX . "_module_contactsnew_fields
 | ||
| 				WHERE
 | ||
| 					id		 = '" . (int)$field_id . "' AND
 | ||
| 					main	!= '1'
 | ||
| 			");
 | ||
| 		}
 | ||
| 
 | ||
| 		return $fid;
 | ||
| 	}
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Удаление формы
 | ||
| 	 */
 | ||
| 	function form_del ($fid)
 | ||
| 	{
 | ||
| 		global $AVE_DB;
 | ||
| 
 | ||
| 		$AVE_DB->Query("
 | ||
| 			DELETE FROM " . PREFIX . "_module_contactsnew_forms
 | ||
| 			WHERE id = '" . $fid . "'
 | ||
| 		");
 | ||
| 		$AVE_DB->Query("
 | ||
| 			DELETE FROM " . PREFIX . "_module_contactsnew_fields
 | ||
| 			WHERE form_id = '" . $fid . "'
 | ||
| 		");
 | ||
| 	}
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Сохранение формы
 | ||
| 	 */
 | ||
| 	function form_copy ($fid)
 | ||
| 	{
 | ||
| 		global $AVE_DB;
 | ||
| 
 | ||
| 		// форма
 | ||
| 		$form = $AVE_DB->Query("
 | ||
| 			SELECT * FROM " . PREFIX . "_module_contactsnew_forms
 | ||
| 			WHERE id = '" . $fid . "'
 | ||
| 		")->FetchAssocArray();
 | ||
| 		if (empty($form)) return;
 | ||
| 		$query = "INSERT INTO " . PREFIX . "_module_contactsnew_forms SET ";
 | ||
| 		foreach ($form as $key => $val)
 | ||
| 		{
 | ||
| 			if ($key == 'id' || $key == 'alias') continue;
 | ||
| 			$query .= $key . " = '" . addslashes($val) . "', ";
 | ||
| 		}
 | ||
| 		$query = rtrim($query,', ');
 | ||
| 		$AVE_DB->Query($query);
 | ||
| 		$fid_new = (int)$AVE_DB->InsertId();
 | ||
| 
 | ||
| 		// поля
 | ||
| 		$sql = $AVE_DB->Query("
 | ||
| 			SELECT * FROM " . PREFIX . "_module_contactsnew_fields
 | ||
| 			WHERE form_id = '" . $fid . "'
 | ||
| 		");
 | ||
| 		while ($row = $sql->FetchAssocArray())
 | ||
| 		{
 | ||
| 			if (empty($row['id'])) continue;
 | ||
| 			$query = "INSERT INTO " . PREFIX . "_module_contactsnew_fields SET ";
 | ||
| 			foreach ($row as $key => $val)
 | ||
| 			{
 | ||
| 				if ($key == 'id') continue;
 | ||
| 				elseif ($key == 'form_id') $val = $fid_new;
 | ||
| 				$query .= $key . " = '" . addslashes($val) . "', ";
 | ||
| 			}
 | ||
| 			$query = rtrim($query,', ');
 | ||
| 			$AVE_DB->Query($query);
 | ||
| 		}
 | ||
| 
 | ||
| 		return $fid_new;
 | ||
| 	}
 | ||
| 
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Вывод формы
 | ||
| 	 */
 | ||
| 	function form_display ($alias_id)
 | ||
| 	{
 | ||
| 		global $AVE_Template;
 | ||
| 
 | ||
| 		$form = $this->_form($alias_id);
 | ||
| 
 | ||
| 		if (empty($form))
 | ||
| 			return "[mod_contactsnew:$alias_id] - " . $AVE_Template->get_config_vars('form_notfound');
 | ||
| 
 | ||
| 		// по дефолту форма валидна, но не отправлена - потом перезаписываем, если что
 | ||
| 		$this->form['is_valid'] = true;
 | ||
| 		$this->form['ajax']['form']['is_valid'] = true;
 | ||
| 		$this->form['ajax']['form']['is_sent'] = false;
 | ||
| 		$this->form['ajax']['form']['finish_tpl'] = null;
 | ||
| 
 | ||
| 		// rubheader
 | ||
| 		$GLOBALS['user_header']['module_contactsnew_' . $alias_id] = $this->_parse_tags($this->form['rubheader']);
 | ||
| 
 | ||
| 		// вывод финишной страницы, если включена проверка от повторной отправки
 | ||
| 		if (! empty($_GET['mcnfinish']) && $form['protection'])
 | ||
| 		{
 | ||
| 			if ($_SESSION['mcnfinish'][$form['id'] . $_GET['mcnfinish']] === true)
 | ||
| 			{
 | ||
| 				unset($_SESSION['mcnfinish'][$form['id'] . $_GET['mcnfinish']]);
 | ||
| 
 | ||
| 				// формируем финишную страницу
 | ||
| 				$tpl = $this->_parse_tags($form['finish_tpl']);
 | ||
| 				$tpl = $this->_eval2var('?>' . $tpl . '<?');
 | ||
| 
 | ||
| 				return $tpl;
 | ||
| 			}
 | ||
| 			else
 | ||
| 			{
 | ||
| 				header('Location: ' . trim(str_replace('mcnfinish=' . $_GET['mcnfinish'],'',$_SERVER['REQUEST_URI']),'?&'));
 | ||
| 				exit;
 | ||
| 			}
 | ||
| 		}
 | ||
| 		// определяем (bool) отправка формы
 | ||
| 		else
 | ||
| 			$this->form['is_submited'] = false;
 | ||
| 
 | ||
| 		if (! empty($_POST['form-' . $alias_id]))
 | ||
| 		{
 | ||
| 			$this->form['is_submited'] = true;
 | ||
| 			// выполняем код после отправки формы
 | ||
| 			eval('?>' . $this->form['code_onsubmit'] . '<?');
 | ||
| 		}
 | ||
| 
 | ||
| 		$tpl = $this->form['form_tpl'];
 | ||
| 		// меняем теги основных полей на стандартные
 | ||
| 		$tpl = $this->_parse_tag_fld_main($tpl,true);
 | ||
| 		// парсим теги полей и названий
 | ||
| 		$tpl = preg_replace_callback('/\[tag:fld:(\d+)]/', array($this,'_parse_tag_fld_form'), $tpl);
 | ||
| 		$tpl = preg_replace_callback('/\[tag:title:([A-Za-z0-9-_]+)]/', array($this,'_parse_tag_title'),$tpl);
 | ||
| 
 | ||
| 		// выполняем код после валидации
 | ||
| 		eval('?>' . $this->form['code_onvalidate'] . '<?');
 | ||
| 
 | ||
| 		// если форма валидна, отправляем её
 | ||
| 		if ($this->form['is_submited'] === true && $this->form['is_valid'] === true)
 | ||
| 			return $this->form_submit($alias_id);
 | ||
| 		// иначе - заканчиваем вывод
 | ||
| 		else
 | ||
| 		{
 | ||
| 			// парсим основные теги
 | ||
| 			$tpl = $this->_parse_tags($tpl);
 | ||
| 			// теги общей валидности
 | ||
| 			if ($this->form['is_submited'])
 | ||
| 			{
 | ||
| 				$this->_parse_tag_if($tpl,'if_form_valid',$this->form['is_valid']);
 | ||
| 				$this->_parse_tag_if($tpl,'if_form_invalid',!$this->form['is_valid']);
 | ||
| 			}
 | ||
| 			else
 | ||
| 			{
 | ||
| 				$this->_parse_tag_if($tpl,'if_form_valid',false);
 | ||
| 				$this->_parse_tag_if($tpl,'if_form_invalid',false);
 | ||
| 			}
 | ||
| 			// заменяем теги условий
 | ||
| 			$tpl = preg_replace('/\[tag:(if|elseif)_fld:(\d*)(.*?)]/si','<? $1 (\$_POST["fields"][$2]$3): ?>',$tpl);
 | ||
| 			$tpl = str_replace(array('[tag:else_fld]','[/tag:if_fld]'),array('<? else: ?>','<? endif ?>'),$tpl);
 | ||
| 			// выполняем код
 | ||
| 			return $this->_eval2var('?>' . $tpl . '<?');
 | ||
| 		}
 | ||
| 	}
 | ||
| 
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Отправка формы
 | ||
| 	 */
 | ||
| 	function form_submit ($alias_id)
 | ||
| 	{
 | ||
| 		global $AVE_DB, $AVE_Template;
 | ||
| 
 | ||
| 		$form = $this->form;
 | ||
| 
 | ||
| 		$fields = $form['fields'];
 | ||
| 
 | ||
| 		$fid = $form['id'];
 | ||
| 
 | ||
| 		// формируем список получателей
 | ||
| 		$recs = array();
 | ||
| 
 | ||
| 		// пользователь (отправка копии)
 | ||
| 		if (
 | ||
| 			($form['is_copy'] === true && $_POST['form-' . $alias_id][$form['fields_main']['copy']] == 1) ||
 | ||
| 			$fields[$form['fields_main']['copy']]['defaultval'] == 1
 | ||
| 		)
 | ||
| 		{
 | ||
| 			$email = '';
 | ||
| 
 | ||
| 			if ($form['is_email'] === true)
 | ||
| 				$email = $_POST['form-' . $alias_id][$form['fields_main']['email']];
 | ||
| 
 | ||
| 			if (empty($email))
 | ||
| 				$email = $_SESSION['user_email'];
 | ||
| 
 | ||
| 			if (! empty($email))
 | ||
| 			{
 | ||
| 				$recs[] = array(
 | ||
| 					'email' => $email,
 | ||
| 					'name'	=> $_SESSION['user_name'],
 | ||
| 					'agent'	=> 'user',
 | ||
| 				);
 | ||
| 			}
 | ||
| 
 | ||
| 			$history['email'] = $email;
 | ||
| 		}
 | ||
| 		else // если чекбоксы - отправить копию неактивные
 | ||
| 		{
 | ||
| 			$email = '';
 | ||
| 
 | ||
| 			if ($form['is_email'] === true)
 | ||
| 				$email = $_POST['form-' . $alias_id][$form['fields_main']['email']];
 | ||
| 
 | ||
| 			if (empty($email))
 | ||
| 				$email = $_SESSION['user_email'];
 | ||
| 
 | ||
| 			$history['email'] = $email;
 | ||
| 		}
 | ||
| 
 | ||
| 		// главные получатели
 | ||
| 		$recs = array_merge($recs, $form['mail_set']['receivers']);
 | ||
| 
 | ||
| 		// выбранные в форме получатели
 | ||
| 		if ($this->form['is_receivers'] === true)
 | ||
| 		{
 | ||
| 			$recs_field_id = $form['fields_main']['receivers'];
 | ||
| 			$recs[] = $fields[$recs_field_id]['setting'][$_POST['form-' . $alias_id][$recs_field_id]];
 | ||
| 		}
 | ||
| 
 | ||
| 		// если ни один получатель не назначен, отправляем админскому
 | ||
| 		if (empty($recs)) $recs[] = array(
 | ||
| 			'name' => get_settings('mail_from_name'),
 | ||
| 			'email' => get_settings('mail_from')
 | ||
| 		);
 | ||
| 
 | ||
| 		// перезаписываем список уникальных получателей в переменную письма
 | ||
| 		$this->form['receivers'] = array();
 | ||
| 
 | ||
| 		foreach ($recs as $rec)
 | ||
| 		{
 | ||
| 			if (!isset($this->form['receivers'][$rec['email']]) && trim($rec['email']) > '')
 | ||
| 				$this->form['receivers'][trim($rec['email'])] = $rec;
 | ||
| 		}
 | ||
| 
 | ||
| 		$recs = $this->form['receivers'];
 | ||
| 		$recs[] = array('agent' => 'history');
 | ||
| 
 | ||
| 		// обрабатываем тему по умолчанию
 | ||
| 		if (!$form['fields'][$form['fields_main']['subject']]['active'] || !$form['fields'][$form['fields_main']['subject']]['is_used'])
 | ||
| 		{
 | ||
| 			$_POST['form-' . $alias_id][$form['fields_main']['subject']] = $form['fields'][$form['fields_main']['subject']]['defaultval'];
 | ||
| 		}
 | ||
| 
 | ||
| 		// обрабатываем шаблон письма
 | ||
| 		$tpl = $form['mail_tpl'];
 | ||
| 
 | ||
| 		// меняем теги основных полей на стандартные
 | ||
| 		$tpl = $this->_parse_tag_fld_main($tpl);
 | ||
| 
 | ||
| 		// парсим [tag:easymail]
 | ||
| 		if (strpos($tpl,'[tag:easymail]') !== false)
 | ||
| 		{
 | ||
| 			$easy = '';
 | ||
| 
 | ||
| 			foreach ($fields as $field_id => $field)
 | ||
| 			{
 | ||
| 				if ($field['is_used'] !== true || $field['title'] == 'captcha' || empty($field['active']))
 | ||
| 					continue;
 | ||
| 
 | ||
| 				$easy .= "[tag:title:$field_id]" . ": [tag:fld:$field_id];" . ($form['mail_set']['format'] === 'text' ? "\r\n" : '<br>');
 | ||
| 			}
 | ||
| 
 | ||
| 			// убираем последний перевод строки
 | ||
| 			$easy = ($form['mail_set']['format'] === 'text') ? rtrim($easy) : substr($easy,0,-4);
 | ||
| 			$tpl = str_replace('[tag:easymail]',$easy,$tpl);
 | ||
| 		}
 | ||
| 
 | ||
| 		// парсим теги полей и названий
 | ||
| 		$tpl = preg_replace_callback('/\[tag:fld:(\d+)]/', array($this,'_parse_tag_fld_mail'),$tpl);
 | ||
| 		$tpl = preg_replace_callback('/\[tag:title:([A-Za-z0-9-_]+)]/', array($this,'_parse_tag_title'),$tpl);
 | ||
| 
 | ||
| 		// парсим основные теги
 | ||
| 		$tpl = $this->_parse_tags($tpl);
 | ||
| 
 | ||
| 		// заменяем теги условий
 | ||
| 		$tpl = preg_replace('/\[tag:(if|elseif)_fld:(\d*)(.*?)]/si','<? $1 (\$_POST["form-' . $alias_id . '"][$2]$3): ?>',$tpl);
 | ||
| 		$tpl = str_replace(array('[tag:else_fld]','[/tag:if_fld]'),array('<? else: ?>','<? endif ?>'),$tpl);
 | ||
| 
 | ||
| 		// файлы-вложения
 | ||
| 		$attach = array();
 | ||
| 
 | ||
| 		if (! empty($_FILES['form-' . $alias_id]['tmp_name']))
 | ||
| 		{
 | ||
| 			foreach ($_FILES['form-' . $alias_id]['name'] as $field_id => $fname)
 | ||
| 			{
 | ||
| 				$ext = (end(explode('.', $fname)));
 | ||
| 
 | ||
| 				if (
 | ||
| 					!empty($_FILES['form-' . $alias_id]['tmp_name'][$field_id]) &&
 | ||
| 					!empty($form['fields'][$field_id]) &&
 | ||
| 					empty($_FILES['form-' . $alias_id]['error'][$field_id]) &&
 | ||
| 					!in_array($ext,array('php', 'phtml', 'php3', 'php4', 'php5', 'js', 'pl'))
 | ||
| 				)
 | ||
| 				{
 | ||
| 					$fname = BASE_DIR . '/' . ATTACH_DIR . '/' . str_replace(' ', '_', mb_strtolower(trim($fname)));
 | ||
| 
 | ||
| 					if (file_exists($fname))
 | ||
| 						$fname = rtrim($fname,'.' . $ext) . '_' . mt_rand(0,10000) . '.' . $ext;
 | ||
| 
 | ||
| 					@move_uploaded_file($_FILES['form-' . $alias_id]['tmp_name'][$field_id], $fname);
 | ||
| 
 | ||
| 					$attach[] = $fname;
 | ||
| 				}
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		// Имя отправителя
 | ||
| 		$from_name_tpl = $form['mail_set']['from_name'];
 | ||
| 		$from_name_tpl = $this->_parse_tags($from_name_tpl);
 | ||
| 		$from_name_tpl = $this->_parse_tag_fld_main($from_name_tpl);
 | ||
| 		$from_name_tpl = preg_replace_callback('/\[tag:fld:(\d+)]/', array($this,'_parse_tag_fld_post'),$from_name_tpl);
 | ||
| 
 | ||
| 		// Email отправителя
 | ||
| 		$from_email_tpl = $form['mail_set']['from_email'];
 | ||
| 		$from_email_tpl = $this->_parse_tags($from_email_tpl);
 | ||
| 		$from_email_tpl = $this->_parse_tag_fld_main($from_email_tpl);
 | ||
| 		$from_email_tpl = preg_replace_callback('/\[tag:fld:(\d+)]/', array($this,'_parse_tag_fld_post'),$from_email_tpl);
 | ||
| 
 | ||
| 		// Тема
 | ||
| 		$subject_tpl = $form['mail_set']['subject_tpl'];
 | ||
| 		$subject_tpl = $this->_parse_tags($subject_tpl);
 | ||
| 		$subject_tpl = $this->_parse_tag_fld_main($subject_tpl);
 | ||
| 		$subject_tpl = preg_replace_callback('/\[tag:fld:(\d+)]/', array($this,'_parse_tag_fld_post'),$subject_tpl);
 | ||
| 
 | ||
| 		// отправляем письма
 | ||
| 		foreach ($recs as $rec)
 | ||
| 		{
 | ||
| 			$mail = $tpl;
 | ||
| 
 | ||
| 			$from_name = $from_name_tpl;
 | ||
| 
 | ||
| 			$from_email = $from_email_tpl;
 | ||
| 
 | ||
| 			$subject = $subject_tpl;
 | ||
| 
 | ||
| 			$if_user_open = ($rec['agent'] === 'user');
 | ||
| 			$if_admin_open = !$if_user_open;
 | ||
| 
 | ||
| 			$this->_parse_tag_if($mail,'if_user',$if_user_open);
 | ||
| 			$this->_parse_tag_if($mail,'if_admin',$if_admin_open);
 | ||
| 			$this->_parse_tag_if($subject,'if_user',$if_user_open);
 | ||
| 			$this->_parse_tag_if($subject,'if_admin',$if_admin_open);
 | ||
| 
 | ||
| 			// @fix для v1.0 beta <= 2: поддержка тега if_notuser
 | ||
| 			$this->_parse_tag_if($mail,'if_notuser',$if_admin_open);
 | ||
| 			$this->_parse_tag_if($subject,'if_notuser',$if_admin_open);
 | ||
| 
 | ||
| 			$mail = trim($this->_eval2var('?>' . $mail . '<?'));
 | ||
| 			$subject = trim($this->_eval2var('?>' . $subject . '<?'));
 | ||
| 
 | ||
| 			// сохраняем в бд историю (письмо, которое пришло админу)
 | ||
| 			if ($rec['agent'] === 'history')
 | ||
| 			{
 | ||
| 				$history['dialog']['request']['body'] = $mail;
 | ||
| 				$history['dialog']['request']['format'] = $form['mail_set']['format'];
 | ||
| 
 | ||
| 				$AVE_DB->Query("
 | ||
| 					INSERT INTO " . PREFIX . "_module_contactsnew_history
 | ||
| 					SET
 | ||
| 						form_id		= '" . $fid . "',
 | ||
| 						email		= '" . $history['email'] . "',
 | ||
| 						subject		= '" . addslashes($subject) . "',
 | ||
| 						date		= '" . time() . "',
 | ||
| 						dialog		= '" . addslashes(serialize($history['dialog'])) . "',
 | ||
| 						postdata	= '" . addslashes(serialize($_POST)) . "'
 | ||
| 				");
 | ||
| 
 | ||
| 				unset($history);
 | ||
| 			}
 | ||
| 			// иначе, отправляем письмо
 | ||
| 			else
 | ||
| 			{
 | ||
| 				$this->_parse_tag_if($from_name,'if_user',$if_user_open);
 | ||
| 				$this->_parse_tag_if($from_name,'if_admin',$if_admin_open);
 | ||
| 				$this->_parse_tag_if($from_email,'if_user',$if_user_open);
 | ||
| 				$this->_parse_tag_if($from_email,'if_admin',$if_admin_open);
 | ||
| 
 | ||
| 				$from_name = $this->_eval2var('?>' . $from_name . '<?');
 | ||
| 				$from_name = trim(preg_replace('/\s+/',' ',$from_name));
 | ||
| 				$from_email = $this->_eval2var('?>' . $from_email . '<?');
 | ||
| 				$from_email = trim(preg_replace('/\s+/','',$from_email));
 | ||
| 
 | ||
| 				if (empty($from_email))
 | ||
| 					$from_email = get_settings('mail_from');
 | ||
| 
 | ||
| 				send_mail(
 | ||
| 					$rec['email'],
 | ||
| 					$mail,
 | ||
| 					$subject,
 | ||
| 					$from_email,
 | ||
| 					$from_name,
 | ||
| 					$form['mail_set']['format'],
 | ||
| 					$attach,
 | ||
| 					false,
 | ||
| 					false
 | ||
| 				);
 | ||
| 				// @fix для AVE.cms.v1.5.beta <= 28: в send_mail() не выключен кэш в конце
 | ||
| 				//ob_end_clean();
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		// выполняем код после отправки писем
 | ||
| 		eval('?>' . $this->form['code_onsend'] . '<?');
 | ||
| 
 | ||
| 		// если включена защита от повторной отправки и не ajax
 | ||
| 		if ($form['protection'] && ! isAjax())
 | ||
| 		{
 | ||
| 			$rand = mt_rand();
 | ||
| 			$_SESSION['mcnfinish'][$form['id'] . $rand] = true;
 | ||
| 			header('Location: ' . $_SERVER['REQUEST_URI'] . ((strpos($_SERVER['REQUEST_URI'], '?') !== false) ? '&' : '?') . 'mcnfinish=' . $rand);
 | ||
| 			exit;
 | ||
| 		}
 | ||
| 		// иначе
 | ||
| 		else
 | ||
| 		{
 | ||
| 			// формируем финишную страницу
 | ||
| 			$tpl = $this->_parse_tags($form['finish_tpl']);
 | ||
| 			$tpl = $this->_eval2var('?>' . $tpl . '<?');
 | ||
| 			// сохраняем информацию для аякса
 | ||
| 			$this->form['ajax']['form']['is_sent'] = true;
 | ||
| 			$this->form['ajax']['form']['finish_tpl'] = $tpl;
 | ||
| 
 | ||
| 			return $tpl;
 | ||
| 		}
 | ||
| 	}
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Вывод истории
 | ||
| 	 */
 | ||
| 	function history_list ($fid)
 | ||
| 	{
 | ||
| 		global $AVE_DB, $AVE_Template;
 | ||
| 		$assign = array();
 | ||
| 		$assign['fid'] = $fid;
 | ||
| 		$assign['form'] = $this->_form($fid,false);
 | ||
| 
 | ||
| 		$limit = 50;
 | ||
| 		$start = get_current_page() * $limit - $limit;
 | ||
| 		$sql = $AVE_DB->Query("
 | ||
| 			SELECT SQL_CALC_FOUND_ROWS *
 | ||
| 			FROM " . PREFIX . "_module_contactsnew_history
 | ||
| 			WHERE form_id = '" . $fid . "'
 | ||
| 			ORDER BY date DESC
 | ||
| 			LIMIT " . $start . "," . $limit . "
 | ||
| 		");
 | ||
| 		$num = (int)$AVE_DB->Query("SELECT FOUND_ROWS()")->GetCell();
 | ||
| 		$pages = @ceil($num / $limit);
 | ||
| 		if ($num > $limit)
 | ||
| 		{
 | ||
| 			$page_nav = '<a class="pnav" href="index.php?do=modules&action=modedit&mod=contactsnew&moduleaction=history_list&fid=' . $fid . '&page={s}&cp=' . SESSION . '">{t}</a>';
 | ||
| 			$page_nav = get_pagination($pages, 'page', $page_nav);
 | ||
| 			$AVE_Template->assign('page_nav', $page_nav);
 | ||
| 		}
 | ||
| 
 | ||
| 		while ($row = $sql->FetchAssocArray())
 | ||
| 		{
 | ||
| 			unset($row['dialog']);
 | ||
| 			$assign['dialogs'][] = $row;
 | ||
| 		}
 | ||
| 
 | ||
| 		$assign = $this->_stripslashes($assign);
 | ||
| 		$AVE_Template->assign($assign);
 | ||
| 		$AVE_Template->assign('content', $AVE_Template->fetch($this->tpl_dir . 'history.tpl'));
 | ||
| 	}
 | ||
| 
 | ||
| 		/**
 | ||
| 	 * Удаление выбранного e-mail
 | ||
| 	 */
 | ||
| 	function email_del ($hid)
 | ||
| 	{
 | ||
| 		global $AVE_DB, $AVE_Template;
 | ||
| 
 | ||
| 		$AVE_DB->Query("
 | ||
| 			DELETE FROM " . PREFIX . "_module_contactsnew_history
 | ||
| 			WHERE id = '" . $hid . "'
 | ||
| 		");
 | ||
| 	}
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Сохранение статуса диалога
 | ||
| 	 */
 | ||
| 	function dialog_status ($hid)
 | ||
| 	{
 | ||
| 		global $AVE_DB;
 | ||
| 
 | ||
| 		if ($_REQUEST['status'] !== 'new')
 | ||
| 		{
 | ||
| 			$AVE_DB->Query("
 | ||
| 				UPDATE " . PREFIX . "_module_contactsnew_history
 | ||
| 				SET
 | ||
| 					status = '" . $_REQUEST['status'] . "'
 | ||
| 				WHERE id = '" . $hid . "'
 | ||
| 			");
 | ||
| 		}
 | ||
| 
 | ||
| 		if (empty($_REQUEST['ajax']))
 | ||
| 		{
 | ||
| 			header('Location: index.php?do=modules&action=modedit&mod=contactsnew&moduleaction=history_list&fid=' . $_REQUEST['fid'] . '&cp=' . SESSION);
 | ||
| 			exit;
 | ||
| 		}
 | ||
| 	}
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Вывод диалога
 | ||
| 	 */
 | ||
| 	function history_dialog ($hid)
 | ||
| 	{
 | ||
| 		global $AVE_DB, $AVE_Template;
 | ||
| 		$assign = array();
 | ||
| 
 | ||
| 		$assign['hid'] = $hid;
 | ||
| 		$history = $AVE_DB->Query("
 | ||
| 			SELECT *
 | ||
| 			FROM " . PREFIX . "_module_contactsnew_history
 | ||
| 			WHERE id = '" . $hid . "'
 | ||
| 		")->FetchAssocArray();
 | ||
| 		$history['dialog'] = unserialize($history['dialog']);
 | ||
| 		$history = $this->_stripslashes($history);
 | ||
| 		$assign['fid'] = $history['form_id'];
 | ||
| 		$assign['form'] = $this->_form($history['form_id'],false);
 | ||
| 
 | ||
| 		// меняем статус на прочитанное
 | ||
| 		if ($history['status'] === 'new')
 | ||
| 		{
 | ||
| 			$AVE_DB->Query("
 | ||
| 				UPDATE " . PREFIX . "_module_contactsnew_history
 | ||
| 				SET
 | ||
| 					status = 'viewed'
 | ||
| 				WHERE id = '" . $hid . "'
 | ||
| 			");
 | ||
| 		}
 | ||
| 
 | ||
| 		// обращение
 | ||
| 		$request_author = $AVE_DB->Query("
 | ||
| 			SELECT Id AS user_id, user_name, firstname, lastname
 | ||
| 			FROM " . PREFIX . "_users
 | ||
| 			WHERE email = '" . $history['email'] . "'
 | ||
| 		")->FetchAssocArray();
 | ||
| 		if (!empty($request_author)) $history['dialog']['request'] = array_merge($history['dialog']['request'], $request_author);
 | ||
| 
 | ||
| 		// ответы
 | ||
| 		foreach ($history['dialog']['response'] as &$response)
 | ||
| 		{
 | ||
| 			$response_author = $AVE_DB->Query("
 | ||
| 				SELECT user_name, firstname, lastname
 | ||
| 				FROM " . PREFIX . "_users
 | ||
| 				WHERE Id = '" . $response['user_id'] . "'
 | ||
| 			")->FetchAssocArray();
 | ||
| 			if (!empty($response_author)) $response = array_merge($response, $response_author);
 | ||
| 		}
 | ||
| 
 | ||
| 		// форма ответа
 | ||
| 		if (empty($history['dialog']['response_draft']))
 | ||
| 		{
 | ||
| 			$history['dialog']['response_draft'] = array(
 | ||
| 				'from_email'	=> get_settings('mail_from'),
 | ||
| 				'from_name'		=> get_settings('mail_from_name'),
 | ||
| 				'body'			=> "\r\n\r\n\r\n--\r\n" . get_settings('mail_signature'),
 | ||
| 			);
 | ||
| 		}
 | ||
| 
 | ||
| 		// алерт при открытии
 | ||
| 		if (!empty($_SESSION['module_contactsnew_admin'][$fid]['dialog_alert']))
 | ||
| 		{
 | ||
| 			$assign['alert']['text'] = $AVE_Template->get_config_vars($_SESSION['module_contactsnew_admin'][$fid]['dialog_alert']['text']);
 | ||
| 			$assign['alert']['theme'] = $_SESSION['module_contactsnew_admin'][$fid]['dialog_alert']['theme'];
 | ||
| 			unset($_SESSION['module_contactsnew_admin'][$fid]['dialog_alert']);
 | ||
| 		}
 | ||
| 
 | ||
| 		$AVE_Template->assign($assign);
 | ||
| 		$AVE_Template->assign($history);
 | ||
| 		$AVE_Template->assign('content', $AVE_Template->fetch($this->tpl_dir . 'dialog.tpl'));
 | ||
| 	}
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Сохранение и отправка ответа
 | ||
| 	 */
 | ||
| 	function history_dialog_submit ($hid)
 | ||
| 	{
 | ||
| 		global $AVE_DB;
 | ||
| 
 | ||
| 		$history = $AVE_DB->Query("
 | ||
| 			SELECT *
 | ||
| 			FROM " . PREFIX . "_module_contactsnew_history
 | ||
| 			WHERE id = '" . $hid . "'
 | ||
| 		")->FetchAssocArray();
 | ||
| 		$history['dialog'] = unserialize($history['dialog']);
 | ||
| 
 | ||
| 		if ($_REQUEST['send'])
 | ||
| 		{
 | ||
| 			$response = $_POST;
 | ||
| 			$response['user_id'] = UID;
 | ||
| 			$response['date'] = time();
 | ||
| 			$history['dialog']['response'][] = $response;
 | ||
| 			$history['status'] = 'replied';
 | ||
| 			unset($history['dialog']['response_draft']);
 | ||
| 			send_mail(
 | ||
| 				$history['email'],
 | ||
| 				$_POST['body'],
 | ||
| 				$_POST['subject'],
 | ||
| 				$_POST['from_email'],
 | ||
| 				$_POST['from_name'],
 | ||
| 				$_POST['format'],
 | ||
| 				array(),
 | ||
| 				false,false
 | ||
| 			);
 | ||
| 		}
 | ||
| 		else
 | ||
| 		{
 | ||
| 			$history['dialog']['response_draft'] = $_POST;
 | ||
| 		}
 | ||
| 
 | ||
| 		$AVE_DB->Query("
 | ||
| 			UPDATE " . PREFIX . "_module_contactsnew_history
 | ||
| 			SET
 | ||
| 				dialog	= '" . addslashes(serialize($history['dialog'])) . "',
 | ||
| 				status	= '" . $history['status'] . "'
 | ||
| 			WHERE id = '" . $hid . "'
 | ||
| 		");
 | ||
| 
 | ||
| 		if ($_REQUEST['send'])
 | ||
| 		{
 | ||
| 			// прописываем алерт об успешной отправке письма
 | ||
| 			$_SESSION['module_contactsnew_admin'][$fid]['dialog_alert'] = array('text' => 'respose_sent', 'theme' => 'accept');
 | ||
| 
 | ||
| 			header('Location: index.php?do=modules&action=modedit&mod=contactsnew&moduleaction=history_dialog&hid=' . $hid . '&cp=' . SESSION);
 | ||
| 			exit;
 | ||
| 		}
 | ||
| 	}
 | ||
| }
 | ||
| ?>
 |