1 (edited by PunBB 2018.04.23 21:14)

Topic: Как добавить свою страницу (подменю) в панель администратора

При написании какого либо расширения, возможно вам понадобиться создать свою страницу (то есть подкатегорию, субменю, подменю или как там его еще называют....) в панели администратора PunBB для того чтобы отображать какие либо настройки или другую информацию. Сейчас мы рассмотрим как сделать страницу  в админке.

В данном примере представим что у нас уже имеется каркас расширения. Информация по созданию расширений находиться здесь.

Для начала нужно определиться в какой главный пункт меню вы хотели бы добавить свой новый подпункт.
Основные пункты админ меню, их 5:
Начало   Настройки   Пользователи   Управление   Расширения
У каждого меню есть своя определенная константа. Вот они:

define('FORUM_PAGE_SECTION', 'start'); //Начало
define('FORUM_PAGE_SECTION', 'settings');  //Настройки
define('FORUM_PAGE_SECTION', 'users');  //Пользователи
define('FORUM_PAGE_SECTION', 'management');  //Управление
define('FORUM_PAGE_SECTION', 'extensions');  //Расширения

Давайте попрактикуемся и добавим страницу/подменю в главное меню администратора - Управление

Создадим простое расширение, которое будет сохранять информацию о пользователях и экспортировать их в формат CSV.

1. Создаем папку с именем aa_export_data, это ID расширение, так что должно совпадать с именем директории.
2. Создаем файл manifest.xml и заполняем все поля:

manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE extension SYSTEM "ext-1.0.dtd">

<extension engine="1.0">
   <id>aa_export_data</id>
   <title>Export Users Data</title>
   <version>0.1</version>
   <description>Export users from the database to .csv file</description>
   <author>aa</author>
   <minversion>1.4</minversion>
   <maxtestedon>1.4.5</maxtestedon>

   <hooks>
      
      <hook id="co_modify_url_scheme"><![CDATA[
$forum_url[$ext_info['id']] = 'admin/settings.php?section='.$ext_info['id'];
      ]]></hook>
      
      <hook id="aop_new_section"><![CDATA[
if ($section == $ext_info['id'])
   require $ext_info['path'].'/hooks/aop_new_section.php';
      ]]></hook>
      
      <hook id="ca_fn_generate_admin_menu_new_sublink"><![CDATA[
require $ext_info['path'].'/hooks/ca_fn_generate_admin_menu_new_sublink.php';
      ]]></hook>
   </hooks>
</extension>

Сохраняем файл.

2 (edited by PunBB 2018.04.23 21:21)

Re: Как добавить свою страницу (подменю) в панель администратора

Далее, в созданной папке расширения, создаем новую директорию с именем hooks.
В папке hooks, создаем PHP файл с именем ca_fn_generate_admin_menu_new_sublink.php и заполняем следующим содержимым:

/hooks/ca_fn_generate_admin_menu_new_sublink.php

<?php

if (!defined('FORUM')) die();

if ($forum_user['g_id'] == FORUM_ADMIN && FORUM_PAGE_SECTION == 'management')
{
   $forum_page['admin_submenu'][$ext_info['id']] = '<li class="'.((FORUM_PAGE == 'admin-'.$ext_info['id']) ? 'active' : 'normal').((empty($forum_page['admin_submenu'])) ? ' first-item' : '').'"><a href="'.forum_link($forum_url[$ext_info['id']]).'">'.$ext_info['id'].'</a></li>';
}

Также сохраняем этот файл.
Этот файл отвечает за новый пункт подменю, а код универсален, поэтому каждый раз когда вы создаете новое расширение подобного плана, то в меню автоматически будет появляться новый пункт подменю.

3 (edited by PunBB 2018.04.23 21:27)

Re: Как добавить свою страницу (подменю) в панель администратора

Ну и создадим в той же папке хуков PHP файл страницы настроек с именем aop_new_section.php.
Теперь заполним файл содержимым:

/hooks/aop_new_section.php

<?php

if (!defined('FORUM')) die();

if (isset($_POST[$ext_info['id']]))
{
   @set_time_limit(0);
   $users_info = $output = array();
   $sep = isset($_POST['separator']) ? forum_trim($_POST['separator']) : ',';
   $file_name = 'file_'.time().'.csv';
   
   $query = array(
      'SELECT'   =>   'id, username, email, num_posts, registered',
      'FROM'      =>   'users',
      'WHERE'      =>   'id>2'
   );
   $result = $forum_db->query_build($query) or error(__FILE__, __LINE__);
   while ($rows = $forum_db->fetch_assoc($result)) {
      $users_info[$rows['id']] = $rows['username'].$sep.$rows['email'].$sep.$rows['num_posts'].$sep.format_time($rows['registered'], 1);
   }
   
   foreach ($users_info as $id => $val) {
      $output .= $val."\n";
   }
   
   if (is_writable($ext_info['path']))
   {
      $fh = @fopen($ext_info['path'].'/'.$file_name, 'wb');
      if ($fh)
      {
         fwrite($fh, $output);
         fclose($fh);
      }
   }
   
  if (file_exists($ext_info['path'].'/'.$file_name)) {
    // сбрасываем буфер вывода PHP, чтобы избежать переполнения памяти выделенной под скрипт
    // если этого не сделать файл будет читаться в память полностью!
    if (ob_get_level()) {
      ob_end_clean();
    }
    // заставляем браузер показать окно сохранения файла
    header('Content-Description: File Transfer');
    header("Content-type: text/csv");
    header('Content-Disposition: attachment; filename=' . basename($ext_info['path'].'/'.$file_name));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header("Pragma: no-cache");
    header('Content-Length: ' . filesize($ext_info['path'].'/'.$file_name));
    // читаем файл и отправляем его пользователю
    readfile($ext_info['path'].'/'.$file_name);
 
    unlink($ext_info['path'].'/'.$file_name);
    exit;
  }
   
//   redirect(forum_link($forum_url[$ext_info['id']]), '');
}

$forum_page = array();
$forum_page['group_count'] = $forum_page['item_count'] = $forum_page['fld_count'] = 0;

define('FORUM_PAGE_SECTION', 'management');
define('FORUM_PAGE', 'admin-'.$ext_info['id']);
require FORUM_ROOT.'header.php';

// START SUBST - <!-- forum_main -->
ob_start();

?>
   <div class="main-content main-frm">
      
      <form class="frm-form" method="post" accept-charset="utf-8" action="<?php echo forum_link($forum_url[$ext_info['id']]) ?>">
         <div class="hidden">
            <input type="hidden" name="csrf_token" value="<?php echo generate_form_token(forum_link($forum_url[$ext_info['id']])) ?>" />
         </div>
         
         <div class="main-subhead">
            <h2 class="hn"><span>Настойки расширения <?php echo $ext_info['id'] ?></span></h2>
         </div>
         
         <div class="ct-box warn-box">
            <p class="warn"><strong>Внимание!</strong> Это страница различных настроек данного расширения. Создайте тебуемыее поля для сохранения настроек.</p>
         </div>
         
         <div class="sf-set set13">
            <div class="sf-box text">
               <label for="fld"><span>Разделитель</span><small>В оснлвном CSV файлы используют знак ',' но могут использовать и другие разделители, установите требуемый</small></label><br>
               <span class="fld-input"><input type="text" name="separator" size="6" maxlength="6" value=","></span>
            </div>
         </div>
         
         <div class="frm-buttons">
            <span class="submit primary"><input type="submit" name="<?php echo $ext_info['id'] ?>" value="Соханить" /></span>
         </div>
      </form>
      
   </div>

Вот и все, сохраняем файл и устанавливаем наше новое расширение.
Не забывайте, что имя директории расширения должно совпадать с ID в manifest.xml

Всегда рады ответить на ваши вопросы  PunBB_INFO_ICQ/wink
Успеха! Default/br

4 (edited by PunBB 2018.04.23 23:15)

Re: Как добавить свою страницу (подменю) в панель администратора

Если вам потребовалось создать страницу настроек в другом пункте меню, например на стартовой странице администрирования, то достаточно выполнить небольшие изменения в двух файлах:

1. ca_fn_generate_admin_menu_new_sublink.php

if ($forum_user['g_id'] == FORUM_ADMIN && FORUM_PAGE_SECTION == 'management')
{

заменить на

if ($forum_user['g_id'] == FORUM_ADMIN && FORUM_PAGE_SECTION == 'start')
{

2. aop_new_section.php

define('FORUM_PAGE_SECTION', 'management');

заменить на

define('FORUM_PAGE_SECTION', 'start');

Все значения FORUM_PAGE_SECTION можно найти в первом посте.

Скачать каркас расширения This content is available only to registered users.