132  /  381

Теория. Контроллеры и компонент

Просмотров: 474
Дата последнего изменения: 02.11.2020
Роберт Басыров
Сложность урока:
3 уровень - средняя сложность. Необходимо внимание и немного подумать.
1
2
3
4
5
Недоступно в редакциях:
Ограничений нет

Для обработки аяксовых запросов в компоненте можно использовать два подхода:

class.php

Обработчик запросов в классе компонента (файл class.php) позволяет:

  • Инкапсулировать весь код в одном классе
  • Повторно использовать методы, данные и параметры компонента
  • Использовать языковые фразы, шаблоны компонента
  • Переопределять в компонентах-потомках стандартное поведение

Чтобы класс компонента мог обрабатывать запросы необходимо:

  • Реализовать интерфейс \Bitrix\Main\Engine\Contract\Controllerable
  • Определить метод-действия с суффиксом Action
  • Реализовать метод configureActions (обычно возвращает пустой массив === конфигурацию по умолчанию)
  • Если нужно добавлять, обрабатывать ошибки, то стоит реализовать \Bitrix\Main\Errorable

Примечание: При выполнении компонента в аяксовом режиме выполняются последовательно CBitrixComponent::onIncludeComponentLang, CBitrixComponent::onPrepareComponentParams и запуск действия с фильтрами..

Внимание! При выполнении компонента в аяксовом режиме метод CBitrixComponent::executeComponent() не запускается.

Пример

<?php
#components/bitrix/example/class.php

use Bitrix\Main\Error;
use Bitrix\Main\ErrorCollection;

if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();

class ExampleComponent extends \CBitrixComponent implements \Bitrix\Main\Engine\Contract\Controllerable, \Bitrix\Main\Errorable
{
	/** @var ErrorCollection */
	protected $errorCollection;

	public function configureActions()
	{
		//если действия не нужно конфигурировать, то пишем просто так. И будет конфиг по умолчанию 
		return [];
	}

	public function onPrepareComponentParams($arParams)
	{
		$this->errorCollection = new ErrorCollection();
		
		//подготовка параметров
		//Этот код **будет** выполняться при запуске аяксовых-действий
	}
	
	public function executeComponent()
	{
		//Внимание! Этот код **не будет** выполняться при запуске аяксовых-действий
	}
		
	//в параметр $person будут автоматически подставлены данные из REQUEST
	public function greetAction($person = 'guest')
	{
		return "Hi {$person}!";
	}

	//пример обработки ошибок
	public function showMeYourErrorAction():? string
	{
		if (rand(3, 43) === 42)
		{
			$this->errorCollection[] = new Error('You are so beautiful or so handsome');
			//теперь в ответе будут ошибки и будет автоматически выставлен статус ответа 'error'. 
			
			return  null;					
		}

		return "Ok";
	}
	
	/**
	 * Getting array of errors.
	 * @return Error[]
	 */
	public function getErrors()
	{
		return $this->errorCollection->toArray();
	}

	/**
	 * Getting once error with the necessary code.
	 * @param string $code Code of error.
	 * @return Error
	 */
	public function getErrorByCode($code)
	{
		return $this->errorCollection->getErrorByCode($code);
	}
}

ajax.php

Обработчик контроллера запросов в файле ajax.php позволяет создать легковесный обработчик аякс-запросов, явно выделяя логику из компонента.

Чтобы его реализовать:

  • Создать в корне компонента файл ajax.php
  • Определить метод-действия с суффиксом Action

Сама логика работы контроллера полностью аналогично описанию контроллера модуля.

<?php
#components/bitrix/example/ajax.php

if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();

class ExampleAjaxController extends \Bitrix\Main\Engine\Controller
{
	#в параметр $person будут автоматически подставлены данные из REQUEST
	public function sayByeAction($person = 'guest')
	{
		return "Goodbye {$person}";
	}

	public function listUsersAction(array $filter)
	{
		$users = [];
		//выборка пользователей по фильтру
		//наполнения массива данными для ответа
		
		return $users;
	}
}

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

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