Мастер создания нового пользователя
Данный пример демонстрирует следующие аспекты программирования мастеров:
- Обработку входных даннных;
- Обработку ошибок шага;
- Javascript-проверку входных данных;
- Работу с элементами Web-форм;
- Работу с переменными мастера.
<?
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
class MainUserFields extends CWizardStep
{
function InitStep()
{
//ID шага
$this->SetStepID("main_fields");
//Заголовок
$this->SetTitle("Основные поля пользователя");
$this->SetSubTitle("Введите логин, пароль и e-mail нового пользователя");
//Навигация
$this->SetNextStep("additional_fields");
$this->SetCancelStep("cancel");
$wizard =& $this->GetWizard(); // Получаем ссылку на объект мастера
$wizard->SetDefaultVar("active", "Y"); //Устанавливаем значение по умолчанию
}
function OnPostForm()
{
$wizard =& $this->GetWizard();
if ($wizard->IsCancelButtonClick())
return;
$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");
}
$password = $wizard->GetVar("password");
if (strlen($password) < 6)
$this->SetError("Пароль должен быть не меньше 6 символов", "password");
$email = $wizard->GetVar("email");
if (strlen($email) < 3 || !check_email($email))
$this->SetError("Вы ввели неверный E-mail", "email");
}
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>';
$wizard =& $this->GetWizard();
$formName = $wizard->GetFormName();
$nextButton = $wizard->GetNextButtonID();
$login = $wizard->GetRealName("login");
$password = $wizard->GetRealName("password");
$email = $wizard->GetRealName("email");
$this->content .= <<<JS
<script type="text/javascript">
function CheckMainFields()
{
var form = document.forms["{$formName}"];
if (!form)
return;
var login = form.elements["{$login}"].value;
var password = form.elements["{$password}"].value;
var email = form.elements["{$email}"].value;
var error = "";
if (login.length < 3)
error += "Логин должен быть больше 3 символов.\\n";
if (password.length < 6)
error += "Пароль должен быть не меньше 6 символов.\\n";
if (email.length < 3)
error += "Вы ввели неверный E-mail.\\n";
if (error.length > 0)
{
alert(error);
return false;
}
}
function AttachEvent()
{
var form = document.forms["{$formName}"];
if (!form)
return;
var nextButton = form.elements["{$nextButton}"];
if (!nextButton)
return;
nextButton.onclick = CheckMainFields;
}
if (window.addEventListener)
window.addEventListener("load", AttachEvent, false);
else if (window.attachEvent)
window.attachEvent("onload", AttachEvent);
//setTimeout(AttachEvent, 500);
</script>
JS;
}
}
class AddtionalUserFields extends CWizardStep
{
function InitStep()
{
//ID шага
$this->SetStepID("additional_fields");
//Заголовок
$this->SetTitle("Дополнительные поля пользователя");
$this->SetSubTitle("Введите дополнительные поля нового пользователя");
//Навигация
$this->SetPrevStep("main_fields");
$this->SetNextStep("user_summary");
$this->SetCancelStep("cancel");
$wizard =& $this->GetWizard();
$wizard->SetDefaultVar("group_id", "2");
}
function OnPostForm()
{
$this->SaveFile("photo", Array("max_file_size" => 1024*50, "extensions" => "gif,jpg,png"));
}
function ShowStep()
{
$wizard =& $this->GetWizard();
$this->content .= '<table class="wizard-data-table">';
$this->content .= '<tr><th align="right">Пол:</th><td>';
$this->content .= $this->ShowRadioField("sex", "M", Array("id" => "sex_m")).'<label for="sex_m">Мужской</lable>';
$this->content .= $this->ShowRadioField("sex", "F", Array("id" => "sex_f")).'<label for="sex_f">Женский</lable>';
$this->content .= '</td></tr>';
$this->content .= '<tr><th align="right">Фото<br />(max. 50кб, <br />JPG, GIF, PNG):</th><td>';
$this->content .= $this->ShowFileField("photo", Array("size" => 25, "max_file_size" => 1024*50));
$this->content .= "<br />".CFile::ShowImage($wizard->GetVar("photo"), 150, 150, "border=0", "", true);
$this->content .= '</td></tr>';
$obGroup = CGroup::GetList($by="name", $order="asc");
$arSelectGroup = Array();
while ($arGroup = $obGroup->Fetch())
$arSelectGroup[$arGroup["ID"]] = htmlspecialchars($arGroup["NAME"]);
$this->content .= '<tr><th align="right" valign="top">Группа:</th><td>';
$this->content .= $this->ShowSelectField("group_id[]", $arSelectGroup , Array("multiple" => "multiple", "size" => "10"));
$this->content .= '</td></tr>';
$this->content .= '</table>';
}
}
class UserSummary extends CWizardStep
{
function InitStep()
{
$this->SetStepID("user_summary");
//Заголовок
$this->SetTitle("Создание пользователя");
$this->SetSubTitle("Нажмите кнопку <i>Создать</i>, чтобы добавить нового пользователя");
//Навигация
$this->SetPrevStep("additional_fields");
$this->SetNextStep("success");
$this->SetNextCaption("Создать");
$this->SetCancelStep("cancel");
}
function OnPostForm()
{
$wizard =& $this->GetWizard();
if (!$wizard->IsNextButtonClick())
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"),
"GROUP_ID" => $wizard->GetVar("group_id"),
"PASSWORD" => $wizard->GetVar("password"),
"CONFIRM_PASSWORD" => $wizard->GetVar("password"),
"PERSONAL_GENDER" => $wizard->GetVar("sex")
);
$photo = intval($wizard->GetVar("photo"));
if ($photo > 0)
$arFields["PERSONAL_PHOTO"] = CFile::MakeFileArray($photo) + Array("MODULE_ID" => "main");
$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 .= "Текущие настройки:<br /><br />";
$wizard =& $this->GetWizard();
$this->content .= "<i>Логин</i>: ".htmlspecialchars($wizard->GetVar("login"))."<br />";
$this->content .= "<i>E-mail</i>: ".htmlspecialchars($wizard->GetVar("email"))."<br />";
$user_name = $wizard->GetVar("user_name");
if (strlen($user_name) > 0)
$this->content .= "<i>Имя</i>: ".htmlspecialchars($user_name)."<br />";
$user_surname = $wizard->GetVar("user_surname");
if (strlen($user_surname) > 0)
$this->content .= "<i>Фамилия</i>: ".htmlspecialchars($user_surname)."<br />";
$sex = $wizard->GetVar("sex");
if (strlen($sex) > 0)
$this->content .= "<i>Пол</i>: ".($sex == "M" ? "Мужской": "Женский")."<br />";
$photo = $wizard->GetVar("photo");
if (intval($photo) > 0)
{
$this->content .= <i>Фото</i>:<br />";
$this->content .= CFile::ShowImage($photo, 150, 150, "border=0", "", true);
}
}
}
class SuccessStep extends CWizardStep
{
function InitStep()
{
//ID шага
$this->SetStepID("success");
//Заголовок
$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 .= "Мастер создания нового пользователя прерван. Новый пользователь не был создан.";
}
}
?>
Статическое определение шагов в файле .description.php:
<?
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
$arWizardDescription = Array(
"NAME" => "Мастер создания нового пользователя",
"STEPS" => Array("MainUserFields", "AddtionalUserFields", "UserSummary", "SuccessStep", "CancelStep")
);
?>
Или динамическое определение в файле wizard.php:
<?
$wizard = new CWizardBase("Мастер создания нового пользователя", $package);
$wizard->AddSteps(Array("MainUserFields", "AddtionalUserFields", "UserSummary", "SuccessStep", "CancelStep"));
$wizard->Display();
?>
© «Битрикс», 2001-2025, «1С-Битрикс», 2025