Your IP : 18.224.52.109


Current Path : /home/bitrix/ext_www/klimatlend.ua/bitrix/modules/iblock/lib/
Upload File :
Current File : /home/bitrix/ext_www/klimatlend.ua/bitrix/modules/iblock/lib/senderconnector.php

<?php
/**
 * Bitrix Framework
 * @package bitrix
 * @subpackage iblock
 * @copyright 2001-2012 Bitrix
 */

namespace Bitrix\Iblock;

use Bitrix\Main,
	Bitrix\Main\Localization\Loc;

Loc::loadMessages(__FILE__);

class SenderEventHandler
{
	/**
	 * Return connector class description.
	 *
	 * @param array $data		Connector data.
	 * @return array
	 */
	public static function onConnectorListIblock($data)
	{
		$data['CONNECTOR'] = 'Bitrix\Iblock\SenderConnectorIblock';

		return $data;
	}
}


class SenderConnectorIblock extends \Bitrix\Sender\Connector
{
	/**
	 * @return string
	 */
	public function getName()
	{
		return Loc::getMessage('sender_connector_iblock_name');
	}

	/**
	 * @return string
	 */
	public function getCode()
	{
		return "iblock";
	}

	/**
	 * @return bool
	 */
	public function requireConfigure()
	{
		return true;
	}

	/** @return \CDBResult */
	public function getData()
	{
		$iblockId = $this->getFieldValue('IBLOCK', null);
		$propertyNameId = $this->getFieldValue('PROPERTY_NAME', null);
		$propertyEmailId = $this->getFieldValue('PROPERTY_EMAIL', null);

		if($iblockId && $propertyEmailId)
		{
			// if property is property with code like '123'
			$propertyNameValue = null;
			$propertyEmailValue = null;
			if($propertyEmailId)
			{
				if(is_numeric($propertyEmailId))
				{
					$propertyEmailId = "PROPERTY_" . $propertyEmailId;
					$propertyEmailValue = $propertyEmailId."_VALUE";
				}
				else
				{
					$propertyEmailValue = $propertyEmailId;
				}
			}
			$selectFields = array($propertyEmailValue);

			if($propertyNameId)
			{
				if(is_numeric($propertyNameId))
				{
					$propertyNameId = "PROPERTY_" . $propertyNameId;
					$propertyNameValue = $propertyNameId . "_VALUE";
				}
				else
				{
					$propertyNameValue = $propertyNameId;
				}

				$selectFields[] = $propertyNameValue;
			}

			$filter = array('IBLOCK_ID' => $iblockId, '!'.$propertyEmailId => false);
			$iblockElementListDb = \CIBlockElement::getList(array('id' => 'asc'), $filter, false, false, $selectFields);

			// replace property names from PROPERTY_123_VALUE to EMAIL, NAME
			$iblockElementDb = new CDBResultSenderConnector($iblockElementListDb);
			$iblockElementDb->senderConnectorFieldEmail = $propertyEmailValue;
			$iblockElementDb->senderConnectorFieldName = $propertyNameValue;
		}
		else
		{
			$iblockElementDb = new \CDBResult();
			$iblockElementDb->InitFromArray(array());
		}


		return $iblockElementDb;
	}

	/**
	 * @return string
	 * @throws \Bitrix\Main\ArgumentException
	 */
	public function getForm()
	{
		/*
		 * select iblock list
		*/
		$iblockList = array();
		$iblockDb = IblockTable::getList(array(
			'select' => array('ID', 'NAME'),
		));
		while($iblock = $iblockDb->fetch())
		{
			$iblockList[] = $iblock;
		}
		if(!empty($iblockList))
			$iblockList = array_merge(
				array(array('ID' => '', 'NAME' => Loc::getMessage('sender_connector_iblock_select'))),
				$iblockList
			);
		else
			$iblockList = array_merge(
				array(array('ID' => '', 'NAME' => Loc::getMessage('sender_connector_iblock_empty'))),
				$iblockList
			);

		/*
		 * select properties from all iblocks
		*/
		$propertyToIblock = array();
		$propertyList = array();
		$propertyList[''][] = array('ID' => '', 'NAME' => Loc::getMessage('sender_connector_iblock_select'));
		$propertyList['EMPTY'][] = array('ID' => '', 'NAME' => Loc::getMessage('sender_connector_iblock_prop_empty'));
		$iblockFieldsDb = PropertyTable::getList(array(
			'select' => array('ID', 'NAME', 'IBLOCK_ID'),
			'filter' => array('=PROPERTY_TYPE' => PropertyTable::TYPE_STRING)
		));
		while($iblockFields = $iblockFieldsDb->fetch())
		{
			// add property
			$propertyList[$iblockFields['IBLOCK_ID']][] = array(
				'ID' => $iblockFields['ID'],
				'NAME' => $iblockFields['NAME']
			);

			// add property link to iblock
			$propertyToIblock[$iblockFields['ID']] = $iblockFields['IBLOCK_ID'];
		}


		$fieldList = static::getIblockFieldList();
		// add default value
		$fieldList = array_merge(
			array(array('ID' => '', 'NAME' => Loc::getMessage('sender_connector_iblock_field_select'))),
			$fieldList
		);
		foreach($iblockList as $iblock)
		{
			if(!$iblock['ID'])
			{
				continue;
			}

			if(!isset($propertyList[$iblock['ID']]) || !is_array($propertyList[$iblock['ID']]))
			{
				$propertyList[$iblock['ID']] = array();
			}
			else
			{
				// add delimiter between fields and properties
				$propertyList[$iblock['ID']] = array_merge(
					array(array('ID' => '------',	'NAME' => '-----------------', 'DISABLED' => true)),
					$propertyList[$iblock['ID']]
				);
			}

			$propertyList[$iblock['ID']] = array_merge($fieldList, $propertyList[$iblock['ID']]);
		}


		/*
		 * create html-control of iblock list
		*/
		$iblockInput = '<select name="'.$this->getFieldName('IBLOCK').'" id="'.$this->getFieldId('IBLOCK').'" onChange="IblockSelect'.$this->getFieldId('IBLOCK').'()">';
		foreach($iblockList as $iblock)
		{
			$inputSelected = ($iblock['ID'] == $this->getFieldValue('IBLOCK') ? 'selected' : '');
			$iblockInput .= '<option value="'.$iblock['ID'].'" '.$inputSelected.'>';
			$iblockInput .= Main\Text\HtmlFilter::encode($iblock['NAME']);
			$iblockInput .= '</option>';
		}
		$iblockInput .= '</select>';


		/*
		 * create html-control of properties list for name
		*/
		$iblockPropertyNameInput = '<select name="'.$this->getFieldName('PROPERTY_NAME').'" id="'.$this->getFieldId('PROPERTY_NAME').'">';
		if(array_key_exists($this->getFieldValue('PROPERTY_NAME', 0), $propertyToIblock))
		{
			$propSet = $propertyList[$propertyToIblock[$this->getFieldValue('PROPERTY_NAME', 0)]];
		}
		elseif(array_key_exists($this->getFieldValue('IBLOCK', 0), $propertyList))
		{
			$propSet = $propertyList[$this->getFieldValue('IBLOCK')];
		}
		else
		{
			$propSet = $propertyList[''];
		}
		foreach($propSet as $property)
		{
			$inputSelected = $property['ID'] == $this->getFieldValue('PROPERTY_NAME') ? 'selected' : '';
			$inputDisabled = (isset($property['DISABLED']) && $property['DISABLED']) ? 'disabled' : '';
			$iblockPropertyNameInput .= '<option value="'.$property['ID'].'" '.$inputSelected.' '.$inputDisabled.'>';
			$iblockPropertyNameInput .= Main\Text\HtmlFilter::encode($property['NAME']);
			$iblockPropertyNameInput .= '</option>';
		}
		$iblockPropertyNameInput .= '</select>';


		/*
		 *  create html-control of properties list for email
		*/
		$iblockPropertyEmailInput = '<select name="'.$this->getFieldName('PROPERTY_EMAIL').'" id="'.$this->getFieldId('PROPERTY_EMAIL').'">';
		if(array_key_exists($this->getFieldValue('PROPERTY_EMAIL', 0), $propertyToIblock))
		{
			$propSet = $propertyList[$propertyToIblock[$this->getFieldValue('PROPERTY_EMAIL', 0)]];
		}
		elseif(array_key_exists($this->getFieldValue('IBLOCK', 0), $propertyList))
		{
			$propSet = $propertyList[$this->getFieldValue('IBLOCK')];
		}
		else
		{
			$propSet = $propertyList[''];
		}
		foreach($propSet as $property)
		{
			$inputSelected = ($property['ID'] == $this->getFieldValue('PROPERTY_EMAIL') ? 'selected' : '');
			$inputDisabled = (isset($property['DISABLED']) && $property['DISABLED']) ? 'disabled' : '';
			$iblockPropertyEmailInput .= '<option value="'.$property['ID'].'" '.$inputSelected.' '.$inputDisabled.'>';
			$iblockPropertyEmailInput .= Main\Text\HtmlFilter::encode($property['NAME']);
			$iblockPropertyEmailInput .= '</option>';
		}
		$iblockPropertyEmailInput .= '</select>';


		$jsScript = "
		<script>
			function IblockSelect".$this->getFieldId('IBLOCK')."()
			{
				var iblock = BX('".$this->getFieldId('IBLOCK')."');
				IblockPropertyAdd(iblock, BX('".$this->getFieldId('PROPERTY_NAME')."'));
				IblockPropertyAdd(iblock, BX('".$this->getFieldId('PROPERTY_EMAIL')."'));
			}
			function IblockPropertyAdd(iblock, iblockProperty)
			{
				if(iblockProperty.length>0)
				{
					for (var j in iblockProperty.options)
					{
						iblockProperty.options.remove(j);
					}
				}
				var propList = {};
				if(iblockProperties[iblock.value] && iblockProperties[iblock.value].length>0)
					propList = iblockProperties[iblock.value];
				else
					propList = iblockProperties['EMPTY'];
				for(var i in propList)
				{
					var optionName = propList[i]['NAME'];
					var optionValue = propList[i]['ID'];
					var optionDisabled = propList[i]['DISABLED'];
					var newOption = new Option(optionName, optionValue);
					if(optionDisabled)
					{
						newOption.disabled = true;
					}
					iblockProperty.options.add(newOption);
				}

			}

			var iblockProperties = ".\CUtil::PhpToJSObject($propertyList).";
		</script>
		";



		return '
			'.Loc::getMessage('sender_connector_iblock_required_settings').'
			<br/><br/>
			<table>
				<tr>
					<td>'.Loc::getMessage('sender_connector_iblock_field_iblock').'</td>
					<td>'.$iblockInput.'</td>
				</tr>
				<tr>
					<td>'.Loc::getMessage('sender_connector_iblock_field_name').'</td>
					<td>'.$iblockPropertyNameInput.'</td>
				</tr>
				<tr>
					<td>'.Loc::getMessage('sender_connector_iblock_field_email').'</td>
					<td>'.$iblockPropertyEmailInput.'</td>
				</tr>
			</table>
			'.$jsScript.'
		';
	}

	protected static function getIblockFieldList()
	{
		$fieldCodeList = array('NAME', 'CODE', 'PREVIEW_TEXT', 'DETAIL_TEXT');

		$resultList = array();
		$entity = ElementTable::getEntity();
		foreach($fieldCodeList as $fieldCode)
		{
			$field = $entity->getField($fieldCode);
			$resultList[] = array(
				'ID' => $fieldCode,
				'NAME' => $field->getTitle()
			);
		}

		return $resultList;
	}
}

class CDBResultSenderConnector extends \CDBResult
{
	public $senderConnectorFieldName = null;
	public $senderConnectorFieldEmail = null;


	/**
	 * @return array|null
	 */
	public function Fetch()
	{
		$fields = parent::Fetch();
		if($fields)
		{
			$keysForUnset = array();
			if ($this->senderConnectorFieldName)
			{
				if(isset($fields[$this->senderConnectorFieldName."_VALUE"]))
				{
					$fields['NAME'] = $fields[$this->senderConnectorFieldName."_VALUE"];
					$keysForUnset[] = $this->senderConnectorFieldName."_VALUE";
					$keysForUnset[] = $this->senderConnectorFieldName."_VALUE"."_ID";
				}
				elseif(isset($fields[$this->senderConnectorFieldName]))
				{
					$fields['NAME'] = $fields[$this->senderConnectorFieldName];
					if($this->senderConnectorFieldName != 'NAME')
						$keysForUnset[] = $this->senderConnectorFieldName;
				}
			}

			if ($this->senderConnectorFieldEmail)
			{
				if(isset($fields[$this->senderConnectorFieldEmail."_VALUE"]))
				{
					$fields['EMAIL'] = $fields[$this->senderConnectorFieldEmail."_VALUE"];
					$keysForUnset[] = $this->senderConnectorFieldEmail."_VALUE";
					$keysForUnset[] = $this->senderConnectorFieldEmail."_VALUE"."_ID";
				}
				elseif(isset($fields[$this->senderConnectorFieldEmail]))
				{
					$fields['EMAIL'] = $fields[$this->senderConnectorFieldEmail];
					$keysForUnset[] = $this->senderConnectorFieldEmail;
				}
			}

			if (count($keysForUnset)>0)
			{
				$keysForUnset = array_unique($keysForUnset);
				foreach($keysForUnset as $key) unset($fields[$key]);
			}
		}

		return $fields;
	}
}