Source of file api.ponboxes.php
Size: 38,444 Bytes - Last Modified: 2024-04-27T15:26:05+03:00
/tmp/current_snapshot/api/libs/api.ponboxes.php
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049 | <?php /** * PON Boxes allows to place/render some boxes on map */ class PONBoxes { /** * Contains system alter config as key=>value * * @var array */ protected $altCfg = array(); /** * Contains all available PON boxes as boxid=>boxdata * * @var array */ protected $allBoxes = array(); /** * Contains all available user/address/onu links to boxes as linkid=>boxid * * @var array */ protected $allLinks = array(); /** * Contains all available ponboxes splitters links as linkid=>boxid * * @var array */ protected $allSplittersLinks = array(); /** * Database abstraction layer with ponboxes * * @var object */ protected $boxes = ''; /** * Database abstraction layer with ponboxes links to users/addresses/ONUs etc * * @var object */ protected $links = ''; /** * Database abstraction layer with ponboxes splitters links * * @var object */ protected $splittersLinks = ''; /** * System message helper object placeholder * * @var object */ protected $messages = ''; /** * System image storage placeholder * * @var object */ protected $photoStorage = null; /** * Pre-defined list pf splitters and couplers * * @var string[] */ protected $splittersTypesList = array(); /** * Contains preloaded users address array * * @var array */ protected $allUserAddress = array(); /** * Routes, static defines etc */ const URL_ME = '?module=ponboxes'; const PROUTE_NEWBOXNAME = 'newboxname'; const PROUTE_NEWBOEXTENINFO = 'newboxexteninfo'; const PROUTE_NEWBOXGEO = 'newboxgeo'; const PROUTE_NEWLINKBOX = 'newlinkboxid'; const PROUTE_NEWLINKTYPE = 'newlinktype'; const PROUTE_NEWLINKONU = 'newlinkonu'; const PROUTE_MAPBOXID = 'setboxidonmap'; const PROUTE_MAPBOXCOORDS = 'newboxmapcoords'; const ROUTE_BOXLIST = 'ajboxes'; const ROUTE_BOXNAV = 'boxidnav'; const ROUTE_MAP = 'boxmap'; const ROUTE_BOXEDIT = 'editboxid'; const ROUTE_BOXDEL = 'deleteboxid'; const ROUTE_LINKDEL = 'deletelinkid'; const ROUTE_SPLITTERADD = 'addboxsplitters'; const ROUTE_SPLITTERDEL = 'delboxsplitters'; const ROUTE_PLACEBOX = 'plcmapboxid'; const TABLE_BOXES = 'ponboxes'; const TABLE_LINKS = 'ponboxeslinks'; const TABLE_SPLITTERSLINKS = 'ponboxes_splitters'; const TABLE_PONONU = 'pononu'; const PHOTOSTORAGE_SCOPE = 'PONBOXES'; /** * Creates new PONBoxes instance * * @param bool $loadFullData * * @return void */ public function __construct($loadFullData = false) { $this->initMessages(); $this->loadConfigs(); $this->setSplitterTypes(); $this->initDatabase(); if ($loadFullData) { $this->loadAllAddress(); $this->loadBoxes(); $this->loadLinks(); $this->loadSplittersLinks(); } } /** * Inits system message helper instance * * @return void */ protected function initMessages() { $this->messages = new UbillingMessageHelper(); } /** * Inits system image storage placeholder * * @return void */ protected function initPhotoStorage() { $this->photoStorage = new PhotoStorage('PONBOXES'); } /** * Loads some required configs * * @global object $ubillingConfig * * @return void */ protected function loadConfigs() { global $ubillingConfig; $this->altCfg = $ubillingConfig->getAlter(); } /** * Loads all users address data into protected property * * @return void */ protected function loadAllAddress() { $this->allUserAddress = zb_AddressGetFulladdresslistCached(); } /** * Sets predefined splitters ad couplers list * * @return void */ protected function setSplitterTypes() { $this->splittersTypesList = array( 'Coupler 5:95' => __('Coupler') . ' 5:95', 'Coupler 10:90' => __('Coupler') . ' 10:90', 'Coupler 15:85' => __('Coupler') . ' 15:85', 'Coupler 20:80' => __('Coupler') . ' 20:80', 'Coupler 25:75' => __('Coupler') . ' 25:75', 'Coupler 30:70' => __('Coupler') . ' 30:70', 'Coupler 35:65' => __('Coupler') . ' 35:65', 'Coupler 40:60' => __('Coupler') . ' 40:60', 'Coupler 45:55' => __('Coupler') . ' 45:55', 'Coupler 50:50' => __('Coupler') . ' 50:50', 'Splitter 1 x 2' => __('Splitter') . ' 1 x 2', 'Splitter 1 x 3' => __('Splitter') . ' 1 x 3', 'Splitter 1 x 4' => __('Splitter') . ' 1 x 4', 'Splitter 1 x 5' => __('Splitter') . ' 1 x 5', 'Splitter 1 x 6' => __('Splitter') . ' 1 x 6', 'Splitter 1 x 8' => __('Splitter') . ' 1 x 8', 'Splitter 1 x 12' => __('Splitter') . ' 1 x 12', 'Splitter 1 x 16' => __('Splitter') . ' 1 x 16', 'Splitter 1 x 32' => __('Splitter') . ' 1 x 32', 'Splitter 1 x 64' => __('Splitter') . ' 1 x 64' ); } /** * Inits all required database abstraction layers for further usage * * @return void */ protected function initDatabase() { $this->boxes = new NyanORM(self::TABLE_BOXES); $this->links = new NyanORM(self::TABLE_LINKS); $this->splittersLinks = new NyanORM(self::TABLE_SPLITTERSLINKS); // . ,. // T."-._..---.._,-"/| // l|"-. _.v._ (" | // [l /.'_ \; _~"-.`-t // Y " _(o} _{o)._ ^.| // j T ,-<v>-. T ] // \ l ( /-^-\ ) ! ! // \. \. "~" ./ /c-..,__ // ^r- .._ .- .-" `- . ~"--. // > \. \ // ] ^. \ // 3 . "> . Y -MEOW! WHERE IS MY BOX?! // ,.__.--._ _j \ ~ . ; | // ( ~"-._~"^._\ ^. ^._ I . l // "-._ ___ ~"-,_7 .Z-._ 7" Y ; \ _ // /" "~-(r r _/_--._~-/ / /,.--^-._ / Y // "-._ '"~~~>-._~]>--^---./____,.^~ ^.^ ! // ~--._ ' Y---. \./ // ~~--._ l_ ) \ // ~-._~~~---._,____..--- \ // ~----"~ \ // \ } /** * Loads all available boxes from database * * @return void */ protected function loadBoxes() { if (@$this->altCfg['PONBOXES_NAME_ORDER']) { $this->boxes->orderBy('name', 'ASC'); } $this->allBoxes = $this->boxes->getAll('id'); } /** * Loads all available boxes to something links from database * * @return void */ protected function loadLinks() { $this->allLinks = $this->links->getAll('id'); } protected function loadSplittersLinks() { $this->allSplittersLinks = $this->splittersLinks->getAll('id'); } /** * Renders all available boxes list container * * @return string */ public function renderBoxesList() { $result = ''; $columns = array('ID', 'Name', 'Additional info', 'Location', 'Actions'); $opts = '"order": [[ 0, "desc" ]]'; $result .= wf_JqDtLoader($columns, self::URL_ME . '&' . self::ROUTE_BOXLIST . '=true', false, __('boxes'), 100, $opts); return ($result); } /** * Renders JSON data with all available PON boxes list and some controls * * @return void */ public function ajBoxesList() { $json = new wf_JqDtHelper(); if (!empty($this->allBoxes)) { foreach ($this->allBoxes as $io => $each) { $data[] = $each['id']; $data[] = $each['name']; $data[] = $each['exten_info']; $data[] = $each['geo']; $boxActs = ''; $boxActs .= wf_Link(self::URL_ME . '&' . self::ROUTE_BOXEDIT . '=' . $each['id'], web_edit_icon()); $data[] = $boxActs; $json->addRow($data); unset($data); } } $json->getJson(); } /** * Renders new pon box creation form. Its obvious. * * @return string */ protected function renderBoxCreateForm() { $result = ''; $sup = wf_tag('sup') . '*' . wf_tag('sup', true); $inputs = wf_TextInput('newboxname', __('Name') . $sup, '', true, 20); $inputs .= wf_TextInput('newboxexteninfo', __('Additional info'), '', true, 20); $inputs .= wf_TextInput('newboxgeo', __('Location'), '', true, 20, 'geo'); $inputs .= wf_Submit(__('Create')); $result .= wf_Form('', 'POST', $inputs, 'glamour'); return ($result); } /** * Renders existing box editing form aka "Box profile" * * @param int $boxId * * @return string */ public function renderBoxEditForm($boxId) { $boxId = ubRouting::filters($boxId, 'int'); $result = ''; if (isset($this->allBoxes[$boxId])) { $boxData = $this->allBoxes[$boxId]; $sup = wf_tag('sup') . '*' . wf_tag('sup', true); $inputs = wf_HiddenInput('editboxid', $boxId); $inputs .= wf_TextInput('editboxname', __('Name') . $sup, $boxData['name'], true, 20); $inputs .= wf_TextInput('editboxexteninfo', __('Additional info'), $boxData['exten_info'], true, 20); $inputs .= wf_TextInput('editboxgeo', __('Location'), $boxData['geo'], true, 20, 'geo'); $inputs .= wf_Submit(__('Save')); $result .= wf_Form('', 'POST', $inputs, 'glamour'); $result .= wf_delimiter(0); $result .= wf_BackLink(self::URL_ME); if (!$this->isBoxProtected($boxId)) { $boxDelControlUrl = self::URL_ME . '&' . self::ROUTE_BOXDEL . '=' . $boxId; $boxDelCancelUrl = self::URL_ME . '&' . self::ROUTE_BOXEDIT . '=' . $boxId; $result .= wf_ConfirmDialogJS($boxDelControlUrl, web_delete_icon() . ' ' . __('Delete'), $this->messages->getDeleteAlert(), 'ubButton', $boxDelCancelUrl) . ' '; } if (empty($boxData['geo'])) { $mapPlaceUrl = self::URL_ME . '&' . self::ROUTE_MAP . '=true&' . self::ROUTE_PLACEBOX . '=' . $boxId; $result .= wf_Link($mapPlaceUrl, wf_img('skins/ymaps/target.png') . ' ' . __('Place on map'), false, 'ubButton'); } } else { $result .= $this->messages->getStyledMessage(__('Something went wrong') . ': ' . __('box') . ' [' . $boxId . '] ' . __('Not exists'), 'error'); } return ($result); } /** * Saves box data if required * * @return void/string on error */ public function saveBox() { $result = ''; if (ubRouting::checkPost(array('editboxid', 'editboxname'))) { $boxId = ubRouting::post('editboxid', 'int'); $newBoxName = ubRouting::post('editboxname'); $newBoxNameF = ubRouting::filters($newBoxName, 'mres'); $newBoxExtenInfo = ubRouting::post('editboxexteninfo'); $newBoxExtenInfoF = ubRouting::filters($newBoxExtenInfo, 'mres'); $newBoxGeoF = ubRouting::post('editboxgeo', 'mres'); if (isset($this->allBoxes[$boxId])) { $boxData = $this->allBoxes[$boxId]; if ($newBoxNameF != $boxData['name']) { //name changed if ($this->isBoxNameFree($newBoxNameF)) { //and still is unique $this->boxes->data('name', $newBoxNameF); $this->boxes->where('id', '=', $boxId); $this->boxes->save(); log_register('PONBOX CHANGE BOX [' . $boxId . '] NAME `' . $newBoxName . '`'); } else { $result .= __('This box already exists'); } } if ($newBoxExtenInfoF != $boxData['exten_info']) { $this->boxes->data('exten_info', $newBoxExtenInfoF); $this->boxes->where('id', '=', $boxId); $this->boxes->save(); log_register('PONBOX CHANGE BOX [' . $boxId . '] EXTEN INFO'); } if ($newBoxGeoF != $boxData['geo']) { $this->boxes->data('geo', $newBoxGeoF); $this->boxes->where('id', '=', $boxId); $this->boxes->save(); log_register('PONBOX CHANGE BOX [' . $boxId . '] GEO `' . $newBoxGeoF . '`'); } } else { $result .= __('Something went wrong') . ': ' . __('box') . ' [' . $boxId . '] ' . __('Not exists'); } } return ($result); } /** * Check is box name already used or not? * * @param string $boxName * * @return bool */ protected function isBoxNameFree($boxName) { $result = true; if (!empty($this->allBoxes)) { foreach ($this->allBoxes as $io => $each) { if ($each['name'] == $boxName) { $result = false; break; } } } return ($result); } /** * Creates new PON box in database * * @param string $name * @param string $geo * * @return void/string on error */ public function createBox($name, $extenInfo = '', $geo = '') { $result = ''; $nameF = ubRouting::filters($name, 'mres'); $extenInfoF = ubRouting::filters($extenInfo, 'mres'); $geoF = ubRouting::filters($geo, 'mres'); if (!empty($nameF)) { if ($this->isBoxNameFree($nameF)) { $this->boxes->data('name', $nameF); $this->boxes->data('exten_info', $extenInfoF); $this->boxes->data('geo', $geoF); $this->boxes->create(); $newId = $this->boxes->getLastId(); log_register('PONBOX CREATE BOX [' . $newId . '] NAME `' . $name . '`'); } else { $result .= __('This box already exists'); } } else { $result .= __('All fields marked with an asterisk are mandatory'); } return ($result); } /** * Renders default controls panel * * @return string */ public function renderControls() { $result = ''; $result .= wf_modalAuto(web_icon_create() . ' ' . __('Create'), __('Create'), $this->renderBoxCreateForm(), 'ubButton') . ' '; if (ubRouting::checkGet(self::ROUTE_MAP) or ubRouting::checkGet(self::ROUTE_BOXEDIT)) { $result .= wf_Link(self::URL_ME, wf_img('skins/icon_table.png') . ' ' . __('List'), false, 'ubButton'); } else { $result .= wf_Link(self::URL_ME . '&' . self::ROUTE_MAP . '=true', wf_img('skins/ponmap_icon.png') . ' ' . __('Map'), false, 'ubButton'); } return ($result); } /** * Check is box protected wit some existing links * * @param int $boxId * * @return bool */ protected function isBoxProtected($boxId) { $boxId = ubRouting::filters($boxId, 'int'); $result = false; if (!empty($this->allLinks)) { foreach ($this->allLinks as $io => $each) { if ($each['boxid'] == $boxId) { $result = true; break; } } } return ($result); } /** * Deletes existing PON box from database * * @param int $boxId * * @return void/string on error */ public function deleteBox($boxId) { $boxId = ubRouting::filters($boxId, 'int'); $result = ''; if (isset($this->allBoxes[$boxId])) { if (!$this->isBoxProtected($boxId)) { $boxData = $this->allBoxes[$boxId]; $this->boxes->where('id', '=', $boxId); $this->boxes->delete(); log_register('PONBOX DELETE BOX [' . $boxId . '] NAME `' . $boxData['name'] . '`'); } else { $result .= __('Something went wrong') . ': ' . __('This item is used by something'); } } else { $result .= __('Something went wrong') . ': ' . __('box') . ' [' . $boxId . '] ' . __('Not exists'); } return ($result); } /** * Delete link from database * * @param int $linkId * @param bool $deleteSplitter * * @return void/string on error */ public function deleteLink($linkId, $deleteSplitter = false) { $linkId = ubRouting::filters($linkId, 'int'); $result = ''; if ($deleteSplitter) { if (isset($this->allSplittersLinks[$linkId])) { $linkData = $this->allSplittersLinks[$linkId]; $this->splittersLinks->where('id', '=', $linkId); $this->splittersLinks->delete(); log_register('PONBOX DELETE SPLITTER [' . $linkId . '] BOX [' . $linkData['boxid'] . ']'); } else { $result .= __('Something went wrong') . ': ' . __('Splitter') . ' [' . $linkId . '] ' . __('Not exists'); } } else { if (isset($this->allLinks[$linkId])) { $linkData = $this->allLinks[$linkId]; $this->links->where('id', '=', $linkId); $this->links->delete(); log_register('PONBOX DELETE LINK [' . $linkId . '] BOX [' . $linkData['boxid'] . ']'); } else { $result .= __('Something went wrong') . ': ' . __('Link') . ' [' . $linkId . '] ' . __('Not exists'); } } return ($result); } /** * Returns form for setting location of the box on map * * @param int $boxId * * @return string */ protected function getBoxPlaceForm($boxId) { $result = ''; $boxId = ubRouting::filters($boxId, 'int'); $boxData = $this->allBoxes[$boxId]; $inputs = wf_HiddenInput(self::PROUTE_MAPBOXID, $boxId); $inputs .= wf_delimiter(1); $inputs .= __('Box') . ': ' . $boxData['name']; $inputs .= wf_delimiter(1); $inputs .= wf_Submit('Save'); $result .= generic_MapEditor(self::PROUTE_MAPBOXCOORDS, __('Place on map'), $inputs); return($result); } /** * Sets some new geo coords for existing box * * @param int $boxId * @param string $coords * * @return void */ public function setBoxGeo($boxId, $coords = '') { $boxId = ubRouting::filters($boxId, 'int'); $coords = ubRouting::filters($coords, 'mres'); $this->boxes->where('id', '=', $boxId); $this->boxes->data('geo', $coords); $this->boxes->save(); log_register('PONBOX CHANGE BOX [' . $boxId . '] GEO `' . $coords . '`'); } /** * Renders available boxes map * * @global object $ubillingConfig * * @return string */ public function renderBoxesMap() { global $ubillingConfig; $mapsCfg = $ubillingConfig->getYmaps(); $result = ''; if (!empty($this->allBoxes)) { $mapContainer = 'ponboxmap'; $result .= generic_MapContainer('100%', '800px', $mapContainer); $placemarks = ''; $editor = ''; if (ubRouting::checkGet(self::ROUTE_PLACEBOX)) { $placeBoxId = ubRouting::get(self::ROUTE_PLACEBOX, 'int'); $editor .= $this->getBoxPlaceForm($placeBoxId); } foreach ($this->allBoxes as $io => $each) { if (!empty($each['geo'])) { $boxLink = trim(wf_Link(self::URL_ME . '&' . self::ROUTE_BOXEDIT . '=' . $each['id'], web_edit_icon())); $placemarks .= generic_mapAddMark($each['geo'], '', $each['name'] . ' ' . $boxLink, '', '', '', true); } } $result .= generic_MapInit($mapsCfg['CENTER'], $mapsCfg['ZOOM'], $mapsCfg['TYPE'], $placemarks, $editor, $mapsCfg['LANG'], $mapContainer); } else { $result .= $this->messages->getStyledMessage(__('Nothing to show'), 'warning'); } return ($result); } /** * Creates box->entity link in database * * @param int $boxId existing PON Box ID * @param string $type link type: login, address, login+address, onuid * @param array $param link parameter * * @return void/string on error */ protected function createLink($boxId, $type, $param) { $result = ''; $useField = array(); $boxId = ubRouting::filters($boxId, 'int'); if (isset($this->allBoxes[$boxId])) { $saveLink = true; switch ($type) { case 'login': $useField = array('login'); break; case 'address': $useField = array('address'); break; case 'loginaddress': $useField = array('login', 'address'); break; case 'onuid': $useField = array('onuid'); break; default: $saveLink = false; $result .= __('Unknown link type') . ' ' . $type; break; } if ($saveLink) { $fieldsCount = count($useField); $this->links->data('boxid', $boxId); for ($i = 0; $i < $fieldsCount; $i++) { $paramF = ubRouting::filters($param[$i], 'mres'); $this->links->data($useField[$i], $paramF); } $this->links->create(); $newId = $this->links->getLastId(); log_register('PONBOX CREATE LINK [' . $newId . '] BOX [' . $boxId . '] TYPE `' . $type . '` TO `' . implode(', ', $param) . '`'); } } else { $result .= __('Something went wrong') . ': ' . __('box') . ' [' . $boxId . '] ' . __('Not exists'); } return ($result); } /** * Search some linked boxes for this ONU * * @param array $onuData * * @return array */ public function getLinkedBoxes($onuData) { $result = array(); if (!empty($onuData)) { $onuId = $onuData['id']; $onuUser = $onuData['login']; if (!empty($this->allLinks)) { foreach ($this->allLinks as $io => $eachLink) { //ONU ID link search if ($eachLink['onuid'] == $onuId) { $result[$eachLink['boxid']] = $eachLink['boxid']; } // This is the water. // And this is the well. // Drink full and descend. // The horse is the white of the eyes and dark within. if (!empty($onuUser)) { //address search $onuUserAddress = @$this->allUserAddress[$onuUser]; if ($eachLink['address'] == $onuUserAddress) { $result[$eachLink['boxid']] = $eachLink['id']; } //direct login search if ($eachLink['login'] == $onuUser) { $result[$eachLink['boxid']] = $eachLink['id']; } } } } } return ($result); } /** * Renders linked lined boxes list * * @param array $boxesArray * @param bool $userProfile * * @return string */ public function renderLinkedBoxes($boxesArray, $userProfile = false) { $result = ''; if (!empty($boxesArray)) { foreach ($boxesArray as $boxId => $linkId) { $boxName = $this->allBoxes[$boxId]['name']; $boxLink = wf_Link(self::URL_ME . '&' . self::ROUTE_BOXEDIT . '=' . $boxId, $boxName); if ($userProfile) { $result .= wf_tag('span', false, '', 'style="color: #32510F; font-size: 14px;"') . $boxLink . wf_delimiter(0) . wf_tag('span', true); } else { $result .= $this->messages->getStyledMessage(__('Box') . ': ' . $boxLink, 'success'); } } } else { if ($userProfile) { $result .= wf_tag('span', false, '', 'style="color: #32510F"; font-size: 14px;') . __('PON Boxes') . ': ' . __('Nothing to show') . wf_tag('span', true); } else { $result .= $this->messages->getStyledMessage(__('PON Boxes') . ': ' . __('Nothing to show'), 'info'); } } return ($result); } /** * Returns linked entity control link * * @param array $linkData * * @return string */ protected function getLinkEntityControl($linkData) { $result = ''; if (!empty($linkData)) { if (!empty($linkData['login']) and ! empty($linkData['address'])) { $result .= wf_Link('?module=userprofile&username=' . $linkData['login'], web_profile_icon() . ' ' . $linkData['login']) . wf_img('skins/icon_build.gif', __('Address')) . ' ' . $linkData['address']; } else { if (!empty($linkData['login'])) { $result .= wf_Link('?module=userprofile&username=' . $linkData['login'], web_profile_icon() . ' ' . $linkData['login']); } if (!empty($linkData['onuid'])) { $result .= wf_Link('?module=ponizer&editonu=' . $linkData['onuid'], wf_img('skins/switch_models.png', __('ONU')) . ' ' . $linkData['onuid']); } if (!empty($linkData['address'])) { $result .= wf_img('skins/icon_build.gif', __('Address')) . ' ' . $linkData['address']; } } } return ($result); } /** * Renders existing POB Box links of any type * * @param int $boxId * * @return string */ public function renderBoxLinksList($boxId) { $result = ''; $boxId = ubRouting::filters($boxId, 'int'); if (isset($this->allBoxes[$boxId])) { if (!empty($this->allLinks)) { $curBoxLinks = array(); foreach ($this->allLinks as $io => $each) { if ($each['boxid'] == $boxId) { $curBoxLinks[] = $each; } } if (!empty($curBoxLinks)) { $cells = wf_TableCell(__('User') . ' / ' . __('ONU') . ' / ' . __('Address')); $cells .= wf_TableCell(__('Actions')); $rows = wf_TableRow($cells, 'row1'); foreach ($curBoxLinks as $io => $each) { $cells = wf_TableCell($this->getLinkEntityControl($each)); $delLinkUrl = self::URL_ME . '&' . self::ROUTE_LINKDEL . '=' . $each['id'] . '&' . self::ROUTE_BOXNAV . '=' . $each['boxid']; $actLinks = wf_JSAlert($delLinkUrl, web_delete_icon(), $this->messages->getDeleteAlert()); $cells .= wf_TableCell($actLinks); $rows .= wf_TableRow($cells, 'row5'); } $result .= wf_TableBody($rows, '100%', 0, 'sortable'); } else { $result .= $this->messages->getStyledMessage(__('Nothing to show'), 'info'); } } else { $result .= $this->messages->getStyledMessage(__('Nothing to show'), 'warning'); } } else { $result .= $this->messages->getStyledMessage(__('Something went wrong') . ': ' . __('box') . ' [' . $boxId . '] ' . __('Not exists'), 'error'); } return ($result); } /** * Renders box assign form. With some ONU or another ONU params * * @param array $onuData * * @return string */ public function renderBoxAssignForm($onuData) { $result = ''; $boxesTmp = array('' => '-'); if (!empty($onuData)) { $onuId = $onuData['id']; $onuUserName = $onuData['login']; $onuUserName = trim($onuUserName); if (!empty($this->allBoxes)) { $inputs = ''; foreach ($this->allBoxes as $eachBoxId => $eachBoxData) { $boxesTmp[$eachBoxData['id']] = $eachBoxData['name']; } $inputs .= wf_HiddenInput(self::PROUTE_NEWLINKONU, $onuId); $inputs .= wf_Selector(self::PROUTE_NEWLINKBOX, $boxesTmp, __('box'), '', false, false) . ' '; $inputs .= wf_nbsp(2); if (!empty($onuUserName)) { $inputs .= wf_RadioInput(self::PROUTE_NEWLINKTYPE, __('ONU'), 'onuid', false, true) . ' '; $inputs .= wf_RadioInput(self::PROUTE_NEWLINKTYPE, __('User'), 'login', false, false) . ' '; $inputs .= wf_RadioInput(self::PROUTE_NEWLINKTYPE, __('Address'), 'address', false, false) . ' '; $inputs .= wf_RadioInput(self::PROUTE_NEWLINKTYPE, __('Login') . ' + ' . __('Address'), 'loginaddress', false, false) . ' '; } else { $inputs .= wf_HiddenInput(self::PROUTE_NEWLINKTYPE, 'onuid'); } $inputs .= wf_nbsp(2); $inputs .= wf_Submit(__('Create new PON box link')); $result .= wf_Form('', 'POST', $inputs, 'glamour'); } } return ($result); } /** * Create PON box link with some ONU by some type in database * * @param int $boxId * @param int $onuId * @param string $linkType * * @return void/string on error */ public function createLinkONU($boxId, $onuId, $linkType) { $result = ''; $boxId = ubRouting::filters($boxId, 'int'); $onuId = ubRouting::filters($onuId, 'int'); if (isset($this->allBoxes[$boxId])) { //PON ONU database abstraction workaround here $ponOnu = new NyanORM(self::TABLE_PONONU); $ponOnu->where('id', '=', $onuId); $onuData = $ponOnu->getAll(); if (!empty($onuData)) { $onuData = $onuData[0]; //trying to create link if ($linkType == 'onuid') { $result .= $this->createLink($boxId, $linkType, array($onuId)); } if ($linkType == 'login' or $linkType == 'address' or $linkType == 'loginaddress') { $userLogin = trim($onuData['login']); if (!empty($userLogin)) { $userData = zb_UserGetAllData($userLogin); if (!empty($userData)) { $userAddress = $userData[$userLogin]['fulladress']; //login linking if ($linkType == 'login') { $result .= $this->createLink($boxId, $linkType, array($userLogin)); } //address linking if ($linkType == 'address') { if (!empty($userAddress)) { $result .= $this->createLink($boxId, $linkType, array($userAddress)); } else { $result .= __('Something went wrong') . ': ' . __('Address') . ' ' . __('Empty'); } } //login and address linking if ($linkType == 'loginaddress') { if (empty($userAddress)) { $userAddress = __('User is a hobo'); } $result .= $this->createLink($boxId, $linkType, array($userLogin, $userAddress)); } } else { $result .= __('Something went wrong') . ': ' . __('User') . ' (' . $userLogin . ') ' . __('Not exists'); } } } } else { $result .= __('Something went wrong') . ': ' . __('ONU') . ' [' . $onuId . '] ' . __('Not exists'); } } else { $result .= __('Something went wrong') . ': ' . __('box') . ' [' . $boxId . '] ' . __('Not exists'); } return ($result); } /** * Renders splitters adding controls * * @param $boxID * * @return string */ public function renderSplittersControls($boxID) { $inputs = __('Place a splitter/coupler in this box') . ':' . wf_nbsp(); $inputs .= wf_Selector(self::ROUTE_SPLITTERADD, $this->splittersTypesList, ''); $inputs .= wf_HiddenInput(self::ROUTE_BOXEDIT, $boxID); $inputs .= wf_Submit(__('Append')); $result = wf_Form('', 'POST', $inputs, 'glamour') . wf_delimiter(0); return ($result); } /** * Renders splitters list * * @param $boxID * * @return string * * @throws Exception */ public function renderSplittersList($boxID) { $result = ''; $boxID = ubRouting::filters($boxID, 'int'); if (isset($this->allBoxes[$boxID])) { if (!empty($this->allSplittersLinks)) { $curBoxSplitters = array(); foreach ($this->allSplittersLinks as $io => $each) { if ($each['boxid'] == $boxID) { $curBoxSplitters[] = $each; } } if (!empty($curBoxSplitters)) { $cells = wf_TableCell(__('Splitter') . ' / ' . __('Coupler')); $cells .= wf_TableCell(__('Actions')); $rows = wf_TableRow($cells, 'row1'); foreach ($curBoxSplitters as $io => $each) { $cells = wf_TableCell($this->splittersTypesList[$each['splitter']]); $delLinkUrl = self::URL_ME . '&' . self::ROUTE_SPLITTERDEL . '=' . $each['id'] . '&' . self::ROUTE_BOXNAV . '=' . $each['boxid']; $actLinks = wf_JSAlert($delLinkUrl, web_delete_icon(), $this->messages->getDeleteAlert()); $cells .= wf_TableCell($actLinks); $rows .= wf_TableRow($cells, 'row5'); } $result .= wf_TableBody($rows, '50%', 0, 'sortable'); } else { $result .= $this->messages->getStyledMessage(__('Nothing to show'), 'info'); } } else { $result .= $this->messages->getStyledMessage(__('Nothing to show'), 'warning'); } } else { $result .= $this->messages->getStyledMessage(__('Something went wrong') . ': ' . __('box') . ' [' . $boxID . '] ' . __('Not exists'), 'error'); } return ($result); } /** * Adds a splitter to PON box * * @return string * * @throws Exception */ public function addSplitter() { $result = ''; if (ubRouting::checkPost(array(self::ROUTE_BOXEDIT, self::ROUTE_SPLITTERADD))) { $boxID = ubRouting::post(self::ROUTE_BOXEDIT, 'int'); $newSplitterName = ubRouting::post(self::ROUTE_SPLITTERADD); $newSplitterNameF = ubRouting::filters($newSplitterName, 'mres'); if (isset($this->allBoxes[$boxID])) { $this->splittersLinks->data('splitter', $newSplitterNameF); $this->splittersLinks->data('boxid', $boxID); $this->splittersLinks->create(); log_register('PONBOX ADD SPLITTER TO BOX [' . $boxID . '] TYPE `' . $newSplitterName . '`'); } else { $result .= __('Something went wrong') . ': ' . __('box') . ' [' . $boxID . '] ' . __('Not exists'); } } return ($result); } /** * Generates a crosslink warning when a certain ONU is linked to several PON boxes * * @param false $userProfile * * @return string */ public function renderCrossLinkWarning($userProfile = false) { $result = ''; $message = __('More then one ponbox link exists for current ONU - does it live in separate multiverses?'); if ($userProfile) { $result = wf_tag('span', false, '', 'style="color: #796616; font-size: 14px;"') . $message . wf_tag('span', true); } else { $result = $this->messages->getStyledMessage($message, 'warning'); } return ($result); } /** * Rendering images processing form and controls * * @param $boxID * * @return string */ public function renderBoxImageControls($boxID) { $photoStorage = new PhotoStorage(self::PHOTOSTORAGE_SCOPE, $boxID); $inputs = $photoStorage->renderUploadForm(true, base64_encode(self::URL_ME . '&' . self::ROUTE_BOXEDIT . '=' . $boxID)); $inputs .= $photoStorage->renderImagesList(); return ($inputs); } } |