Your IP : 18.226.88.23


Current Path : /var/www/axolotl/data/www/nn.axolotls.ru/bitrix/modules/crm/lib/webform/
Upload File :
Current File : /var/www/axolotl/data/www/nn.axolotls.ru/bitrix/modules/crm/lib/webform/result.php

<?php
/**
 * Bitrix Framework
 * @package bitrix
 * @subpackage crm
 * @copyright 2001-2016 Bitrix
 */
namespace Bitrix\Crm\WebForm;

use Bitrix\Main\Localization\Loc;
use Bitrix\Crm\WebForm\Internals\ResultTable;
use Bitrix\Crm\WebForm\Internals\Model;
use Bitrix\Crm\WebForm\Internals\FormCounterTable;
use Bitrix\Main\Entity\Result as EntityResult;
use Bitrix\Main\Type\DateTime;

Loc::loadMessages(__FILE__);

class Result extends Model
{
	/**@var $resultEntity ResultEntity Result entity. */
	protected $resultEntity;

	/** @var string $resultUrl Result Url. */
	protected $url;

	protected function getClassTable()
	{
		return 'ResultTable';
	}

	/*
	 * Get result entity.
	 *
	 * @return ResultEntity
	 * */
	public function getResultEntity()
	{
		return $this->resultEntity;
	}

	/**
	 * Get result url.
	 *
	 * @return string
	 */
	public function getUrl()
	{
		return $this->url;
	}

	/**
	 * Set result url.
	 *
	 * @param string $url Url.
	 * @return void
	 */
	public function setUrl(string $url = null)
	{
		$this->url = $url;
	}

	public function load($id)
	{
		$class = $this->getClassTable();

		$this->id = $id;
		$result = $class::getRowById($id);
		if(!$result)
		{
			return;
		}

		$this->params = $result;
	}

	public function save($onlyCheck = false)
	{
		$fields = $this->params;
		$fieldsResult = array(
			'FORM_ID' => $fields['FORM_ID'],
			'ORIGIN_ID' => $fields['ORIGIN_ID'],
			'DATE_INSERT' => new DateTime()
		);

		if(!$this->check())
		{
			return;
		}

		if($this->id)
		{
			$result = ResultTable::update($this->id, $fieldsResult);
		}
		else
		{
			$result = ResultTable::add($fieldsResult);
			$this->id = $result->getId();
			if($this->id > 0)
			{
				$this->addEntity();
				FormCounterTable::incCounters(
					$fields['FORM_ID'],
					array(
						'END_FILL',
						'MONEY' => $this->getProductSum()
					)
				);
			}
		}

		$this->prepareResult($result);
	}

	public function check()
	{
		$fields = $this->params;
		$fieldsResult = array(
			'FORM_ID' => $fields['FORM_ID'],
			'DATE_INSERT' => new DateTime()
		);

		$result = new EntityResult;
		ResultTable::checkFields($result, $this->id, $fieldsResult);
		$this->prepareResult($result);

		if(!$this->hasErrors())
		{
			$this->checkFields();
		}

		return !$this->hasErrors();
	}

	protected function checkFields()
	{
		$result = true;
		$fields = $this->params['FIELDS'];
		foreach($fields as $field)
		{
			if(!$this->checkField($field))
			{
				$result = false;
			}
		}

		return $result;
	}

	protected function getProductSum()
	{
		$productSum = 0;
		foreach($this->params['PRODUCTS'] as $product)
		{
			$productSum += (int) $product['PRICE'];
		}

		return $productSum;
	}

	public function getFieldsForAdd()
	{
		$fieldsForAdd = array();

		$fields = $this->params['FIELDS'];
		foreach($fields as $field)
		{
			if($field['hidden'])
			{
				continue;
			}

			if(count($field['values']) == 0)
			{
				continue;
			}

			$fieldsForAdd[] = array(
				'type' => '',
				'name' => '',
				'caption' => '',
			);

			foreach($field['values'] as $value)
			{
				foreach($field['items'] as $item)
				{
					if($item['value'] != $value)
					{
						continue;
					}

					$fieldsForAdd['values'][] = $item;
					break;
				}
			}
		}

		return $fieldsForAdd;
	}

	protected function checkField($field)
	{
		if($field['hidden'])
		{
			return true;
		}

		$values = array();
		foreach($field['values'] as $value)
		{
			if(is_string($value))
			{
				$value = trim($value);
			}
			else
			{
				trimArr($value);
			}

			if(!$value && $value !== '0' && $value !== 0)
			{
				continue;
			}

			$values[] = $value;
		}


		if($field['required'] && count($values) == 0 && empty($this->params['DISABLE_FIELD_CHECKING']))
		{
			$this->errors[] = Loc::getMessage('CRM_WEBFORM_RESULT_ERROR_REQUIRED_FIELD_EMPTY', array('%field%', $field['caption']));
			return false;
		}
		else if(count($values) == 0)
		{
			return true;
		}

		$result = true;
		switch($field['type'])
		{
			case 'checkbox':
			case 'radio':
			case 'list':
				$itemValues = array();
				foreach($field['items'] as $item)
				{
					$itemValues[] = $item['value'];
				}

				$result = array_intersect($values, $itemValues) > 0;
				break;

			case 'email':
				foreach($values as $value)
				{
					if(!$this->checkEmail($value))
					{
						$result = false;
						break;
					}
				}
				break;
			case 'phone':
				foreach($values as $value)
				{
					if(!$this->checkPhone($value))
					{
						$result = false;
						break;
					}
				}
				break;
			case 'int':
				foreach($values as $value)
				{
					if(!$this->checkInt($value))
					{
						$result = false;
						break;
					}
				}
				break;
		}


		if(!$result)
		{
			$this->errors[] = Loc::getMessage('CRM_WEBFORM_RESULT_ERROR_REQUIRED_FIELD_EMPTY', array('%field%', $field['caption']));
		}

		return $result;
	}

	protected function checkEmail($value)
	{
		return check_email($value);
	}

	protected function checkInt($value)
	{
		return is_numeric($value);
	}

	protected function checkPhone($value)
	{
		return true;
	}

	public static function formatFieldsByTemplate(array $fields, $fieldTemplate = "%caption%%required%: %values%\n", $valueTemplate = "%value%\n", $valueListTemplate = "\n%value%")
	{
		$result = '';
		foreach($fields as $field)
		{
			if(!$field || !is_array($field['value']))
			{
				continue;
			}

			$values = array();
			foreach($field['value'] as $value)
			{
				if(is_array($value))
				{
					$values[] = htmlspecialcharsbx($value['title']);

				}
				else
				{
					$values[] = htmlspecialcharsbx($value);
				}
			}

			// format values
			$displayedValues = '';
			foreach ($values as $value)
			{
				switch ($field['type'])
				{
					case Internals\FieldTable::TYPE_ENUM_CHECKBOX:
						if (in_array($value, ['Y', 'N']))
						{
							EntityFieldProvider::getBooleanFieldItems();
							$value = Loc::getMessage('CRM_WEBFORM_FIELD_PROVIDER_' . (
								$value === 'Y' ? 'YES' : 'NO'
							));
						}
						break;
				}

				$displayedValues .= str_replace(
					array('%value%'),
					array($value),
					($valueListTemplate && count($values) > 1) ? $valueListTemplate : $valueTemplate
				);
			}

			// format field
			$result .= str_replace(
				array(
					'%caption%',
					'%required%',
					'%values%'
				),
				array(
					htmlspecialcharsbx($field['caption']),
					$field['required'] ? '*' : '',
					$displayedValues
				),
				$fieldTemplate
			);
		}

		return $result;
	}

	protected function addEntity()
	{
		$scheme = $this->params['ENTITY_SCHEME'];
		$fields = $this->params['FIELDS'];
		$presetFields = $this->params['PRESET_FIELDS'];
		$products = $this->params['PRODUCTS'];
		$currencyId = $this->params['CURRENCY_ID'];
		$assignedById = $this->params['ASSIGNED_BY_ID'];
		$activityFields = $this->params['ACTIVITY_FIELDS'];
		$invoiceSettings = $this->params['INVOICE_SETTINGS'];
		$duplicateMode = $this->params['DUPLICATE_MODE'];
		$commonFields = $this->params['COMMON_FIELDS'];
		$commonData = $this->params['COMMON_DATA'];
		$placeholders = $this->params['PLACEHOLDERS'];
		$isCallback = $this->params['IS_CALLBACK'];
		$callbackPhone = $this->params['CALLBACK_PHONE'];
		$entities = $this->params['ENTITIES'];

		$resultEntity = new ResultEntity;
		$resultEntity->setFormData($this->params['FORM']);
		$resultEntity->setFormId($this->params['FORM_ID']);
		$resultEntity->setResultId($this->id);
		$resultEntity->setAssignedById($assignedById);
		$resultEntity->setPresetFields($presetFields);
		$resultEntity->setCommonFields($commonFields);
		$resultEntity->setCommonData($commonData);
		$resultEntity->setPlaceholders($placeholders);
		$resultEntity->setProductRows($products);
		$resultEntity->setCurrencyId($currencyId);
		$resultEntity->setActivityFields($activityFields);
		$resultEntity->setInvoiceSettings($invoiceSettings);
		$resultEntity->setDuplicateMode($duplicateMode);
		$resultEntity->setCallback($isCallback, $callbackPhone);
		$resultEntity->setEntities($entities);

		$resultEntity->add($scheme, $fields);
		$this->resultEntity = $resultEntity;
	}
}