LookupWidget2
Lista wyboru z możliwością wyszukiwania.
Lookup przed wyszukaniem | Lookup po wyszukaniu |
---|---|
Powołanie obiektu LookupWidget2
Porady
Podczas tworzenia obiektu trzeba podać kolejno parametry:
- Nazwa widgetu, powinna być unikalna oraz mówić czego dotyczy (wymagany typ danych: String)
- Wyszukiwarka dostarczająca danych (wymagany by wyszukiwarka dziedziczyła po:
AbsSearchEngine
) - Flaga, mówiąca czy pola jest obowiązkowe (wymagany typ danych: bool)
Dodanie Obiektu
Poniższy kod dodaje Lookup sprawy do dialogu.
require_once('./classes/LookupWidget/LookupWidget2.inc');
require_once('./classes/LookupWidget/Processes/EditableProcessesSearchEngine.inc');
$obiekt = new LookupWidget2($this->name.'prc_id', new EditableProcessesSearchEngine());
$obiekt->setFilterString('is_grp IS NOT TRUE');
$composer->addNext($obiekt, 'prc_id');
Konstruktor obiektu wymaga przekazania obiektu menedżera wyszukiwania (właściwej klasy typu AbsSearchEngine
) w zależności od tego jaki rodzaj danych lista będzie obsługiwała. W podanym przykładzie jest to ContactSearchEngine, który obsługuje wyszukiwanie kontrahentów.
Jeśli lista ma także pozwalać na dodawanie nowych wpisów danego typu, przekazujemy obiekt do statycznej metody manage
, odpowiedniej klasy menedżera listy - w tym przypadku będzie to ProcessesLookupManager.
require_once './classes/LookupWidget/Processes/ProcessesLookupManager.inc';
ProcessesLookupManager::manage($obiekt);
Powiązania między Lookup'ami
Istnieje możliwość połączenia Lookup'ów np. można połączyć Lookup Klientów oraz spraw, tzw. jeżeli wyszukamy klienta, to będziemy mieli możliwość wyszukiwania sprawy z jego kartoteki.
require_once('./classes/LookupWidget/LookupWidget2.inc');
require_once('./classes/LookupWidget/Contact/ContactSearchEngine.inc');
require_once('./classes/LookupWidget/Contact/ContactLookupManager.inc');
$this->contid = new LookupWidget2($this->name.'contid', new ContactSearchEngine(), FALSE, 1);
ContactLookupManager::manage($this->contid);
require_once './classes/LookupWidget/Processes/EditableProcessesSearchEngine.inc';
require_once './classes/LookupWidget/Processes/ProcessesLookupManager.inc';
$this->prc_id = new LookupWidget2($this->name.'prc_id', new EditableProcessesSearchEngine());
$this->prc_id->withTitles = TRUE;
ProcessesLookupManager::manage($this->prc_id, ['contid' => $this->contid->name], TRUE);
$composer->addNext($this->contid, 'prc_id');
$composer->addNext($this->prc_id, 'prc_id');
Dostępne parametry
setFilterString($s)
Ustawia dodatkowy warunek filtrowania.
$obiekt->setFilterString('number::integer between 1000 AND 2000');
addIcon($icon, $title = NULL, $onClick = NULL)
Metoda umożliwia dodanie przycisku do naszego Lookup`a.
$HWND = Application::registerDialog(Application::getShortName('DataSources'), 'DataSources', MOD_PATH.'Dictionaries/DataSources/DataSources.inc');
$obiekt->addIcon(IMG_PATH.'toolbarIcons/settings_small.png', Translator::translate('Zarządzaj źródłami danych'), 'App.openDialogEx(\''.$HWND.'\', null, null);');
showInfoIcon
Odpowiada za pokazanie w polu combo ikony info. Default: FALSE
$obiekt->showInfoIcon = true;
withTitles
Każdy lookup będzie będzie miał w option title. Default: TRUE
$obiekt->withTitles = true;
autoClear
Po nieudanym wyszukiwaniu czyści pole. Default: FALSE
$obiekt->autoClear = true;
Obsługa zdarzeń Javascript
afterSearch
Obsługa zdarzania afterSearch. Jako string należy przekazać kod js, który zostanie wywołany momencie wykrycia tego zdarzenia na obiekcie. Akcja zostanie wykonana przy wyniku wyszukiwania = 1.
$obiekt->afterSearch = [
FALSE,
'if({key}<0){
BalloonHint.showAbove($(\''.$obiekt->name.'\'), \'\', \''.Translator::translateJS('Szukany rekord nie został znaleziony.').'\', 260,null,BHS_STATIC,null,null);
};',
];
onClear
Jako string należy przekazać kod js, który zostanie wywołany momencie wykrycia tego zdarzenia na obiekcie.
$obiekt->onClear = 'alert(\'onClear\')';
afterLoad
Jako string należy przekazać kod js, który zostanie wywołany momencie wykrycia tego zdarzenia na obiekcie. Akcja zostanie wykonana po załadowaniu lookup'a.
$obiekt->afterLoad = [
FALSE,
'if({key}<0){
BalloonHint.showAbove($(\''.$obiekt->name.'\'), \'\', \''.Translator::translateJS('Szukany rekord nie został znaleziony.').'\', 260,null,BHS_STATIC,null,null);
};',
];
Lista dostępnych silników wyszukiwania
Poniżej zamieszczona została kompletna lista typów wyszukiwanych obiektów zaimplementowanych dla komponentu LookupWidget2.
Wyspecyfikowane zostały ścieżki plików źródłowych oraz nazwy klas odpowiedzialnych za wyszukiwanie (SearchEngine) oraz zarządzanie obiektami (LookupManager).
Obiekt | Referencja do klucza w DB | Nazwa klasy | Lokalizacja klasy |
Adresy | adresses.addrid |
|
|
Adresy email | address_book_view.eab_id |
|
|
Dodatkowe analityki | additional_analytics.adanid |
|
|
Dostawcy | contacts.contid |
|
|
Gminy | communities.comdsc |
|
|
Miejsca powstania kosztów | places_of_vcosts.povcid |
|
|
Klienci | contacts.contid |
Możliwość zaawansowanego wyszukiwania umożliwia |
( |
Magazyny | warehouses.wahaid |
|
|
Numery faksów | contacts.contid |
|
|
Numery telefonów | contacts.contid |
|
|
Osoby kontaktowe | contact_persons.copeid |
|
|
Powiaty | districts.distid |
|
|
Pracownicy | users.usr_id |
|
|
Produkty | depository.depoid |
|
|
Projekty | projects.projid |
|
|
Rejestry VAT | vat_registers.vtrgid |
|
|
Rodzaje kosztów | vat_registers.vtrgid |
|
|
Sprawy | processes.prc_id |
|
|
Sprawy z uprawnieniem do odczytu | processes.prc_id |
|
|
Sprawy z uprawnieniem do edycji | processes.prc_id |
|
|
Symbole dokumentów | documents.doc_id |
|
|
Symbole spraw | processes.prc_id |
|
|
Urządzenia | devices.devcid |
|
|
Województwa | provinces.pro_id |
|
|
Teczki | storage_places.strpid |
|
|
Własny silnik wyszukiwania
Poniżej przykładowa klasa SearchEngine, która będzie nam służyć do wyszukiwania w rejestrze cregisters.creg_samochody
o następujących kolumnach:
- id____
- nr_rejestracyjny
- marka
- model
- ent_id
Tylko tyle kolumn wystarczy!
Teraz możemy przejść do zakodowania klasy SearchEngin-a.
Poniżej przykładowa klasa.
W komentarza dodano odpowiednie opisy do czego służą poszczególne właściwości. Na potrzeby przykładu załóżmy że plik z klasą najduje się w ./scripts/CarLib/LookupWidget/CarsSearchEngine.inc
namespace ReadyApp\CarLib\LookupWidget;
require_once('./classes/LookupWidget/AbsSearchEngine.inc');
/**
* CarsSearchEngine
*
* @uses \AbsSearchEngine
* @final
* @author
* @version 0.1
* @copyright
*/
class CarsSearchEngine extends \AbsSearchEngine {
/**
* Nazwa kolumny z identyfikatorem rekordu
*
* @var string
* @access public
*/
public $keyCol = 'id____';
/**
* Nazwa kolumny, której zawartość wyświetli się w polu Lookup`a po wyszukaniu frazy
*
* @var string
* @access public
*/
public $labelCol = 'label_';
/**
* Kwerenda, służąca do zasilenia silnika w rekordy
*
* @var string
* @access public
*/
public $select = 'SELECT id____, COALESCE(nr_rejestracyjny||\' - \'||marka || \' \'||model, marka || \' \'||model) AS label_ FROM cregisters.creg_samochody';
/**
* Lista pól, po których będzie można szukać
*
* @var array
* @access public
*/
public $fields = ['id____', 'nr_rejestracyjny', 'marka', 'model'];
/**
* Lista pól, po których lista zostanie posortowana
*
* @var string
* @access public
*/
public $order = 'nr_rejestracyjny, marka, model';
/**
* Czy pokazać ikonę po wybraniu rekordu (z lewej strony)
* Ikona musi być zdefiniowana w MapService (lub CustomMapService)
*
* @var bool
* @access public
*/
public $showInfoIcon = FALSE;
/**
* Clsnam z MapService (lub CustomMapService)
* @var string
*/
public $gicon = '';
/**
* @access public
* @return void
*/
public function __construct() {
$this->infoMessage = &$_SESSION[get_class($this)]['infoMessage'];
if (empty($this->infoMessage)) {
//Komunikat jeśli samochodu nie znaleziono
$this->infoMessage = \Translator::translate('Wybrany samochód nie został znaleziony.');
}
parent::__construct();
// Tutaj możemy dodać określone warunki jak context czy sprawdzanie uprawnień per użytkownik
$this->append(' AND ent_id = '.\SysContext::$ent_id.' AND is_del IS NOT TRUE';);
}
}
Plik z przykładu
Info
Klasa musi dziedziczyć po klasie AbsSearchEngine
Własny LookupManager
Za pomocą LookupManagera możemy dodać własne przyciski czy też sparametryzować nasz LookupWidget2.
Do przykładu posłuży nam rejestr cregisters.creg_samochody
, dla którego zrobić LookupManager, który doda nam przycisk umożliwiajaacy dodanie nowego samochodu oraz uzupełni później(po dodaniu) nam pole LookupWidget2.
Poniżej listning klasy CarLookupManager. Na potrzeby przykładu załóżmy że plik z klasą najduje się w ./scripts/CarLib/LookupWidget/CarsLookupManager.inc
namespace ReadyApp\CarLib\LookupWidget;
/**
* CarsLookupManager
*
* @final
* @author
* @version 0.1
* @copyright
*/
final class CarsLookupManager {
/**
* Metoda odpowiedziana za ansychroniczne wygenerowanie LookupWidget2
* z uzupełnionym już polem. Wybranym samochodem po przez klucz id____
*
* @param string $params JSON zawierający pola: id____ z wskazanym id rekordu, name__ z nazwą lookupa na dialogu
* @return string|null
*/
public function setByPKey($params): ?string {
$data = JSON::toArray($params);
$id____ = $data['id____'];
$name__ = $data['name__'];
require_once('./classes/LookupWidget/LookupWidget2.inc');
$searchEngine = new CarsSearchEngine();
$lookup = new LookupWidget2($name__, $searchEngine);
$lookup->autoClear = TRUE;
if (is_numeric($id____)) {
$searchEngine->append(' AND id____ = '.$id____.'');
$lookup->search('');
return $lookup->toHtml('fast');
}
return NULL;
}
/**
*
* @param LookupWidget2 $lookup
* @param array $params Dodatkowe parametry przekazane podczas tworzenia dialoga
* @return void
*/
public static function manage(LookupWidget2 $lookup, $params = array()): void {
$lookupName = $lookup->getName();
JScript::add('App.'.$lookupName.'onAdd = function(id____) {
asyncLibrary.execute(\'./scripts/CarLib/LookupWidget/CarsLookupManager.inc\',\'\\ReadyApp\\CarLib\\LookupWidget\\CarsLookupManager\', \'\', \'setByPKey\', ({id____:id____,name__:\''.$lookup->getName().'\'}).toJSONString(), \'if(text)$(\\\''.$lookup->getName(TRUE).'\\\').innerHTML=text;\', null,FAST);
}');
$lookupName = $lookup->getName();
$inputName = $lookupName . LookupWidget2::INPUT_PREFIX;
$searchName = $lookupName . LookupWidget2::SEARCH_PREFIX;
$comboName = $lookupName . LookupWidget2::COMBO_PREFIX;
$script = '
App.openDialogByCls(\'CREGISTER_ENTRY\', null, ({afterSubmit:\'App.'.$lookupName.'onAdd(id____)\', mode:\'new\',cregid:1}).toJSONString());
return false;
';
$img = 'add.gif';
$newCarIcon = new FormButton(array(
'name' => $lookupName . '_NewCarIcon',
'class_' => 'halflings eic-i2 halflings-plus',
'title' => Translator::translate('Dodaj samochód'),
'submit' => FALSE,
'script' => $script
));
$newCarIcon->tabIndex = -1;
$lookup->addIcon($newCarIcon);
}
}
Plik z przykładu