Advertisement
Guest User

Untitled

a guest
Mar 13th, 2018
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 15.78 KB | None | 0 0
  1. <?php
  2. use Bitrix\Main,
  3.     Bitrix\Main\Loader,
  4.     Bitrix\Main\Context,
  5.     Bitrix\Main\Localization\Loc;
  6.  
  7. if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true)
  8.     die();
  9.  
  10. class DTKUsersEdit  extends CBitrixComponent
  11. {
  12.    
  13.     /**
  14.      * ID пользователя
  15.      */
  16.     protected $userId = 0;
  17.    
  18.     /**
  19.      * Содержит данные запроса
  20.      */
  21.     protected $context;
  22.     protected $request;
  23.  
  24.     /**
  25.      * Значения полей
  26.      */
  27.     protected $fieldsValues = array();
  28.    
  29.     /**
  30.      * Значения полей переданные через POST
  31.      */
  32.     protected $requestValues = array();
  33.    
  34.     /**
  35.      * Список полей формы
  36.      */
  37.     protected $formFields = array();
  38.    
  39.     /**
  40.      * Массив значений полей
  41.      */
  42.     protected $updateValues = array();
  43.    
  44.     /**
  45.      * Массив значений полей для добавления\редактирования
  46.      */
  47.     protected $fieldsUpdateValues = array();
  48.    
  49.     /**
  50.      * Статус добавления \ редактирования пользователя
  51.      */
  52.     protected $success = false;
  53.    
  54.     /**
  55.      * Список ошибок
  56.      */
  57.     protected $errors = array();
  58.    
  59.     /**
  60.      * Список полей пользователей
  61.      */
  62.     protected $arUserFields = array(
  63.         'ID',
  64.         'LOGIN',
  65.         'EMAIL',
  66.         'NAME',
  67.         'LAST_NAME',
  68.         'SECOND_NAME',
  69.         'PERSONAL_BIRTHDAY',
  70.         'PERSONAL_PROFESSION',
  71.         'PERSONAL_WWW',
  72.         'PERSONAL_ICQ',
  73.         'PERSONAL_GENDER',
  74.         'PERSONAL_PHOTO',
  75.         'PERSONAL_PHONE',
  76.         'PERSONAL_FAX',
  77.         'PERSONAL_MOBILE',
  78.         'PERSONAL_PAGER',
  79.         'PERSONAL_STREET',
  80.         'PERSONAL_MAILBOX',
  81.         'PERSONAL_CITY',
  82.         'PERSONAL_STATE',
  83.         'PERSONAL_ZIP',
  84.         'PERSONAL_COUNTRY',
  85.         'PERSONAL_NOTES',
  86.         'WORK_COMPANY',
  87.         'WORK_DEPARTMENT',
  88.         'WORK_POSITION',
  89.         'WORK_WWW',
  90.         'WORK_PHONE',
  91.         'WORK_FAX',
  92.         'WORK_PAGER',
  93.         'WORK_STREET',
  94.         'WORK_MAILBOX',
  95.         'WORK_CITY',
  96.         'WORK_STATE',
  97.         'WORK_ZIP',
  98.         'WORK_COUNTRY',
  99.         'WORK_PROFILE',
  100.         'WORK_NOTES',
  101.         'ADMIN_NOTES',
  102.         'WORK_LOGO',
  103.         'XML_ID',
  104.         'PASSWORD'
  105.     );
  106.  
  107.     /**
  108.      * Подключение ланговых файлов
  109.      */
  110.     public function onIncludeComponentLang()
  111.     {
  112.         $this->includeComponentLang(basename(__FILE__));
  113.         Loc::loadMessages(__FILE__);
  114.     }
  115.    
  116.     /**
  117.      * Обработка параметров компонента
  118.      */
  119.     public function onPrepareComponentParams($arParams)
  120.     {  
  121.         $this->userId = intval($arParams['USER_ID']);
  122.         return $arParams;
  123.     }
  124.    
  125.     protected function getUserFields($selectedFields)
  126.     {
  127.         $arFields = array();
  128.        
  129.         // User fields
  130.         foreach ($this->arUserFields as $field)
  131.         {
  132.             if (in_array($field, $selectedFields))
  133.             {
  134.                 $arField = array(
  135.                     'NAME' => (strlen(Loc::getMessage('USER_FIELD_' . $field)) > 0) ? Loc::getMessage('USER_FIELD_' . $field) : $field,
  136.                     'MULTIPLE' => 'N'
  137.                 );
  138.                
  139.                 if ($field == 'PERSONAL_PHOTO' || $field == 'WORK_LOGO')
  140.                 {
  141.                     $arField['TYPE'] = 'F';
  142.                 }
  143.                
  144.                 if ($field == 'EMAIL' && $this->arParams['EDIT_GEN_LOGIN_AND_PASS'] == 'Y')
  145.                 {
  146.                     $arField['REQUIRED'] = 'Y';
  147.                 }
  148.                
  149.                 // Вместе с паролем получаем поле для подтверждения
  150.                 if ($field == 'PASSWORD')
  151.                 {
  152.                     $arFields['CONFIRM_PASSWORD'] = array(
  153.                         'NAME' => 'CONFIRM_PASSWORD',
  154.                         'MULTIPLE' => 'N'
  155.                     );
  156.                 }
  157.                
  158.                 $arFields[$field] = $arField;
  159.             }          
  160.         }
  161.        
  162.         // User props
  163.         $arRes = $GLOBALS['USER_FIELD_MANAGER']->GetUserFields('USER', 0, LANGUAGE_ID);
  164.        
  165.         if (!empty($arRes))
  166.         {
  167.             foreach ($arRes as $key => $val)
  168.             {
  169.                 if (in_array($val['FIELD_NAME'], $selectedFields))
  170.                 {
  171.                     $arProp = array(
  172.                         'NAME' => (strLen($val['EDIT_FORM_LABEL']) > 0 ? $val['EDIT_FORM_LABEL'] : $val['FIELD_NAME']),
  173.                         'MULTIPLE' => $val['MULTIPLE']
  174.                     );
  175.                    
  176.                     if ($val['USER_TYPE_ID'] == 'file') // Файл
  177.                     {
  178.                         $arProp['TYPE'] = 'F';
  179.                     }
  180.                     elseif($val['USER_TYPE_ID'] == 'iblock_element') // Привязка к элементу инфоблока
  181.                     {
  182.                         $arProp['TYPE'] = 'L';
  183.                     }
  184.                     else
  185.                     {
  186.                         $arProp['TYPE'] = 'S';
  187.                     }
  188.                    
  189.                     $arFields[$val['FIELD_NAME']] = $arProp ;
  190.                 }
  191.             }  
  192.         }
  193.  
  194.         return $arFields;
  195.     }
  196.    
  197.     /**
  198.      * Получить все значения полей указанного пользователя
  199.      *
  200.      * @param int - ID пользователя
  201.      *
  202.      * @return array
  203.      */
  204.     protected function getUserFieldsValues($userId, $selectedFields)
  205.     {
  206.         $fieldsValues = array();
  207.         // Получаем значения свойств элемента инфоблока
  208.         if($userId > 0)
  209.         {
  210.             $by = 'sort';
  211.             $tmp = 'asc';
  212.             $select = array(
  213.                 'FIELDS' => $selectedFields,
  214.                 'SELECT' => $selectedFields,           
  215.             );
  216.            
  217.             $rsUser = CUser::GetList(
  218.                 $by,
  219.                 $tmp,          
  220.                 array(
  221.                     'ID' => $this->userId
  222.                 ),
  223.                 $select
  224.             );
  225.            
  226.             if ($arUser = $rsUser->GetNext())
  227.             {
  228.                 foreach ($arUser as $fieldCode => $value)
  229.                 {
  230.                     if ($this->fields[$fieldCode]['TYPE'] == 'F')
  231.                     {                  
  232.                         if ($arFile = CFile::GetFileArray($value))
  233.                         {
  234.                             $value = array(
  235.                                 'FILE' => $arFile
  236.                             );
  237.                         }
  238.                         else
  239.                         {
  240.                             $value = '';
  241.                         }
  242.                     }
  243.                    
  244.                     // Нет смысла выводить хэш пароля, поэтому значение остается пустым
  245.                     if ($fieldCode == 'PASSWORD')
  246.                         continue;
  247.                    
  248.                     $fieldsValues[$fieldCode] = $value;
  249.                 }
  250.             }
  251.         }
  252.         return $fieldsValues;
  253.     }
  254.  
  255.     /*
  256.      * Получить данные из запроса
  257.      */
  258.     protected function getRequestData()
  259.     {
  260.         $this->context = Context::getCurrent();
  261.         $this->request = $this->context->getRequest();
  262.        
  263.         if ($this->userId == 0 && intval($this->request->get('ID')) > 0)
  264.         {
  265.             $this->userId = $this->request->get('ID');
  266.         }
  267.        
  268.         if($this->request->getPost('submit') <> '')
  269.         {
  270.             $this->requestValues = $this->request->getPost('FIELDS');
  271.         }
  272.     }
  273.    
  274.     /*
  275.      * Получаем данные
  276.      */
  277.     protected function getResultData()
  278.     {
  279.         $this->fields = $this->getUserFields($this->arParams['EDIT_FIELDS']);
  280.        
  281.         if ($this->userId > 0)
  282.         {
  283.             $this->fieldsValues = $this->getUserFieldsValues($this->userId, $this->arParams['EDIT_FIELDS']);
  284.         }
  285.        
  286.         if (!empty($this->requestValues))
  287.         {
  288.             $this->fieldsValues = $this->prepareFieldsValues($this->fields, $this->requestValues, $this->fieldsValues);
  289.         }  
  290.     }
  291.    
  292.     /*
  293.      * Заменяем текущие значения, значениями переданными в REQUEST запросе
  294.      */
  295.     protected function prepareFieldsValues($fields, $requestValues, $fieldsValues)
  296.     {  
  297.         // Присваимваем пустые значения свойствам, которых не было в запросе
  298.         foreach ($fields as $fieldCode => $field)
  299.         {          
  300.             if (!isset($requestValues[$fieldCode])){
  301.                 $requestValues[$fieldCode] = '';
  302.             }
  303.         }
  304.        
  305.         if (is_array($requestValues) && count($requestValues) > 0)
  306.         {
  307.             foreach($requestValues as $fieldCode => $fieldValue)
  308.             {      
  309.                 if ($fields[$fieldCode]['TYPE'] == 'F')
  310.                 {
  311.                     continue;
  312.                 }
  313.                 $fieldsValues[$fieldCode] = htmlspecialcharsEx($fieldValue);
  314.             }
  315.         }
  316.        
  317.         // Сохранить старый пароль если не был передан новый
  318.         if (empty($fieldsValues['PASSWORD']) && empty($fieldsValues['CONFIRM_PASSWORD']))
  319.         {
  320.             unset($fieldsValues['PASSWORD'], $fieldsValues['CONFIRM_PASSWORD']);   
  321.         }
  322.  
  323.         return $fieldsValues;
  324.     }
  325.    
  326.     /*
  327.      * Получить массив данных для вызова API добавления \ редактирования элемента инфоблока
  328.      */
  329.     protected function getUpdateFieldsValues($fields, $fieldsValues)
  330.     {
  331.         $delRequest = $this->request->get('DELETE_FILE');
  332.        
  333.         $updateValues = array();
  334.        
  335.         if (is_array($fieldsValues) && count($fieldsValues) > 0)
  336.         {
  337.             foreach($fieldsValues as $fieldCode => $fieldValue)
  338.             {  
  339.                 if ($fields[$fieldCode]['TYPE'] == 'F') // Файл
  340.                 {
  341.                     $arFile = $this->request->getFile('FIELD_FILE_' . $fieldCode);
  342.                     $arFile["del"] = ($delRequest[$fieldCode] == "Y") ? "Y" : "";
  343.                    
  344.                     if (intval($fieldValue) > 0)
  345.                     {
  346.                         $arFile["old_file"] = $fieldValue;
  347.                     }
  348.                    
  349.                     if($arFile["del"] == 'Y' || $arFile['tmp_name'] <> '')
  350.                     {
  351.                         $updateValues[$fieldCode] = $arFile;
  352.                     }
  353.                     else
  354.                     {
  355.                         unset($updateValues[$fieldCode]);
  356.                     }
  357.                 }
  358.                 else
  359.                 {
  360.                     $updateValues[$fieldCode] = htmlspecialcharsBack($fieldValue);
  361.                 }
  362.                
  363.                 if (substr($fieldCode, 0, 1) == '~')
  364.                     unset($updateValues[$fieldCode]);
  365.             }
  366.         }
  367.  
  368.         return $updateValues;
  369.     }
  370.    
  371.     /*
  372.      * Выполнить добавление \ редактирование пользователя
  373.      */
  374.     protected function performAction()
  375.     {  
  376.         $this->checkUpdateData($this->fields, $this->fieldsUpdateValues, $this->arParams['EDIT_REQUIRED_FIELDS']);
  377.  
  378.         if ($this->request->getPost('haserror') == '' && empty($this->errors))
  379.         {
  380.             if ($this->userId > 0)
  381.             {
  382.                 $this->updateUser($this->userId, $this->fieldsUpdateValues);
  383.             }
  384.             else
  385.             {  
  386.                 if ($this->fieldsUpdateValues['LOGIN'] == '' || $this->fieldsUpdateValues['PASSWORD'] == '') {
  387.                     $this->arParams['EDIT_GEN_LOGIN_AND_PASS'] = 'Y';
  388.                 }
  389.                 $this->addUser($this->fieldsUpdateValues, $this->arParams['EDIT_GEN_LOGIN_AND_PASS'], $this->arParams['USER_GROUP']);
  390.             }
  391.            
  392.             if ($this->success == true)
  393.             {
  394.                 global $APPLICATION;
  395.                 LocalRedirect($APPLICATION->GetCurPageParam("success=yes", array('success'), false));
  396.             }
  397.         }
  398.     }
  399.    
  400.     /*
  401.      * Подготовить данные для вывода
  402.      */
  403.     protected function prepareResultData()
  404.     {
  405.         $this->formFields = $this->getFormFields($this->fields, $this->arParams['EDIT_REQUIRED_FIELDS'], $this->errors['FIELDS'], $this->fieldsValues);
  406.     }
  407.    
  408.     /*
  409.      * Подготовить данные пришедщие из REQUEST запроса
  410.      */
  411.     protected function prepareRequestData()
  412.     {      
  413.         $this->fieldsUpdateValues = $this->getUpdateFieldsValues($this->fields, $this->fieldsValues);  
  414.     }
  415.    
  416.     /**
  417.      * Получаем массив полей формы для вывода
  418.      *
  419.      * @param array - Массив полей пользователя
  420.      * @param array - Массив полей, выбранных обязательными для заполнения
  421.      * @param array - Массив с ошибками полей
  422.      * @param array - Массив текущих значений полей, либо переданных в запросе
  423.      *
  424.      * @return array
  425.      */
  426.     protected function getFormFields($fields, $fieldsRequired, $fieldsErrors, $fieldsValues)
  427.     {
  428.         $formFields = array();
  429.        
  430.         if(is_array($fields) && count($fields) > 0)
  431.         {
  432.             foreach($fields as $fieldCode => $field)
  433.             {
  434.                 switch ($field['TYPE'])
  435.                 {
  436.                     case 'L':
  437.                         break;
  438.                     case 'F':
  439.                         $formFields[$fieldCode] = array(
  440.                             'CODE' => $fieldCode,
  441.                             'CONTROL_ID' => 'edit_cid_' . strtolower($fieldCode),
  442.                             'CONTROL_NAME' => 'FIELDS[' . $fieldCode . ']',
  443.                             'CONTROL_FILE_DEL_ID' => 'edit_file_del_cid_' . strtolower($fieldCode),
  444.                             'CONTROL_FILE_ID' => 'edit_file_cid_' . strtolower($fieldCode),
  445.                             'CONTROL_FILE_NAME' => 'FIELD_FILE_' . $fieldCode,
  446.                             'CONTROL_FILE_DELETE' => 'DELETE_FILE[' . $fieldCode . ']',
  447.                             'NAME' => $field['NAME'],
  448.                             'REQUIRED' => (in_array($fieldCode, $fieldsRequired)) ? 'Y' : 'N',
  449.                             'ERROR' => (isset($fieldsErrors[$fieldCode])) ? $fieldsErrors[$fieldCode] : '',
  450.                             'VALUE' => $fieldsValues[$fieldCode]['FILE']
  451.                         );
  452.                         break;
  453.                     default:
  454.                         $formFields[$fieldCode] = array(
  455.                             'CODE' => $fieldCode,
  456.                             'CONTROL_ID' => 'edit_cid_' . strtolower($fieldCode),
  457.                             'CONTROL_NAME' => 'FIELDS[' . $fieldCode . ']',
  458.                             'NAME' => $field['NAME'],
  459.                             'REQUIRED' => (in_array($fieldCode, $fieldsRequired) || $field['REQUIRED']) ? 'Y' : 'N',
  460.                             'ERROR' => (isset($fieldsErrors[$fieldCode])) ? $fieldsErrors[$fieldCode] : '',
  461.                             'VALUE' => $fieldsValues[$fieldCode]
  462.                         );
  463.                 }
  464.             }
  465.         }
  466.        
  467.         return $formFields;
  468.     }
  469.    
  470.     /*
  471.      * Проверка переданных значений перед добавлением \ редактированием элемента инфоблока
  472.      */
  473.     protected function checkUpdateData($fields, $fieldsValues, $requiredFields)
  474.     {
  475.         //global $DB;
  476.         if (is_array($fields) && count($fields) > 0)
  477.         {
  478.             foreach ($fieldsValues as $fieldCode => $fieldValue)
  479.             {
  480.                 if (empty($fieldValue) && in_array($fieldCode, $requiredFields))
  481.                 {
  482.                     $arError['FIELDS'][$fieldCode] = Loc::getMessage('ERROR_FIELD_EMPTY');
  483.                 }
  484.             }
  485.            
  486.             if (!$GLOBALS['USER_FIELD_MANAGER']->CheckFields("USER", 0, $fieldsValues))
  487.             {
  488.                 global $APPLICATION;
  489.                 $e = $APPLICATION->GetException();
  490.                 $propErrors = $e->GetMessages();
  491.                 $APPLICATION->ResetException();
  492.                
  493.                 if (is_array($propErrors) && count($propErrors) > 0)
  494.                 {
  495.                     foreach ($propErrors as $error)
  496.                     {
  497.                         $arError['FIELDS'][$error['id']] =  $error['text'];
  498.                     }
  499.                 }
  500.             }
  501.         }
  502.  
  503.         $this->errors = $arError;
  504.     }
  505.    
  506.     /**
  507.      * Обновление пользователя
  508.      *
  509.      * @param int - ID пользователя
  510.      * @param array - Список обновляемых полей
  511.      *
  512.      * @return void
  513.      */
  514.     protected function updateUser($userId, $updateValues)
  515.     {      
  516.         if($userId > 0)
  517.         {
  518.             $user = new CUser;
  519.                
  520.             if ($updateValues['LOGIN'] == '' || $updateValues['PASSWORD'] == '')
  521.             {
  522.                 unset($updateValues['LOGIN'], $updateValues['PASSWORD'], $updateValues['CONFIRM_PASSWORD']);
  523.             }
  524.  
  525.             if (!$res = $user->Update($userId, $updateValues))
  526.             {
  527.                 $this->errors['MAIN'][] = $user->LAST_ERROR;
  528.             }
  529.             else
  530.             {
  531.                 $this->success = true;
  532.             }
  533.         }
  534.     }
  535.    
  536.     /**
  537.      * Добавление пользователя
  538.      *
  539.      * @param array - Список добавляемых полей
  540.      *
  541.      * @return void
  542.      */
  543.     protected function addUser($updateValues, $genLoginAndPass, $groupIds)
  544.     {
  545.         $user = new CUser;
  546.        
  547.         if ($genLoginAndPass == 'Y')
  548.         {
  549.             if ($updateValues['EMAIL'] != '')
  550.             {
  551.                 $login = $updateValues['EMAIL'];       
  552.                 $password = substr(md5($updateValues['EMAIL']), 10);
  553.                
  554.                 $updateValues['LOGIN'] = $login;
  555.                 $updateValues['PASSWORD'] = $password;
  556.                 $updateValues['CONFIRM_PASSWORD'] = $password;
  557.             }
  558.             else
  559.             {
  560.                 $this->errors['MAIN'][] = Loc::getMessage('ERROR_FIELD_EMAIL');
  561.             }
  562.         }
  563.        
  564.         $updateValues['GROUP_ID'] = $groupIds;
  565.        
  566.         if (!$resultId = $user->Add($updateValues))
  567.         {
  568.             $this->errors['MAIN'][] = $user->LAST_ERROR;
  569.         }
  570.         else
  571.         {
  572.             $this->success = true;
  573.         }
  574.        
  575.         return $resultId;
  576.     }
  577.    
  578.     /**
  579.      * Заполняем массив arResult данными
  580.      *
  581.      * @return void
  582.      */
  583.     protected function formatResult()
  584.     {  
  585.         $this->arResult['USER_ID'] = $this->userId;
  586.         $this->arResult['UPDATE_VALUE'] = $this->fieldsUpdateValues;
  587.         $this->arResult['FORM_FIELDS'] = $this->formFields;
  588.         $this->arResult['ERRORS'] = $this->errors;
  589.         $this->arResult["PARAMS_HASH"] = md5(serialize($this->arParams).$this->GetTemplateName());
  590.         $this->arResult['SUCCESS'] = (empty($this->errors)) ? $this->request->get('success') : false;
  591.         $this->arResult['SUCCESS_REDIRECT'] = $this->arParams['SUCCESS_REDIRECT'];
  592.     }
  593.    
  594.     /**
  595.      * Выполняем код компонента
  596.      */
  597.     public function executeComponent()
  598.     {
  599.         try
  600.         {
  601.             global $APPLICATION;
  602.  
  603.             $this->setFrameMode(false);
  604.            
  605.             $this->getRequestData();
  606.             $this->getResultData();
  607.            
  608.             if ($this->request->getPost('submit') <> '')
  609.             {
  610.                 $this->prepareRequestData();
  611.                 $this->performAction();
  612.             }      
  613.            
  614.             $this->prepareResultData();    
  615.             $this->formatResult();
  616.         }
  617.         catch (Main\SystemException $e)
  618.         {
  619.             ShowError($e->getMessage());
  620.         }
  621.  
  622.         $this->includeComponentTemplate();
  623.     }
  624. }
  625. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement