/** * Display categories * * @param int $parent_id The parent id/name (only show categories under this category) * @param string $blockname The name of the template block to use (categories by default) */ function titania_display_categories($parent_id = 0, $blockname = 'categories', $is_manage = false) { $only_visible = !$is_manage ? 'AND category_visible = 1' : ''; $sql = 'SELECT * FROM ' . TITANIA_CATEGORIES_TABLE . ' WHERE parent_id = ' . (int) $parent_id . "\n\t\t\t{$only_visible}\n\t\tORDER BY left_id ASC"; $result = phpbb::$db->sql_query($sql); $category = new titania_category(); while ($row = phpbb::$db->sql_fetchrow($result)) { $category->__set_array($row); phpbb::$template->assign_block_vars($blockname, $category->assign_display(true)); } phpbb::$db->sql_freeresult($result); unset($category); }
/** * Set submitted settings on the category object. * * @param \titania_category $category Category object. * @return \titania_category */ protected function set_submitted_settings($category) { $category->__set_array(array('category_name' => $this->request->variable('category_name', '', true), 'category_name_clean' => $this->request->variable('category_name_clean', '', true), 'parent_id' => $this->request->variable('category_parent', 0), 'category_visible' => $this->request->variable('category_visible', 1), 'category_type' => $this->request->variable('category_type', 0), 'category_options' => 0)); // Set category options foreach ($category->available_options as $option => $flag) { if ($this->request->variable($option, false)) { $category->set_option($option); } } return $category; }
/** * Generate the category select (much is from the make_jumpbox function) * * @param array|bool $selected Array of selected categories. Defaults to false. * @param bool $is_manage Whether in category management, in which case all are listed * @param bool $disable_parents Whether to disable categories that do not have a contribution type * @param bool|int $category_type Category type to limit list to * @return void */ public function generate_category_select($selected = false, $is_manage = false, $disable_parents = true, $category_type = false) { if (!is_array($selected)) { $selected = array($selected); } $right = $padding = 0; $padding_store = array('0' => 0); $categories = $this->cache->get_categories(); $hidden_categories = array(); $category = new \titania_category(); foreach ($categories as $row) { $type = $this->types->get($row['category_type']); if ($type && (!$type->acl_get('submit') || $category_type && $type->id != $category_type)) { continue; } $category->__set_array($row); if ($row['left_id'] < $right) { $padding++; $padding_store[$row['parent_id']] = $padding; } else { if ($row['left_id'] > $right + 1) { $padding = isset($padding_store[$row['parent_id']]) ? $padding_store[$row['parent_id']] : $padding; } } $right = $row['right_id']; if (!$is_manage) { // Non-postable category with no children, don't display $not_postable = $row['category_type'] == 0 && $row['left_id'] + 1 == $row['right_id']; $hidden = !$row['category_visible'] || in_array($row['parent_id'], $hidden_categories); $team_only_restriction = $category->is_option_set('team_only') && !$type->acl_get('moderate'); if ($not_postable || $hidden || $team_only_restriction) { if ($hidden) { $hidden_categories[] = $row['category_id']; } continue; } } $this->template->assign_block_vars('category_select', array('S_SELECTED' => in_array($row['category_id'], $selected), 'S_DISABLED' => $row['category_type'] == 0 && $disable_parents, 'VALUE' => $row['category_id'], 'TYPE' => $row['category_type'], 'NAME' => $category->get_name())); for ($i = 0; $i < $padding; $i++) { $this->template->assign_block_vars('category_select.level', array()); } } }
/** * Get category URL's. * * @return array */ protected function get_category_urls() { $category = new \titania_category(); $url = $this->get_index_url($this->params); $urls = array(0 => $this->request->is_ajax() ? str_replace('&', '&', $url) : $url); foreach ($this->cache->get_categories() as $data) { if (!$category->category_visible) { continue; } $category->__set_array($data); $url = $category->get_url($this->params); $urls[$category->category_id] = $this->request->is_ajax() ? str_replace('&', '&', $url) : $url; } return $urls; }
// Redirect back to the previous category redirect(titania_url::build_url('manage/categories', array('c' => $parent_id))); } } phpbb::$template->assign_vars(array('S_DELETE_CATEGORY' => true, 'U_ACTION' => titania_url::build_url('manage/categories', array('c' => $category_id, 'action' => 'delete')), 'U_BACK' => 'c_' . $category_object->parent_id, 'CATEGORY' => $category_id, 'CATEGORY_NAME' => isset(phpbb::$user->lang[$category_object->category_name]) ? phpbb::$user->lang[$category_object->category_name] : $category_object->category_name, 'SECTION_NAME' => phpbb::$user->lang['DELETE_CATEGORY'] . ' - ' . (isset(phpbb::$user->lang[$category_object->category_name]) ? phpbb::$user->lang[$category_object->category_name] : $category_object->category_name), 'S_HAS_SUBCATS' => $category_object->right_id - $category_object->left_id > 1 ? true : false, 'S_MOVE_CATEGORY_OPTIONS' => generate_category_select($category_object->parent_id, true), 'ERROR_MSG' => sizeof($error) ? implode('<br />', $error) : '')); break; default: titania::_include('functions_display', 'titania_display_categories'); titania_display_categories($category_id, 'categories', true); if ($category_id != 0) { // Breadcrumbs $category_object = new titania_category(); $categories_ary = titania::$cache->get_categories(); // Parents foreach (array_reverse(titania::$cache->get_category_parents($category_id)) as $row) { $category_object->__set_array($categories_ary[$row['category_id']]); titania::generate_breadcrumbs(array(isset(phpbb::$user->lang[$categories_ary[$row['category_id']]['category_name']]) ? phpbb::$user->lang[$categories_ary[$row['category_id']]['category_name']] : $categories_ary[$row['category_id']]['category_name'] => titania_url::build_url('manage/categories', array('c' => $row['category_id'])))); } // Self $category_object->__set_array($categories_ary[$category_id]); titania::generate_breadcrumbs(array(isset(phpbb::$user->lang[$categories_ary[$category_id]['category_name']]) ? phpbb::$user->lang[$categories_ary[$category_id]['category_name']] : $categories_ary[$category_id]['category_name'] => titania_url::build_url('manage/categories', array('c' => $category_id)))); // Second set of breadcrumbs for category navigation // Parents foreach (array_reverse(titania::$cache->get_category_parents($category_id)) as $row) { $category_object->__set_array($categories_ary[$row['category_id']]); titania::generate_breadcrumbs(array(isset(phpbb::$user->lang[$categories_ary[$row['category_id']]['category_name']]) ? phpbb::$user->lang[$categories_ary[$row['category_id']]['category_name']] : $categories_ary[$row['category_id']]['category_name'] => titania_url::build_url('manage/categories', array('c' => $row['category_id']))), $block = 'nav_categories'); } // Self $category_object->__set_array($categories_ary[$category_id]); titania::generate_breadcrumbs(array(isset(phpbb::$user->lang[$categories_ary[$category_id]['category_name']]) ? phpbb::$user->lang[$categories_ary[$category_id]['category_name']] : $categories_ary[$category_id]['category_name'] => titania_url::build_url('manage/categories', array('c' => $category_id))), $block = 'nav_categories'); unset($categories_ary, $category_object);
/** * Load contribution * * Call this AFTER you have loaded the main object (like the FAQ item if requested for example) * * @param mixed $contrib contrib_id (always send if you have loaded an item for this contrib!) */ function load_contrib($contrib_id = false) { $contrib = request_var('id', 0) ? request_var('id', 0) : utf8_normalize_nfc(request_var('c', '', true)); $type = request_var('type', ''); // Load the contribution titania::$contrib = new titania_contribution(); if (!titania::$contrib->load($contrib)) { trigger_error('CONTRIB_NOT_FOUND'); } // Make sure the contrib requested is the same as the contrib loaded if ($contrib_id !== false && $contrib_id != titania::$contrib->contrib_id || $type != titania_types::$types[titania::$contrib->contrib_type]->url) { // Mismatch, redirect redirect(titania::$contrib->get_url(basename(request_var('page', 'details')))); } // Put the author in titania::$author titania::$author = titania::$contrib->author; // Check to see if the currently accessing user is an author if (titania::$access_level == TITANIA_ACCESS_PUBLIC && phpbb::$user->data['is_registered'] && !phpbb::$user->data['is_bot']) { if (titania::$contrib->is_author || titania::$contrib->is_active_coauthor) { titania::$access_level = TITANIA_ACCESS_AUTHORS; } } // Count the number of FAQ items to display $flags = titania_count::get_flags(titania::$access_level); $faq_count = titania_count::from_db(titania::$contrib->contrib_faq_count, $flags); /** * Menu Array * * 'filename' => array( * 'title' => 'nav menu title', * 'url' => $page_url, * 'auth' => ($can_see_page) ? true : false, // Not required, always true if missing * ), */ $nav_ary = array('details' => array('title' => 'CONTRIB_DETAILS', 'url' => titania::$contrib->get_url()), 'faq' => array('title' => 'CONTRIB_FAQ', 'url' => titania::$contrib->get_url('faq'), 'auth' => titania::$access_level != TITANIA_ACCESS_PUBLIC || $faq_count ? true : false, 'count' => $faq_count), 'support' => array('title' => 'CONTRIB_SUPPORT', 'url' => titania::$contrib->get_url('support'), 'auth' => titania::$config->support_in_titania || titania::$access_level < TITANIA_ACCESS_PUBLIC ? true : false), 'manage' => array('title' => 'CONTRIB_MANAGE', 'url' => titania::$contrib->get_url('manage'), 'auth' => (titania::$contrib->is_author || titania::$contrib->is_active_coauthor) && phpbb::$auth->acl_get('u_titania_post_edit_own') && !in_array(titania::$contrib->contrib_status, array(TITANIA_CONTRIB_CLEANED, TITANIA_CONTRIB_DISABLED)) || phpbb::$auth->acl_get('u_titania_mod_contrib_mod') || titania_types::$types[titania::$contrib->contrib_type]->acl_get('moderate'))); // Display nav menu $page = request_var('page', ''); titania::generate_nav($nav_ary, $page, 'details'); // Search for a category with the same name as the contrib type. This is a bit ugly, but there really isn't any better option $categories_ary = titania::$cache->get_categories(); foreach ($categories_ary as $category_id => $category_row) { $category_row['category_name'] = isset(phpbb::$user->lang[$category_row['category_name']]) ? phpbb::$user->lang[$category_row['category_name']] : $category_row['category_name']; if ($category_row['category_name'] == titania_types::$types[titania::$contrib->contrib_type]->lang || $category_row['category_name'] == titania_types::$types[titania::$contrib->contrib_type]->langs) { $category_object = new titania_category(); $category_object->__set_array($categories_ary[$category_id]); // Generate the main breadcrumbs titania::generate_breadcrumbs(array($category_object->category_name => titania_url::build_url($category_object->get_url()))); break; } } titania::generate_breadcrumbs(array(titania::$contrib->contrib_name => titania::$contrib->get_url())); if ($page) { titania::generate_breadcrumbs(array($nav_ary[$page]['title'] => $nav_ary[$page]['url'])); } }
/** * Set the relations between contribs and categories * * @param array $contrib_categories Categories to put the contribution in * @param bool $protect_team_only Whether to protect "Team only" categories. * If true, existing categories that are "Team only" and are not part of $contrib_categories * will be preserved. * * @return null */ public function put_contrib_in_categories($contrib_categories = array(), $protect_team_only = true) { if (!$this->contrib_id) { return; } $protected_categories = array(); $exclude_sql = ''; if ($protect_team_only && !empty($this->category_data)) { $category = new \titania_category(); foreach ($this->category_data as $row) { $category->__set_array($row); if ($category->is_option_set('team_only')) { $protected_categories[] = (int) $category->category_id; } } } if (!empty($protected_categories)) { $exclude_sql = 'AND ' . phpbb::$db->sql_in_set('category_id', $protected_categories, true); } // Resync the count $this->update_category_count('-'); // Remove them from the old categories $sql = 'DELETE FROM ' . TITANIA_CONTRIB_IN_CATEGORIES_TABLE . ' WHERE contrib_id = ' . $this->contrib_id . "\n\t\t\t\t{$exclude_sql}"; phpbb::$db->sql_query($sql); if (!sizeof($contrib_categories)) { return; } $sql_ary = array(); foreach ($contrib_categories as $category_id) { $sql_ary[] = array('contrib_id' => $this->contrib_id, 'category_id' => $category_id); } phpbb::$db->sql_multi_insert(TITANIA_CONTRIB_IN_CATEGORIES_TABLE, $sql_ary); $this->contrib_categories = implode(',', array_merge($contrib_categories, $protected_categories)); $this->fill_categories(); // Resync the count $this->update_category_count(); }
/** * Assign breadcrumbs to template. * * @return null */ protected function generate_breadcrumbs() { // Search for a category with the same name as the contrib type. This is a bit ugly, but there really isn't any better option $categories = $this->cache->get_categories(); $category = new \titania_category(); foreach ($categories as $category_id => $category_row) { $category->__set_array($category_row); $name = $category->get_name(); if ($name == $this->contrib->type->lang || $name == $this->contrib->type->langs) { // Generate the main breadcrumbs $this->display->generate_breadcrumbs(array($name => $category->get_url())); } } }