PageRenderTime 44ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/components/bitrix/main.userconsent.edit/class.php

https://gitlab.com/alexprowars/bitrix
PHP | 326 lines | 283 code | 36 blank | 7 comment | 27 complexity | e0c9980b9e17e25061337066004f2ee0 MD5 | raw file
  1. <?
  2. use Bitrix\Main\Localization\Loc;
  3. use Bitrix\Main\ErrorCollection;
  4. use Bitrix\Main\UserConsent\Agreement;
  5. use Bitrix\Main\UserConsent\Intl;
  6. use Bitrix\Main\UserConsent\Internals\FieldTable;
  7. use Bitrix\Main\UserConsent\Text;
  8. if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true)
  9. {
  10. die();
  11. }
  12. Loc::loadMessages(__FILE__);
  13. class MainUserConsentEditComponent extends CBitrixComponent
  14. {
  15. /** @var ErrorCollection $errors */
  16. protected $errors;
  17. /** @var Agreement $agreement */
  18. protected $agreement;
  19. protected function checkRequiredParams()
  20. {
  21. return true;
  22. }
  23. protected function initParams()
  24. {
  25. $this->arParams['ID'] = isset($this->arParams['ID']) ? intval($this->arParams['ID']) : null;
  26. $this->arParams['PATH_TO_ADD'] = isset($this->arParams['PATH_TO_ADD']) ? $this->arParams['PATH_TO_ADD'] : '';
  27. $this->arParams['PATH_TO_EDIT'] = isset($this->arParams['PATH_TO_EDIT']) ? $this->arParams['PATH_TO_EDIT'] : '';
  28. $this->arParams['PATH_TO_LIST'] = isset($this->arParams['PATH_TO_LIST']) ? $this->arParams['PATH_TO_LIST'] : '';
  29. $this->arParams['IFRAME'] = isset($this->arParams['IFRAME']) ? $this->arParams['IFRAME'] == 'Y' : $this->request->get('IFRAME') == 'Y';
  30. $this->arParams['SET_TITLE'] = isset($this->arParams['SET_TITLE']) ? $this->arParams['SET_TITLE'] == 'Y' : true;
  31. $this->arParams['CAN_EDIT'] = isset($this->arParams['CAN_EDIT']) ? $this->arParams['CAN_EDIT'] : false;
  32. }
  33. protected function processPost()
  34. {
  35. $languageId = $this->request->getPost('LANGUAGE_ID');
  36. $fieldList = array();
  37. $fields = $this->request->getPost('FIELDS');
  38. if (isset($fields[$languageId]) && is_array($fields[$languageId]))
  39. {
  40. $fieldList = $fields[$languageId];
  41. }
  42. $data = array(
  43. 'NAME' => $this->request->getPost('NAME'),
  44. 'TYPE' => $this->request->getPost('TYPE'),
  45. 'LANGUAGE_ID' => $languageId,
  46. 'DATA_PROVIDER' => $this->request->getPost('DATA_PROVIDER'),
  47. 'AGREEMENT_TEXT' => $this->request->getPost('AGREEMENT_TEXT'),
  48. 'IS_AGREEMENT_TEXT_HTML' => ($this->request->getPost('IS_AGREEMENT_TEXT_HTML') ? 'Y': 'N'),
  49. 'LABEL_TEXT' => $this->request->getPost('LABEL_TEXT'),
  50. 'USE_URL' => $this->request->getPost('USE_URL') ? 'Y': 'N',
  51. 'URL' => $this->request->getPost('URL'),
  52. 'FIELDS' => $fieldList,
  53. );
  54. $this->agreement->mergeData($data);
  55. $this->agreement->save();
  56. $pathTo = str_replace('#id#', $this->agreement->getId(), $this->arParams['PATH_TO_EDIT']);
  57. if ($this->arParams['IFRAME'])
  58. {
  59. $pathTo .= strpos($pathTo, '?') === false ? '?' : '&';
  60. $pathTo .= 'IFRAME=Y';
  61. }
  62. if ($this->agreement->hasErrors())
  63. {
  64. $this->arResult['ERRORS'] = $this->agreement->getErrors();
  65. }
  66. elseif ($this->request->get('save'))
  67. {
  68. if ($this->arParams['IFRAME'])
  69. {
  70. $pathTo .= strpos($pathTo, '?') === false ? '?' : '&';
  71. $pathTo .= 'IS_SAVED=Y';
  72. LocalRedirect($pathTo);
  73. }
  74. else
  75. {
  76. LocalRedirect($this->arParams['PATH_TO_LIST']);
  77. }
  78. }
  79. else
  80. {
  81. LocalRedirect($pathTo);
  82. }
  83. }
  84. protected function prepareResult()
  85. {
  86. $this->arResult['IS_SAVED'] = ($this->request->get('IS_SAVED') == 'Y');
  87. $this->arResult['AJAX_REQUEST'] = $this->request->isAjaxRequest();
  88. $this->arResult['ERRORS'] = array();
  89. $this->agreement = new Agreement($this->arParams['ID']);
  90. if (
  91. $this->request->isPost() &&
  92. !$this->arResult['AJAX_REQUEST'] &&
  93. check_bitrix_sessid() &&
  94. $this->arParams['CAN_EDIT']
  95. )
  96. {
  97. $this->processPost();
  98. }
  99. /* Set data */
  100. $this->arResult['DATA'] = $this->agreement->getData();
  101. /* Set data providers */
  102. $this->prepareResultDataProviders();
  103. /* Set types */
  104. $this->prepareResultTypes();
  105. /* Set title */
  106. if ($this->arParams['SET_TITLE'])
  107. {
  108. /**@var CMain*/
  109. $GLOBALS['APPLICATION']->SetTitle(
  110. $this->agreement->getId()
  111. ?
  112. Loc::getMessage('MAIN_USER_CONSENT_EDIT_COMP_TITLE_EDIT')
  113. :
  114. Loc::getMessage('MAIN_USER_CONSENT_EDIT_COMP_TITLE_ADD')
  115. );
  116. }
  117. $this->prepareMenu();
  118. return true;
  119. }
  120. protected function prepareResultTypes()
  121. {
  122. $this->arResult['TYPE_LIST'] = array();
  123. $data = $this->arResult['DATA'];
  124. $postFields = (isset($data['FIELDS']) && is_array($data['FIELDS'])) ? $data['FIELDS'] : array();
  125. $typeNames = Agreement::getTypeNames();
  126. $this->arResult['TYPE_LIST'][] = array(
  127. 'TYPE' => Agreement::TYPE_CUSTOM,
  128. 'LANGUAGE_ID' => '',
  129. 'NAME' => $typeNames[Agreement::TYPE_CUSTOM],
  130. 'AGREEMENT_TEXT' => '',
  131. 'AVAILABLE' => true,
  132. 'SELECTED' => (Agreement::TYPE_CUSTOM == $data['TYPE'] && !$data['LANGUAGE_ID']),
  133. 'FIELDS' => [
  134. [
  135. 'INPUT_NAME' => 'AGREEMENT_TEXT',
  136. 'CODE' => 'AGREEMENT_TEXT',
  137. 'TYPE' => 'text',
  138. 'CAPTION' => Loc::getMessage('MAIN_USER_CONSENT_EDIT_COMP_FIELD_AGREEMENT_TEXT'),
  139. 'PLACEHOLDER' => Loc::getMessage('MAIN_USER_CONSENT_EDIT_COMP_FIELD_AGREEMENT_TEXT_HINT'),
  140. 'VALUE' => $data['AGREEMENT_TEXT'],
  141. 'TAB' => 'text',
  142. ],
  143. [
  144. 'INPUT_NAME' => 'IS_AGREEMENT_TEXT_HTML',
  145. 'CODE' => 'IS_AGREEMENT_TEXT_HTML',
  146. 'TYPE' => 'checkbox',
  147. 'CAPTION' => Loc::getMessage('MAIN_USER_CONSENT_EDIT_COMP_FIELD_IS_AGREEMENT_TEXT_HTML'),
  148. 'VALUE' => $data['IS_AGREEMENT_TEXT_HTML'],
  149. 'TAB' => 'text',
  150. ],
  151. [
  152. 'INPUT_NAME' => 'LABEL_TEXT',
  153. 'CODE' => 'LABEL_TEXT',
  154. 'TYPE' => 'string',
  155. 'CAPTION' => Loc::getMessage('MAIN_USER_CONSENT_EDIT_COMP_FIELD_LABEL_TEXT'),
  156. 'PLACEHOLDER' => Loc::getMessage('MAIN_USER_CONSENT_EDIT_COMP_FIELD_LABEL_TEXT_HINT'),
  157. 'VALUE' => $data['LABEL_TEXT'] ? $data['LABEL_TEXT'] : Loc::getMessage('MAIN_USER_CONSENT_EDIT_COMP_FIELD_LABEL_TEXT_DEFAULT_VALUE'),
  158. 'TAB' => 'settings',
  159. ],
  160. [
  161. 'INPUT_NAME' => 'URL',
  162. 'CODE' => 'URL',
  163. 'TYPE' => 'string',
  164. 'SHOW_BY_CHECKBOX' => true,
  165. 'CHECKBOX_NAME' => 'USE_URL',
  166. 'CAPTION' => Loc::getMessage('MAIN_USER_CONSENT_EDIT_COMP_FIELD_LABEL_USE_URL'),
  167. 'PLACEHOLDER' => Loc::getMessage('MAIN_USER_CONSENT_EDIT_COMP_FIELD_LABEL_URL'),
  168. 'VALUE' => ($data['USE_URL'] == 'Y' && $data['URL'] ? $data['URL'] : ''),
  169. 'TAB' => 'settings',
  170. ]
  171. ],
  172. 'IS_SUPPORT_DATA_PROVIDERS' => false
  173. );
  174. $fieldValues = FieldTable::getConsentFields($this->agreement->getId());
  175. $intlList = Intl::getList();
  176. foreach ($intlList as $intl)
  177. {
  178. $demoTextFields = array('FIELDS' => Loc::getMessage('MAIN_USER_CONSENT_EDIT_COMP_FIELD_FORM_FIELD_NAMES'));
  179. $fields = array();
  180. foreach ($intl['FIELDS'] as $field)
  181. {
  182. $fieldCode = $field['CODE'];
  183. if (isset($postFields[$fieldCode]))
  184. {
  185. $field['VALUE'] = $postFields[$fieldCode];
  186. }
  187. elseif (isset($fieldValues[$fieldCode]))
  188. {
  189. $field['VALUE'] = $fieldValues[$fieldCode];
  190. }
  191. else
  192. {
  193. $field['VALUE'] = '';
  194. }
  195. $fields[] = $field;
  196. $demoTextFields[$fieldCode] = '<' . str_replace(' ', '_', strtoupper($field['CAPTION'])) . '>';
  197. }
  198. $this->arResult['TYPE_LIST'][] = array(
  199. 'TYPE' => Agreement::TYPE_STANDARD,
  200. 'LANGUAGE_ID' => $intl['LANGUAGE_ID'],
  201. 'NAME' => $intl['NAME'],
  202. 'AGREEMENT_TEXT' => Text::replace($intl['AGREEMENT_TEXT'], $demoTextFields, true),
  203. 'SELECTED' => (
  204. Agreement::TYPE_STANDARD == $data['TYPE']
  205. &&
  206. $intl['LANGUAGE_ID'] == $data['LANGUAGE_ID']
  207. ),
  208. 'AVAILABLE' => $intl['BASE_LANGUAGE_ID'] == $this->getLanguageId(),
  209. 'FIELDS' => $fields,
  210. 'IS_SUPPORT_DATA_PROVIDERS' => true
  211. );
  212. }
  213. $this->arResult['TYPE_LIST_AVAILABLE_COUNT'] = 0;
  214. foreach ($this->arResult['TYPE_LIST'] as $type)
  215. {
  216. $this->arResult['TYPE_LIST_AVAILABLE_COUNT'] += ($type['SELECTED'] || $type['AVAILABLE']) ? 1 : 0;
  217. }
  218. }
  219. protected function prepareResultDataProviders()
  220. {
  221. $this->arResult['DATA_PROVIDER_LIST'] = array();
  222. $data = $this->arResult['DATA'];
  223. $dataProviders = \Bitrix\Main\UserConsent\DataProvider::getList();
  224. foreach ($dataProviders as $provider)
  225. {
  226. $provider = $provider->toArray();
  227. $valuesData = $provider['DATA'];
  228. $provider['DATA'] = array();
  229. foreach ($valuesData as $key => $value)
  230. {
  231. $provider['DATA'][] = array(
  232. 'CODE' => $key,
  233. 'VALUE' => $value,
  234. );
  235. }
  236. $provider['SELECTED'] = $provider['CODE'] == $data['DATA_PROVIDER'];
  237. $this->arResult['DATA_PROVIDER_LIST'][] = $provider;
  238. }
  239. }
  240. protected function printErrors()
  241. {
  242. foreach ($this->errors as $error)
  243. {
  244. ShowError($error);
  245. }
  246. }
  247. public function executeComponent()
  248. {
  249. $this->errors = new \Bitrix\Main\ErrorCollection();
  250. $this->initParams();
  251. if (!$this->checkRequiredParams())
  252. {
  253. $this->printErrors();
  254. return;
  255. }
  256. if (!$this->prepareResult())
  257. {
  258. $this->printErrors();
  259. return;
  260. }
  261. $this->includeComponentTemplate();
  262. }
  263. private function prepareMenu()
  264. {
  265. $this->arResult['MENU_ITEMS'] = [
  266. 'text' => [
  267. 'NAME' => Loc::getMessage('MAIN_USER_CONSENT_EDIT_COMP_TAB_TEXT'),
  268. 'ATTRIBUTES' => [
  269. 'onclick' => 'BX.Main.UserConsent.Edit.showTextTab();',
  270. ],
  271. 'ACTIVE' => true
  272. ],
  273. 'settings' => [
  274. 'NAME' => Loc::getMessage('MAIN_USER_CONSENT_EDIT_COMP_TAB_SETTINGS_1'),
  275. 'ATTRIBUTES' => [
  276. 'onclick' => 'BX.Main.UserConsent.Edit.showSettingsTab();',
  277. ],
  278. ],
  279. ];
  280. if ($this->arParams['ID'])
  281. {
  282. $this->arResult['MENU_ITEMS']['list'] = [
  283. 'NAME' => Loc::getMessage('MAIN_USER_CONSENT_EDIT_COMP_TAB_LIST'),
  284. 'ATTRIBUTES' => [
  285. 'onclick' => 'BX.Main.UserConsent.Edit.showListTab();',
  286. ],
  287. ];
  288. }
  289. }
  290. }