Source of file api.globalsearch.php
Size: 12,900 Bytes - Last Modified: 2024-04-27T15:26:05+03:00
/tmp/current_snapshot/api/libs/api.globalsearch.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391 | <?php /** * Ubilling user search implementation */ class GlobalSearch { /** * Contains requred javascripts code * * @var string */ protected $jsRuntime = ''; /** * Contains some styles for search controls * * @var string */ protected $styles = ''; /** * Contains default search input placeholder * * @var string */ protected $placeholder = ''; /** * Contains system alter config as key=>value * * @var array */ protected $alterConf = array(); /** * Contains raw user data for further usage * * @var array */ protected $rawData = array(); /** * Contains configurable search fields list * * @var array */ protected $fields = array(); /** * UbillingConfig object placeholder * * @var null */ protected $ubConfig = null; /** * Path to globalsearch cache file */ const CACHE_NAME = 'exports/globalsearchcache.dat'; /** * Some exceptions here */ const EX_NO_SEARCHTYPE = 'SEARCHTYPE_NOT_DETECTED'; /** * Creates new globalsearch instance * * @return void */ public function __construct($stylesPath = '') { global $ubillingConfig; $this->ubConfig = $ubillingConfig; $this->loadAlter(); $this->setPlaceholder(); $this->setStyles($stylesPath); $this->setJsRuntime(); } /** * Loads system alter config into protected prop * * @return void */ protected function loadAlter() { $this->alterConf = $this->ubConfig->getAlter(); } /** * Sets javascript runtime * * @return void */ protected function setJsRuntime() { if (@$this->alterConf['SPHINX_SEARCH_ENABLED']) { $searchLib = 'sphinxsearch.js'; } else { $searchLib = 'glsearch.js'; } $libPath = ''; if (file_exists(CUR_SKIN_PATH . $searchLib)) { $libPath = CUR_SKIN_PATH . $searchLib; } else { $libPath = 'modules/jsc/' . $searchLib; } $this->jsRuntime = wf_tag('script', false, '', 'type="text/javascript" language="javascript" src="' . $libPath . '"'); $this->jsRuntime .= wf_tag('script', true); } /** * Sets CSS input styling * * @param string $stylesPath custom css location path * * @return void */ protected function setStyles($stylesPath = '') { if (@$this->alterConf['SPHINX_SEARCH_ENABLED']) { $searchCss = 'sphinxsearch.css'; } else { $searchCss = 'glsearch.css'; } if (empty($stylesPath)) { $fullPath = 'skins/' . $searchCss; } else { $fullPath = $stylesPath . $searchCss; } $this->styles = wf_tag('link', false, '', 'rel="stylesheet" href="' . $fullPath . '" type="text/css" media="screen""'); $this->styles .= wf_tag('link', true); } /** * Sets input placeholder * * @return void */ protected function setPlaceholder() { $this->placeholder = ' value="' . __('User search') . '" onfocus="if(!this._haschanged){this.value=\'\'};this._haschanged=true;"'; } /** * Renders search form * * @param string $appendClass * * @return string */ public function renderSearchInput($appendClass = '') { $result = ''; if (!empty($appendClass)) { $appendClass = ' ' . $appendClass; } if ($this->alterConf['GLOBALSEARCH_ENABLED']) { $result .= $this->styles; $result .= $this->jsRuntime; if (@$this->alterConf['SPHINX_SEARCH_ENABLED']) { //render SphinxSearch input $result .= wf_tag('input', false, 'sphinxsearch-input' . $appendClass, 'type="text" name="globalsearchquery" autocomplete="off" id="sphinxsearchinput" oninput="querySearch(this.value)"' . $this->placeholder); $result .= wf_HiddenInput('globalsearch_type', 'full'); $result .= wf_tag('ul', false, 'ui-menu ui-widget ui-autocomplete ui-front sphinxsearchcontainer', 'id="ssearchcontainer" style="display: none;"'); $result .= wf_tag('ul', true); } else { //render standard GlobalSearch input $result .= wf_tag('input', false, '.ui-autocomplete' . $appendClass, 'type="text" id="globalsearch" name="globalsearchquery"' . $this->placeholder); $result .= wf_tag('input', false, '', 'type="hidden" id="globalsearch_type" name="globalsearch_type" value=""'); } } else { $result = wf_tag('input', false, '', 'type="text" name="partialaddr"' . $this->placeholder); } $result .= ''; return ($result); } /** * Prepares data array to json encoding * * @param array $data data array to transform * @param string $category data category * @param string $type globalsearch type * @return array */ protected function transformArray($data, $category, $type) { $result = array(); if (!empty($data)) { foreach ($data as $io => $each) { if (!empty($each)) { $result[zb_rand_string(8)] = array( 'label' => $each, 'lower' => strtolower_utf8($each), 'category' => $category, 'type' => $type ); } } } return ($result); } /** * Preloads raw data for searchable user fields and controls caching * * @return void */ protected function loadRawdata($forceCache = false) { $cacheTime = $this->alterConf['GLOBALSEARCH_CACHE']; $cacheTime = time() - ($cacheTime * 60); //in minutes $addressExtendedOn = $this->ubConfig->getAlterParam('ADDRESS_EXTENDED_ENABLED'); //extracting user fields types to load if (!empty($this->alterConf['GLOBALSEARCH_FIELDS'])) { $this->fields = explode(',', $this->alterConf['GLOBALSEARCH_FIELDS']); $this->fields = array_flip($this->fields); } $updateCache = false; if (file_exists(self::CACHE_NAME)) { $updateCache = false; if ((filemtime(self::CACHE_NAME) > $cacheTime)) { $updateCache = false; } else { $updateCache = true; } } else { $updateCache = true; } //force cache parameter if ($forceCache) { $updateCache = true; } //updating rawdata cache if ($updateCache) { //loading needed fields if (isset($this->fields['realname'])) { $this->rawData = $this->rawData + $this->transformArray(zb_UserGetAllRealnames(), __('Real Name'), 'realname'); } if (isset($this->fields['address'])) { $this->rawData = $this->rawData + $this->transformArray(zb_AddressGetFulladdresslist(), __('Full address'), 'address'); } if ($addressExtendedOn and isset($this->fields['address_extend'])) { $this->rawData = $this->rawData + $this->transformArray(zb_AddressExtenGetList(), __('Extended address info'), 'address_extend'); } if (isset($this->fields['contract'])) { $allContracts = zb_UserGetAllContracts(); $allContracts = array_flip($allContracts); $this->rawData = $this->rawData + $this->transformArray($allContracts, __('Contract'), 'contract'); } if ((isset($this->fields['phone'])) OR ( isset($this->fields['mobile']))) { $allPhonedata = zb_UserGetAllPhoneData(); if (isset($this->fields['phone'])) { if (!empty($allPhonedata)) { $allPhones = array(); foreach ($allPhonedata as $io => $each) { $allPhones[$io] = $each['phone']; } $this->rawData = $this->rawData + $this->transformArray($allPhones, __('Phone'), 'phone'); } } if (isset($this->fields['mobile'])) { if (!empty($allPhonedata)) { $allMobiles = array(); foreach ($allPhonedata as $io => $each) { $allMobiles[$io] = $each['mobile']; } $this->rawData = $this->rawData + $this->transformArray($allMobiles, __('Mobile'), 'mobile'); } } } if (isset($this->fields['ip'])) { $this->rawData = $this->rawData + $this->transformArray(zb_UserGetAllIPs(), __('IP'), 'ip'); } if (isset($this->fields['mac'])) { $this->rawData = $this->rawData + $this->transformArray(zb_UserGetAllIpMACs(), __('MAC address'), 'mac'); } if (isset($this->fields['login'])) { $allLogins = zb_UserGetAllStargazerLogins(); $this->rawData = $this->rawData + $this->transformArray($allLogins, __('Login'), 'login'); } if (isset($this->fields['seal'])) { $conDet = new ConnectionDetails(); $allSeals = $conDet->getAllSeals(); $this->rawData = $this->rawData + $this->transformArray($allSeals, __('Cable seal'), 'seal'); } if (isset($this->fields['paymentid'])) { if ($this->alterConf['OPENPAYZ_SUPPORT']) { if ($this->alterConf['OPENPAYZ_REALID']) { $allPayIds_q = "SELECT * from `op_customers`"; $allPayIds = simple_queryall($allPayIds_q); $tmpArrPayids = array(); if (!empty($allPayIds)) { foreach ($allPayIds as $io => $each) { $tmpArrPayids[$each['realid']] = $each['virtualid']; } } $this->rawData = $this->rawData + $this->transformArray($tmpArrPayids, __('Payment ID'), 'payid'); } else { $allPayIds_q = "SELECT `login`,`IP` from `users`"; $allPayIds = simple_queryall($allPayIds_q); $tmpArrPayids = array(); if (!empty($allPayIds)) { foreach ($allPayIds as $io => $each) { $tmpArrPayids[$each['login']] = ip2int($each['IP']); } } $this->rawData = $this->rawData + $this->transformArray($tmpArrPayids, __('Payment ID'), 'payid'); } } } file_put_contents(self::CACHE_NAME, serialize($this->rawData)); } else { $this->rawData = file_get_contents(self::CACHE_NAME); $this->rawData = unserialize($this->rawData); } } /** * Returns json encoded data for input autocomplete * * @return void */ public function ajaxCallback($forceCache = false) { $this->loadRawdata($forceCache); $data = array(); if (!empty($this->rawData)) { $term = (wf_CheckGet(array('term'))) ? strtolower_utf8($_GET['term']) : ''; foreach ($this->rawData as $io => $each) { if ($term) { if (ispos($each['lower'], $term)) { $data[] = $each; } } else { $data[] = $each; } } } if (!$forceCache) { //output not needed die(json_encode($data)); } } /** * Detects searchtype by search query fragment * * @param string $term * @return string */ public function detectSearchType($term) { $result = ''; $term = trim($term); if (!empty($term)) { $term = strtolower_utf8($term); $this->loadRawdata(); if (!empty($this->rawData)) { foreach ($this->rawData as $io => $each) { if (ispos($each['lower'], $term)) { $result = $each['type']; break; } } } } return ($result); } } ?> |