/** * Filling the gaps in marker groups * * @return array If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops) */ public function step2() { $order = 2; foreach (\IPS\Db::i()->select('*', 'membermap_markers_groups') as $group) { $group = \IPS\membermap\Markers\Groups::constructFromData($group); \IPS\Lang::saveCustom('membermap', "membermap_marker_group_{$group->id}", trim($group->name)); \IPS\Lang::saveCustom('membermap', "membermap_marker_group_{$group->id}_JS", trim($group->name), 1); $group->name_seo = \IPS\Http\Url::seoTitle(trim($group->name)); if ($group->type == 'custom') { $group->position = $order; $group->moderate = 1; $order++; } try { $latestMarker = \IPS\Db::i()->select('*', 'membermap_markers', array('marker_open=? and marker_parent_id=?', 1, $group->id), 'marker_updated DESC, marker_added DESC', array(0, 1))->first(); $group->last_marker_id = $latestMarker['marker_id']; $group->last_marker_date = $latestMarker['marker_added']; } catch (\UnderflowException $e) { $group->last_marker_id = 0; $group->last_marker_date = 0; } $group->save(); /* Reset permissions */ $perms = $group->permissions(); \IPS\Db::i()->update('core_permission_index', array('perm_view' => '*', 'perm_2' => '*', 'perm_3' => \IPS\Settings::i()->admin_group, 'perm_4' => \IPS\Settings::i()->admin_group), array('perm_id=?', $perms['perm_id'])); } return TRUE; }
/** * Get the marker group ID for member markers * * @return int Group ID */ public function getMemberGroupId() { static $groupId = null; if ($groupId !== null) { return $groupId; } /* Get from cache */ if (isset(\IPS\Data\Store::i()->membermap_memberGroupId)) { $groupId = \IPS\Data\Store::i()->membermap_memberGroupId; } else { try { $groupId = \IPS\Db::i()->select('group_id', 'membermap_markers_groups', array('group_type=?', 'member'))->first(); } catch (\UnderflowException $e) { /* No group exists. Need to create one then */ $memberGroup = new \IPS\membermap\Markers\Groups(); $memberGroup->name = "Members"; $memberGroup->name_seo = "members"; $memberGroup->protected = 1; $memberGroup->type = "member"; $memberGroup->pin_colour = "#FFFFFF"; $memberGroup->pin_bg_colour = "darkblue"; $memberGroup->pin_icon = "fa-user"; $memberGroup->position = 1; $memberGroup->save(); /* Add in permissions */ $groups = array_filter(iterator_to_array(\IPS\Db::i()->select('g_id', 'core_groups')), function ($groupId) { if ($groupId == \IPS\Settings::i()->guest_group) { return FALSE; } return TRUE; }); $default = implode(',', $groups); \IPS\Db::i()->insert('core_permission_index', array('app' => 'membermap', 'perm_type' => 'membermap', 'perm_type_id' => $memberGroup->id, 'perm_view' => '*', 'perm_2' => '*', 'perm_3' => $default, 'perm_4' => $default)); \IPS\Lang::saveCustom('membermap', "membermap_marker_group_{$memberGroup->id}", trim($memberGroup->name)); \IPS\Lang::saveCustom('membermap', "membermap_marker_group_{$memberGroup->id}_JS", trim($memberGroup->name), 1); $groupId = $memberGroup->id; } \IPS\Data\Store::i()->membermap_memberGroupId = $groupId; } return $groupId; }
/** * [Node] Format form values from add/edit form for save * * @param array $values Values from the form * @return array */ public function formatFormValues($values) { if (!$this->id) { $this->save(); } if (isset($values['group_name'])) { \IPS\Lang::saveCustom('membermap', "membermap_marker_group_{$this->id}", $values['group_name']); \IPS\Lang::saveCustom('membermap', "membermap_marker_group_{$this->id}_JS", $values['group_name'], 1); $this->name_seo = \IPS\Http\Url::seoTitle($values['group_name'][\IPS\Lang::defaultLanguage()]); unset($values['group_name']); } foreach (array('group_pin_icon', 'group_pin_colour', 'group_pin_bg_colour') as $val) { if (isset($values[$val])) { $key = str_replace('group_', '', $val); $values[$key] = $values[$val]; unset($values[$val]); } } return $values; }
public function import() { $id = isset(\IPS\Request::i()->id) ? intval(\IPS\Request::i()->id) : 0; /* Build form */ $form = new \IPS\Helpers\Form(NULL, 'import'); if (isset(\IPS\Request::i()->id)) { $group = \IPS\membermap\Markers\Groups::load(intval(\IPS\Request::i()->id)); if ($group->type == 'member') { \IPS\Output::i()->error('generic_error', '1MM4/1', 403, ''); } } $form->add(new \IPS\Helpers\Form\Upload('import_upload', NULL, TRUE, array('allowedFileTypes' => array('kml'), 'temporary' => TRUE))); $form->add(new \IPS\Helpers\Form\YesNo('import_creategroups', FALSE, FALSE, array('togglesOff' => array('import_group')))); $form->add(new \IPS\Helpers\Form\Node('import_group', $id ?: 0, FALSE, array('class' => '\\IPS\\membermap\\Markers\\Groups', 'permissionCheck' => 'add', 'subnodes' => false, 'where' => array('group_type != ?', 'member')), NULL, NULL, NULL, 'import_group')); if ($values = $form->values()) { try { $xml = \IPS\Xml\SimpleXML::loadFile($values['import_upload']); } catch (\InvalidArgumentException $e) { $form->error = \IPS\Member::loggedIn()->language()->addToStack('xml_upload_invalid'); \IPS\Output::i()->output = $form; return; } /* No group selected, and don't create groups?! */ if ($values['import_creategroups'] == FALSE and !$values['import_group']) { $form->error = \IPS\Member::loggedIn()->language()->addToStack('membermap_error_no_id_no_create'); \IPS\Output::i()->output = $form; return; } $markers = array(); $groupOrder = NULL; $imported = 0; foreach ($xml->Document->Folder as $folder) { if (!isset($folder->Placemark)) { continue; } $folderName = (string) $folder->name; foreach ($folder->Placemark as $placemark) { if (!isset($placemark->Point->coordinates)) { continue; } list($lon, $lat, $elev) = explode(',', $placemark->Point->coordinates); $markers[] = array('marker_name' => (string) $placemark->name, 'marker_name_seo' => \IPS\Http\Url::seoTitle((string) $placemark->name), 'marker_description' => (string) $placemark->description, 'marker_lat' => $lat, 'marker_lon' => $lon, 'marker_member_id' => \IPS\Member::loggedIn()->member_id, 'marker_added' => time(), 'marker_open' => 1, 'marker_parent_id' => isset($values['import_group']) ? $values['import_group']->id : NULL); } /* Create a new group per "folder" */ if ($values['import_creategroups'] == TRUE and count($markers) > 0) { if ($groupOrder === NULL) { $groupOrder = \IPS\Db::i()->select(array("MAX( `group_position` ) as position"), 'membermap_markers_groups')->first(); } $groupOrder = $groupOrder + 1; $group = new \IPS\membermap\Markers\Groups(); $group->name = $folderName; $group->name_seo = \IPS\Http\Url::seoTitle($folderName); $group->type = 'custom'; $group->pin_colour = '#FFFFFF'; $group->pin_bg_colour = 'red'; $group->pin_icon = 'fa-globe'; $group->position = $groupOrder; $group->save(); \IPS\Lang::saveCustom('membermap', "membermap_marker_group_{$group->id}", trim($folderName)); \IPS\Lang::saveCustom('membermap', "membermap_marker_group_{$group->id}_JS", trim($folderName), 1); // Add group id to all elements of the array array_walk($markers, function (&$v, $k) use($group) { $v['marker_parent_id'] = $group->id; }); // Insert \IPS\Db::i()->insert('membermap_markers', $markers); $group->setLastComment(); $group->save(); // Set default permissions $perms = $group->permissions(); \IPS\Db::i()->update('core_permission_index', array('perm_view' => '*', 'perm_2' => '*', 'perm_3' => \IPS\Settings::i()->admin_group, 'perm_4' => \IPS\Settings::i()->admin_group), array('perm_id=?', $perms['perm_id'])); // Reset $imported += count($markers); $markers = array(); } } /* If we still got markers here, it's all pushed to one group, probably */ if (is_array($markers) and count($markers) > 0) { \IPS\Db::i()->insert('membermap_markers', $markers); $group = $values['import_group']; $group->setLastComment(); $group->save(); $imported += count($markers); } \IPS\membermap\Map::i()->invalidateJsonCache(); $message = \IPS\Member::loggedIn()->language()->addToStack('membermap_import_thumbup', FALSE, array('sprintf' => array($imported))); \IPS\Output::i()->redirect(\IPS\Http\Url::internal("app=membermap&module=membermap&controller=markers"), $message); } /* Display */ \IPS\Output::i()->output = $form; }