Документация для разработчиков
Темная тема

Определение шагов мастера

Определение шагов мастера

Чтобы создать мастер, нужно в файле wizard.php определить все шаги и их содержимое. Каждый шаг определяется классом, который обязательно должен наследоваться от класса CWizardStep. В классе шага необходимо переопределить 3 метода:

  • InitStep – вызывается при добавлении шага в мастер. Метод предназначен для инициализации свойств шага: идентификатора (ID), заголовка, подзаголовка, кнопок перехода на следующие шаги и др. В этом методе обязательно нужно определить ID шага;
  • ShowStep – вызывается в момент показа шага пользователю. Метод предназначен для определения содержимого шага: в переменную $this->content необходимо записать весь вывод шага;
  • OnPostForm – вызывается при нажатии на любую из кнопок навигации мастера. В этом методе можно проверить входные данные, вернуть ошибки, изменить текущий шаг, выполнить любые другие действия;

Методы ShowStep и OnPostForm переопределять необязательно. Метод InitStep обязательно должен присутствовать в классе, т.к. в нем с помощью функции SetStepID определяется ID шага. В случае динамического определения шагов устанавливать ID шага в InitStep необязательно.

Класс СWizardBase является оболочкой мастера и содержит методы общие для всех шагов (работа с переменными мастера, управление кнопками навигации и др.). Для каждого подключаемого мастера создаётся экземпляр класса СWizardBase. Для получения доступа к методам класса СWizardBase в теле переопределяемых функций (InitStep, ShowStep, OnPostFrom) нужно получить объект мастера с помощью метода CWizardStep::GetWizard:

$wizard =& $this->GetWizard(); //Получаем ссылку на объект мастера
$myVar = $wizard->GetVar("myVar"); //Используем метод мастера (класс CWizardBase)

Для каждого шага, добавляемого в мастер, создаётся экземпляр класса CWizardStep. В переопределяемых функциях шага методы класса CWizardStep доступны через переменную-псевдоним $this. Каждый шаг мастера сам определяет, какие кнопки навигации (Назад, Далее, Готово, Отмена) будут показаны, и на какой шаг они будут вести. Названия кнопок можно изменить по своему усмотрению. Как правило, содержимое шага представляет собой набор полей Web-формы. Для упрощения работы с элементами Web-формы класс CWizardStep содержит методы для создания текстовых полей, переключателей, флажков и др.

Пример определения шагов мастера в файле wizard.php:

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

class MainUserFields extends CWizardStep
{
	function InitStep()
	{
		$this->SetStepID("main_fields");//ID шага

		$this->SetTitle("Основные поля пользователя");//Заголовок
		$this->SetSubTitle("Введите логин, пароль и e-mail нового пользователя"); //Подзаголовок

		//Навигация
		$this->SetNextStep("success");
		$this->SetCancelStep("cancel");

		$wizard =& $this->GetWizard(); // Получаем ссылку на объект мастера
		$wizard->SetDefaultVar("active", "Y"); //Устанавливаем значение по умолчанию
	}

	function OnPostForm()
	{
		$wizard =& $this->GetWizard();

		if ($wizard->IsCancelButtonClick())
			return;

		$success = true;
		$login = $wizard->GetVar("login");
		if (strlen($login) < 3)
			$this->SetError("Логин должен быть больше 3 символов", "login");
		else
		{
			$obUser = CUser::GetList($by="id", $order="desc", Array("LOGIN_EQUAL" => $login));
			if ($obUser->Fetch())
			{
				$this->SetError("Такой логин уже существует", "login");
				$success = false;
			}
		}

		$password = $wizard->GetVar("password");
		if (strlen($password) < 6)
		{
			$this->SetError("Пароль должен быть не меньше 6 символов", "password");
			$success = false;
		}

		$email = $wizard->GetVar("email");
		if (strlen($email) < 3 || !check_email($email))
		{
			$this->SetError("Вы ввели неверный E-mail", "email");
			$success = false;
		}

		if (!$success)
			return;

		//Добавляем пользователя
		$user = new CUser;
		$arFields = Array(
			"NAME" => $wizard->GetVar("user_name"),
			"LAST_NAME" => $wizard->GetVar("user_surname"),
			"EMAIL" => $wizard->GetVar("email"),
			"LOGIN" => $wizard->GetVar("login"),
			"ACTIVE" => ($wizard->GetVar("active") == "Y" ? "Y" : "N"),
			"PASSWORD" => $wizard->GetVar("password"),
			"CONFIRM_PASSWORD" => $wizard->GetVar("password"),
		);

		$userID = $user->Add($arFields);
		if (intval($userID) > 0)
		{
			$wizard->SetVar("userID", $userID);
			CFile::Delete($photo); //Удаляем временный файл
		}
		else
			$this->SetError($user->LAST_ERROR);
	}

	function ShowStep()
	{
		$this->content .= '<table class="wizard-data-table">';

		$this->content .= '<tr><th align="right">Активен:</th><td>'.$this->ShowCheckBoxField("active", "Y").'</td></tr>';

		$this->content .= '<tr><th align="right"><span class="wizard-required">*</span>Логин (мин. 3 символа):</th><td>';
		$this->content .= $this->ShowInputField("text", "login", Array("size" => 25));
		$this->content .= '</td></tr>';

		$this->content .= '<tr><th align="right"><span class="wizard-required">*</span>Пароль (мин. 6 символов):</th><td>';
		$this->content .= $this->ShowInputField("password", "password", Array("size" => 25));
		$this->content .='</td></tr>';

		$this->content .= '<tr><th align="right"><span class="wizard-required">*</span>E-mail:</th><td>';
		$this->content .= $this->ShowInputField("text", "email", Array("size" => 25));
		$this->content .= '</td></tr>';

		$this->content .= '<tr><th align="right">Имя:</th><td>'.$this->ShowInputField("text", "user_name", Array("size" => 25)).'</td></tr>';
		$this->content .= '<tr><th align="right">Фамилия:</th><td>'.$this->ShowInputField("text", "user_surname", Array("size" => 25)).'</td></tr>';

		$this->content .= '</table>';
		$this->content .= '<br /><div class="wizard-note-box"><span class="wizard-required">*</span> Поля, обязательные для заполнения.</div>';
	}
}

class SuccessStep extends CWizardStep
{
	function InitStep()
	{
		$this->SetStepID("success");//ID шага
		$this->SetTitle("Работа мастера успешно завершена");//Заголовок
		//Навигация
		$this->SetCancelStep("success");
		$this->SetCancelCaption("Готово");
	}

	function ShowStep()
	{
		$this->content .= "Мастер успешно добавил нового пользователя. ";

		$wizard =& $this->GetWizard();
		$userID = intval($wizard->GetVar("userID"));
		if ($userID > 0)
			$this->content .= 'Идентификатор нового пользователя
				<a target="_blank" href="/bitrix/admin/user_edit.php?ID='.$userID.'&lang='.LANGUAGE_ID.'">'.$userID.'</a>';
	}
}

class CancelStep extends CWizardStep
{
	function InitStep()
	{
		$this->SetTitle("Мастер прерван");
		$this->SetStepID("cancel");
		$this->SetCancelStep("cancel");
		$this->SetCancelCaption("Закрыть");
	}

	function ShowStep()
	{
		$this->content .= "Мастер создания нового пользователя прерван. Новый пользователь не был создан.";
	}
}
?>

После того как мы определили классы в файле wizard.php, их имена необходимо описать в файле .description.php:

<?
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
$arWizardDescription = Array(
	"NAME" => "Мастер создания нового пользователя",
	"STEPS" => Array("MainUserFields", "SuccessStep", "CancelStep"), //Описание шагов
);
?>

Система автоматически создаст мастер и добавит в него шаги с названиями, описанные в файле .description.php.

Шаг ввода данных нового пользователя

После заполнения и отправки формы выведется окно с сообщением об удачном добавлении пользователя, либо об ошибке.

Динамическое определение шагов

Статическое описание шагов мастера в файле .description.php, облегчает задачу инициализации шагов мастера, но в то же время уменьшает гибкость. Часто необходимо инициализировать шаги мастера по какому-либо условию. При динамическом определении инициализация шагов происходит непосредственно в файле wizard.php, поэтому описывать названия классов в файле .description.php не нужно. В файле wizard.php необходимо создать объект мастера (экземпляр класса СWizardBase) и затем добавить в него объекты шагов c помощью методов AddStep или AddSteps. Метод Display выведет мастер на экран.

<?
//Создаем мастер
$wizard = new CWizardBase("Мастер создания нового пользователя", $package);

//Добавляем шаги
$wizard->AddStep(new MainUserFields);
$wizard->AddStep(new SuccessStep);
$wizard->AddStep(new CancelStep);

/*
Или с помощью AddSteps:
$wizard->AddSteps(Array("MainUserFields", "SuccessStep", "CancelStep"));
*/

//Выводим
$wizard->Display();
?>

Вторым параметром метод CWizardBase::AddStep может принимать ID добавляемого шага. При инициализации шага с помощью AddStep с указанным вторым параметром, в классе шага необязательно переопределять метод InitStep для установки ID шага с помощью метода SetStepID.

<?
//Создаем мастер
$wizard = new CWizardBase("Мастер создания нового пользователя", $package);

//Добавляем шаги с указанием идентификаторов
$wizard->AddStep(new MainUserFields, "main_fields");
$wizard->AddStep(new SuccessStep, "success");
$wizard->AddStep(new CancelStep, "cancel");

//Выводим
$wizard->Display();
?>

Вы также можете динамически задать свойства мастера и шагов:

<?
//Создаем мастер
$wizard = new CWizardBase("Мастер создания нового пользователя", $package);

//Устнавим значение по уомлчанию для поля Логин
$wizard->SetDefaultVar("login", "new_user");

$mainStep = new MainUserFields;
//Изменим надпись кнопки Далее
$mainStep->SetNextCaption("Создать пользователя");

//Добавляем шаги
$wizard->AddStep($mainStep, "main_fields");
$wizard->AddStep(new SuccessStep, "success");
$wizard->AddStep(new CancelStep, "cancel");

//Выводим
$wizard->Display();
?>


© «Битрикс», 2001-2024, «1С-Битрикс», 2024