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

Пример создания списка элементов

Описание создания административной страницы со списком можно увидеть здесь.

Пример

<?php
use Bitrix\Main\Loader;
use Bitrix\Main\Localization\Loc;

// подключим все необходимые файлы:
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php"); // первый общий пролог

Loader::includeModule('subscribe'); // инициализация модуля
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/subscribe/prolog.php"); // пролог модуля

// явного подключения языкового файла не требуется

// получим права доступа текущего пользователя на модуль
$POST_RIGHT = $APPLICATION->GetGroupRight("subscribe");
// если нет прав - отправим к форме авторизации с сообщением об ошибке
if ($POST_RIGHT == "D")
	$APPLICATION->AuthForm(Loc::getMessage("ACCESS_DENIED"));

$sTableID = "tbl_rubric"; // ID таблицы
$oSort = new CAdminSorting($sTableID, "ID", "desc"); // объект сортировки
$lAdmin = new CAdminList($sTableID, $oSort); // основной объект списка
$by = mb_strtoupper($lAdmin->getField());
$order = mb_strtoupper($lAdmin->getOrder());

// ******************************************************************** //
//                           ФИЛЬТР                                     //
// ******************************************************************** //

// *********************** CheckFilter ******************************** //
// проверку значений фильтра для удобства вынесем в отдельную функцию
function CheckFilter()
{
	global $FilterArr, $lAdmin;
	foreach ($FilterArr as $f) global $$f;

	// В данном случае проверять нечего. 
	// В общем случае нужно проверять значения переменных $find_имя
	// и в случае возниконовения ошибки передавать ее обработчику 
	// посредством $lAdmin->AddFilterError('текст_ошибки').
  
	return count($lAdmin->arFilterErrors)==0; // если ошибки есть, вернем false;
}
// *********************** /CheckFilter ******************************* //

// опишем элементы фильтра
$FilterArr = Array(
  "find",
  "find_type",
  "find_id",
  "find_lid",
  "find_active",
  "find_visible",
  "find_auto",
);

// инициализируем фильтр
$lAdmin->InitFilter($FilterArr);

// если все значения фильтра корректны, обработаем его
if (CheckFilter())
{
	// создадим массив фильтрации для выборки CRubric::GetList() на основе значений фильтра
	$arFilter = Array(
		"ID"    => ($find!="" && $find_type == "id"? $find:$find_id),
		"LID"    => $find_lid,
		"ACTIVE"  => $find_active,
		"VISIBLE"  => $find_visible,
		"AUTO"    => $find_auto,
	);
}


// ******************************************************************** //
//                ОБРАБОТКА ДЕЙСТВИЙ НАД ЭЛЕМЕНТАМИ СПИСКА              //
// ******************************************************************** //

// сохранение отредактированных элементов
if($lAdmin->EditAction() && $POST_RIGHT=="W")
{
	// пройдем по списку переданных элементов
	foreach($lAdmin->GetEditFields() as $ID=>$arFields)
	{ 
    
		// сохраним изменения каждого элемента
		$DB->StartTransaction();
		$ID = IntVal($ID);
		$cData = new CRubric;
		if(($rsData = $cData->GetByID($ID)) && ($arData = $rsData->Fetch()))
		{
			foreach($arFields as $key=>$value)
				$arData[$key]=$value;
			if(!$cData->Update($ID, $arData))
			{
				$lAdmin->AddGroupError(Loc::getMessage("rub_save_error")." ".$cData->LAST_ERROR, $ID);
				$DB->Rollback();
			}
		}
		else
		{
			$lAdmin->AddGroupError(Loc::getMessage("rub_save_error")." ".Loc::getMessage("rub_no_rubric"), $ID);
			$DB->Rollback();
		}
		$DB->Commit();
	}
}

// обработка одиночных и групповых действий
if(($arID = $lAdmin->GroupAction()) && $POST_RIGHT=="W")
{
// если выбрано "Для всех элементов"
if ($lAdmin->IsGroupActionToAll())
	{
		$cData = new CRubric;
		$rsData = $cData->GetList(array($by=>$order), $arFilter);
		while($arRes = $rsData->Fetch())
			$arID[] = $arRes['ID'];
	}

$action = $lAdmin->GetAction();

 // пройдем по списку элементов
	foreach($arID as $ID)
	{
		if(strlen($ID)<=0)
			continue;
		$ID = IntVal($ID);
        
		// для каждого элемента совершим требуемое действие
		switch($action)
		{
		// удаление
		case "delete":
			@set_time_limit(0);
			$DB->StartTransaction();
			if(!CRubric::Delete($ID))
			{
				$DB->Rollback();
				$lAdmin->AddGroupError(Loc::getMessage("rub_del_err"), $ID);
			}
			$DB->Commit();
			break;
    
		// активация/деактивация
		case "activate":
		case "deactivate":
			$cData = new CRubric;
			if(($rsData = $cData->GetByID($ID)) && ($arFields = $rsData->Fetch()))
			{
				$arFields["ACTIVE"]=($_REQUEST['action']=="activate"?"Y":"N");
				if(!$cData->Update($ID, $arFields))
					$lAdmin->AddGroupError(Loc::getMessage("rub_save_error").$cData->LAST_ERROR, $ID);
			}
			else
				$lAdmin->AddGroupError(Loc::getMessage("rub_save_error")." ".Loc::getMessage("rub_no_rubric"), $ID);
			break;
		}
	}
}

// ******************************************************************** //
//                ВЫБОРКА ЭЛЕМЕНТОВ СПИСКА                              //
// ******************************************************************** //

// выберем список рассылок
$cData = new CRubric;
$rsData = $cData->GetList(array($by=>$order), $arFilter);

// преобразуем список в экземпляр класса CAdminResult
$rsData = new CAdminResult($rsData, $sTableID);

// аналогично CDBResult инициализируем постраничную навигацию.
$rsData->NavStart();

// отправим вывод переключателя страниц в основной объект $lAdmin
$lAdmin->NavText($rsData->GetNavPrint(Loc::getMessage("rub_nav")));

// ******************************************************************** //
//                ПОДГОТОВКА СПИСКА К ВЫВОДУ                            //
// ******************************************************************** //

$lAdmin->AddHeaders(array(
	array(  "id"    =>"ID",
		"content"  =>"ID",
		"sort"    =>"id",
		"align"    =>"right",
		"default"  =>true,
	),
	array(  "id"    =>"NAME",
		"content"  =>Loc::getMessage("rub_name"),
		"sort"    =>"name",
		"default"  =>true,
	),
	array(  "id"    =>"LID",
		"content"  =>Loc::getMessage("rub_site"),
		"sort"    =>"lid",
		"default"  =>true,
	),
	array(  "id"    =>"SORT",
		"content"  =>Loc::getMessage("rub_sort"),
		"sort"    =>"sort",
		"align"    =>"right",
		"default"  =>true,
	),
	array(  "id"    =>"ACTIVE",
		"content"  =>Loc::getMessage("rub_act"),
		"sort"    =>"act",
		"default"  =>true,
	),
	array(  "id"    =>"VISIBLE",
		"content"  =>Loc::getMessage("rub_visible"),
		"sort"    =>"visible",
		"default"  =>true,
	),
	array(  "id"    =>"AUTO",
		"content"  =>Loc::getMessage("rub_auto"),
		"sort"    =>"auto",
		"default"  =>true,
	),
	array(  "id"    =>"LAST_EXECUTED",
		"content"  =>Loc::getMessage("rub_last_exec"),
		"sort"    =>"last_executed",
		"default"  =>true,
	),
));

while($arRes = $rsData->NavNext(true, "f_")):
  
	// создаем строку. результат - экземпляр класса CAdminListRow
	$row =& $lAdmin->AddRow($f_ID, $arRes); 
  
	// далее настроим отображение значений при просмотре и редаткировании списка
  
	// параметр NAME будет редактироваться как текст, а отображаться ссылкой
	$row->AddInputField("NAME", array("size"=>20));
	$row->AddViewField("NAME", '<a href="rubric_edit.php?ID='.$f_ID.'&lang='.LANG.'">'.$f_NAME.'</a>');
  
	// параметр LID будет редактироваться в виде выпадающего списка языков
	$row->AddEditField("LID", CLang::SelectBox("LID", $f_LID)); 
  
	// параметр SORT будет редактироваться текстом
	$row->AddInputField("SORT", array("size"=>20)); 
  
	// флаги ACTIVE и VISIBLE будут редактироваться чекбоксами
	$row->AddCheckField("ACTIVE"); 
	$row->AddCheckField("VISIBLE");
  
	// параметр AUTO будет отображаться в виде "Да" или "Нет", полужирным при редактировании
	$row->AddViewField("AUTO", $f_AUTO=="Y"?Loc::getMessage("POST_U_YES"):Loc::getMessage("POST_U_NO")); 
	$row->AddEditField("AUTO", "<b>".($f_AUTO=="Y"?Loc::getMessage("POST_U_YES"):Loc::getMessage("POST_U_NO"))."</b>");

	// сформируем контекстное меню
	$arActions = Array();

	// редактирование элемента
	$arActions[] = array(
		"ICON"=>"edit",
		"DEFAULT"=>true,
		"TEXT"=>Loc::getMessage("rub_edit"),
		"ACTION"=>$lAdmin->ActionRedirect("rubric_edit.php?ID=".$f_ID)
	);
  
	// удаление элемента
	if ($POST_RIGHT>="W")
		$arActions[] = array(
			"ICON"=>"delete",
			"TEXT"=>Loc::getMessage("rub_del"),
			"ACTION"=>"if(confirm('".Loc::getMessage('rub_del_conf')."')) ".$lAdmin->ActionDoGroup($f_ID, "delete")
		);

	// вставим разделитель
	$arActions[] = array("SEPARATOR"=>true);

	// проверка шаблона для автогенерируемых рассылок
	if (strlen($f_TEMPLATE)>0 && $f_AUTO=="Y")
		$arActions[] = array(
			"ICON"=>"",
			"TEXT"=>Loc::getMessage("rub_check"),
			"ACTION"=>$lAdmin->ActionRedirect("template_test.php?ID=".$f_ID)
		);

	// если последний элемент - разделитель, почистим мусор.
	if(is_set($arActions[count($arActions)-1], "SEPARATOR"))
		unset($arActions[count($arActions)-1]);
  
	// применим контекстное меню к строке
	$row->AddActions($arActions);

endwhile;

// резюме таблицы
$lAdmin->AddFooter(
	array(
		array("title"=>Loc::getMessage("MAIN_ADMIN_LIST_SELECTED"), "value"=>$rsData->SelectedRowsCount()), // кол-во элементов
		array("counter"=>true, "title"=>Loc::getMessage("MAIN_ADMIN_LIST_CHECKED"), "value"=>"0"), // счетчик выбранных элементов
	)
);

// групповые действия
$lAdmin->AddGroupActionTable(Array(
	"delete"=>Loc::getMessage("MAIN_ADMIN_LIST_DELETE"), // удалить выбранные элементы
	"activate"=>Loc::getMessage("MAIN_ADMIN_LIST_ACTIVATE"), // активировать выбранные элементы
	"deactivate"=>Loc::getMessage("MAIN_ADMIN_LIST_DEACTIVATE"), // деактивировать выбранные элементы
));

// ******************************************************************** //
//                АДМИНИСТРАТИВНОЕ МЕНЮ                                 //
// ******************************************************************** //
  
// сформируем меню из одного пункта - добавление рассылки
$aContext = array(
	array(
		"TEXT"=>Loc::getMessage("POST_ADD"),
		"LINK"=>"rubric_edit.php?lang=".LANG,
		"TITLE"=>Loc::getMessage("POST_ADD_TITLE"),
		"ICON"=>"btn_new",
	),
);

// и прикрепим его к списку
$lAdmin->AddAdminContextMenu($aContext);

// ******************************************************************** //
//                ВЫВОД                                                 //
// ******************************************************************** //

// альтернативный вывод
$lAdmin->CheckListMode();

// установим заголовок страницы
$APPLICATION->SetTitle(Loc::getMessage("rub_title"));

// не забудем разделить подготовку данных и вывод
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_after.php");

// ******************************************************************** //
//                ВЫВОД ФИЛЬТРА                                         //
// ******************************************************************** //

// создадим объект фильтра
$oFilter = new CAdminFilter(
	$sTableID."_filter",
	array(
		"ID",
		Loc::getMessage("rub_f_site"),
		Loc::getMessage("rub_f_active"),
		Loc::getMessage("rub_f_public"),
		Loc::getMessage("rub_f_auto"),
	)
);

<form name="find_form" method="get" action="<?echo $APPLICATION->GetCurPage();?>">
<?php
$oFilter->Begin();
<tr>
	<td><b><?=Loc::getMessage("rub_f_find")?>:</b></td>
	<td>
		<input type="text" size="25" name="find" value="<?echo htmlspecialchars($find)?>" title="<?=Loc::getMessage("rub_f_find_title")?>">
		<?php
		$arr = array(
			"reference" => array(
			"ID",
		),
		"reference_id" => array(
			"id",
		)
	);
	echo SelectBoxFromArray("find_type", $arr, $find_type, "", "");

	</td>
</tr>
<tr>
	<td><?="ID"?>:</td>
	<td>
		<input type="text" name="find_id" size="47" value="<?echo htmlspecialchars($find_id)?>">
	</td>
</tr>
<tr>
	<td><?=Loc::getMessage("rub_f_site").":"?></td>
	<td><input type="text" name="find_lid" size="47" value="<?echo htmlspecialchars($find_lid)?>"></td>
</tr>
<tr>
	<td><?=Loc::getMessage("rub_f_active")?>:</td>
	<td>
		<?php
		$arr = array(
			"reference" => array(
			Loc::getMessage("POST_YES"),
			Loc::getMessage("POST_NO"),
		),
		"reference_id" => array(
			"Y",
			"N",
		)
	);
	echo SelectBoxFromArray("find_active", $arr, $find_active, Loc::getMessage("POST_ALL"), "");

	</td>
</tr>
<tr>
	<td><?=Loc::getMessage("rub_f_public")?>:</td>
	<td><?php
echo SelectBoxFromArray("find_visible", $arr, $find_visible, Loc::getMessage("POST_ALL"), "");</td>
</tr>
<tr>
	<td><?=Loc::getMessage("rub_f_auto")?>:</td>
	<td><?php
echo SelectBoxFromArray("find_auto", $arr, $find_auto, Loc::getMessage("POST_ALL"), "");</td>
</tr>
<?php
$oFilter->Buttons(array("table_id"=>$sTableID,"url"=>$APPLICATION->GetCurPage(),"form"=>"find_form"));
$oFilter->End();

</form>

<?php
// выведем таблицу списка элементов
$lAdmin->DisplayList();


<?php
// завершение страницы
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_admin.php");


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