Ta klasa została stworzona z głównym celem - uzyskać narzędzia do szybkiego tworzenia różnych pól, formularzy i komponentów przy tworzeniu modułów, które będą działać w pełnej kompatybilności z systemem EGO CRM.

Klasa «ui::» zawiera dwa bloki metod o różnych celach:

Pełna dokumentacja jest dostępna pod poniższym linkiem:

W przedstawionych przykładach wartości pól, poza polami plików, są zapisywane przy pomocy klasy «storage::» (używany jest parametr «value_storage»). Zapisane wartości widzisz tylko Ty.

Pliki, które ładujesz na tej stronie przykładów, są widoczne tylko dla Ciebie.

We wszystkich przykładach z plikami używamy parametru «auto_delete» z wartością «1». Oznacza to, że wszystkie pliki, które wgrasz, zostaną usunięte po 1 dniu.

Metody służą do renderowania pól różnych typów i zawierają wiele parametrów.
Zwróć uwagę, że niektóre pola mają rozszerzone wersje (opisane w sekcji «Formularze pojedyncze»).
Używaj konstruktora podczas tworzenia potrzebnego zestawu parametrów, który jest przedstawiony w każdej metodzie w dokumentacji klasy «ui::».
Podajemy linki do konstruktora w każdym przykładzie, abyś mógł zobaczyć wartości używanych w przykładach parametrów.

1. ui::btn()

Przyciski i linki.

$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()

Przyciski typu Włącz / Wyłącz

Metoda ma rozszerzoną wersję «ui::btn_onoff_with_save()», która jest przedstawiona w sekcji «Formularze pojedyncze», gdzie pokazano, jak przetwarzać to pojedyncze pole do zapisywania jego wartości.

$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()

Pola typu «input»

Metoda ma rozszerzoną wersję «ui::input_with_save()», która jest przedstawiona w sekcji «Formularze pojedyncze», gdzie pokazano, jak przetwarzać to pojedyncze pole do zapisywania jego wartości.

Kliknij dwukrotnie, aby wyczyścić poleMy 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()

Pola typu «input type=file» do przesyłania plików.

Metoda ma rozszerzoną wersję «ui::input_file_with_save()», która jest przedstawiona w sekcji «Formularze pojedyncze», gdzie pokazano, jak przetwarzać to pojedyncze pole do zapisywania jego wartości.

(Bez podpisu)
Plik(i) nie załadowany
$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()

Obszary tekstowe.

Metoda ma rozszerzoną wersję «ui::textarea_with_save()», która jest przedstawiona w sekcji «Formularze pojedyncze», gdzie pokazano, jak przetwarzać to pojedyncze pole do zapisywania jego wartości.

Kliknij dwukrotnie, aby wyczyścić poleMy 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()

Pola typu «select».

Metoda ma rozszerzoną wersję «ui::select_with_save()», która jest przedstawiona w sekcji «Formularze pojedyncze», gdzie pokazano, jak przetwarzać to pojedyncze pole do zapisywania jego wartości.

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()

Pole lub wiele pól typu «checkbox».

Metoda ma rozszerzoną wersję «ui::checkbox_with_save()», która jest przedstawiona w sekcji «Formularze pojedyncze», gdzie pokazano, jak przetwarzać to pojedyncze pole do zapisywania jego wartości.

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()

Pole lub wiele pól typu «radio».

Metoda ma rozszerzoną wersję «ui::radio_with_save()», która jest przedstawiona w sekcji «Formularze pojedyncze», gdzie pokazano, jak przetwarzać to pojedyncze pole do zapisywania jego wartości.

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);

Formularze pojedyncze to pojedyncze pola, które wymagają zapisania.
Dla takich scenariuszy używa się wymienionych poniżej metod, które automatycznie stworzą potrzebny formularz oraz przycisk zapisywania wewnątrz formularza, jeśli jest to zgodne z logiką.

Nie musisz nawet wskazywać handlera w metodzie, po prostu utwórz handler na swoim serwerze według schematu:
save_+nazwa_pola, tj. prefiks «save_», następnie atrybut «name» pola.

Na koniec nawet nie będziesz musiał tworzyć handlera na swoim serwerze, jeśli przekażesz parametr «_auto_handler», system zrobi wszystko sam, to wygodne, jeśli nie potrzebujesz żadnych dodatkowych przetwarzań, a tylko zapisać wartość pola.

W handlerze na serwerze użyj metody «ui::get_post_VAL()». Ta metoda zwróci wartość wprowadzoną przez użytkownika.

W metodzie «ui::get_post_VAL()» wartość wprowadzona przez użytkownika zostanie również automatycznie przefiltrowana w zależności od typu pola. Możesz także ustawić typ filtrowania za pomocą parametru «post_filter». Przeczytaj o szczegółach filtrowania danych:

Po wykonaniu filtrowania system automatycznie zwraca do pola przefiltrowaną wartość, aby użytkownik mógł kontrolować to, co zapisuje.
Jeśli trzeba zmienić zwracaną wartość, użyj helpera «oj_ret()» z pierwszym argumentem «ret_val», a drugim wartość, która ma zostać zwrócona do pola.

1. ui::btn_onoff_with_save()

Przeanalizujmy przykład zapisywania pojedynczego przycisku włącz/wyłącz.

Nasze pole ma atrybut «name» z wartością «my_onoff_short_form», więc na serwerze tworzymy obsługującego «save_my_onoff_short_form».
W obsługującym używamy metody «ui::get_post_VAL()», która zwróci wartość przycisku «Y» lub «N».

W przykładzie używany jest parametr «value_storage», który automatycznie zapisze wartość pola w bazie danych.

$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()

Zapisujemy pole «input».

Tworzymy na serwerze handler z identyfikatorem w postaci «save_+nazwa_pola». Nasze pole ma atrybut «name» o wartości «my_input_short_form», więc identyfikator handlera będzie «save_my_input_short_form».

W przykładzie używany jest parametr «value_storage», który automatycznie zapisze wartość pola w bazie danych.

Kliknij dwukrotnie, aby wyczyścić poleNaciśnij ENTER, aby zapisać
$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()

Zapisz plik(i) przesłane przez użytkownika.

Ta metoda może działać całkowicie automatycznie, nie musisz nawet tworzyć handlera, system zrobi wszystko sam.

Szczegóły pracy z «input type=file» czytaj w linku poniżej.

Przykład:KLASA «ui::» | Klasa «upload::» | Przykłady pracy z «input type=file»

(Bez podpisu)
Plik(i) nie załadowanyTylko pliki: 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()

Zapisz pole «textarea».

Tworzymy na serwerze handler z identyfikatorem w postaci «save_+nazwa_pola». Nasze pole ma atrybut «name» o wartości «my_textarea_short_form», więc identyfikator handlera będzie «save_my_textarea_short_form».

W przykładzie używany jest parametr «value_storage», który automatycznie zapisze wartość pola w bazie danych.

Kliknij dwukrotnie, aby wyczyścić poleNaciśnij ENTER, aby zapisaćNaciśnij SHIFT+ENTER, aby dodać nową linię
$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()

Zapisz pole «select».

W przykładzie używany jest parametr «value_storage», który automatycznie zapisze wartość pola w bazie danych.

Dla tego przykładu nie będziemy tworzyć handlera na serwerze, ponieważ używamy parametru «_auto_handler», który uruchomi automatyczny handler systemu.

$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()

Zapisz pole «select» z parametrem «multiple» ustawionym na «TRUE».

Na serwerze tworzymy handler z identyfikatorem w formacie «save_+nazwa_pola». Nasze pole ma atrybut «name» o wartości «my_select_multiple_short_form», więc identyfikator handlera będzie «save_my_select_multiple_short_form».
Zwróć uwagę, że w handlerze metoda «ui::get_post_VAL()» zwróci tablicę wartości wybranych przez użytkownika, a nie pojedynczą wartość jak w poprzednim przykładzie.

W przykładzie używany jest parametr «value_storage», który automatycznie zapisze wartość pola w bazie danych.

Wybierz kilka wartości, przytrzymując 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()

Zapisz pole lub wiele pól «checkbox».

W przykładzie używany jest parametr «value_storage», który automatycznie zapisze wartość pola w bazie danych.

Dla tego przykładu nie będziemy tworzyć handlera na serwerze, ponieważ używamy parametru «_auto_handler», który uruchomi automatyczny handler systemu.

$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()

Zapisz pole lub wiele pól «radio».

W przykładzie używany jest parametr «value_storage», który automatycznie zapisze wartość pola w bazie danych.

Dla tego przykładu nie będziemy tworzyć handlera na serwerze, ponieważ używamy parametru «_auto_handler», który uruchomi automatyczny handler systemu.

$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);

Formularze złożone to formularze, które zawierają kilka pól, które wymagają zapisania.

  • Budowanie formularzy złożonych powinno zaczynać się od metody «ui::form_start()» z odpowiednimi parametrami.

  • Następnie następują metody tworzące pola wymaganych typów.
  • I wreszcie formularz złożony powinien kończyć się metodą «ui::form_end()» z odpowiednimi parametrami.

Obowiązkowym elementem każdego formularza, który ma być zapisany, jest przycisk zapisu formularza.
W zależności od parametrów przekazanych do metody «ui::form_end()» przycisk może być wygenerowany automatycznie przez system.
Zbadaj dokumentację konstruktora metody «ui::form_end()».

Filtrowanie danych wejściowych formularza w handlerze odbywa się za pomocą metody «ui::get_post_VALS()», która automatycznie filtruje w zależności od typu pola. Metoda zwróci tablicę przefiltrowanych wartości każdego pola. Możesz także samodzielnie przejść przez tablicę $_POST['val'] (niezalecane).

Możesz także ustawić typ filtrowania dla dowolnego pola, jeśli jest to konieczne, za pomocą parametru «post_filter». Przeczytaj o szczegółach filtrowania danych:

1.

Przykład pracy z normalnym formularzem złożonym.
Wskazujemy obsługującego formularza «saves_form_example_1» w metodzie «ui::form_end()».

Tworzymy na serwerze obsługującego o identyfikatorze «saves_form_example_1».
Zwróć uwagę, że prefiks «saves_» w identyfikatorze obsługującego jest obowiązkowy!

W naszym formularzu jest pole typu «file». System całkowicie automatycznie załaduje plik, w handlerze nie używamy żadnych przetwarzań. Jak pracować z polami typu «file» zobacz w oddzielnym przykładzie dokumentacji.

W przykładzie używany jest parametr «value_storage», który automatycznie zapisze wartość pola w bazie danych.

Min. 0Maks. 1000
Kliknij dwukrotnie, aby wyczyścić pole

(Bez podpisu)
Plik(i) nie załadowany
$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.

Powtarzamy poprzedni przykład, dodając «required» do pól.

W przykładzie używany jest parametr «value_storage», który automatycznie zapisze wartość pola w bazie danych.

Zwróć także uwagę, że w tym przykładzie używana jest całkowicie automatyczna obsługa.
W tym celu przekazaliśmy metodzie «ui::form_end()» dodatkowy prefiks «auto:».
W takim przypadku nie jest wymagane tworzenie handlera po stronie serwera, system zrobi wszystko automatycznie.

* wypełnij pole
Min. 0Maks. 1000
Kliknij dwukrotnie, aby wyczyścić pole
* wypełnij pole

* wybierz co najmniej jedną wartość
(Bez podpisu)
* wypełnij pole
Plik(i) nie załadowany
$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);
}

W tym bloku przykładów osobno rozpatrzymy użycie zaawansowanych schematów przetwarzania. Zaawansowanymi schematami rozumie się udział Twoich własnych kodów JS, które mogą być używane PRZED wysłaniem danych formularza przez ajax, jak również PO otrzymaniu odpowiedzi ajax.

Konkretnie zapoznaj się ze schematami przetwarzania pod linkiem poniżej (Konstruktor schematu przetwarzania). Użyj tej dokumentacji do zrozumienia przedstawionych poniżej przykładów:

1.

W tym przykładzie dodamy obsługę JS przed wysłaniem formularza przez ajax.
Nasze pole ma atrybut «name» o wartości «input_extend_js_1», więc identyfikator handlera na serwerze będzie «save_input_extend_js_1». Ten sam identyfikator handlera jest używany w kodzie JS. Tworzymy obiekt «$$.save_input_extend_js_1 = {};». Następnie dodajemy do obiektu właściwość «start» w postaci funkcji, która będzie zawierać nasz kod obsługi.

W przykładzie używany jest parametr «value_storage», który automatycznie zapisze wartość pola w bazie danych.

Kliknij dwukrotnie, aby wyczyścić poleNaciśnij ENTER, aby zapisać
$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.

W następnym przykładzie wykonamy przetwarzanie PO otrzymaniu pozytywnej odpowiedzi ajax. W tym celu w handlerze JS podobnie jak w poprzednim przykładzie tworzymy właściwość «cb» w postaci funkcji.

W naszym przykładzie po otrzymaniu odpowiedzi ajax kod JS zmieni kolor pola i doda «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.

Na koniec rozważmy bardziej złożony przykład. Użyjemy formularza złożonego. W kodzie JS wpisujemy handlery zarówno PRZED wysłaniem przez ajax, jak i PO otrzymaniu odpowiedzi ajax.

W naszym przykładzie używamy identyfikatora handlera «saves_complex_extend_js», który jest podany w metodzie «ui::form_end()». Zatem w naszym kodzie JS tworzymy obiekt o nazwie «saves_complex_extend_js» i dodajemy niezbędne właściwości-funkcje.

Zwróć uwagę, że dodaliśmy także handler dla pierwszego pola select.

W przykładzie używany jest parametr «value_storage», który automatycznie zapisze wartość pola w bazie danych.

Zwróć także uwagę, że w tym przykładzie używana jest całkowicie automatyczna obsługa.
W tym celu przekazaliśmy metodzie «ui::form_end()» dodatkowy prefiks «auto:».
W takim przypadku nie jest wymagane tworzenie handlera po stronie serwera, system zrobi wszystko automatycznie.

Kliknij dwukrotnie, aby wyczyścić pole
$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)'});
}

Czasami konieczne jest dodanie handlera do elementu DOM. Możesz to zrobić zwykłymi metodami JS (JQUERY). Jednak, aby handler działał poprawnie w systemie EGO CRM z uwzględnieniem wszystkich jego możliwości, element musi mieć przypisane specjalne atrybuty i klasy.
Używając metody ui::dom_element() podczas tworzenia tagu HTML elementu, wprowadzasz ten element do standardowej pracy systemu, tak jak dzieje się to z polami formularzy.

W przyszłości możesz używać dowolnego schematu przetwarzania względem elementu, zapoznaj się z sekcją «Konstruktor schematu przetwarzania» pod linkiem poniżej:

1.

Wykonujemy tylko obsługę JS po kliknięciu elementu 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.

Utrudniamy poprzedni przykład, obsługą 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.

Specyficznym zastosowaniem jest podłączenie menu kontekstowego (kliknięcie prawym przyciskiem myszy).
Szczegółowe przykłady można zobaczyć pod linkiem:

Przykład:KLASA «ui::» | Menu kontekstowe (prawy przycisk myszy)

Metody służą do renderowania specjalnych komponentów.

1. ui::dropdown()

Element rozwijany.
Zobacz szczegółowe przykłady pod linkiem poniżej.

Przykład:KLASA «ui::» | Element rozwijany - 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()

Zakładki - Tabs / Pills.
Zobacz szczegółowe przykłady pod linkiem poniżej.

Przykład:KLASA «ui::» | Zakładki - 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()

Galeria.
Zobacz szczegółowe przykłady pod linkiem poniżej.

Przykład:KLASA «ui::» | Galeria - Gallery

[Zobacz]
$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);

W poprzednich przykładach na tej stronie już używaliśmy klasy «storage::» w różnych automatycznych wariantach podczas pracy z polami formularzy.
Rozważmy wariant ręcznego użycia klasy «storage::». Ręczne użycie jest potrzebne, gdy musimy zapisać pewne wartości niezwiązane z polami formularzy.

Istnieje wiele możliwych przykładów takiego użycia klasy. Podamy tylko 1 przykład.

W naszym przykładzie utworzymy 3 zakładki. W każdej zakładce jest 4 podzakładki.
Domyślnie przy załadowaniu strony otwierana jest zakładka 1 i podzakładka 1.
Jednak załóżmy, że musimy zapisać, która zakładka i podzakładka były ostatnio otwarte, aby przy następnym przeładowaniu strony otworzyły się ostatnio zapisane zakładka i podzakładka. Zapamiętamy także, która podzakładka była ostatnio otwarta w każdej zakładce.

Przeanalizuj stworzony przykład.

Przykład

Przełącz zakładkę i podzakładkę i odśwież stronę.

$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);
}