type = $type; $this->from = $from; $this->redirect = is_array($redirect) ? json_encode($redirect) : $redirect; $this->description = $description; $this->active = $active; $this->short_url = $short_url; $this->id = $id; } /** * Save item in database */ public function save() { $routeLib = TikiLib::lib('custom_route'); $id = $routeLib->setRoute($this->type, $this->from, $this->redirect, $this->description, $this->active, $this->short_url, $this->id); if ($id) { $this->id = $id; } } /** * Load a custom route by ID * * @param $id * @return array|null|Item */ public static function load($id) { $routeLib = TikiLib::lib('custom_route'); $details = $routeLib->getRoute($id); if (empty($details)) { return null; } return new self( $details['type'], $details['from'], $details['redirect'], $details['description'], $details['active'], $details['short_url'], $details['id'] ); } /** * Check if a given path matches a custom route * * @param $path * @return bool|string */ public function matchRoute($path) { switch ($this->type) { case self::TYPE_DIRECT: if ($path === $this->from) { return true; } break; case self::TYPE_OBJECT: if ($path === $this->from) { return true; } break; case self::TYPE_TRACKER_FIELD: preg_match($this->from, $path, $matches); if (isset($matches[1])) { return true; } break; default: break; } return false; } /** * Attempts to determine if is viable to do an in-place redirect and return the appropriate setting (or false) * * @param $path * @return array|bool The setting for in place redirect of false */ public function getInPlaceRoutingParameters($path) { switch ($this->type) { case self::TYPE_OBJECT: $redirectDetails = json_decode($this->redirect, true); $objectType = $redirectDetails['type']; $objectId = $redirectDetails['object']; break; case self::TYPE_TRACKER_FIELD: $redirectDetails = json_decode($this->redirect, true); preg_match($this->from, $path, $matches); if (! isset($matches[1])) { return false; } if ($redirectDetails['tracker_field'] == 'itemId') { $itemId = $matches[1]; } else { $itemId = TikiLib::lib('trk')->get_item_id( $redirectDetails['tracker'], $redirectDetails['tracker_field'], $matches[1] ); } if (empty($itemId)) { $itemId = '0'; } $objectType = 'tracker item'; $objectId = $itemId; break; default: return false; } switch ($objectType) { case 'article': $file = 'tiki-read_article.php'; $params = ['articleId' => $objectId]; break; case 'blog': $file = 'tiki-view_blog.php'; $params = ['blogId' => $objectId]; break; case 'forum': $file = 'tiki-view_forum.php'; $params = ['forumId' => $objectId]; break; case 'tracker item': $file = 'tiki-view_tracker_item.php'; $params = ['itemId' => $objectId]; break; case 'wiki page': /** @var \WikiLib $wikiLib */ $wikiLib = TikiLib::lib('wiki'); $pageName = $wikiLib->get_page_name_from_id($objectId); $pageSlug = $wikiLib->get_slug_by_page($pageName); if (empty($pageSlug)) { return false; } $file = 'tiki-index.php'; $params = ['page' => $pageSlug]; break; default: return false; } return [ 'file' => $file, 'get_param' => $params ]; } /** * Check if a given path matches a custom route * * @param $path * @return bool|string */ public function getRedirectPath($path) { switch ($this->type) { case self::TYPE_DIRECT: if ($path === $this->from) { $redirectDetails = json_decode($this->redirect, true); return $redirectDetails['to']; } break; case self::TYPE_OBJECT: if ($path === $this->from) { $redirectDetails = json_decode($this->redirect, true); $type = $redirectDetails['type']; $objectId = $redirectDetails['object']; if ($type == 'wiki page') { /** @var \WikiLib $wikiLib */ $wikiLib = TikiLib::lib('wiki'); $pageName = $wikiLib->get_page_name_from_id($objectId); $pageSlug = $wikiLib->get_slug_by_page($pageName); if (empty($pageSlug)) { return false; } $objectId = $pageSlug; } require_once('tiki-sefurl.php'); $smarty = TikiLib::lib('smarty'); $smarty->loadPlugin('smarty_modifier_sefurl'); $isExternal = TikiLib::setExternalContext(true); $url = smarty_modifier_sefurl($objectId, $type); TikiLib::setExternalContext($isExternal); return $url; } break; case self::TYPE_TRACKER_FIELD: preg_match($this->from, $path, $matches); if (! isset($matches[1])) { return false; } $redirectDetails = json_decode($this->redirect, true); $trklib = TikiLib::lib('trk'); if ($redirectDetails['tracker_field'] == 'itemId') { $itemId = $matches[1]; } else { $itemId = $trklib->get_item_id( $redirectDetails['tracker'], $redirectDetails['tracker_field'], $matches[1] ); } if (empty($itemId)) { $itemId = '0'; } require_once('tiki-sefurl.php'); $smarty = TikiLib::lib('smarty'); $smarty->loadPlugin('smarty_modifier_sefurl'); $isExternal = TikiLib::setExternalContext(true); $url = smarty_modifier_sefurl($itemId, 'trackeritem'); TikiLib::setExternalContext($isExternal); return $url; break; default: break; } return false; } /** * Validate the route requirements are met. * * @return array */ public function validate() { $errors = []; if (empty($this->from)) { $errors[] = tr('From is required'); } $routeLib = TikiLib::lib('custom_route'); if ($routeLib->checkRouteExists($this->from, $this->id)) { $errors[] = tr('There is a route with the same From path already defined.'); } if (empty($this->type)) { $errors[] = tr('Type is required'); } /** @var Type $class */ $className = 'Tiki\\CustomRoute\\Type\\' . $this->type; if (class_exists($className)) { $class = new $className(); $params = json_decode($this->redirect, true); $errors += $class->validateParams($params); } else { $errors[] = tr('Selected type is not supported'); } return $errors; } /** * Converts the Item object into a array * * @return array */ public function toArray() { return [ 'id' => $this->id, 'type' => $this->type, 'from' => $this->from, 'params' => json_decode($this->redirect, true), 'description' => $this->description, 'active' => $this->active, 'short_url' => $this->short_url, ]; } /** * Returns the full short url link * * @return string The absolute short url link * @throws \Exception */ public function getShortUrlLink() { global $base_url; if (! $this->short_url) { throw new \Exception('This custom route is not Short URL'); } $link = ! empty($prefs['sefurl_short_url_base_url']) ? $prefs['sefurl_short_url_base_url'] : $base_url; $link = rtrim($link, '/') . '/' . $this->from; return $link; } }