Przejdź do głównej treści

LookupWidget2


Lista wyboru z możliwością wyszukiwania.

Lookup przed wyszukaniemLookup 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.

Widok

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.

Widok

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

AddressSearchEngine

./classes/LookupWidget/Address/AddressSearchEngine.inc

Adresy email

address_book_view.eab_id

EmailAddressBookSearchEngine

EmailAddressBookLookupManager

./classes/LookupWidget/EmailAddressBook/EmailAddressBookSearchEngine.inc

./classes/LookupWidget/EmailAddressBook/EmailAddressBookLookupManager.inc

Dodatkowe analityki

additional_analytics.adanid

AdditionalAnalyticsSearchEngine

AdditionalAnalyticsLookupManager

./classes/LookupWidget/AdditionalAnalytics/AdditionalAnalyticsSearchEngine.inc

./classes/LookupWidget/AdditionalAnalytics/AdditionalAnalyticsLookupManager.inc

Dostawcy

contacts.contid

SupplierSearchEngine

./classes/LookupWidget/Contact/SupplierSearchEngine.inc

Gminy

communities.comdsc

SupplierSearchEngine

/classes/LookupWidget/ContactAddress/CommunitiesSearchEngine.inc

Miejsca powstania kosztów

places_of_vcosts.povcid

PlacesOfVCostsSearchEngine

PlacesOfVCostsLookupManager

./classes/LookupWidget/PlacesOfVCosts/PlacesOfVCostsSearchEngine.inc

./classes/LookupWidget/PlacesOfVCosts/PlacesOfVCostsLookupManager.inc

Klienci

contacts.contid

ContactSearchEngine

ContactLookupManager

Możliwość zaawansowanego wyszukiwania umożliwia ContactLookupManagerEx.

./classes/LookupWidget/Contact/ContactSearchEngine.inc

./classes/LookupWidget/Contact/ContactLookupManager.inc

(./classes/LookupWidget/Contact/ContactLookupManagerEx.inc)

Magazyny

warehouses.wahaid

WarehousesSearchEngine

WarehousesLookupManager

./classes/LookupWidget/Warehouses/WarehousesSearchEngine.inc

./classes/LookupWidget/Warehouses/WarehousesLookupManager.inc

Numery faksów

contacts.contid

FaxSearchEngine

./classes/LookupWidget/Fax/FaxSearchEngine.inc

Numery telefonów

contacts.contid

ContactsPhoneBookSearchEngine

./classes/LookupWidget/ContactPersons/ContactsPhoneBookSearchEngine.inc

Osoby kontaktowe

contact_persons.copeid

ContactPersonsSearchEngine

ContactPersonsLookupManager

./classes/LookupWidget/ContactPersons/ContactPersonsSearchEngine.inc

./classes/LookupWidget/ContactPersons/ContactPersonsLookupManager.inc

Powiaty

districts.distid

DistrictSearchEngine

./classes/LookupWidget/ContactAddress/DistrictSearchEngine.inc

Pracownicy

users.usr_id

EmployeesSearchEngine

./classes/LookupWidget/Employees/EmployeesSearchEngine.inc

Produkty

depository.depoid

DepositorySearchEngine

DepositoryLookupManager

./classes/LookupWidget/Depository/DepositorySearchEngine.inc

./classes/LookupWidget/Depository/DepositoryLookupManager.inc

Projekty

projects.projid

ProjectsSearchEngine

ProjectsLookupManager

./classes/LookupWidget/Projects/ProjectsSearchEngine.inc

./classes/LookupWidget/Projects/ProjectsLookupManager.inc

Rejestry VAT

vat_registers.vtrgid

VatRegistersSearchEngine

VatRegistersLookupManager

./classes/LookupWidget/VatRegisters/VatRegistersSearchEngine.inc

./classes/LookupWidget/VatRegisters/VatRegistersLookupManager.inc

Rodzaje kosztów

vat_registers.vtrgid

VatRegistersSearchEngine

VatRegistersLookupManager

./classes/LookupWidget/VatRegisters/VatRegistersSearchEngine.inc

./classes/LookupWidget/VatRegisters/VatRegistersLookupManager.inc

Sprawy

processes.prc_id

ProcessesSearchEngine

VatRegistersLookupManager

./classes/LookupWidget/Processes/ProcessesSearchEngine.inc

./classes/LookupWidget/Processes/ProcessesLookupManager.inc

Sprawy z uprawnieniem do odczytu

processes.prc_id

ProcessesReadSearchEngine

./classes/LookupWidget/Processes/ProcessesReadSearchEngine.inc

Sprawy z uprawnieniem do edycji

processes.prc_id

EditableProcessesSearchEngine

./classes/LookupWidget/Processes/EditableProcessesSearchEngine.inc

Symbole dokumentów

documents.doc_id

DocumentsSymbolSearchEngine

./classes/LookupWidget/Document/DocumentsSymbolSearchEngine.inc

Symbole spraw

processes.prc_id

ProcessesSymbolSearchEngine

./classes/LookupWidget/Processes/ProcessesSymbolSearchEngine.inc

Urządzenia

devices.devcid

DevicesSearchEngine

DevicesLookupManager

./classes/LookupWidget/Devices/DevicesSearchEngine.inc

./classes/LookupWidget/Devices/DevicesLookupManager.inc

Województwa

provinces.pro_id

ProvincesSearchEngine

./classes/LookupWidget/ContactAddress/ProvincesSearchEngine.inc

Teczki

storage_places.strpid

BriefcaseSearchEngine

./classes/LookupWidget/Briefcase/BriefcaseSearchEngine.inc

@include-pop()

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

Kod
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';);
    }
} 

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

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

    }

}