Стоит ли магазин на битрикс своих денег часть 3 (цены продолжение 1)
22.10.2016php, 1C-Bitrix
И так немного поколдовав над админкой у меня получилосьсделать полный редактор типа цен исходный код страницы списка:
<?php define("ADMIN_MODULE_NAME", "binliz.sale"); require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php"); IncludeModuleLangFile(__FILE__); IncludeModuleLangFile(__DIR__.'/menu.php'); if (!$USER->IsAdmin()) { $APPLICATION->AuthForm(GetMessage("ACCESS_DENIED")); } if (!CModule::IncludeModule(ADMIN_MODULE_NAME)) { $APPLICATION->AuthForm(GetMessage("ACCESS_DENIED")); } use Binliz\Main; use Bitrix\Main\Application; $APPLICATION->SetTitle(GetMessage("HEADER_TITLE")); CAdminMessage::ShowMessage($strError); $context = Application::getInstance()->getContext(); $request = $context->getRequest(); $flag = $request->isPost(); $sTableID = "tbl_binliz_sale_cataolg_price_type"; $oSort = new CAdminSorting($sTableID, "NAME", "asc"); $lAdmin = new CAdminList($sTableID, $oSort); // Действия // сохранение отредактированных элементов if($lAdmin->EditAction()) { // пройдем по списку переданных элементов foreach($FIELDS as $ID=>$arFields) { if(!$lAdmin->IsUpdated($ID)) continue; // сохраним изменения каждого элемента $DB->StartTransaction(); $ID = IntVal($ID); $cData = new Binliz\Sale\SaleCatalogPriceTypeTable; if(($rsData = $cData->GetByID($ID)) && ($arData = $rsData->Fetch())) { foreach($arFields as $key=>$value) $arData[$key]=$value; if(!$cData->Update($ID, $arData)) { $lAdmin->AddGroupError(GetMessage("rub_save_error")." ".$cData->LAST_ERROR, $ID); $DB->Rollback(); } } else { $lAdmin->AddGroupError(GetMessage("rub_save_error")." ".GetMessage("rub_no_rubric"), $ID); $DB->Rollback(); } $DB->Commit(); } } // обработка одиночных и групповых действий if(($arID = $lAdmin->GroupAction())) { // если выбрано "Для всех элементов" if($_REQUEST['action_target']=='selected') { $cData = new Binliz\Sale\SaleCatalogPriceTypeTable; $rsData = $cData->GetList(array( 'order'=>array($by=>$order), 'filter'=>array(),'select'=>array('ID'))); while($arRes = $rsData->Fetch()) $arID[] = $arRes['ID']; } // пройдем по списку элементов foreach($arID as $ID) { if(strlen($ID)<=0) continue; $ID = IntVal($ID); // для каждого элемента совершим требуемое действие switch($_REQUEST['action']) { // удаление case "delete": @set_time_limit(0); $DB->StartTransaction(); if(!Binliz\Sale\SaleCatalogPriceTypeTable::Delete($ID)) { $DB->Rollback(); $lAdmin->AddGroupError(GetMessage("rub_del_err"), $ID); }else{ $resulgroup = \Binliz\Sale\SaleCatalogPriceTypeGroupTable::GetList(array('filter'=>array('PRICE_TYPE'=>$ID),'select'=>array('ID'))); $needDelete = array(); while($rcGrp = $resulgroup->Fetch()){ $needDelete[] = $rcGrp['ID']; } foreach($needDelete as $ElGroupID){ \Binliz\Sale\SaleCatalogPriceTypeGroupTable::Delete($ElGroupID); } } $DB->Commit(); break; // активация/деактивация case "activate": case "deactivate": $cData = new Binliz\Sale\SaleCatalogPriceTypeTable; if(($rsData = $cData->GetByID($ID)) && ($arFields = $rsData->Fetch())) { $arFields["ACTIVE"]=($_REQUEST['action']=="activate"?1:0); if(!$cData->Update($ID, $arFields)) $lAdmin->AddGroupError(GetMessage("rub_save_error").$cData->LAST_ERROR, $ID); } else $lAdmin->AddGroupError(GetMessage("rub_save_error")." ".GetMessage("rub_no_rubric"), $ID); break; } } } //var_dump($_REQUEST); // --- Действия $arHeaders = array( array("id"=>"ID", "content"=>"ID", "sort"=>"ID", "default"=>true), array("id"=>"SORT", "content"=>GetMessage('HEAD_SORT'), "sort"=>"SORT","default"=>true), array("id"=>"NAME", "content"=>GetMessage('HEAD_NAME'), "sort"=>"NAME", "default"=>true), array("id"=>"ACTIVE", "content"=>GetMessage('HEAD_ACTIVE'), "sort"=>"ACTIVE","default"=>true) ); $lAdmin->AddHeaders($arHeaders); // menu if ($_REQUEST["mode"] !== "list") { $aMenu = array( array( "TEXT" => GetMessage('BUTTON_ADD'), "TITLE" => GetMessage('BUTTON_ADD'), "LINK" => "binliz_store_price_types_edit.php?lang=".LANGUAGE_ID, "ICON" => "btn_new", ) ); $context = new CAdminContextMenu($aMenu); } $aContext = array( array( "TEXT" => GetMessage('BUTTON_ADD'), "TITLE" => GetMessage('BUTTON_ADD'), "LINK" => "binliz_store_price_types_edit.php?lang=".LANGUAGE_ID, "ICON" => "btn_new", ) ); // и прикрепим его к списку $lAdmin->AddAdminContextMenu($aContext); // select data $rsData = Binliz\Sale\SaleCatalogPriceTypeTable::getList(array( "select" => $lAdmin->GetVisibleHeaderColumns(), "order" => array($by => strtoupper($order)) )); $rsData = new CAdminResult($rsData, $sTableID); $rsData->NavStart(); // build list $lAdmin->NavText($rsData->GetNavPrint(GetMessage("PAGES"))); while($arRes = $rsData->NavNext(true, "f_")) { $row = $lAdmin->AddRow($f_ID, $arRes); if($f_ACTIVE) $row->AddViewField("ACTIVE", "Y"); else $row->AddViewField("ACTIVE", "N"); $can_edit = true; $arActions = Array(); $arActions[] = array( "ICON"=>"edit", "TEXT"=>GetMessage($can_edit ? "MAIN_ADMIN_MENU_EDIT" : "MAIN_ADMIN_MENU_VIEW"), "ACTION"=>$lAdmin->ActionRedirect("binliz_store_price_types_edit.php?ID=".$f_ID) ); $arActions[] = array( "ICON"=>"delete", "TEXT" => GetMessage("MAIN_ADMIN_MENU_DELETE"), "ACTION"=>"if(confirm('".GetMessage('rub_del_conf')."')) ".$lAdmin->ActionDoGroup($f_ID, "delete") ); $row->AddActions($arActions); } $lAdmin->AddFooter( array( array("title"=>GetMessage("MAIN_ADMIN_LIST_SELECTED"), "value"=>$rsData->SelectedRowsCount()), // кол-во элементов array("counter"=>true, "title"=>GetMessage("MAIN_ADMIN_LIST_CHECKED"), "value"=>"0"), // счетчик выбранных элементов ) ); // групповые действия $lAdmin->AddGroupActionTable(Array( "delete"=>GetMessage("MAIN_ADMIN_LIST_DELETE"), // удалить выбранные элементы "activate"=>GetMessage("MAIN_ADMIN_LIST_ACTIVATE"), // активировать выбранные элементы "deactivate"=>GetMessage("MAIN_ADMIN_LIST_DEACTIVATE"), // деактивировать выбранные элементы )); // view if ($_REQUEST["mode"] == "list" || $_REQUEST["mode"] == "frame") { require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_js.php"); } else { require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_after.php"); $context->Show(); } $lAdmin->CheckListMode(); $lAdmin->DisplayList(); if ($_REQUEST["mode"] == "list" || $_REQUEST["mode"] == "frame") require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_admin_js.php"); else require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_admin.php");
И детальная страница
<?php define("ADMIN_MODULE_NAME", "binliz.sale"); require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php"); IncludeModuleLangFile(__FILE__); IncludeModuleLangFile(__DIR__.'/menu.php'); if (!$USER->IsAdmin()) { $APPLICATION->AuthForm(GetMessage("ACCESS_DENIED")); } if (!CModule::IncludeModule(ADMIN_MODULE_NAME)) { $APPLICATION->AuthForm(GetMessage("ACCESS_DENIED")); } use Binliz\Main; use Bitrix\Main\Application; $APPLICATION->SetTitle(GetMessage("HEADER_TITLE")); $context = Application::getInstance()->getContext(); $request = $context->getRequest(); $flag = $request->isPost(); if($flag && check_bitrix_sessid()){ $ID = $request->getPost('ID'); $save = $request->getPost('save'); $apply = $request->getPost('apply'); $updateArr=$request->getPostList()->toArray(); $keys = array(); $rsData = \Binliz\Sale\SaleCatalogPriceTypeTable::GetMap(); foreach($rsData as $key=>$item){ if($item instanceof Bitrix\Main\Entity\ReferenceField);else $keys[] = $key; } $updateArrNonFree = $updateArr; $updateArr = array_intersect_key($updateArr,array_flip($keys)); if($request->getPost('Update') == "Y"){ } if($updateArr){ if($ID>0){ $rsData = \Binliz\Sale\SaleCatalogPriceTypeTable::update($ID,$updateArr); } else{ $rsData = \Binliz\Sale\SaleCatalogPriceTypeTable::add($updateArr); } if($rsData->isSuccess()){ $elementID = $rsData->getId(); if($updateArrNonFree['USER_GROUP_BUY']){ // Список групп которые уже есть $resulgroup = \Binliz\Sale\SaleCatalogPriceTypeGroupTable::GetList(array('filter'=>array('PRICE_TYPE'=>$elementID),'select'=>array('GROUP_ID','ID'))); $isIn = array(); $needAdd = array(); $needDelete = array(); while($rcGrp = $resulgroup->Fetch()){ $isIn[] = $rcGrp['GROUP_ID']; if(in_array($rcGrp['GROUP_ID'],$updateArrNonFree['USER_GROUP_BUY'])) ; else $needDelete[] = $rcGrp['ID']; } $needAdd = array_intersect($updateArrNonFree['USER_GROUP_BUY'],$isIn); foreach($needDelete as $ElGroupID){ \Binliz\Sale\SaleCatalogPriceTypeGroupTable::Delete($ElGroupID); } foreach($updateArrNonFree['USER_GROUP_BUY'] as $group){ if(!in_array($group,$needAdd)) \Binliz\Sale\SaleCatalogPriceTypeGroupTable::add(array('PRICE_TYPE'=>$elementID, 'GROUP_ID'=>$group)); } } } if($save){ LocalRedirect('/bitrix/admin/binliz_store_price_types.php'); } } } if($request->getQuery('action') == "delete" && check_bitrix_sessid()){ $ID = $request->getQuery('ID'); $rsData = \Binliz\Sale\SaleCatalogPriceTypeTable::Delete($ID); LocalRedirect('/bitrix/admin/binliz_store_price_types.php'); } if($ID){ $res = Binliz\Main\ElementReviewTable::GetById($ID); $arCatalogGroup = $res->Fetch(); } $arUserGroupList = []; $rsUserGroups = CGroup::GetList(($by="sort"), ($order="asc")); while ($arGroup = $rsUserGroups->Fetch()) { $arUserGroupList[] = array( 'ID' => intval($arGroup['ID']), 'NAME' => $arGroup['NAME'], ); } $arGroupUserList = []; $arCatalogGroup = [ 'ACTIVE'=>1, 'SORT'=>100, ]; if($ID){ $res = Binliz\Sale\SaleCatalogPriceTypeGroupTable::GetList(array('filter'=>array('PRICE_TYPE'=>$ID),'select'=>array('GROUP_ID','ID'))); while($arOneGList = $res->Fetch()){ $arGroupUserList[] = $arOneGList['GROUP_ID']; } $res = Binliz\Sale\SaleCatalogPriceTypeTable::GetById($ID); $arCatalogGroup = $res->Fetch(); } // view if ($_REQUEST["mode"] == "list") { require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_js.php"); } else { require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_after.php"); } CAdminMessage::ShowMessage($strError); ?> <form method="POST" action="<?echo $sDocPath ?>?lang=<?echo LANG ?>" ENCTYPE="multipart/form-data" name="dataload" id="dataload"> <input type="hidden" name="Update" value="Y"> <input type="hidden" name="lang" value="<?echo LANGUAGE_ID ?>"> <input type="hidden" name="ID" value="<?echo $ID ?>"> <?=bitrix_sessid_post()?> <? $aTabs = array( array( "DIV" => "edit1", "TAB" => "Настройка типа цены" , "ICON" => "iblock", "TITLE" => "", ) ); $tabControl = new CAdminTabControl("tabControl", $aTabs, false, true); $tabControl->Begin(); $tabControl->BeginNextTab(); ?> <? if ($ID>0):?> <tr> <td width="40%">ID:</td> <td width="60%"><?echo $ID ?></td> </tr> <?endif;?> <tr> <td width="40%"><?echo GetMessage("FIELD_ACTIVE") ?></td> <td width="60%"> <input type="hidden" name="ACTIVE" id="IS_ACTIVE_N" value="0"> <input type="checkbox" name="ACTIVE" id="IS_ACTIVE_Y" value="1" <?if($arCatalogGroup['ACTIVE'] ==1) echo "checked";?>> </td> </tr> <tr class="adm-detail-required-field"> <td width="40%"><?echo GetMessage("FIELD_NAME") ?></td> <td width="60%"><input type="text" name="NAME" value="<? echo htmlspecialcharsbx($arCatalogGroup['NAME']); ?>"></td> </tr> <tr> <td width="40%"><?echo GetMessage("FIELD_SORT") ?></td> <td width="60%"><input type="text" name="SORT" value="<? echo intval($arCatalogGroup['SORT']); ?>"></td> </tr> <tr class="adm-detail-required-field"> <td valign="top" width="40%"> <?echo GetMessage('FIELD_GROUP');?> </td> <td width="60%"> <select name="USER_GROUP_BUY[]" multiple size="8"> <? foreach ($arUserGroupList as &$arOneGroup) { ?><option value="<? echo $arOneGroup["ID"]; ?>"<?if (in_array($arOneGroup["ID"], $arGroupUserList)) echo " selected"?>><? echo "[".$arOneGroup["ID"]."] ".htmlspecialcharsex($arOneGroup["NAME"]); ?></option><? } if (isset($arOneGroup)) unset($arOneGroup); ?> </select> </td> </tr> <? $tabControl->EndTab(); $tabControl->Buttons(array("disabled"=>false,"back_url"=>'binliz_store_price_types.php?lang='.LANGUAGE_ID)); ?> <?$tabControl->End();?> </form> <? if ($_REQUEST["mode"] == "list") require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_admin_js.php"); else require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_admin.php");
Внешний вид страниц стал следующий