Определение шагов мастера
Определение шагов мастера
Чтобы создать мастер, нужно в файле 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();
?>