Цей клас було створено з основною метою - отримати інструменти для швидкого створення різних полів, форм і компонентів при розробці модулів, які працюватимуть у повній сумісності з системою EGO CRM.

Клас «ui::» містить два блоки методів різного призначення:

Повна документація представлена за посиланням нижче:

У представлених прикладах значення полів, крім полів з файлами, зберігаються за допомогою класу «storage::» (використовується параметр «value_storage»). Збережені значення видно тільки Вам.

Файли, які ви завантажуєте на цій сторінці прикладів, бачите лише ви.

У всіх прикладах з файлами ми використовуємо параметр «auto_delete» зі значенням «1». Це означає, що всі файли, завантажені вами, будуть видалені через 1 добу.

Методи використовуються для відмалювання полів різних типів і включають багато параметрів.
Зверніть увагу, що деякі поля мають розширені версії (описані у розділі «Одиночні форми»).
Використовуйте конструктор при створенні необхідного набору параметрів, який представлений у документації класу «ui::» для кожного методу.
Ми наводимо посилання на конструктор у кожному прикладі, щоб Ви могли переглянути значення параметрів, які використовуються у прикладах.

1. ui::btn()

Кнопки та посилання.

$args = array();
$args['in_div'] = true;
$args['size'] = '';
$args['handler_click'] = 'my_handler_forms_1';
$args['theme'] = 'primary';
$args['text'] = 'Button text';
$args['icon'] = array('user', 'far', '');
$str .= ui::btn($args);

//===
$args = array();
$args['in_div'] = true;
$args['size'] = 'sm';
$args['btn_open_img'] = media_link('c1c3ad469424684ae939');
$args['theme'] = 'warning';
$args['text'] = 'Open image';
$args['icon'] = array('image', 'far', '');
$str .= ui::btn($args);

//===
$args = array();
$args['in_div'] = true;
$args['as_a_href'] = 'https://www.youtube.com/';
$args['as_a_target'] = '_blank';
$args['btn_style'] = 'link';
$args['text'] = 'Youtube';
$args['icon'] = array('video', 'far', 'text-primary');
$str .= ui::btn($args);

2. ui::btn_onoff()

Кнопки типу Увімкнути / Вимкнути

Метод має розширений варіант «ui::btn_onoff_with_save()», який представлений у розділі «Одиночні форми», де показано, як обробляти це одиночне поле для збереження його значень.

$args = array();
$args['in_div'] = true;
$args['size'] = '';
$str .= ui::btn_onoff($args);

//===
$args = array();
$args['in_div'] = true;
$args['size'] = 'sm';
$args['onoff_text_start'] = 'Text before button'; 
$str .= ui::btn_onoff($args);

3. ui::input()

Поля типу «input»

Метод має розширений варіант «ui::input_with_save()», який представлений у розділі «Одиночні форми», де показано, як обробляти це одиночне поле для збереження його значень.

Виконайте подвійний клік для очищення поляMy help message
$args = array();
$args['in_div'] = true;
$args['name'] = 'my_input';
$args['value'] = '';
$args['placeholder'] = 'Placeholder text';
$args['label'] = 'My label text';
$args['help'] = 'My help message';
$str .= ui::input($args);

4. ui::input_file()

Поля типу «input type=file» для завантаження файлів.

Метод має розширений варіант «ui::input_file_with_save()», який представлений у розділі «Одиночні форми», де показано, як обробляти це одиночне поле для збереження його значень.

(Без підпису)
Файл(и) не завантажений
$args = array();
$args['name'] = 'my_input_file';
$args['in_div'] = true;
$args['size'] = '';
$args['help'] = '';
$args['with_result'] = true;
$args['with_result_detail'] = true;
$args['with_preview'] = true;
$args['with_delete'] = true;
$args['with_caption'] = true;
$str .= ui::input_file($args);

5. ui::textarea()

Текстові області.

Метод має розширений варіант «ui::textarea_with_save()», який представлений у розділі «Одиночні форми», де показано, як обробляти це одиночне поле для збереження його значень.

Виконайте подвійний клік для очищення поляMy help message
$args = array();
$args['in_div'] = true;
$args['name'] = 'my_textarea';
$args['value'] = '';
$args['placeholder'] = 'Placeholder text';
$args['label'] = 'My label text';
$args['help'] = 'My help message';
$args['rows'] = 3;
$str .= ui::textarea($args);

6. ui::select()

Поля типу «select».

Метод має розширений варіант «ui::select_with_save()», який представлений у розділі «Одиночні форми», де показано, як обробляти це одиночне поле для збереження його значень.

My help message
$args = array();
$args['in_div'] = true;
$args['name'] = 'my_select';
$args['value'] = '';
$args['label'] = 'My label text';
$args['help'] = 'My help message';
$args['opts'] = array(
		'opt_1_value'=>'Option 1'
	, 'opt_2_value'=>'Option 2'
	, 'opt_3_value'=>'Option 3'
);
$args['include_opt_not_set'] = true;
$str .= ui::select($args);

7. ui::checkbox()

Поле або множина полів типу «checkbox».

Метод має розширений варіант «ui::checkbox_with_save()», який представлений у розділі «Одиночні форми», де показано, як обробляти це одиночне поле для збереження його значень.

My help message
$args = array();
$args['in_div'] = true;
$args['name'] = 'my_checkboxes';
$args['value'] = '';
$args['label'] = 'My label text';
$args['help'] = 'My help message';
$args['opts'] = array(
		'opt_1_value'=>'Option 1'
	, 'opt_2_value'=>'Option 2'
	, 'opt_3_value'=>'Option 3'
	, 'opt_4_value'=>'Option 4'
	,	'opt_5_value'=>'Option 5'
	, 'opt_6_value'=>'Option 6'
	, 'opt_7_value'=>'Option 7'
	, 'opt_8_value'=>'Option 8'
);
$args['include_opt_not_set'] = true;
$str .= ui::checkbox($args);

8. ui::radio()

Поле або множина полів типу «radio».

Метод має розширений варіант «ui::radio_with_save()», який представлений у розділі «Одиночні форми», де показано, як обробляти це одиночне поле для збереження його значень.

My help message
$args = array();
$args['in_div'] = true;
$args['name'] = 'my_radios';
$args['value'] = '';
$args['label'] = 'My label text';
$args['help'] = 'My help message';
$args['opts'] = array(
		'opt_1_value'=>'Option 1'
	, 'opt_2_value'=>'Option 2'
	, 'opt_3_value'=>'Option 3'
	, 'opt_4_value'=>'Option 4'
	,	'opt_5_value'=>'Option 5'
	, 'opt_6_value'=>'Option 6'
	, 'opt_7_value'=>'Option 7'
	, 'opt_8_value'=>'Option 8'
);
$args['include_opt_not_set'] = true;
$str .= ui::radio($args);

Під одиночними формами маються на увазі одиночні поля, які необхідно зберегти.
Для таких сценаріїв використовуються наведені нижче методи, які автоматично створять необхідну форму, а також кнопку збереження всередині форми, якщо це відповідає логіці.

Вам навіть не потрібно вказувати в методі обробник, просто створіть на вашому сервері обробник за схемою:
save_+назва_поля, тобто префікс «save_», далі атрибут «name» поля.

Нарешті, Вам навіть не знадобиться створювати на Вашому сервері обробник, якщо Ви передаєте параметр «_auto_handler», система зробить усе сама, це зручно, якщо Вам не потрібні жодні додаткові обробки, а лише зберегти значення поля.

У Вашому обробнику на сервері використовуйте метод «ui::get_post_VAL()». Цей метод поверне введене користувачем значення.

У методі «ui::get_post_VAL()» значення, введене користувачем, також буде автоматично відфільтроване залежно від типу поля. Ви також можете встановити тип фільтрації за допомогою параметра «post_filter». Читайте про особливості фільтрації даних:

Після виконання фільтрації система автоматично повертає у поле відфільтроване значення для контролю користувачем того, що він зберігає.
Якщо потрібно змінити повернене значення, використовуйте хелпер «oj_ret()» з першим аргументом «ret_val», другим аргументом передайте значення, яке має повернутися в поле.

1. ui::btn_onoff_with_save()

Розглянемо приклад збереження одиночної кнопки увімкнення - вимкнення.

Наше поле має атрибут «name» зі значенням «my_onoff_short_form», тому на сервері створюємо обробник «save_my_onoff_short_form».
В обробнику використовуємо метод «ui::get_post_VAL()», який поверне значення кнопки «Y» або «N».

У прикладі використовується параметр «value_storage», який виконає автоматичне збереження значення поля у базі даних.

$args = array();
$args['in_div'] = true;
$args['name'] = 'my_onoff_short_form';
$args['value_storage'] = array('api_docs_examples', 'access');
$str .= ui::btn_onoff_with_save($args);
public function save_my_onoff_short_form() { 
	$now_val = ui::get_post_VAL();
	if($now_val === 'Y') {
		// YOUR code
	}
	else {
		// YOUR code
	}
	storage::auto();
	//---
	$msg = e_p(mlang('s_status__success', 1).'!');
	$msg .= e_p('<strong>VALUE:</strong> <br>'.$now_val);
	ojsucc($msg, 3000);
}

2. ui::input_with_save()

Зберігаємо поле «input».

Створюємо на сервері обробник з ідентифікатором у вигляді «save_+назва_поля». Наше поле має атрибут «name» зі значенням «my_input_short_form», отже ідентифікатор обробника буде «save_my_input_short_form».

У прикладі використовується параметр «value_storage», який виконає автоматичне збереження значення поля у базі даних.

Виконайте подвійний клік для очищення поляНатисніть ENTER для збереження
$args = array();
$args['in_div'] = true;
$args['name'] = 'my_input_short_form';
$args['value'] = '';
$args['label'] = 'Type in the word:';
$args['value_storage'] = array('api_docs_examples', 'access');
$str .= ui::input_with_save($args);
public function save_my_input_short_form() { 
	$now_val = (string) ui::get_post_VAL();
	if($now_val !== '') {
		// YOUR code
		storage::auto();
		//---
		$msg = e_p(mlang('s_status__success', 1).'!');
		$msg .= e_p('<strong>VALUE:</strong> <br>'.$now_val);
		ojsucc($msg, 3000);
	}
	else {
		ojerr(mlang('s_form__fill', 1).'!');
	}
}

3. ui::input_file_with_save()

Зберегти файл(и), завантажені користувачем.

Цей метод може працювати повністю автоматично, Вам навіть не потрібно створювати обробник, система зробить усе сама.

Докладніше про роботу з «input type=file» читайте за посиланням нижче.

Приклад:КЛАС «ui::» | Клас «upload::» | Приклади роботи з «input type=file»

(Без підпису)
Файл(и) не завантаженийТільки файли: png, jpg, jpeg, gif, ico
$args = array();
$args['name'] = 'my_ui_file_input';
$args['in_div'] = true;
$args['inp_file_only_imgs'] = true;
$args['with_caption'] = true;
$args['multiple'] = true;
$args['auto_delete'] = 1;
$str .= ui::input_file_with_save($args);

4. ui::textarea_with_save()

Зберегти поле «textarea».

Створюємо на сервері обробник з ідентифікатором у вигляді «save_+назва_поля». Наше поле має атрибут «name» зі значенням «my_textarea_short_form», отже ідентифікатор обробника буде «save_my_textarea_short_form».

У прикладі використовується параметр «value_storage», який виконає автоматичне збереження значення поля у базі даних.

Виконайте подвійний клік для очищення поляНатисніть ENTER для збереженняНатисніть SHIFT+ENTER для перенесення рядка
$args = array();
$args['in_div'] = true;
$args['name'] = 'my_textarea_short_form';
$args['value'] = '';
$args['label'] = 'Type in the words:';
$args['rows'] = 3;
$args['value_storage'] = array('api_docs_examples', 'access');
$str .= ui::textarea_with_save($args);
public function save_my_textarea_short_form() { 
	$now_val = (string) ui::get_post_VAL();
	if($now_val !== '') {
		// YOUR code
		storage::auto();
		//---
		$msg = e_p(mlang('s_status__success', 1).'!');
		$msg .= e_p('<strong>VALUE:</strong> <br>'.nl2br($now_val));
		ojsucc($msg, 3000);
	}
	else {
		ojerr(mlang('s_form__fill', 1).'!');
	}
}

5. ui::select_with_save()

Зберегти поле «select».

У прикладі використовується параметр «value_storage», який виконає автоматичне збереження значення поля у базі даних.

Для цього прикладу ми не створюватимемо обробник на сервері, оскільки використовуємо параметр «_auto_handler», який запустить системний автоматичний обробник.

$args = array();
$args['in_div'] = true;
$args['name'] = 'my_select_short_form';
$args['value'] = '';
$args['label'] = 'Select option:';
$args['opts'] = array(
		'opt_1_value'=>'Option 1'
	,	'opt_2_value'=>'Option 2'
	,	'opt_3_value'=>'Option 3'
	,	'opt_4_value'=>'Option 4'
	,	'opt_5_value'=>'Option 5'
);
$args['include_opt_not_set'] = true;
$args['value_storage'] = array('api_docs_examples', 'access');
$args['_auto_handler'] = true;
$str .= ui::select_with_save($args);

6. ui::select_with_save()

Зберегти поле «select» з параметром «multiple» зі значенням «TRUE».

Створюємо на сервері обробник з ідентифікатором у вигляді «save_+назва_поля». Наше поле має атрибут «name» зі значенням «my_select_multiple_short_form», отже ідентифікатор обробника буде «save_my_select_multiple_short_form».
Зверніть увагу, що в обробнику метод «ui::get_post_VAL()» поверне масив обраних користувачем значень, а не одне значення, як у попередньому прикладі.

У прикладі використовується параметр «value_storage», який виконає автоматичне збереження значення поля у базі даних.

Виберіть кілька значень, утримуючи Ctrl(Command).
$args = array();
$args['in_div'] = true;
$args['name'] = 'my_select_multiple_short_form';
$args['value'] = '';
$args['label'] = 'Select option:';
$args['opts'] = array(
		'opt_1_value'=>'Option 1'
	,	'opt_2_value'=>'Option 2'
	,	'opt_3_value'=>'Option 3'
	,	'opt_4_value'=>'Option 4'
	,	'opt_5_value'=>'Option 5'
);
$args['include_opt_not_set'] = true;
$args['multiple'] = true;
$args['value_storage'] = array('api_docs_examples', 'access');
$str .= ui::select_with_save($args);
public function save_my_select_multiple_short_form() { 
	$now_val = ui::get_post_VAL();
	if(!empty($now_val)) {
		// YOUR code
		storage::auto();
		//---
		$msg = e_p(mlang('s_status__success', 1).'!');
		$now_val_format = "<pre>\n";
			$now_val_format .= print_r($now_val, true);
		$now_val_format .= "</pre>";
		$msg .= e_p('<strong>VALUE:</strong> <br>'.$now_val_format);
		ojsucc($msg, 3000);
	}
	else {
		ojerr(mlang('s_form__fill', 1).'!');
	}
}

7. ui::checkbox_with_save()

Зберегти поле або множину полів «checkbox».

У прикладі використовується параметр «value_storage», який виконає автоматичне збереження значення поля у базі даних.

Для цього прикладу ми не створюватимемо обробник на сервері, оскільки використовуємо параметр «_auto_handler», який запустить системний автоматичний обробник.

$args = array();
$args['in_div'] = true;
$args['name'] = 'my_checkboxes_short_form';
$args['value'] = '';
$args['label'] = 'Check options:';
$args['opts'] = array(
		'opt_1_value'=>'Option 1'
	,	'opt_2_value'=>'Option 2'
	,	'opt_3_value'=>'Option 3'
	,	'opt_4_value'=>'Option 4'
	,	'opt_5_value'=>'Option 5'
);
$args['max_opts_in_block'] = 2;
$args['value_storage'] = array('api_docs_examples', 'access');
$args['_auto_handler'] = true;
$str .= ui::checkbox_with_save($args);

8. ui::radio_with_save()

Зберегти поле або множину полів «radio».

У прикладі використовується параметр «value_storage», який виконає автоматичне збереження значення поля у базі даних.

Для цього прикладу ми не створюватимемо обробник на сервері, оскільки використовуємо параметр «_auto_handler», який запустить системний автоматичний обробник.

$args = array();
$args['in_div'] = true;
$args['name'] = 'my_radios_short_form';
$args['value'] = '';
$args['label'] = 'Select radio:';
$args['opts'] = array(
		'opt_1_value'=>'Option 1'
	,	'opt_2_value'=>'Option 2'
	,	'opt_3_value'=>'Option 3'
	,	'opt_4_value'=>'Option 4'
	,	'opt_5_value'=>'Option 5'
);
$args['max_opts_in_block'] = 2;
$args['value_storage'] = array('api_docs_examples', 'access');
$args['_auto_handler'] = true;
$str .= ui::radio_with_save($args);

Під комплексними формами маються на увазі форми, у яких знаходиться кілька полів, які необхідно зберегти.

  • Побудова комплексних форм повинна починатися з методу «ui::form_start()» з відповідними параметрами.

  • Далі йдуть методи, які створюють поля потрібних типів.
  • І нарешті, комплексна форма повинна закінчуватися методом «ui::form_end()» з відповідними параметрами.

Обов’язковим елементом будь-якої форми, яку потрібно зберегти, є кнопка збереження форми.
В залежності від параметрів, переданих методу «ui::form_end()», кнопка може бути відрендерена системою автоматично.
Вивчіть опис конструктора методу «ui::form_end()».

Фільтрація вхідних даних форми в обробнику здійснюється за допомогою методу «ui::get_post_VALS()», який виконує фільтрацію автоматично залежно від типу поля. Метод поверне масив відфільтрованих значень кожного поля. Також Ви можете самостійно перебрати масив $_POST['val'] (не рекомендується).

Ви також можете встановити тип фільтрації для будь-якого поля, якщо необхідно, за допомогою параметра «post_filter». Читайте про особливості фільтрації даних:

1.

Приклад роботи з звичайною комплексною формою.
Вказуємо обробник форми «saves_form_example_1» у методі «ui::form_end()».

Створюємо на сервері обробник з ідентифікатором «saves_form_example_1».
Зверніть увагу, префікс «saves_» в ідентифікаторі обробника обов’язковий!

У нашій формі присутнє поле типу «file». Система повністю автоматично завантажить файл, ніяких обробок у обробнику не використовуємо. Про те, як працювати з полями типу «file», дивіться окремий приклад у документації.

У прикладі використовується параметр «value_storage», який виконає автоматичне збереження значення поля у базі даних.

Мін. 0Макс. 1000
Виконайте подвійний клік для очищення поля

(Без підпису)
Файл(и) не завантажений
$str .= ui::form_start();
//--- INPUT number
$args = array();
$args['in_div'] = true;
$args['name'] = 'my_input_number';
$args['label'] = 'Type in the number:';
$args['type'] = 'number';
$args['inp_type_number_min'] = 0;
$args['inp_type_number_max'] = 1000;
$args['value_storage'] = array('api_docs_examples_complex', 'access');
$str .= ui::input($args);
//--- SELECT
$args = array();
$args['in_div'] = true;
$args['name'] = 'my_select';
$args['value'] = '';
$args['label'] = 'Select the option:';
$args['opts'] = array(
		'opt_1_value'=>'Option 1'
	,	'opt_2_value'=>'Option 2'
	,	'opt_3_value'=>'Option 3'
	,	'opt_4_value'=>'Option 4'
);
$args['include_opt_not_set'] = true;
$args['value_storage'] = array('api_docs_examples_complex', 'access');
$str .= ui::select($args);
//--- CHECKBOXES
$args = array();
$args['in_div'] = true;
$args['name'] = 'my_checkboxes';
$args['value'] = '';
$args['label'] = 'Check the checkboxes:';
$args['opts'] = array(
		'check_1_value'=>'Option 1'
	,	'check_2_value'=>'Option 2'
	,	'check_3_value'=>'Option 3'
	,	'check_4_value'=>'Option 4'
);
$args['max_opts_in_block'] = 2;
$args['value_storage'] = array('api_docs_examples_complex', 'access');
$str .= ui::checkbox($args);
//--- INPUT TYPE FILE
$args = array();
$args['name'] = 'my_form_file_example_1_';
$args['in_div'] = true;
$args['multiple'] = true;
$args['with_caption'] = true;
$args['auto_delete'] = 1;
$str .= ui::input_file($args);
//=== form end
$str .= ui::form_end('saves_form_example_1');
public function saves_form_example_1() { 
	$now_vals = ui::get_post_VALS();
	//if(...) {
		// YOUR code
	// }
	storage::auto();
	//---
	$msg = e_p(mlang('s_status__success', 1).'!');
	$now_vals_format = "<pre>\n";
		$now_vals_format .= print_r($now_vals, true);
	$now_vals_format .= "</pre>";
	$msg .= e_p('<strong>VALUES:</strong> <br>'.$now_vals_format);
	//---
	$now_uploaded = upload::get_uploaded();
	$now_uploaded_format = "<pre>\n";
		$now_uploaded_format .= print_r($now_uploaded, true);
	$now_uploaded_format .= "</pre>";
	$msg .= e_p('<strong>UPLOADED:</strong> <br>'.$now_uploaded_format);
	ojsucc($msg, false);
}

2.

Повторимо попередній приклад, додавши «required» полям.

У прикладі використовується параметр «value_storage», який виконає автоматичне збереження значення поля у базі даних.

Також зверніть увагу, що у цьому прикладі використовується повністю автоматична обробка.
Для цього ми передали методу «ui::form_end()» додатковий префікс «auto:».
У такому випадку не потрібно створювати обробник на сервері, система все зробить автоматично.

* заповніть поле
Мін. 0Макс. 1000
Виконайте подвійний клік для очищення поля
* заповніть поле

* виберіть хоча б одне значення
(Без підпису)
* заповніть поле
Файл(и) не завантажений
$str .= ui::form_start();
//--- INPUT number
$args = array();
$args['in_div'] = true;
$args['name'] = 'my_input_number';
$args['label'] = 'Type in the number:';
$args['type'] = 'number';
$args['inp_type_number_min'] = 0;
$args['inp_type_number_max'] = 1000;
$args['required'] = true;
$args['value_storage'] = array('api_docs_examples_complex_auto', 'access');
$str .= ui::input($args);
//--- SELECT
$args = array();
$args['in_div'] = true;
$args['name'] = 'my_select';
$args['value'] = '';
$args['label'] = 'Select the option:';
$args['opts'] = array(
		'opt_1_value'=>'Option 1'
	,	'opt_2_value'=>'Option 2'
	,	'opt_3_value'=>'Option 3'
	,	'opt_4_value'=>'Option 4'
);
$args['include_opt_not_set'] = true;
$args['required'] = true;
$args['value_storage'] = array('api_docs_examples_complex_auto', 'access');
$str .= ui::select($args);
//--- CHECKBOXES
$args = array();
$args['in_div'] = true;
$args['name'] = 'my_checkboxes';
$args['value'] = '';
$args['label'] = 'Check the checkboxes:';
$args['opts'] = array(
		'check_1_value'=>'Option 1'
	,	'check_2_value'=>'Option 2'
	,	'check_3_value'=>'Option 3'
	,	'check_4_value'=>'Option 4'
);
$args['max_opts_in_block'] = 2;
$args['required'] = true;
$args['value_storage'] = array('api_docs_examples_complex_auto', 'access');
$str .= ui::checkbox($args);
//--- INPUT TYPE FILE
$args = array();
$args['name'] = 'my_form_file_example_2_';
$args['in_div'] = true;
$args['multiple'] = true;
$args['with_caption'] = true;
$args['auto_delete'] = 1;
$args['required'] = true;
$str .= ui::input_file($args);
//=== form end
$str .= ui::form_end('auto:saves_form_example_2');
public function saves_form_example_1() { 
	$now_vals = ui::get_post_VALS();
	//if(...) {
		// YOUR code
	// }
	storage::auto();
	//---
	$msg = e_p(mlang('s_status__success', 1).'!');
	$now_vals_format = "<pre>\n";
		$now_vals_format .= print_r($now_vals, true);
	$now_vals_format .= "</pre>";
	$msg .= e_p('<strong>VALUES:</strong> <br>'.$now_vals_format);
	//---
	$now_uploaded = upload::get_uploaded();
	$now_uploaded_format = "<pre>\n";
		$now_uploaded_format .= print_r($now_uploaded, true);
	$now_uploaded_format .= "</pre>";
	$msg .= e_p('<strong>UPLOADED:</strong> <br>'.$now_uploaded_format);
	ojsucc($msg, false);
}

У цьому блоці прикладів окремо розглянемо використання розширених схем обробки. Під розширеними схемами розуміється участь Ваших кастомних JS-кодів, які можуть використовуватися ДО відправлення даних форми по ajax, так і ПІСЛЯ отримання відповіді по ajax.

Обов’язково вивчіть схеми обробки за посиланням нижче (Конструктор схеми обробки). Використовуйте цю документацію для розуміння наведених нижче прикладів:

1.

Додамо у цьому прикладі JS-обробку перед відправленням форми через ajax.
Наше поле має атрибут «name» зі значенням «input_extend_js_1», отже ідентифікатор обробника на сервері буде «save_input_extend_js_1». Такий самий ідентифікатор обробника використовується у JS-коді. Створюємо об’єкт «$$.save_input_extend_js_1 = {};». Далі додаємо об’єкту властивість «start» у вигляді функції, яка міститиме наш код обробки.

У прикладі використовується параметр «value_storage», який виконає автоматичне збереження значення поля у базі даних.

Виконайте подвійний клік для очищення поляНатисніть ENTER для збереження
$args = array();
$args['in_div'] = true;
$args['name'] = 'input_extend_js_1';
$args['label'] = 'Type in the word:';
$args['value_storage'] = array('api_docs_examples_js', 'access');
$str .= ui::input_with_save($args);
$$.save_input_extend_js_1 = {};
$$.save_input_extend_js_1.start = function(data, element, event) {
	console.log('data', data);
  var confirm_text = $$.mlang('forms_example__extend_js_confirm_example');
  confirm_text += ' '+data.val.length;
  confirm_text +='?';
  if(!confirm(confirm_text)) return false;
  data.my_par_1 = 'my_value_1';
}

2.

У наступному прикладі виконаємо обробку ПІСЛЯ отримання успішної відповіді по ajax. Для цього в JS-обробнику за аналогією з попереднім прикладом створюємо властивість «cb» у вигляді функції.

У нашому прикладі після отримання відповіді по ajax JS-код перекрасить поле і додасть «disabled».

$args = array();
$args['in_div'] = true;
$args['name'] = 'select_extend_js_2';
$args['label'] = 'Select option:';
$args['opts'] = array(
    'opt_1_value'=>'opt_1_label'
  , 'opt_2_value'=>'opt_2_label'
  , 'opt_3_value'=>'opt_3_label'
  , 'opt_4_value'=>'opt_4_label'
);
$str .= ui::select_with_save($args);
$$.save_select_extend_js_2 = {};
$$.save_select_extend_js_2.cb = function(json, element, event) {
  console.log('json', json);
  var field =	element.closest('form').find('select');
  field.prop('disabled', true).css({'background-color': '#d4f0ff'});
}

3.

Нарешті, розглянемо складніший приклад. Використовуємо комплексну форму. У JS-коді прописуємо обробники як ПЕРЕД відправкою ajax, так і ПІСЛЯ отримання відповіді по ajax.

У нашому прикладі ми використовуємо ідентифікатор обробника «saves_complex_extend_js», який вказаний у методі «ui::form_end()». Отже, у нашому JS-коді створюємо об’єкт з назвою «saves_complex_extend_js» і додаємо необхідні властивості-функції.

Зверніть увагу, що ми також додали обробник першому полю select.

У прикладі використовується параметр «value_storage», який виконає автоматичне збереження значення поля у базі даних.

Також зверніть увагу, що у цьому прикладі використовується повністю автоматична обробка.
Для цього ми передали методу «ui::form_end()» додатковий префікс «auto:».
У такому випадку не потрібно створювати обробник на сервері, система все зробить автоматично.

Виконайте подвійний клік для очищення поля
$str .= ui::form_start();
	$args = array();
	$args['in_div'] = true;
	$args['name'] = 'select_complex_js';
	$args['label'] = 'Select option:';
	$args['handler_change'] = 'select_interaction';
	$args['opts'] = array(
			'opt_1_value'=>'opt_1_label'
		, 'opt_2_value'=>'opt_2_label'
		, 'opt_3_value'=>'opt_3_label'
		, 'opt_4_value'=>'opt_4_label'
	);
	$args['include_opt_not_set'] = true;
	$args['value_storage'] = array('api_docs_examples_js_complex', 'access');
	$str .= ui::select($args);
	
	$str .= '<div class="js-by_select_interaction" style="display: none;">';
		$args = array();
		$args['in_div'] = true;
		$args['name'] = 'checkbox_complex_js';
		$args['label'] = 'Check options:';
		$args['opts'] = array(
				'opt_1_value'=>'opt_1_label'
			, 'opt_2_value'=>'opt_2_label'
			, 'opt_3_value'=>'opt_3_label'
			, 'opt_4_value'=>'opt_4_label'
		);
		$args['value_storage'] = array('api_docs_examples_js_complex', 'access');
		$str .= ui::checkbox($args);
	$str .= '</div>';
	
	$args = array();
	$args['in_div'] = true;
	$args['name'] = 'textarea_complex_js';
	$args['label'] = 'Type in the words:';
	$args['value_storage'] = array('api_docs_examples_js_complex', 'access');
	$str .= ui::textarea($args);

$str .= ui::form_end('auto:saves_complex_extend_js');
$$.select_interaction = function(data, element, event) {
  var div_by_select_interaction = element.closest('form').find('.js-by_select_interaction');
  if(data.val!=='') div_by_select_interaction.slideDown();
  else div_by_select_interaction.slideUp();
  return true;
}

$$.saves_complex_extend_js = {};
$$.saves_complex_extend_js.start = function(data, element, event) {
  console.log('data', data);
  var form = element.closest('form');
  form.css({'transform': 'rotate(-5deg)'});
}
$$.saves_complex_extend_js.cb = function(json, element, event) {
  console.log('json', json);
  var form = element.closest('form');
  form.css({'transform': 'rotate(0deg)'});
}

Іноді потрібно додати обробник DOM-елементу. Ви можете зробити це звичайними методами JS (JQUERY). Проте для роботи обробників у системі EGO CRM з урахуванням усіх її можливостей, елементу потрібно призначити спеціальні атрибути та класи.
Використовуючи метод ui::dom_element() під час створення HTML-тега елемента, ви вводите цей елемент у стандартну роботу системи, як це відбувається з полями форм.

У подальшому щодо елемента Ви можете використовувати будь-яку схему обробки, вивчіть розділ «Конструктор схеми обробки» за посиланням нижче:

1.

Виконаємо лише JS-обробку по кліку на елементі DIV.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus volutpat lacinia nunc, eget tincidunt est maximus eu.
$args = array();
$args['handler_click'] = 'color_my_box';
$args['id'] = set_id('my_coloring_div');
$args['addclass'] = 'p-3 border';
$args['attrs'] = array(
	  'data-color_1'=>'red'
	, 'data-color_2'=>'blue'
	, 'data-color_3'=>'green'
	, 'data-color_4'=>'orange'
	, 'style'=>'background: orange; color: white;'
);
$args['cursor'] = 'pointer';
$str .= '<div '.ui::dom_element($args).' >';
  $str .= 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus volutpat lacinia nunc, eget tincidunt est maximus eu.';
$str .= '</div>';
$$._now_color = 1;
$$.color_my_box = function(data, element, event){
	element.css({'background': element.data('color_'+$$._now_color)});
	$$._now_color++;
	if($$._now_color>4) $$._now_color = 1;
	return true;
}

2.

Ускладнимо попередній приклад обробкою по ajax.

Душа моя озарена неземной радостью, как эти чудесные весенние утра, которыми я наслаждаюсь от всего сердца.
$args = array();
$args['handler_click'] = 'color_my_box_with_ajax';
$args['id'] = set_id('my_coloring_div_with_ajax');
$args['addclass'] = 'p-3 border';
$args['attrs'] = array(
	  'data-color_1'=>'orange'
	, 'data-color_2'=>'red'
	, 'data-color_3'=>'blue'
	, 'data-color_4'=>'green'
	, 'style'=>'background: green; color: white;'
);
$args['cursor'] = 'pointer';
$str .= '<div '.ui::dom_element($args).' >';
  $str .= 'Душа моя озарена неземной радостью, как эти чудесные весенние утра, которыми я наслаждаюсь от всего сердца.';
$str .= '</div>';
$$._number_color = 1;
$$.color_my_box_with_ajax = {};
$$.color_my_box_with_ajax.start = function(data, element, event){
	element.css({'background': element.data('color_'+$$._number_color)});
	data._number_color = $$._number_color;
	$$._number_color++;
	if($$._number_color>4) $$._number_color = 1;
}

3.

Специфічним застосуванням є підключення контекстного меню (клік правою кнопкою миші).
Детальні приклади дивіться за посиланням:

Приклад:КЛАС «ui::» | Контекстне меню (права кнопка миші)

Методи використовуються для відмалювання спеціальних компонентів.

1. ui::dropdown()

Випадаючий елемент.
Дивіться докладні приклади за посиланням нижче.

Приклад:КЛАС «ui::» | Випадаючий елемент - dropdown

$args = array();
$args['btn_text'] = 'Text for button';
$args['body'] = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus volutpat lacinia nunc, eget tincidunt est maximus eu.';
$str .= ui::dropdown($args);

2. ui::tabs()

Вкладки - Tabs / Pills.
Дивіться докладні приклади за посиланням нижче.

Приклад:КЛАС «ui::» | Вкладки - Tabs / Pills

Lorem ipsum dolor sit amet, consectetur adipiscing elit. In a eleifend ante, sed ultrices ipsum. Praesent id lectus mattis, dapibus massa et, blandit ipsum. Pellentesque ullamcorper ante augue, id aliquam sem vulputate id. Sed elit augue, molestie a elit aliquet, facilisis elementum eros. Nam non enim sapien. Vivamus non eleifend quam. Nam dapibus condimentum porttitor. Aenean tempor tincidunt tristique.
Далеко-далеко за словесными горами в стране гласных и согласных живут рыбные тексты. Вдали от всех живут они в буквенных домах на берегу Семантика большого языкового океана.
Душа моя озарена неземной радостью, как эти чудесные весенние утра, которыми я наслаждаюсь от всего сердца. Я совсем один и блаженствую в здешнем краю, словно созданном для таких, как я. Я так счастлив, мой друг, так упоен ощущением покоя, что искусство мое страдает от этого. Ни одного штриха не мог бы я сделать, а никогда не был таким большим художником, как в эти минуты.
$args = array();
$args['children'] = array();
//--- Tab 1
$tab = array(
		'btn_text'=>'Tab 1'
	, 'body'=>'Lorem ipsum dolor sit amet, consectetur adipiscing elit. In a eleifend ante, sed ultrices ipsum. Praesent id lectus mattis, dapibus massa et, blandit ipsum. Pellentesque ullamcorper ante augue, id aliquam sem vulputate id. Sed elit augue, molestie a elit aliquet, facilisis elementum eros. Nam non enim sapien. Vivamus non eleifend quam. Nam dapibus condimentum porttitor. Aenean tempor tincidunt tristique.'
);
$args['children'][] = $tab;
//--- Tab 2
$tab = array(
		'btn_text'=>'Tab 2'
	, 'body'=>'Далеко-далеко за словесными горами в стране гласных и согласных живут рыбные тексты. Вдали от всех живут они в буквенных домах на берегу Семантика большого языкового океана.'
);
$args['children'][] = $tab;
//--- Tab 3
$tab = array(
		'btn_text'=>'Tab 3'
	, 'body'=>'Душа моя озарена неземной радостью, как эти чудесные весенние утра, которыми я наслаждаюсь от всего сердца. Я совсем один и блаженствую в здешнем краю, словно созданном для таких, как я. Я так счастлив, мой друг, так упоен ощущением покоя, что искусство мое страдает от этого. Ни одного штриха не мог бы я сделать, а никогда не был таким большим художником, как в эти минуты.'
);
$args['children'][] = $tab;
//---
$args['style_pills'] = false;
$str .= ui::tabs($args);

3. ui::gallery()

Галерея.
Дивіться докладні приклади за посиланням нижче.

Приклад:КЛАС «ui::» | Галерея - Gallery

[Дивитися]
$args = array();
$args['children'] = array();
//--- Image 1
$image_set = array(
		'src'=>media_link('011ab21242e86e7d7635')
	, 'caption'=>'Caption for image 1'
);
$args['children'][] = $image_set;
//--- Image 2
$image_set = array(
		'src'=>media_link('3e1861d3864ba55b27a8')
	, 'caption'=>'Caption for image 2'
);
$args['children'][] = $image_set;
//---
$str .= ui::gallery($args);

У попередніх прикладах на цій сторінці ми вже використовували клас «storage::» у різних автоматичних варіантах під час роботи з полями форм.
Розглянемо варіант ручного використання класу «storage::». Ручне використання потрібне, коли потрібно зберегти деякі значення, не пов’язані з полями форм.

Можливих прикладів такого використання класу може бути безліч. Ми наведемо лише 1 приклад.

У нашому прикладі ми створимо 3 вкладки. У кожній вкладці по 4 субвкладки.
За замовчуванням при завантаженні сторінки відкривається вкладка 1 і субвкладка 1.
Однак припустимо, що нам потрібно зберегти, яка вкладка і субвкладка були відкриті останній раз, щоб при наступному перезавантаженні сторінки відкрилися останні збережені вкладка і субвкладка. Також запам’ятаємо, яка субвкладка була відкритою останній раз у кожній вкладці.

Проаналізуйте створений приклад.

Приклад

Переключіть вкладку та субвкладку і перезавантажте сторінку.

$args = array();
//===  get saved open_tab
$saved_open_tab = storage::get_value('api_docs_examples_storage', 'open_tab');
if(!$saved_open_tab) $saved_open_tab = 0;
//===
$args['children'] = array();
$args['children'][] = array(
		'btn_text'=>'Tab 1'
	, 'handler_tab'=>'open_tab'
	, 'handler_tab_force'=>true
	, 'use_btn_reload'=>false
	, 'init_open'=>($saved_open_tab === 0 ? true : false)
);
$args['children'][] = array(
		'btn_text'=>'Tab 2'
	, 'handler_tab'=>'open_tab'
	, 'handler_tab_force'=>true
	, 'use_btn_reload'=>false
	, 'init_open'=>($saved_open_tab === 1 ? true : false)
);
$args['children'][] = array(
		'btn_text'=>'Tab 3'
	, 'handler_tab'=>'open_tab'
	, 'handler_tab_force'=>true
	, 'use_btn_reload'=>false
	, 'init_open'=>($saved_open_tab === 2 ? true : false)
);
$str .= ui::tabs($args);
public function open_tab() { 
	$str = '';
	$open_tab = $this->post['_tab'];
	//=== save to storage
	storage::init('api_docs_examples_storage', 'access');
	storage::set_f('open_tab', $open_tab, 'int');
	storage::save();
	//=== get saved open_sub_tab
	$saved_open_sub_tab_rels = storage::get_value('api_docs_examples_storage', 'open_sub_tab');
	if(!$saved_open_sub_tab_rels) $saved_open_sub_tab_rels = array();
	$saved_open_sub_tab = (isset($saved_open_sub_tab_rels[$open_tab]) ? (int) $saved_open_sub_tab_rels[$open_tab] : 0);
	//===
	$str .= '<div class="pl-3 border-left border-warning">';
		$str .= '<div class="py-4">My content for Tab '.($open_tab+1).'</div>';
		//===
		$args = array();
		$args['children'] = array();
		$args['children'][] = array(
				'btn_text'=>'SubTab 1'
			, 'handler_tab'=>'open_sub_tab'
			, 'handler_tab_force'=>true
			, 'handler_tab_pars'=>array('open_tab'=>$open_tab)
			, 'use_btn_reload'=>false
			, 'init_open'=>($saved_open_sub_tab === 0 ? true : false)
		);
		$args['children'][] = array(
				'btn_text'=>'SubTab 2'
			, 'handler_tab'=>'open_sub_tab'
			, 'handler_tab_force'=>true
			, 'handler_tab_pars'=>array('open_tab'=>$open_tab)
			, 'use_btn_reload'=>false
			, 'init_open'=>($saved_open_sub_tab === 1 ? true : false)
		);
		$args['children'][] = array(
				'btn_text'=>'SubTab 3'
			, 'handler_tab'=>'open_sub_tab'
			, 'handler_tab_force'=>true
			, 'handler_tab_pars'=>array('open_tab'=>$open_tab)
			, 'use_btn_reload'=>false
			, 'init_open'=>($saved_open_sub_tab === 2 ? true : false)
		);
		$args['children'][] = array(
				'btn_text'=>'SubTab 4'
			, 'handler_tab'=>'open_sub_tab'
			, 'handler_tab_force'=>true
			, 'handler_tab_pars'=>array('open_tab'=>$open_tab)
			, 'use_btn_reload'=>false
			, 'init_open'=>($saved_open_sub_tab === 3 ? true : false)
		);
		$str .= ui::tabs($args);
	$str .= '</div>';
	oj_tab($str);
}
public function open_sub_tab() { 
	$str = '';
	$open_sub_tab = $this->post['_tab'];
	$open_tab = $this->post['open_tab'];
	//=== save to storage
	$open_sub_tabs_rels = array($open_tab=>$open_sub_tab);
	storage::init('api_docs_examples_storage', 'access');
	storage::set_f('open_sub_tab', $open_sub_tabs_rels, 'array:add');
	storage::save();
	//===
	$str .= '<div class="py-4">My SubTab '.($open_sub_tab+1).' content for Tab '.($open_tab+1).'</div>';
	oj_tab($str);
}