267  /  331

Пользовательские типы свойств заказа

Просмотров: 2878 (Статистика ведётся с 06.02.2017)

В системе имеются следующие стандартные типы свойств: Строка, Число, Да/Нет, Перечисление, Файл, Дата и Местоположение. Но вы можете добавлять свои типы свойств и самостоятельно определять их внешний вид. Таким образом, у покупателя при оформлении заказа будет спрашиваться какое-то значение, которое вы сами запрограммируете. Для этого вам необходимо выполнить следующие действия:

  • Унаследовать класс пользовательского типа:
    class MyType extends \Bitrix\Sale\Internals\Input\Base
    {
    	protected static function getEditHtmlSingle($name, array $input, $value){...} 
    	protected static function getErrorSingle(array $input, $value){...}
    	static function getSettings(array $input, $reload){...}
    }
    
  • Подключить тип свойства к системе - тип подключается на событии registerInputTypes:
    \Bitrix\Main\EventManager::getInstance()->addEventHandler(
    	'sale',
    	'registerInputTypes',
    	'myFunction'
    );
    
    В обработчике события вы регистрируете свой тип свойства с помощью метода Manager::register, где указываете ваш класс-обработчик и имя вашего типа:
    public function myFunction(\Bitrix\Main\Event $event)
    {
    	\Bitrix\Sale\Internals\Input\Manager::register(
    		"myType",
    		array(
    			'CLASS' => '\MyNamespace\MyType',
    			'NAME' => 'Мой тип',
    		)	
    	);
    }
    

Важно! Название типа myType должно быть уникальным в рамках всей системы.

В результате в дальнейшем, когда менеджер магазина будет создавать новое свойство заказа, ему среди стандартных типов будет доступен для выбора и ваш созданный тип свойства.

Примеры создания типа свойств

Создадим свойство типа String:

class StringInput extends \Bitrix\Sale\Internals\Input\Base // String reserved in php 7
{
	protected static function getEditHtmlSingle($name, array $input, $value)
	{
		if ($input['MULTILINE'] == 'Y')
		{
			$attributes = static::extractAttributes($input,
				array('DISABLED'=>'', 'READONLY'=>'', 'AUTOFOCUS'=>'', 'REQUIRED'=>''),
				array('FORM'=>1, 'MAXLENGTH'=>1, 'PLACEHOLDER'=>1, 'DIRNAME'=>1, 'ROWS'=>1, 'COLS'=>1, 'WRAP'=>1));

			return '<textarea name="'.$name.'"'.$attributes.'>'.htmlspecialcharsbx($value).'</textarea>';
		}
		else
		{
			$attributes = static::extractAttributes($input,
				array('DISABLED'=>'', 'READONLY'=>'', 'AUTOFOCUS'=>'', 'REQUIRED'=>'', 'AUTOCOMPLETE'=>'on'),
				array('FORM'=>1, 'MAXLENGTH'=>1, 'PLACEHOLDER'=>1, 'DIRNAME'=>1, 'SIZE'=>1, 'LIST'=>1, 'PATTERN'=>1));

			return '<input type="text" name="'.$name.'" value="'.htmlspecialcharsbx($value).'"'.$attributes.'>';
		}
	}

	/**
	 * @param $name
	 * @param array $input
	 * @param $value
	 * @return string
	 */
	public static function getFilterEditHtml($name, array $input, $value)
	{
		return static::getEditHtmlSingle($name, $input, $value);
	}

	protected static function getErrorSingle(array $input, $value)
	{
		$errors = array();

		$value = trim($value);

		if ($input['MINLENGTH'] && strlen($value) < $input['MINLENGTH'])
			$errors['MINLENGTH'] = Loc::getMessage('INPUT_STRING_MINLENGTH_ERROR', array("#NUM#" => $input['MINLENGTH']));

		if ($input['MAXLENGTH'] && strlen($value) > $input['MAXLENGTH'])
			$errors['MAXLENGTH'] = Loc::getMessage('INPUT_STRING_MAXLENGTH_ERROR', array("#NUM#" => $input['MAXLENGTH']));

		if ($input['PATTERN'] && !preg_match($input['PATTERN'], $value))
			$errors['PATTERN'] = Loc::getMessage('INPUT_STRING_PATTERN_ERROR');

		return $errors;
	}

	static function getSettings(array $input, $reload)
	{
		$settings = array(
			'MINLENGTH' => array('TYPE' => 'NUMBER', 'LABEL' => Loc::getMessage('INPUT_STRING_MINLENGTH'), 'MIN' => 0, 'STEP' => 1),
			'MAXLENGTH' => array('TYPE' => 'NUMBER', 'LABEL' => Loc::getMessage('INPUT_STRING_MAXLENGTH'), 'MIN' => 0, 'STEP' => 1),
			'PATTERN'   => array('TYPE' => 'STRING', 'LABEL' => Loc::getMessage('INPUT_STRING_PATTERN'  )),
			'MULTILINE' => array('TYPE' => 'Y/N'   , 'LABEL' => Loc::getMessage('INPUT_STRING_MULTILINE'), 'ONCLICK' => $reload),
		);

		if ($input['MULTILINE'] == 'Y')
		{
			$settings['COLS'] = array('TYPE' => 'NUMBER', 'LABEL' => Loc::getMessage('INPUT_STRING_SIZE'), 'MIN' => 0, 'STEP' => 1);
			$settings['ROWS'] = array('TYPE' => 'NUMBER', 'LABEL' => Loc::getMessage('INPUT_STRING_ROWS'), 'MIN' => 0, 'STEP' => 1);
		}
		else
		{
			$settings['SIZE'] = array('TYPE' => 'NUMBER', 'LABEL' => Loc::getMessage('INPUT_STRING_SIZE'), 'MIN' => 0, 'STEP' => 1);
		}

		return $settings;
	}
}

\Bitrix\Sale\Internals\Input\Manager::register('STRING', array(
	'CLASS' => '\StringInput',
	'NAME' => \Bitrix\Main\Localization\Loc::getMessage('INPUT_STRING'),
));

Создадим тип свойств Period:

class Period extends \Bitrix\Sale\Internals\Input\Base
{
	public static function getViewHtmlSingle(array $input, array $values)
	{
		self::checkArgs($input, $values);

		return $input["ITEMS"]["FROM"]["NAME"].": ".\Bitrix\Sale\Internals\Input\Manager::getViewHtml($input["ITEMS"]["FROM"], $values["FROM"]).
			$input["ITEMS"]["TO"]["NAME"].": ".\Bitrix\Sale\Internals\Input\Manager::getViewHtml($input["ITEMS"]["TO"], $values["TO"]).
			" ".\Bitrix\Sale\Internals\Input\Manager::getViewHtml($input["ITEMS"]["TYPE"], $values["TYPE"]);
	}

	public static function getEditHtmlSingle($name, array $input, $values)
	{
		if(!isset($input["ITEMS"]))
			$input["ITEMS"] = array(
		"FROM" => array(
			"TYPE" => "STRING",
			"NAME" => ""
		),
		"TO" => array(
			"TYPE" => "STRING",
			"NAME" => " - "
		),
		"TYPE" => array(
			"TYPE" => "ENUM",
			"OPTIONS" => array(
				"H" => "HOURS", //Loc::getMessage("SALE_DLVR_HANDL_CONF_PERIOD_HOUR"),
				"D" => "DAYS", //Loc::getMessage("SALE_DLVR_HANDL_CONF_PERIOD_DAY"),
				"M" => "MONTHS" ////Loc::getMessage("SALE_DLVR_HANDL_CONF_PERIOD_MONTH")
			)
		)
	);

		return $input["ITEMS"]["FROM"]["NAME"].\Bitrix\Sale\Internals\Input\Manager::getEditHtml($name."[FROM]", $input["ITEMS"]["FROM"], $values["FROM"]).
			$input["ITEMS"]["TO"]["NAME"].\Bitrix\Sale\Internals\Input\Manager::getEditHtml($name."[TO]", $input["ITEMS"]["TO"], $values["TO"]).
			" ".\Bitrix\Sale\Internals\Input\Manager::getEditHtml($name."[TYPE]", $input["ITEMS"]["TYPE"], $values["TYPE"]);
	}

	public static function getError(array $input, array $values)
	{
		return self::getErrorSingle($input, $values);
	}

	public static function getErrorSingle(array $input, array $values)
	{
		self::checkArgs($input, $values);

		$errors = array();

		if ($error = \Bitrix\Sale\Internals\Input\Manager::getError($input["ITEMS"]["FROM"], $values["FROM"]))
			$errors = $error;

		if ($error = \Bitrix\Sale\Internals\Input\Manager::getError($input["ITEMS"]["TO"], $values["TO"]))
			$errors = array_merge($errors, $error);

		if ($error = \Bitrix\Sale\Internals\Input\Manager::getError($input["ITEMS"]["TYPE"], $values["TYPE"]))
			$errors = array_merge($errors, $error);

		return $errors;
	}

	public static function getValueSingle(array $input, $userValue)
	{
		return $userValue;
	}

	public static function getSettings(array $input, $reload)
	{
		return array();
	}

	protected static function checkArgs(array $input, array $values)
	{
		if(!isset($input["ITEMS"]["FROM"]) || !isset($input["ITEMS"]["TO"]) || !isset($input["ITEMS"]["TYPE"]))
			throw new \Bitrix\Main\ArgumentException("Wrong argument structure!", "input");

		if(!isset($values["FROM"]) || !isset($values["TO"]) || !isset($values["TYPE"]))
			throw new \Bitrix\Main\ArgumentException("Wrong argument structure!", "values");

		return true;
	}
}

\Bitrix\Sale\Internals\Input\Manager::register('DELIVERY_PERIOD', array(
	'CLASS' => '\Period',
	'NAME' => \Bitrix\Main\Localization\Loc::getMessage('INPUT_DELIVERY_PERIOD')
));


4
Курсы разработаны в компании «1С-Битрикс»

Если вы нашли неточность в тексте, непонятное объяснение, пожалуйста, сообщите нам об этом в комментариях.
Развернуть комментарии