Pole typu Lookup
Pole to wygląda jak ComboBox. Różnica polega na tym, że wyszukiwanie odbywa się tylko za pomocą „lupki”, a wartością pola będzie dana pobrana z bazy pod kluczem {valueField}. Wartość prezentowaną w polu określamy w parametrze ** labelField**.
Kolumna clsnam w zapytaniu spowoduje pokazanie ikony „i” umożliwiającej otwarcie formularza obiektu powiązanego z danym clsnam (np. 'CONTACT' as clsnam, contid AS keyval - da możliwość otwarcia panelu klienta). Klucz użyty do otwarcia obiektu pobrany zostanie z zapytania z kolumny keyval lub jeśli nie podano to z kolumny wskazanej w valueField.
- Znacznik
{SEARCH_TEXT}
zostanie zastąpiony wpisanym w pole tekstem. - Znacznik
{FILTER_STRING}
zostanie zastąpiony wartością z parametru „sql_filter”.
Przepis
Efekt
Zawartość pola Parametry
{
"sql": "SELECT usr_id, lasfir || COALESCE(' - ' || ndenam,'') AS orlasfir FROM orgtree_view WHERE NOT is_del AND ent_id = {ENT_ID} AND orunid > 0 AND ndetpe = 'POST' AND {FILTER_STRING} ORDER BY 2",
"sql_filter": "(firnam ~* E'^{SEARCH_TEXT}' OR lasnam ~* E'^{SEARCH_TEXT}')",
"valueField": "usr_id",
"labelField": "orlasfir",
"defaultValue": "{SQL::SELECT {LOGGED_USR_ID}}"
}
Powyższy przykład jest dla listy pracowników.
Przykłady
Lista urządzeń
{
"sql": "SELECT devcid, name__ || ' - ' || COALESCE(sernum) AS device FROM cregisters.creg_devices WHERE {FILTER_STRING}",
"sql_filter": "sernum ~* E'^{SEARCH_TEXT}' OR name__ ~* E'^{SEARCH_TEXT}'",
"valueField": "devcid",
"labelField": "device"
}
Lista klientów
{
"sql": "SELECT contid, name_1 || ' - ' || f_addr AS caption, 'CONTACT' as clsnam, contid AS keyval FROM contacts_view WHERE is_del IS FALSE AND {FILTER_STRING[AND]} ORDER BY caption",
"sql_filter": "(name_1 || ' ' || name_2) ~* E'{SEARCH_TEXT}'",
"valueField": "contid",
"labelField": "caption"
}
Lista MPK
{
"sql": "SELECT place_, COALESCE(place_, '')||COALESCE(' '||dscrpt, '') AS searchresult FROM places_of_vcosts_view WHERE {FILTER_STRING} AND is_del IS NOT TRUE AND year__ = extract(year FROM CURRENT_DATE) AND is_act IS NOT FALSE AND ent_id = {ENT_ID} ORDER BY place_, dscrpt",
"sql_filter": "(dscrpt ~* E'{SEARCH_TEXT}' OR place_ ~* E'{SEARCH_TEXT}')",
"valueField": "place_",
"labelField": "searchresult"
}
Przykład dla wyszukiwania po kilku frazach rozdzielonych spacjami.
Parametr „sql_filter” zostanie powtórzony dla każdej frazy.
{
"sql": "SELECT usr_id, lasfir || COALESCE(' - ' || ndenam,'') AS orlasfir FROM orgtree_view WHERE NOT is_del AND ent_id = {ENT_ID} AND orunid > 0 AND ndetpe = 'POST' AND {FILTER_STRING[AND]} ORDER BY 2",
"sql_filter": "(firnam ~* E'{SEARCH_TEXT}' OR lasnam ~* E'{SEARCH_TEXT}')",
"valueField": "usr_id",
"labelField": "usrnam"
}
Wynikowy SQL dla powyższego przykładu i wyszukiwanego tekstu „jan kow”:
SELECT usr_id, lasfir || COALESCE(' - ' || ndenam, '') AS orlasfir
FROM orgtree_view
WHERE NOT is_del
AND ent_id = {ENT_ID}
AND orunid
> 0
AND ndetpe = 'POST'
AND ((firnam ~* E'jan'
OR lasnam ~* E'jan')
AND (firnam ~* E'kow'
OR lasnam ~* E'kow'))
ORDER BY lasfir
Własne ikony
Do lookup'u możemy dodawać dodatkowe ikony (przyciski). Zastosowania mogą być różne. Jedno z nich prezentujemy poniżej.
Przypuśćmy, że mamy słownik (dowolny rejestr lub inna podstawowa tabela), który wyświetlamy na formatce rejestru, ale chcemy mieć możliwość uzupełniania go z poziomu tej właśnie formatki. Podobne działania ma podstawowy lookup np. kontaktów (klientów) z plusikiem.
Realizacja tego odbywa się poprzez własną klasę.
Wymagane jest, aby definicja pola w rejestrze została wzbogacona o parametr:
{
"manager": {
"class": "MyCustomSListBoxManager",
"path": "./scripts/MyCustomSListBoxManager.inc"
}
}
Natomiast pełna definicja prezentuje się następująco:
{
"sql": "SELECT usr_id, lasfir || COALESCE(' - ' || ndenam,'') AS orlasfir FROM orgtree_view WHERE NOT is_del AND ent_id = {ENT_ID} AND usr_id IS NOT NULL AND ndetpe = 'POST' AND {FILTER_STRING} ORDER BY 2",
"sql_filter": "(firnam ~* E'^{SEARCH_TEXT}' or lasnam ~* E'^{SEARCH_TEXT}')",
"valueField": "usr_id",
"labelField": "orlasfir",
"manager": {
"class": "MyCustomSListBoxManager",
"path": "./scripts/MyCustomSListBoxManager.inc"
}
}
Zadaniem klasy MyCustomSListBoxManager jest dodanie ikon jak poniżej
final public static function manage(SListBox $lookup, $params = array()) {
$lookupName = $lookup->getName();
$dHWND = Application::registerDialog(Application::getShortName($lookupName.'CustomAsyncTreeDialog'), 'CustomAsyncTreeDialog', './scripts/CustomAsyncTreeDialog.inc');
$newContactIcon = new ImgFormButton(array(
'name' => $lookupName.'_NewContactIcon',
'submit' => FALSE,
'image' => IMG_PATH.'toolbarIcons/list.png',
'title' => Translator::translate('Dodaj z listy')
));
$newContactIcon->script = 'App.openDialogEx(\''.$dHWND.'\', null, ({onAdd:\'App.'.$lookupName.'onAdd\'}).toJSONString())';
$lookup->addIcon($newContactIcon);
JScript::add('
App.'.$lookupName.'onAdd = function(povcid) {
$(\''.$lookupName.'v\').value = povcid;
asyncLibrary.execute(\'./scripts/MyCustomSListBoxManager.inc\',\'MyCustomSListBoxManager\', \'\', \'setByPKey\', ({povcid:povcid,name__:\''.$lookupName.'\'}).toJSONString(), \'if(text) {DOMO.replaceWithHTML($(\\\''.$lookupName.SListBox::INPUT_PREFIX.'\\\'), text);}\', null,FAST);
}
');
}
Cała klasa możesz pobrać poniżej.