浏览代码

Ticket #4558 - Build-in API support: Configuration.

AntonLV 2 年之前
父节点
当前提交
8e99491a49

+ 8 - 0
install/sql/system.sql

@@ -759,6 +759,14 @@ INSERT INTO `sys_options`(`category_id`, `name`, `caption`, `value`, `type`, `ex
 (@iCategoryId, 'sys_api_extended_units', '_adm_stg_cpt_option_sys_api_extended_units', '', 'checkbox', '', '', '', 30),
 (@iCategoryId, 'sys_api_conn_in_prof_units', '_adm_stg_cpt_option_sys_api_conn_in_prof_units', '', 'checkbox', '', '', '', 31);
 
+--
+-- CATEGORY (HIDDEN): API (config)
+--
+INSERT INTO `sys_options_categories`(`type_id`, `name`, `caption`, `hidden`, `order`) VALUES (@iTypeId, 'api_config', '_adm_stg_cpt_category_api_config', 1, 3);
+SET @iCategoryId = LAST_INSERT_ID();
+
+INSERT INTO `sys_options`(`category_id`, `name`, `caption`, `value`, `type`, `extra`, `check`, `check_error`, `order`) VALUES
+(@iCategoryId, 'sys_api_config', '_adm_stg_cpt_option_sys_api_config', '', 'text', '', '', '', 1);
 
 --
 -- CATEGORY (HIDDEN): PWA Manifest

+ 57 - 55
modules/boonex/english/data/langs/system/en.xml

@@ -1086,64 +1086,65 @@
     <string name="_adm_form_txt_search_forms_module"><![CDATA[Module]]></string>
     <string name="_adm_form_txt_search_forms_n_fields"><![CDATA[{0} fields]]></string>
     <string name="_adm_form_txt_search_forms_title"><![CDATA[System Name]]></string>
-	<string name="_adm_form_txt_select_display"><![CDATA[Select Display...]]></string>
-	<string name="_adm_form_txt_select_form"><![CDATA[Select Form...]]></string>
-	<string name="_adm_form_txt_select_list"><![CDATA[Select List...]]></string>
-	<string name="_adm_from_err_field_delete"><![CDATA[Cannot delete field]]></string>
-	<string name="_adm_from_err_pre_lists_delete"><![CDATA[Cannot delete list]]></string>
-	<string name="_adm_ipbl_Date_of_finish"><![CDATA[Expiration date]]></string>
-	<string name="_adm_ipbl_IP_Role"><![CDATA[IP Role]]></string>
-	<string name="_adm_ipbl_Stored_members_caption"><![CDATA[Stored Logged Members IPs]]></string>
-	<string name="_adm_ipbl_Type0_desc"><![CDATA[IP List Type is 0 : disabled]]></string>
-	<string name="_adm_ipbl_Type1_desc"><![CDATA[IP List Type is 1 : All IPs allowed except listed]]></string>
-	<string name="_adm_ipbl_Type2_desc"><![CDATA[IP List Type is 2 : All IPs blocked except listed]]></string>
-	<string name="_adm_ipbl_sample"><![CDATA[sample]]></string>
+    <string name="_adm_form_txt_select_display"><![CDATA[Select Display...]]></string>
+    <string name="_adm_form_txt_select_form"><![CDATA[Select Form...]]></string>
+    <string name="_adm_form_txt_select_list"><![CDATA[Select List...]]></string>
+    <string name="_adm_from_err_field_delete"><![CDATA[Cannot delete field]]></string>
+    <string name="_adm_from_err_pre_lists_delete"><![CDATA[Cannot delete list]]></string>
+    <string name="_adm_ipbl_Date_of_finish"><![CDATA[Expiration date]]></string>
+    <string name="_adm_ipbl_IP_Role"><![CDATA[IP Role]]></string>
+    <string name="_adm_ipbl_Stored_members_caption"><![CDATA[Stored Logged Members IPs]]></string>
+    <string name="_adm_ipbl_Type0_desc"><![CDATA[IP List Type is 0 : disabled]]></string>
+    <string name="_adm_ipbl_Type1_desc"><![CDATA[IP List Type is 1 : All IPs allowed except listed]]></string>
+    <string name="_adm_ipbl_Type2_desc"><![CDATA[IP List Type is 2 : All IPs blocked except listed]]></string>
+    <string name="_adm_ipbl_sample"><![CDATA[sample]]></string>
     <string name="_adm_lang_cnf_uninstall"><![CDATA[<h3>Uninstall "{0}" language?</h3><p>Uninstalling "{0}" language will also delete all of its data. Do you want to continue?</p>]]></string>
-	<string name="_adm_lmi_cpt_actions"><![CDATA[Actions]]></string>
-  <string name="_adm_lmi_cpt_badges"><![CDATA[Badges]]></string>
-	<string name="_adm_lmi_cpt_categories"><![CDATA[Categories]]></string>
-	<string name="_adm_lmi_cpt_checkout"><![CDATA[Checkout {checkout_counter}]]></string>
-	<string name="_adm_lmi_cpt_cover"><![CDATA[Cover]]></string>
-	<string name="_adm_lmi_cpt_search"><![CDATA[Search]]></string>
-	<string name="_adm_lmi_cpt_search_forms"><![CDATA[Search Forms]]></string>
-	<string name="_adm_lmi_cpt_search_fields"><![CDATA[Search Fields]]></string>
+    <string name="_adm_lmi_cpt_actions"><![CDATA[Actions]]></string>
+    <string name="_adm_lmi_cpt_api_config"><![CDATA[Configuration]]></string>
+    <string name="_adm_lmi_cpt_badges"><![CDATA[Badges]]></string>
+    <string name="_adm_lmi_cpt_categories"><![CDATA[Categories]]></string>
+    <string name="_adm_lmi_cpt_checkout"><![CDATA[Checkout {checkout_counter}]]></string>
+    <string name="_adm_lmi_cpt_cover"><![CDATA[Cover]]></string>
+    <string name="_adm_lmi_cpt_search"><![CDATA[Search]]></string>
+    <string name="_adm_lmi_cpt_search_forms"><![CDATA[Search Forms]]></string>
+    <string name="_adm_lmi_cpt_search_fields"><![CDATA[Search Fields]]></string>
     <string name="_adm_lmi_cpt_search_sortable_fields"><![CDATA[Search Sortable Fields]]></string>
-	<string name="_adm_lmi_cpt_splash"><![CDATA[Splash]]></string>
-	<string name="_adm_lmi_cpt_displays"><![CDATA[Displays]]></string>
-	<string name="_adm_lmi_cpt_downloaded"><![CDATA[Downloaded]]></string>
-	<string name="_adm_lmi_cpt_etemplates"><![CDATA[Emails]]></string>
-	<string name="_adm_lmi_cpt_etemplates_hf"><![CDATA[Email Template]]></string>
-	<string name="_adm_lmi_cpt_featured"><![CDATA[Featured]]></string>
-	<string name="_adm_lmi_cpt_fields"><![CDATA[Fields]]></string>
-	<string name="_adm_lmi_cpt_files"><![CDATA[Files]]></string>
-	<string name="_adm_lmi_cpt_forms"><![CDATA[Forms]]></string>
-	<string name="_adm_lmi_cpt_general"><![CDATA[General]]></string>
-	<string name="_adm_lmi_cpt_goodies"><![CDATA[Storefront]]></string>
-	<string name="_adm_lmi_cpt_icon"><![CDATA[Site Icon]]></string>
-	<string name="_adm_lmi_cpt_injections"><![CDATA[Injections]]></string>
-	<string name="_adm_lmi_cpt_images"><![CDATA[Images]]></string>
-	<string name="_adm_lmi_cpt_items"><![CDATA[Items]]></string>
-	<string name="_adm_lmi_cpt_keys"><![CDATA[Keys]]></string>
-        <string name="_adm_lmi_cpt_labels"><![CDATA[Labels]]></string>
-	<string name="_adm_lmi_cpt_latest"><![CDATA[Latest]]></string>
-	<string name="_adm_lmi_cpt_levels"><![CDATA[Levels]]></string>
-	<string name="_adm_lmi_cpt_logo"><![CDATA[Logo]]></string>
-	<string name="_adm_lmi_cpt_menus"><![CDATA[Menus]]></string>
-	<string name="_adm_lmi_cpt_origins"><![CDATA[Origins]]></string>
-	<string name="_adm_lmi_cpt_pre_lists"><![CDATA[Data Lists]]></string>
-	<string name="_adm_lmi_cpt_pre_values"><![CDATA[Data Items]]></string>
-	<string name="_adm_lmi_cpt_popular"><![CDATA[Popular]]></string>
-	<string name="_adm_lmi_cpt_purchases"><![CDATA[Purchases]]></string>
-        <string name="_adm_lmi_cpt_pwa"><![CDATA[PWA]]></string>
-        <string name="_adm_lmi_cpt_ractions"><![CDATA[Actions]]></string>
-        <string name="_adm_lmi_cpt_rlevels"><![CDATA[Levels]]></string>
-	<string name="_adm_lmi_cpt_sets"><![CDATA[Sets]]></string>
-	<string name="_adm_lmi_cpt_settings"><![CDATA[Settings]]></string>
-	<string name="_adm_lmi_cpt_updates"><![CDATA[Updates]]></string>
-	<string name="_adm_mobile_page_homepage"><![CDATA[Homepage]]></string>
-	<string name="_adm_mobile_page_profile"><![CDATA[Profile]]></string>
+    <string name="_adm_lmi_cpt_splash"><![CDATA[Splash]]></string>
+    <string name="_adm_lmi_cpt_displays"><![CDATA[Displays]]></string>
+    <string name="_adm_lmi_cpt_downloaded"><![CDATA[Downloaded]]></string>
+    <string name="_adm_lmi_cpt_etemplates"><![CDATA[Emails]]></string>
+    <string name="_adm_lmi_cpt_etemplates_hf"><![CDATA[Email Template]]></string>
+    <string name="_adm_lmi_cpt_featured"><![CDATA[Featured]]></string>
+    <string name="_adm_lmi_cpt_fields"><![CDATA[Fields]]></string>
+    <string name="_adm_lmi_cpt_files"><![CDATA[Files]]></string>
+    <string name="_adm_lmi_cpt_forms"><![CDATA[Forms]]></string>
+    <string name="_adm_lmi_cpt_general"><![CDATA[General]]></string>
+    <string name="_adm_lmi_cpt_goodies"><![CDATA[Storefront]]></string>
+    <string name="_adm_lmi_cpt_icon"><![CDATA[Site Icon]]></string>
+    <string name="_adm_lmi_cpt_injections"><![CDATA[Injections]]></string>
+    <string name="_adm_lmi_cpt_images"><![CDATA[Images]]></string>
+    <string name="_adm_lmi_cpt_items"><![CDATA[Items]]></string>
+    <string name="_adm_lmi_cpt_keys"><![CDATA[Keys]]></string>
+    <string name="_adm_lmi_cpt_labels"><![CDATA[Labels]]></string>
+    <string name="_adm_lmi_cpt_latest"><![CDATA[Latest]]></string>
+    <string name="_adm_lmi_cpt_levels"><![CDATA[Levels]]></string>
+    <string name="_adm_lmi_cpt_logo"><![CDATA[Logo]]></string>
+    <string name="_adm_lmi_cpt_menus"><![CDATA[Menus]]></string>
+    <string name="_adm_lmi_cpt_origins"><![CDATA[Origins]]></string>
+    <string name="_adm_lmi_cpt_pre_lists"><![CDATA[Data Lists]]></string>
+    <string name="_adm_lmi_cpt_pre_values"><![CDATA[Data Items]]></string>
+    <string name="_adm_lmi_cpt_popular"><![CDATA[Popular]]></string>
+    <string name="_adm_lmi_cpt_purchases"><![CDATA[Purchases]]></string>
+    <string name="_adm_lmi_cpt_pwa"><![CDATA[PWA]]></string>
+    <string name="_adm_lmi_cpt_ractions"><![CDATA[Actions]]></string>
+    <string name="_adm_lmi_cpt_rlevels"><![CDATA[Levels]]></string>
+    <string name="_adm_lmi_cpt_sets"><![CDATA[Sets]]></string>
+    <string name="_adm_lmi_cpt_settings"><![CDATA[Settings]]></string>
+    <string name="_adm_lmi_cpt_updates"><![CDATA[Updates]]></string>
+    <string name="_adm_mobile_page_homepage"><![CDATA[Homepage]]></string>
+    <string name="_adm_mobile_page_profile"><![CDATA[Profile]]></string>
     <string name="_adm_mod_cnf_uninstall"><![CDATA[<h3>Uninstall "{0}" module?</h3><p>Uninstalling "{0}" module will also delete all of its data. Do you want to continue?</p>]]></string>
-	<string name="_adm_mod_err_cannot_process_action"><![CDATA[Cannot process action. It does not have an associated handler.]]></string>
+    <string name="_adm_mod_err_cannot_process_action"><![CDATA[Cannot process action. It does not have an associated handler.]]></string>
     <string name="_adm_mod_err_only_admin_can_perform_operations_with_modules"><![CDATA[Only admin can perform operations with modules]]></string>
 	<string name="_adm_mod_err_process_operation_failed"><![CDATA[Cannot {0} module from "{1}" directory]]></string>
 	<string name="_adm_mod_msg_process_operation_scheduled"><![CDATA[Operation was scheduled and will be performed in a few minutes. Please wait.]]></string>	
@@ -1737,6 +1738,7 @@
     <string name="_adm_stg_cpt_option_sys_api_access_by_origin"><![CDATA[Allow access by origin]]></string>
     <string name="_adm_stg_cpt_option_sys_api_access_by_key"><![CDATA[Allow access with API key]]></string>
     <string name="_adm_stg_cpt_option_sys_api_access_unsafe_services"><![CDATA[Access to unsafe services]]></string>
+    <string name="_adm_stg_cpt_option_sys_api_config"><![CDATA[]]></string>
     <string name="_adm_stg_cpt_option_sys_api_cookie_path"><![CDATA[Cookies path]]></string>
     <string name="_adm_stg_cpt_option_sys_api_cookie_secure"><![CDATA[Secure cookies]]></string>
     <string name="_adm_stg_cpt_option_sys_api_cookie_samesite"><![CDATA[Cookies SameSite attribute]]></string>

+ 20 - 18
modules/boonex/russian/data/langs/system/ru.xml

@@ -1069,26 +1069,27 @@
     <string name="_adm_form_txt_search_forms_module"><![CDATA[Модуль]]></string>
     <string name="_adm_form_txt_search_forms_n_fields"><![CDATA[{0} полей]]></string>
     <string name="_adm_form_txt_search_forms_title"><![CDATA[Системное имя]]></string>
-	<string name="_adm_form_txt_select_display"><![CDATA[Выбрать дисплей...]]></string>
-	<string name="_adm_form_txt_select_form"><![CDATA[Выбрать форму...]]></string>
-	<string name="_adm_form_txt_select_list"><![CDATA[Выбрать список...]]></string>
-	<string name="_adm_from_err_field_delete"><![CDATA[Невозможно удалить поле]]></string>
-	<string name="_adm_from_err_pre_lists_delete"><![CDATA[Невозможно удалить список]]></string>
-	<string name="_adm_ipbl_Date_of_finish"><![CDATA[Дата окончания срока]]></string>
-	<string name="_adm_ipbl_IP_Role"><![CDATA[IP-роль]]></string>
-	<string name="_adm_ipbl_Stored_members_caption"><![CDATA[Сохранённые IP посещавших сайт пользователей]]></string>
-	<string name="_adm_ipbl_Type0_desc"><![CDATA[Тип IP-списка 0: отключён]]></string>
-	<string name="_adm_ipbl_Type1_desc"><![CDATA[Тип IP-списка 1: Все IP разрешены, кроме перечисленных]]></string>
-	<string name="_adm_ipbl_Type2_desc"><![CDATA[Тип IP-списка 2: Все IP заблокированы, кроме перечисленных]]></string>
-	<string name="_adm_ipbl_sample"><![CDATA[образец]]></string>
+    <string name="_adm_form_txt_select_display"><![CDATA[Выбрать дисплей...]]></string>
+    <string name="_adm_form_txt_select_form"><![CDATA[Выбрать форму...]]></string>
+    <string name="_adm_form_txt_select_list"><![CDATA[Выбрать список...]]></string>
+    <string name="_adm_from_err_field_delete"><![CDATA[Невозможно удалить поле]]></string>
+    <string name="_adm_from_err_pre_lists_delete"><![CDATA[Невозможно удалить список]]></string>
+    <string name="_adm_ipbl_Date_of_finish"><![CDATA[Дата окончания срока]]></string>
+    <string name="_adm_ipbl_IP_Role"><![CDATA[IP-роль]]></string>
+    <string name="_adm_ipbl_Stored_members_caption"><![CDATA[Сохранённые IP посещавших сайт пользователей]]></string>
+    <string name="_adm_ipbl_Type0_desc"><![CDATA[Тип IP-списка 0: отключён]]></string>
+    <string name="_adm_ipbl_Type1_desc"><![CDATA[Тип IP-списка 1: Все IP разрешены, кроме перечисленных]]></string>
+    <string name="_adm_ipbl_Type2_desc"><![CDATA[Тип IP-списка 2: Все IP заблокированы, кроме перечисленных]]></string>
+    <string name="_adm_ipbl_sample"><![CDATA[образец]]></string>
     <string name="_adm_lang_cnf_uninstall"><![CDATA[<h3>Удалить "{0}" язык?</h3><p>Удаление "{0}" языка также удалит все его данные. Вы хотите продолжить?</p>]]></string>
-	<string name="_adm_lmi_cpt_actions"><![CDATA[Действия]]></string>
+    <string name="_adm_lmi_cpt_actions"><![CDATA[Действия]]></string>
+    <string name="_adm_lmi_cpt_api_config"><![CDATA[Конфигурация]]></string>
     <string name="_adm_lmi_cpt_badges"><![CDATA[Бейджи]]></string>
-	<string name="_adm_lmi_cpt_categories"><![CDATA[Категории]]></string>
-	<string name="_adm_lmi_cpt_checkout"><![CDATA[Оплата {checkout_counter}]]></string>
-	<string name="_adm_lmi_cpt_cover"><![CDATA[Обложка]]></string>
-	<string name="_adm_lmi_cpt_search"><![CDATA[Поиск]]></string>
-	<string name="_adm_lmi_cpt_search_forms"><![CDATA[Формы поиска]]></string>
+    <string name="_adm_lmi_cpt_categories"><![CDATA[Категории]]></string>
+    <string name="_adm_lmi_cpt_checkout"><![CDATA[Оплата {checkout_counter}]]></string>
+    <string name="_adm_lmi_cpt_cover"><![CDATA[Обложка]]></string>
+    <string name="_adm_lmi_cpt_search"><![CDATA[Поиск]]></string>
+    <string name="_adm_lmi_cpt_search_forms"><![CDATA[Формы поиска]]></string>
     <string name="_adm_lmi_cpt_search_fields"><![CDATA[Поля поиска]]></string>
     <string name="_adm_lmi_cpt_search_sortable_fields"><![CDATA[Поля сортироски поиска]]></string>
 	<string name="_adm_lmi_cpt_splash"><![CDATA[Заставка]]></string>
@@ -1712,6 +1713,7 @@
     <string name="_adm_stg_cpt_option_sys_api_access_by_origin"><![CDATA[Доступ по "origin" заголовку]]></string>
     <string name="_adm_stg_cpt_option_sys_api_access_by_key"><![CDATA[Доступ по API ключу]]></string>
     <string name="_adm_stg_cpt_option_sys_api_access_unsafe_services"><![CDATA[Доступ к небезопасным сервисам]]></string>
+    <string name="_adm_stg_cpt_option_sys_api_config"><![CDATA[]]></string>
     <string name="_adm_stg_cpt_option_sys_api_cookie_path"><![CDATA[Путь к файлам cookie]]></string>
     <string name="_adm_stg_cpt_option_sys_api_cookie_secure"><![CDATA[Безопасные cookie]]></string>
     <string name="_adm_stg_cpt_option_sys_api_cookie_samesite"><![CDATA[Значение для SameSite атрибута]]></string>

+ 1 - 0
studio/api.php

@@ -10,6 +10,7 @@
 
 require_once('./../inc/header.inc.php');
 require_once(BX_DIRECTORY_PATH_INC . 'design.inc.php');
+require_once(BX_DOL_DIR_STUDIO_INC . 'utils.inc.php');
 
 bx_import('BxDolLanguages');
 

+ 1 - 0
studio/classes/BxDolStudioAPI.php

@@ -8,6 +8,7 @@
  */
 
 define('BX_DOL_STUDIO_API_TYPE_SETTINGS', 'settings');
+define('BX_DOL_STUDIO_API_TYPE_CONFIG', 'api_config');
 define('BX_DOL_STUDIO_API_TYPE_KEYS', 'keys');
 define('BX_DOL_STUDIO_API_TYPE_ORIGINS', 'origins');
 

+ 32 - 0
studio/classes/BxDolStudioOptionsApi.php

@@ -0,0 +1,32 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaStudio UNA Studio
+ * @{
+ */
+
+class BxDolStudioOptionsApi extends BxTemplStudioOptions
+{
+    public function __construct($sType = '', $mixedCategory = '', $sMix = '')
+    {
+        parent::__construct($sType, $mixedCategory, $sMix);
+
+        $this->sBaseUrl = BX_DOL_URL_STUDIO . bx_append_url_params('api.php', ['page' => 'api_config']);
+    }
+
+    public function saveChanges(&$oForm)
+    {
+        $sResult = parent::saveChanges($oForm);
+
+        if(($oSockets = BxDolSockets::getInstance()) && $oSockets->isEnabled())
+            $oSockets->sendEvent('sys_api', 0, 'config_updated', getParam('sys_api_config'));
+
+        //TODO: Add necessary actions here.
+
+        return $sResult;
+    }
+}
+
+/** @} */

+ 19 - 0
studio/js/page.js

@@ -8,6 +8,7 @@
 function BxDolStudioPage(oOptions) {
     this.sActionsUrl = oOptions.sActionUrl;
     this.sObjName = oOptions.sObjName == undefined ? 'oBxDolStudioPage' : oOptions.sObjName;
+    this.sCodeMirror = oOptions.sCodeMirror == undefined ? '' : oOptions.sCodeMirror;
     this.sAnimationEffect = oOptions.sAnimationEffect == undefined ? 'slide' : oOptions.sAnimationEffect;
     this.iAnimationSpeed = oOptions.iAnimationSpeed == undefined ? 'slow' : oOptions.iAnimationSpeed;
     this.oPopupOptions = {
@@ -17,6 +18,12 @@ function BxDolStudioPage(oOptions) {
         },
         closeOnOuterClick: false
     };
+    
+    var $this = this;
+    $(document).ready (function () {
+    	if($this.sCodeMirror != '')
+            $this.initCodeMirror($this.sCodeMirror);
+    });
 }
 
 BxDolStudioPage.prototype.processJson = function (oData) {
@@ -74,4 +81,16 @@ BxDolStudioPage.prototype.togglePopup = function(sName, oLink) {
         $(sId).dolPopup(oPopupOptions);
 };
 
+BxDolStudioPage.prototype.initCodeMirror = function(sSelector) {
+    var oSelector = $(sSelector);
+    for(var i = 0; i < oSelector.length; i++) {
+        var e = CodeMirror.fromTextArea(oSelector.get(i), {
+            lineNumbers: true,
+            mode: "htmlmixed",
+            htmlMode: true,
+            matchBrackets: true
+        });
+    }
+};
+
 /** @} */

+ 15 - 0
studio/template/scripts/BxBaseStudioAPI.php

@@ -24,6 +24,7 @@ class BxBaseStudioAPI extends BxDolStudioAPI
 
         $this->aMenuItems = array(
             BX_DOL_STUDIO_API_TYPE_SETTINGS => array('icon' => 'cogs'),
+            BX_DOL_STUDIO_API_TYPE_CONFIG => array('icon' => 'cogs'),
             BX_DOL_STUDIO_API_TYPE_ORIGINS => array('icon' => 'globe'),
             BX_DOL_STUDIO_API_TYPE_KEYS => array('icon' => 'key'),
         );
@@ -72,6 +73,20 @@ class BxBaseStudioAPI extends BxDolStudioAPI
         
         return $oOptions->getCode();
     }
+    
+    protected function getApiConfig()
+    {
+        $oOptions = new BxTemplStudioOptionsApi(BX_DOL_STUDIO_STG_TYPE_DEFAULT, [
+            'api_config'
+        ]);
+
+        $this->aPageCss = array_merge($this->aPageCss, $oOptions->getCss(), [BX_DIRECTORY_PATH_PLUGINS_PUBLIC . 'codemirror/|codemirror.css']);
+        $this->aPageJs = array_merge($this->aPageJs, $oOptions->getJs(), ['codemirror/codemirror.min.js']);
+
+        return $oOptions->getCode() . $this->getPageJsCode([
+            'sCodeMirror' => "textarea[name='sys_api_config']"
+        ]);
+    }
 
     protected function getKeys()
     {

+ 34 - 0
studio/template/scripts/BxBaseStudioOptionsApi.php

@@ -0,0 +1,34 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaView UNA Studio Representation classes
+ * @ingroup     UnaStudio
+ * @{
+ */
+
+class BxBaseStudioOptionsApi extends BxDolStudioOptionsApi
+{
+    public function __construct($sType = '', $mixedCategory = '', $sMix = '')
+    {
+        parent::__construct($sType, $mixedCategory, $sMix);
+    }
+
+    protected function field($aItem, $aItems2Mixes)
+    {
+        $aField = parent::field($aItem, $aItems2Mixes);
+
+        switch($aItem['name']) {
+            case 'sys_api_config':
+                $aField = array_merge($aField, [
+                    'code' => 1
+                ]);
+                break;
+        }
+
+        return $aField;
+    }
+}
+
+/** @} */

+ 18 - 0
studio/template/scripts_templ/BxTemplStudioOptionsApi.php

@@ -0,0 +1,18 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaStudioView UNA Studio Representation classes
+ * @ingroup     UnaStudio
+ * @{
+ */
+
+class BxTemplStudioOptionsApi extends BxBaseStudioOptionsApi
+{
+    public function __construct($sType = '', $sCategory = '', $sMix = '')
+    {
+        parent::__construct($sType, $sCategory, $sMix);
+    }
+}
+/** @} */