public static function getCategoryValue($id, $field, $clang = null) { if ($clang === null) { $clang = rex_clang::getCurrentId(); } $cat = rex_category::get($id, $clang); if ($cat) { return htmlspecialchars($cat->getValue($field)); } }
public function hasCategoryPerm($category_id) { if ($this->hasAll() || in_array($category_id, $this->perms)) { return true; } if ($c = rex_category::get($category_id)) { foreach ($c->getPathAsArray() as $k) { if (in_array($k, $this->perms)) { return true; } } } return false; }
/** * Löscht die gecachten Meta-Dateien eines Artikels. Wenn keine clang angegeben, wird * der Artikel in allen Sprachen gelöscht. * * @param int $id ArtikelId des Artikels * @param int $clang ClangId des Artikels * * @return bool True on success, False on errro */ public static function deleteMeta($id, $clang = null) { // sanity check if ($id < 0) { return false; } $cachePath = rex_path::addonCache('structure'); foreach (rex_clang::getAllIds() as $_clang) { if ($clang !== null && $clang != $_clang) { continue; } rex_file::delete($cachePath . $id . '.' . $_clang . '.article'); rex_article::clearInstance([$id, $_clang]); rex_category::clearInstance([$id, $_clang]); } return true; }
protected function buildFilterCondition(array $params) { $s = ''; if (!empty($params['id'])) { $OOCat = rex_category::get($params['id'], $params['clang']); // Alle Metafelder des Pfades sind erlaubt foreach ($OOCat->getPathAsArray() as $pathElement) { if ($pathElement != '') { $s .= ' OR `p`.`restrictions` LIKE "%|' . $pathElement . '|%"'; } } // Auch die Kategorie selbst kann Metafelder haben $s .= ' OR `p`.`restrictions` LIKE "%|' . $params['id'] . '|%"'; } $restrictionsCondition = 'AND (`p`.`restrictions` = "" OR `p`.`restrictions` IS NULL ' . $s . ')'; return $restrictionsCondition; }
public function execute() { // check if a new category was folded $category_id = rex_request('toggle_category_id', 'int', -1); $category_id = rex_category::get($category_id) ? $category_id : -1; /** * @var rex_user */ $user = rex::getUser(); if (!$user->getComplexPerm('structure')->hasCategoryPerm($category_id)) { throw new rex_api_exception('user has no permission for this category!'); } $context = rex_context::fromGet(); $categoryTree = new rex_sitemap_category_tree($context); $tree = $categoryTree->getTree($category_id); $result = new rex_api_result(true); return $result; }
protected function addCatOption(rex_category $cat, $group = null) { if (!$this->check_perms || $this->check_perms && rex::getUser()->getComplexPerm('structure')->hasCategoryPerm($cat->getId(), false)) { $cid = $cat->getId(); $cname = $cat->getName() . ' [' . $cid . ']'; if ($group === null) { $group = $cat->getParentId(); } $this->addOption($cname, $cid, $cid, $group); $childs = $cat->getChildren($this->ignore_offlines, $this->clang); if (is_array($childs)) { foreach ($childs as $child) { $this->addCatOption($child); } } } }
/** * @param string $path * @param rex_category $cat * @param rex_yrewrite_domain $domain * * @return string */ public function appendCategory($path, rex_category $cat, rex_yrewrite_domain $domain) { return $path . '/' . $this->normalize($cat->getName(), $cat->getClang()); }
<?php /** * Regelt die Rechte an den einzelnen Kategorien und gibt den Pfad aus * Kategorien = Startartikel und Bezüge. * * @package redaxo5 */ $KATout = ''; // Variable definiert und vorbelegt wenn nicht existent $KAToutARR = []; // Variable definiert und vorbelegt wenn nicht existent $navigation = []; $ooCat = rex_category::get($category_id, $clang); if ($ooCat) { foreach ($ooCat->getParentTree() as $parent) { $catid = $parent->getId(); if (rex::getUser()->getComplexPerm('structure')->hasCategoryPerm($catid)) { $n = []; $n['title'] = str_replace(' ', ' ', htmlspecialchars($parent->getName())); $n['href'] = rex_url::backendPage('structure', ['category_id' => $catid, 'clang' => $clang]); $navigation[] = $n; } } } $title = '<a href="' . rex_url::backendPage('structure', ['category_id' => 0, 'clang' => $clang]) . '"><i class="rex-icon rex-icon-sitestartarticle"></i> ' . rex_i18n::msg('homepage') . '</a>'; $fragment = new rex_fragment(); $fragment->setVar('title', $title, false); $fragment->setVar('items', $navigation, false); echo $fragment->parse('core/navigations/breadcrumb.php'); unset($fragment);
/** * Returns TRUE if this category is the direct * parent of the other category. * * @param self $otherCat * * @return bool */ public function isParent(self $otherCat) { return $this->getId() == $otherCat->getParentId() && $this->getClang() == $otherCat->getClang(); }
protected function _getNavigation($category_id, $depth = 1) { if ($category_id < 1) { $nav_obj = rex_category::getRootCategories(); } else { $nav_obj = rex_category::get($category_id)->getChildren(); } $return = ''; if (count($nav_obj) > 0) { $return .= '<ul class="rex-navi' . ($depth + 1) . '">'; } $lis = []; foreach ($nav_obj as $nav) { $li = []; $a = []; $li['class'] = []; $a['class'] = []; $a['href'] = [$nav->getUrl()]; if ($this->checkFilter($nav, $depth) && $this->checkCallbacks($nav, $depth, $li, $a)) { $li['class'][] = 'rex-article-' . $nav->getId(); // classes abhaengig vom pfad if ($nav->getId() == $this->current_category_id) { $li['class'][] = 'rex-current'; $a['class'][] = 'rex-current'; } elseif (in_array($nav->getId(), $this->path)) { $li['class'][] = 'rex-active'; $a['class'][] = 'rex-active'; } else { $li['class'][] = 'rex-normal'; } if (isset($this->linkclasses[$depth - 1])) { $a['class'][] = $this->linkclasses[$depth - 1]; } if (isset($this->classes[$depth - 1])) { $li['class'][] = $this->classes[$depth - 1]; } $li_attr = []; foreach ($li as $attr => $v) { $li_attr[] = $attr . '="' . implode(' ', $v) . '"'; } $a_attr = []; foreach ($a as $attr => $v) { $a_attr[] = $attr . '="' . implode(' ', $v) . '"'; } $l = '<li ' . implode(' ', $li_attr) . '>'; $l .= '<a ' . implode(' ', $a_attr) . '>' . htmlspecialchars($nav->getName()) . '</a>'; ++$depth; if (($this->open || $nav->getId() == $this->current_category_id || in_array($nav->getId(), $this->path)) && ($this->depth >= $depth || $this->depth < 0)) { $l .= $this->_getNavigation($nav->getId(), $depth); } --$depth; $l .= '</li>'; $lis[] = $l; } } if (count($lis) > 0) { return '<ul class="rex-navi' . $depth . ' rex-navi-depth-' . $depth . ' rex-navi-has-' . count($lis) . '-elements">' . implode('', $lis) . '</ul>'; } return ''; }
/** * Erstellt eine neue Kategorie. * * @param int $category_id KategorieId in der die neue Kategorie erstellt werden soll * @param array $data Array mit den Daten der Kategorie * * @throws rex_api_exception * * @return string Eine Statusmeldung */ public static function addCategory($category_id, array $data) { $message = ''; if (!is_array($data)) { throw new rex_api_exception('Expecting $data to be an array!'); } self::reqKey($data, 'catpriority'); self::reqKey($data, 'catname'); // parent may be null, when adding in the root cat $parent = rex_category::get($category_id); if ($parent) { $path = $parent->getPath(); $path .= $parent->getId() . '|'; } else { $path = '|'; } if ($data['catpriority'] <= 0) { $data['catpriority'] = 1; } if (!isset($data['name'])) { $data['name'] = $data['catname']; } if (!isset($data['status'])) { $data['status'] = 0; } $contentAvailable = rex_plugin::get('structure', 'content')->isAvailable(); if ($contentAvailable) { $startpageTemplates = []; if ($category_id != '') { // TemplateId vom Startartikel der jeweiligen Sprache vererben $sql = rex_sql::factory(); // $sql->setDebug(); $sql->setQuery('select clang_id,template_id from ' . rex::getTablePrefix() . "article where id={$category_id} and startarticle=1"); for ($i = 0; $i < $sql->getRows(); $i++, $sql->next()) { $startpageTemplates[$sql->getValue('clang_id')] = $sql->getValue('template_id'); } } // Alle Templates der Kategorie $templates = rex_template::getTemplatesForCategory($category_id); } $user = rex::isBackend() ? null : 'frontend'; // Kategorie in allen Sprachen anlegen $AART = rex_sql::factory(); foreach (rex_clang::getAllIds() as $key) { if ($contentAvailable) { $template_id = rex_template::getDefaultId(); if (isset($startpageTemplates[$key]) && $startpageTemplates[$key] != '') { $template_id = $startpageTemplates[$key]; } // Wenn Template nicht vorhanden, dann entweder erlaubtes nehmen // oder leer setzen. if (!isset($templates[$template_id])) { $template_id = 0; if (count($templates) > 0) { $template_id = key($templates); } } } $AART->setTable(rex::getTablePrefix() . 'article'); if (!isset($id)) { $id = $AART->setNewId('id'); } else { $AART->setValue('id', $id); } $AART->setValue('clang_id', $key); $AART->setValue('template_id', $template_id); $AART->setValue('name', $data['name']); $AART->setValue('catname', $data['catname']); $AART->setValue('catpriority', $data['catpriority']); $AART->setValue('parent_id', $category_id); $AART->setValue('priority', 1); $AART->setValue('path', $path); $AART->setValue('startarticle', 1); $AART->setValue('status', $data['status']); $AART->addGlobalUpdateFields($user); $AART->addGlobalCreateFields($user); try { $AART->insert(); // ----- PRIOR if (isset($data['catpriority'])) { self::newCatPrio($category_id, $key, 0, $data['catpriority']); } $message = rex_i18n::msg('category_added_and_startarticle_created'); rex_article_cache::delete($id, $key); // ----- EXTENSION POINT // Objekte clonen, damit diese nicht von der extension veraendert werden koennen $message = rex_extension::registerPoint(new rex_extension_point('CAT_ADDED', $message, ['category' => clone $AART, 'id' => $id, 'parent_id' => $category_id, 'clang' => $key, 'name' => $data['catname'], 'priority' => $data['catpriority'], 'path' => $path, 'status' => $data['status'], 'article' => clone $AART, 'data' => $data])); } catch (rex_sql_exception $e) { throw new rex_api_exception($e); } } return $message; }
/** * Get an array of all parentCategories. * Returns an array of rex_structure_element objects. * * @return rex_category[] */ public function getParentTree() { $return = []; if ($this->path) { if ($this->isStartArticle()) { $explode = explode('|', $this->path . $this->id . '|'); } else { $explode = explode('|', $this->path); } if (is_array($explode)) { foreach ($explode as $var) { if ($var != '') { $return[] = rex_category::get($var, $this->clang_id); } } } } return $return; }
/** * Returns an array containing all templates which are available for the given category_id. * if the category_id is non-positive all templates in the system are returned. * if the category_id is invalid an empty array is returned. * * @param int $category_id * @param bool $ignore_inactive * * @return array */ public static function getTemplatesForCategory($category_id, $ignore_inactive = true) { $ignore_inactive = $ignore_inactive ? 1 : 0; $templates = []; $t_sql = rex_sql::factory(); $t_sql->setQuery('select id,name,attributes from ' . rex::getTablePrefix() . 'template where active=' . $ignore_inactive . ' order by name'); if ($category_id < 1) { // Alle globalen Templates foreach ($t_sql as $row) { $attributes = $row->getArrayValue('attributes'); $categories = isset($attributes['categories']) ? $attributes['categories'] : []; if (!is_array($categories) || $categories['all'] == 1) { $templates[$row->getValue('id')] = $row->getValue('name'); } } } else { if ($c = rex_category::get($category_id)) { $path = $c->getPathAsArray(); $path[] = $category_id; foreach ($t_sql as $row) { $attributes = $row->getArrayValue('attributes'); $categories = isset($attributes['categories']) ? $attributes['categories'] : []; // template ist nicht kategoriespezifisch -> includen if (!is_array($categories) || $categories['all'] == 1) { $templates[$row->getValue('id')] = $row->getValue('name'); } else { // template ist auf kategorien beschraenkt.. // nachschauen ob eine davon im pfad der aktuellen kategorie liegt foreach ($path as $p) { if (in_array($p, $categories)) { $templates[$row->getValue('id')] = $row->getValue('name'); break; } } } } } } return $templates; }
/** * Returns the parent category. * * @return rex_category */ public function getCategory() { return rex_category::get($this->getCategoryId(), $this->getClang()); }
/** * Erstellt einen neuen Artikel. * * @param array $data Array mit den Daten des Artikels * * @throws rex_api_exception * * @return string Eine Statusmeldung */ public static function addArticle($data) { if (!is_array($data)) { throw new rex_api_exception('Expecting $data to be an array!'); } self::reqKey($data, 'category_id'); self::reqKey($data, 'priority'); self::reqKey($data, 'name'); if ($data['priority'] <= 0) { $data['priority'] = 1; } // parent may be null, when adding in the root cat $parent = rex_category::get($data['category_id']); if ($parent) { $path = $parent->getPath(); $path .= $parent->getId() . '|'; } else { $path = '|'; } if (rex_plugin::get('structure', 'content')->isAvailable()) { $templates = rex_template::getTemplatesForCategory($data['category_id']); // Wenn Template nicht vorhanden, dann entweder erlaubtes nehmen // oder leer setzen. if (!isset($templates[$data['template_id']])) { $data['template_id'] = 0; if (count($templates) > 0) { $data['template_id'] = key($templates); } } } $message = rex_i18n::msg('article_added'); $AART = rex_sql::factory(); unset($id); foreach (rex_clang::getAllIds() as $key) { // ------- Kategorienamen holen $category = rex_category::get($data['category_id'], $key); $categoryName = ''; if ($category) { $categoryName = $category->getName(); } $AART->setTable(rex::getTablePrefix() . 'article'); if (!isset($id) || !$id) { $id = $AART->setNewId('id'); } else { $AART->setValue('id', $id); } $AART->setValue('name', $data['name']); $AART->setValue('catname', $categoryName); $AART->setValue('clang_id', $key); $AART->setValue('parent_id', $data['category_id']); $AART->setValue('priority', $data['priority']); $AART->setValue('path', $path); $AART->setValue('startarticle', 0); $AART->setValue('status', 0); $AART->setValue('template_id', $data['template_id']); $AART->addGlobalCreateFields(); $AART->addGlobalUpdateFields(); try { $AART->insert(); // ----- PRIOR self::newArtPrio($data['category_id'], $key, 0, $data['priority']); } catch (rex_sql_exception $e) { throw new rex_api_exception($e); } rex_article_cache::delete($id, $key); // ----- EXTENSION POINT $message = rex_extension::registerPoint(new rex_extension_point('ART_ADDED', $message, ['id' => $id, 'clang' => $key, 'status' => 0, 'name' => $data['name'], 'parent_id' => $data['category_id'], 'priority' => $data['priority'], 'path' => $path, 'template_id' => $data['template_id'], 'data' => $data])); } return $message; }
public function getList($category_id) { $isRoot = $category_id === 0; $mountpoints = rex::getUser()->getComplexPerm('structure')->getMountpoints(); if ($isRoot && count($mountpoints) == 0) { $articles = rex_article::getRootArticles(); } else { $articles = rex_category::get($category_id)->getArticles(); } return self::renderList($articles, $category_id); }
public static function generatePathFile($params) { $setDomain = function (rex_yrewrite_domain &$domain, &$path, rex_structure_element $element) { $id = $element->getId(); $clang = $element->getClang(); if (isset(rex_yrewrite::$domainsByMountId[$id][$clang])) { $domain = rex_yrewrite::$domainsByMountId[$id][$clang]; $path = rex_yrewrite::$scheme->getClang($clang, $domain); } }; $setPath = function (rex_yrewrite_domain $domain, $path, rex_article $art) use($setDomain) { $setDomain($domain, $path, $art); if (($redirection = rex_yrewrite::$scheme->getRedirection($art, $domain)) instanceof rex_structure_element) { rex_yrewrite::$paths['redirections'][$art->getId()][$art->getClang()] = ['id' => $redirection->getId(), 'clang' => $redirection->getClang()]; unset(rex_yrewrite::$paths['paths'][$domain->getName()][$art->getId()][$art->getClang()]); return; } unset(rex_yrewrite::$paths['redirections'][$art->getId()][$art->getClang()]); $url = rex_yrewrite::$scheme->getCustomUrl($art, $domain); if (!is_string($url)) { $url = rex_yrewrite::$scheme->appendArticle($path, $art, $domain); } rex_yrewrite::$paths['paths'][$domain->getName()][$art->getId()][$art->getClang()] = ltrim($url, '/'); }; $generatePaths = function (rex_yrewrite_domain $domain, $path, rex_category $cat) use(&$generatePaths, $setDomain, $setPath) { $path = rex_yrewrite::$scheme->appendCategory($path, $cat, $domain); $setDomain($domain, $path, $cat); foreach ($cat->getChildren() as $child) { $generatePaths($domain, $path, $child); } foreach ($cat->getArticles() as $art) { $setPath($domain, $path, $art); } }; $ep = isset($params['extension_point']) ? $params['extension_point'] : ''; switch ($ep) { // clang and id specific update case 'CAT_DELETED': case 'ART_DELETED': foreach (self::$paths['paths'] as $domain => $c) { unset(self::$paths['paths'][$domain][$params['id']]); } unset(self::$paths['redirections'][$params['id']]); if (0 == $params['re_id']) { break; } $params['id'] = $params['re_id']; // no break // no break case 'CAT_ADDED': case 'CAT_UPDATED': case 'CAT_STATUS': case 'ART_ADDED': case 'ART_UPDATED': case 'ART_STATUS': rex_article_cache::delete($params['id']); $domain = self::$domainsByMountId[0][$params['clang']]; $path = self::$scheme->getClang($params['clang'], $domain); $art = rex_article::get($params['id'], $params['clang']); $tree = $art->getParentTree(); if ($art->isStartArticle()) { $cat = array_pop($tree); } foreach ($tree as $parent) { $path = self::$scheme->appendCategory($path, $parent, $domain); $setDomain($domain, $path, $parent); $setPath($domain, $path, rex_article::get($parent->getId(), $parent->getClang())); } if ($art->isStartArticle()) { $generatePaths($domain, $path, $cat); } else { $setPath($domain, $path, $art); } break; // update all // update all case 'CLANG_DELETED': case 'CLANG_ADDED': case 'CLANG_UPDATED': //case 'ALL_GENERATED': //case 'ALL_GENERATED': default: self::$paths = ['paths' => [], 'redirections' => []]; foreach (rex_clang::getAllIds() as $clangId) { $domain = self::$domainsByMountId[0][$clangId]; $path = self::$scheme->getClang($clangId, $domain); foreach (rex_category::getRootCategories(false, $clangId) as $cat) { $generatePaths($domain, $path, $cat); } foreach (rex_article::getRootArticles(false, $clangId) as $art) { $setPath($domain, $path, $art); } } break; } rex_file::putCache(self::$pathfile, self::$paths); }
window.opener.document.getElementById("' . $opener_input_field_name . '").value = name; self.close();'; } // ------------------------ Print JS Functions ?> <script type="text/javascript"> function insertLink(link,name){ <?php echo $func_body . "\n"; ?> } </script> <?php $isRoot = $category_id === 0; $category = rex_category::get($category_id); $navigation = []; if ($category) { foreach ($category->getParentTree() as $parent) { $n = []; $n['title'] = str_replace(' ', ' ', htmlspecialchars($parent->getName())); $n['href'] = $context->getUrl(['category_id' => $parent->getId()]); $navigation[] = $n; } } echo rex_view::title('Linkmap'); $title = '<a href="' . $context->getUrl(['category_id' => 0]) . '"><i class="rex-icon rex-icon-sitestartarticle"></i> ' . rex_i18n::msg('homepage') . '</a>'; $fragment = new rex_fragment(); $fragment->setVar('title', $title, false); $fragment->setVar('items', $navigation, false); echo $fragment->parse('core/navigations/breadcrumb.php');
<input type="hidden" name="edit_id" value="' . $edit_id . '" />'; } // --------------------- PRINT CATS/SUBCATS $echo .= ' <table class="table table-striped table-hover"> <thead> <tr> <th class="rex-table-icon">' . $add_category . '</th> <th class="rex-table-id">' . rex_i18n::msg('header_id') . '</th> <th>' . rex_i18n::msg('header_category') . '</th> <th class="rex-table-priority">' . rex_i18n::msg('header_priority') . '</th> <th class="rex-table-action" colspan="3">' . rex_i18n::msg('header_status') . '</th> </tr> </thead> <tbody>'; if ($category_id != 0 && ($category = rex_category::get($category_id))) { $echo .= ' <tr> <td class="rex-table-icon"><i class="rex-icon rex-icon-open-category"></i></td> <td class="rex-table-id">-</td> <td data-title="' . rex_i18n::msg('header_category') . '"><a href="' . $context->getUrl(['category_id' => $category->getParentId()]) . '">..</a></td> <td class="rex-table-priority" data-title="' . rex_i18n::msg('header_priority') . '"> </td> <td class="rex-table-action" colspan="3"> </td> </tr>'; } // --------------------- KATEGORIE ADD FORM if ($function == 'add_cat' && $KATPERM) { $meta_buttons = rex_extension::registerPoint(new rex_extension_point('CAT_FORM_BUTTONS', '', ['id' => $category_id, 'clang' => $clang])); $add_buttons = ' <input type="hidden" name="rex-api-call" value="category_add" /> <input type="hidden" name="parent-category-id" value="' . $category_id . '" /> <button class="btn btn-save" type="submit" name="category-add-button"' . rex::getAccesskey(rex_i18n::msg('add_category'), 'save') . '>' . rex_i18n::msg('add_category') . '</button>';
static function getListValue($params) { $return = array(); foreach (explode(',', $params['value']) as $id) { if ($cat = rex_category::get($id, (int) $params['params']['field']['clang'])) { $return[] = $cat->getName(); } } return implode('<br />', $return); }
} if (rex::isBackend() && rex::getUser()) { rex_view::addJsFile($this->getAssetsUrl('linkmap.js')); rex_extension::register('PAGE_SIDEBAR', function () { $category_id = rex_request('category_id', 'int'); $article_id = rex_request('article_id', 'int'); $clang = rex_request('clang', 'int'); $ctype = rex_request('ctype', 'int'); $category_id = rex_category::get($category_id) ? $category_id : 0; $article_id = rex_article::get($article_id) ? $article_id : 0; $clang = rex_clang::exists($clang) ? $clang : rex_clang::getStartId(); // TODO - CHECK PERM $context = new rex_context(['page' => 'structure', 'category_id' => $category_id, 'article_id' => $article_id, 'clang' => $clang, 'ctype' => $ctype]); // check if a new category was folded $category_id = rex_request('toggle_category_id', 'int', -1); $category_id = rex_category::get($category_id) ? $category_id : -1; $tree = ''; $tree .= '<div id="rex-sitemap">'; // TODO remove container (just their to get some linkmap styles) $tree .= '<div id="rex-linkmap">'; $categoryTree = new rex_sitemap_category_tree($context); $tree .= $categoryTree->getTree($category_id); $tree .= '</div>'; $tree .= '</div>'; return $tree; }); if (rex_be_controller::getCurrentPagePart(1) == 'system') { rex_system_setting::register(new rex_system_setting_article_id('start_article_id')); rex_system_setting::register(new rex_system_setting_article_id('notfound_article_id')); } }