| 1 | <?php |
|---|
| 2 | |
|---|
| 3 | /** |
|---|
| 4 | * CustomGoogleMapsDialog |
|---|
| 5 | * |
|---|
| 6 | * @author Tomasz Świenty |
|---|
| 7 | * @version 0.1 |
|---|
| 8 | * @copyright Copyright (c) eDokumenty |
|---|
| 9 | */ |
|---|
| 10 | final class CustomGoogleMapsDialog extends DialogForm { |
|---|
| 11 | |
|---|
| 12 | |
|---|
| 13 | protected static $cMethods = [ |
|---|
| 14 | 'updateGPSLocation' |
|---|
| 15 | ]; |
|---|
| 16 | |
|---|
| 17 | |
|---|
| 18 | /** |
|---|
| 19 | * CustomGoogleMapsDialog constructor. |
|---|
| 20 | * @param $name |
|---|
| 21 | * @param null $caption |
|---|
| 22 | * @param int $mode |
|---|
| 23 | */ |
|---|
| 24 | public function __construct($name, $caption = NULL, $mode = BS_DIALOG) { |
|---|
| 25 | |
|---|
| 26 | parent::__construct($name, Translator::translate('Google Maps'), BS_DIALOG); |
|---|
| 27 | |
|---|
| 28 | $this->path = App::makeRelativePath(__FILE__); |
|---|
| 29 | |
|---|
| 30 | $this->width = '780px'; |
|---|
| 31 | $this->height = '740px'; |
|---|
| 32 | |
|---|
| 33 | if ($this->isOpened() AND !$this->noNeedForCreate() AND !Request::hasMethodCall($this->name, array_keys(self::$cMethods))) { |
|---|
| 34 | $this->create(); |
|---|
| 35 | } |
|---|
| 36 | |
|---|
| 37 | } |
|---|
| 38 | |
|---|
| 39 | |
|---|
| 40 | /** |
|---|
| 41 | * @return array |
|---|
| 42 | */ |
|---|
| 43 | public function getCallableMethods() { |
|---|
| 44 | |
|---|
| 45 | return self::$cMethods; |
|---|
| 46 | |
|---|
| 47 | } |
|---|
| 48 | |
|---|
| 49 | |
|---|
| 50 | /** |
|---|
| 51 | * @param $params |
|---|
| 52 | * @throws CustomErrorException |
|---|
| 53 | */ |
|---|
| 54 | public function updateGPSLocation($params) { |
|---|
| 55 | |
|---|
| 56 | $pData = JSON::toArray($params); |
|---|
| 57 | $mainad = (isset($pData['mainad']) AND (filter_var($pData['mainad'], FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]) !== FALSE)) ? $pData['mainad'] : FALSE; |
|---|
| 58 | if (!$mainad) { |
|---|
| 59 | throw new CustomErrorException(Translator::translate('Brak identyfikatora adresu')); |
|---|
| 60 | } |
|---|
| 61 | |
|---|
| 62 | $gps = isset($pData['gps'], $pData['gps']['lat'], $pData['gps']['lng']) ? $pData['gps'] : FALSE; |
|---|
| 63 | if (!$gps) { |
|---|
| 64 | throw new CustomErrorException(Translator::translate('Brak lokalizacji GPS')); |
|---|
| 65 | } |
|---|
| 66 | |
|---|
| 67 | require_once(MODEL_PATH.'Contacts/PAddress.inc'); |
|---|
| 68 | $address = new PAddress($mainad); |
|---|
| 69 | $address->set('lat___', $pData['gps']['lat']); |
|---|
| 70 | $address->set('lng___', $pData['gps']['lng']); |
|---|
| 71 | $address->save(); |
|---|
| 72 | } |
|---|
| 73 | |
|---|
| 74 | |
|---|
| 75 | /** |
|---|
| 76 | * @param null $params |
|---|
| 77 | * @param null $data |
|---|
| 78 | * @throws CustomErrorException |
|---|
| 79 | */ |
|---|
| 80 | public function open($params = NULL, &$data = NULL) { |
|---|
| 81 | |
|---|
| 82 | $pData = JSON::toArray($params); |
|---|
| 83 | |
|---|
| 84 | $keyval = (isset($pData['keyval']) AND is_array($pData['keyval'])) ? $pData['keyval'] : FALSE; |
|---|
| 85 | if (!$keyval) { |
|---|
| 86 | throw new CustomErrorException(Translator::translate('Wybierz klientów z listy')); |
|---|
| 87 | } |
|---|
| 88 | |
|---|
| 89 | parent::open($params, $data); |
|---|
| 90 | $this->setSData(['contid' => $keyval]); |
|---|
| 91 | $this->create(); |
|---|
| 92 | |
|---|
| 93 | } |
|---|
| 94 | |
|---|
| 95 | |
|---|
| 96 | /** |
|---|
| 97 | * @return bool |
|---|
| 98 | */ |
|---|
| 99 | protected function create() { |
|---|
| 100 | |
|---|
| 101 | if (!$this->isOpened()) { |
|---|
| 102 | return FALSE; |
|---|
| 103 | } |
|---|
| 104 | |
|---|
| 105 | $sData = $this->getSData(); |
|---|
| 106 | $contacts = PgManager::getInstance()->query('SELECT contid, name_1, f_addr, mainad FROM contacts_view WHERE contid IN ('.implode(', ', $sData['contid']).')', FALSE, PGSQL_ASSOC); |
|---|
| 107 | |
|---|
| 108 | $mapCanvas = new Panel($this->name.'mapCanvas'); |
|---|
| 109 | $mapCanvas->width = '100%'; |
|---|
| 110 | $mapCanvas->height = '100%'; |
|---|
| 111 | $mapCanvas->position = 'relative'; |
|---|
| 112 | |
|---|
| 113 | $map = \ReadyCls\Google\Google::createMapInstance($this->name.'map', $mapCanvas->name); |
|---|
| 114 | $map->create(); |
|---|
| 115 | |
|---|
| 116 | foreach ($contacts as $contact) { |
|---|
| 117 | $map->addMarkerByLocation($contact['f_addr'], $contact['name_1'], FALSE, 'App.'.$this->name.'markerDropCallback('.$contact['mainad'].', marker);'); |
|---|
| 118 | } |
|---|
| 119 | |
|---|
| 120 | $this->add($mapCanvas); |
|---|
| 121 | |
|---|
| 122 | // dostępne metody https://developers.google.com/maps/documentation/javascript/reference/marker#Marker |
|---|
| 123 | JScript::add(' |
|---|
| 124 | App.'.$this->name.'markerDropCallback = function(mainad, marker) { |
|---|
| 125 | '.JScript::confirmAction(Translator::translate('Czy zmienić lokaliację GPS'), 'App.'.$this->name.'markerDropCallbackConfirm(mainad, marker)', NULL, FALSE).' |
|---|
| 126 | } |
|---|
| 127 | |
|---|
| 128 | App.'.$this->name.'markerDropCallbackConfirm = function(mainad, marker) { |
|---|
| 129 | $A1(\''.$this->name.'\', \''.$this->name.'\', '.(int)array_search('updateGPSLocation', self::$cMethods).', ({mainad:mainad, gps:marker.getPosition().toJSON()}).toJSONString(), \'\', 0, true); |
|---|
| 130 | } |
|---|
| 131 | '); |
|---|
| 132 | |
|---|
| 133 | return TRUE; |
|---|
| 134 | |
|---|
| 135 | } |
|---|
| 136 | |
|---|
| 137 | } |
|---|
| 138 | |
|---|
| 139 | /** |
|---|
| 140 | * CustomGoogleMapsDialog |
|---|
| 141 | * |
|---|
| 142 | * @author Tomasz Świenty |
|---|
| 143 | * @version 0.1 |
|---|
| 144 | * @copyright Copyright (c) eDokumenty |
|---|
| 145 | */ |
|---|
| 146 | final class CustomGoogleMapsDialogInitializer { |
|---|
| 147 | |
|---|
| 148 | |
|---|
| 149 | /** |
|---|
| 150 | * @param $args |
|---|
| 151 | * @throws WidgetException |
|---|
| 152 | */ |
|---|
| 153 | public static function init($args) { |
|---|
| 154 | |
|---|
| 155 | if (!isset($args['keyval']) OR !$args['keyval']) { |
|---|
| 156 | throw new WidgetException($args['listName'], Translator::translate('Wybierz klientów')); |
|---|
| 157 | } |
|---|
| 158 | |
|---|
| 159 | $HWND = Application::registerDialog(Application::getShortName('CustomGoogleMapsDialog'), 'CustomGoogleMapsDialog', './scripts/CustomGoogleMapsDialog.inc'); |
|---|
| 160 | |
|---|
| 161 | JScript::add('App.openDialogEx(\''.$HWND.'\', null, ('.JSON::encode($args).').toJSONString())'); |
|---|
| 162 | |
|---|
| 163 | } |
|---|
| 164 | |
|---|
| 165 | } |
|---|
| 166 | |
|---|
| 167 | if (isset($args['keyval'])) { |
|---|
| 168 | CustomGoogleMapsDialogInitializer::init($args); |
|---|
| 169 | } |
|---|