Verzeichnisstruktur phpBB-3.0.0


Veröffentlicht
12.12.2007

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

acp_modules.php

Zuletzt modifiziert: 09.10.2024, 12:51 - Dateigröße: 30.82 KiB


 0001  <?php
 0002  /**
 0003  *
 0004  * @package acp
 0005  * @version $Id$
 0006  * @copyright (c) 2005 phpBB Group
 0007  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 0008  *
 0009  */
 0010   
 0011  /**
 0012  * @ignore
 0013  */
 0014  if (!defined('IN_PHPBB'))
 0015  {
 0016      exit;
 0017  }
 0018   
 0019  /**
 0020  * - Able to check for new module versions (modes changed/adjusted/added/removed)
 0021  * Icons for:
 0022  * - module enabled and displayed (common)
 0023  * - module enabled and not displayed
 0024  * - module deactivated
 0025  * - category (enabled)
 0026  * - category disabled
 0027  */
 0028   
 0029  /**
 0030  * @package acp
 0031  */
 0032  class acp_modules
 0033  {
 0034      var $module_class = '';
 0035      var $parent_id;
 0036      var $u_action;
 0037   
 0038      function main($id, $mode)
 0039      {
 0040          global $db, $user, $auth, $template, $module;
 0041          global $config, $phpbb_admin_path, $phpbb_root_path, $phpEx;
 0042   
 0043          // Set a global define for modules we might include (the author is able to prevent execution of code by checking this constant)
 0044          define('MODULE_INCLUDE', true);
 0045   
 0046          $user->add_lang('acp/modules');
 0047          $this->tpl_name = 'acp_modules';
 0048   
 0049          // module class
 0050          $this->module_class = $mode;
 0051   
 0052          if ($this->module_class == 'ucp')
 0053          {
 0054              $user->add_lang('ucp');
 0055          }
 0056          else if ($this->module_class == 'mcp')
 0057          {
 0058              $user->add_lang('mcp');
 0059          }
 0060   
 0061          if ($module->p_class != $this->module_class)
 0062          {
 0063              $module->add_mod_info($this->module_class);
 0064          }
 0065   
 0066          $this->page_title = strtoupper($this->module_class);
 0067   
 0068          $this->parent_id = request_var('parent_id', 0);
 0069          $module_id = request_var('m', 0);
 0070          $action = request_var('action', '');
 0071          $errors = array();
 0072   
 0073          switch ($action)
 0074          {
 0075              case 'delete':
 0076                  if (!$module_id)
 0077                  {
 0078                      trigger_error($user->lang['NO_MODULE_ID'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
 0079                  }
 0080   
 0081                  if (confirm_box(true))
 0082                  {
 0083                      // Make sure we are not directly within a module
 0084                      if ($module_id == $this->parent_id)
 0085                      {
 0086                          $sql = 'SELECT parent_id
 0087                              FROM ' . MODULES_TABLE . '
 0088                              WHERE module_id = ' . $module_id;
 0089                          $result = $db->sql_query($sql);
 0090                          $this->parent_id = (int) $db->sql_fetchfield('parent_id');
 0091                          $db->sql_freeresult($result);
 0092                      }
 0093   
 0094                      $errors = $this->delete_module($module_id);
 0095   
 0096                      if (!sizeof($errors))
 0097                      {
 0098                          $this->remove_cache_file();
 0099                          trigger_error($user->lang['MODULE_DELETED'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id));
 0100                      }
 0101                  }
 0102                  else
 0103                  {
 0104                      confirm_box(false, 'DELETE_MODULE', build_hidden_fields(array(
 0105                          'i'            => $id,
 0106                          'mode'        => $mode,
 0107                          'parent_id'    => $this->parent_id,
 0108                          'module_id'    => $module_id,
 0109                          'action'    => $action,
 0110                      )));
 0111                  }
 0112   
 0113              break;
 0114              
 0115              case 'enable':
 0116              case 'disable':
 0117                  if (!$module_id)
 0118                  {
 0119                      trigger_error($user->lang['NO_MODULE_ID'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
 0120                  }
 0121   
 0122                  $sql = 'SELECT *
 0123                      FROM ' . MODULES_TABLE . "
 0124                      WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
 0125                          AND module_id = $module_id";
 0126                  $result = $db->sql_query($sql);
 0127                  $row = $db->sql_fetchrow($result);
 0128                  $db->sql_freeresult($result);
 0129   
 0130                  if (!$row)
 0131                  {
 0132                      trigger_error($user->lang['NO_MODULE'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
 0133                  }
 0134   
 0135                  $sql = 'UPDATE ' . MODULES_TABLE . '
 0136                      SET module_enabled = ' . (($action == 'enable') ? 1 : 0) . "
 0137                      WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
 0138                          AND module_id = $module_id";
 0139                  $db->sql_query($sql);
 0140   
 0141                  add_log('admin', 'LOG_MODULE_' . strtoupper($action), $this->lang_name($row['module_langname']));
 0142                  $this->remove_cache_file();
 0143   
 0144              break;
 0145   
 0146              case 'move_up':
 0147              case 'move_down':
 0148                  if (!$module_id)
 0149                  {
 0150                      trigger_error($user->lang['NO_MODULE_ID'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
 0151                  }
 0152   
 0153                  $sql = 'SELECT *
 0154                      FROM ' . MODULES_TABLE . "
 0155                      WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
 0156                          AND module_id = $module_id";
 0157                  $result = $db->sql_query($sql);
 0158                  $row = $db->sql_fetchrow($result);
 0159                  $db->sql_freeresult($result);
 0160   
 0161                  if (!$row)
 0162                  {
 0163                      trigger_error($user->lang['NO_MODULE'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
 0164                  }
 0165   
 0166                  $move_module_name = $this->move_module_by($row, $action, 1);
 0167   
 0168                  if ($move_module_name !== false)
 0169                  {
 0170                      add_log('admin', 'LOG_MODULE_' . strtoupper($action), $this->lang_name($row['module_langname']), $move_module_name);
 0171                      $this->remove_cache_file();
 0172                  }
 0173          
 0174              break;
 0175   
 0176              case 'quickadd':
 0177                  $quick_install = request_var('quick_install', '');
 0178   
 0179                  if (confirm_box(true))
 0180                  {
 0181                      if (!$quick_install || strpos($quick_install, '::') === false)
 0182                      {
 0183                          break;
 0184                      }
 0185   
 0186                      list($module_basename, $module_mode) = explode('::', $quick_install);
 0187   
 0188                      // Check if module name and mode exist...
 0189                      $fileinfo = $this->get_module_infos($module_basename);
 0190                      $fileinfo = $fileinfo[$module_basename];
 0191   
 0192                      if (isset($fileinfo['modes'][$module_mode]))
 0193                      {
 0194                          $module_data = array(
 0195                              'module_basename'    => $module_basename,
 0196                              'module_enabled'    => 0,
 0197                              'module_display'    => (isset($fileinfo['modes'][$module_mode]['display'])) ? $fileinfo['modes'][$module_mode]['display'] : 1,
 0198                              'parent_id'            => $this->parent_id,
 0199                              'module_class'        => $this->module_class,
 0200                              'module_langname'    => $fileinfo['modes'][$module_mode]['title'],
 0201                              'module_mode'        => $module_mode,
 0202                              'module_auth'        => $fileinfo['modes'][$module_mode]['auth'],
 0203                          );
 0204   
 0205                          $errors = $this->update_module_data($module_data);
 0206   
 0207                          if (!sizeof($errors))
 0208                          {
 0209                              $this->remove_cache_file();
 0210      
 0211                              trigger_error($user->lang['MODULE_ADDED'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id));
 0212                          }
 0213                      }
 0214                  }
 0215                  else
 0216                  {
 0217                      confirm_box(false, 'ADD_MODULE', build_hidden_fields(array(
 0218                          'i'            => $id,
 0219                          'mode'        => $mode,
 0220                          'parent_id'    => $this->parent_id,
 0221                          'action'    => 'quickadd',
 0222                          'quick_install'    => $quick_install,
 0223                      )));
 0224                  }
 0225   
 0226              break;
 0227   
 0228              case 'edit':
 0229   
 0230                  if (!$module_id)
 0231                  {
 0232                      trigger_error($user->lang['NO_MODULE_ID'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
 0233                  }
 0234                  
 0235                  $module_row = $this->get_module_row($module_id);
 0236   
 0237              // no break
 0238   
 0239              case 'add':
 0240   
 0241                  if ($action == 'add')
 0242                  {
 0243                      $module_row = array(
 0244                          'module_basename'    => '',
 0245                          'module_enabled'    => 0,
 0246                          'module_display'    => 1,
 0247                          'parent_id'            => 0,
 0248                          'module_langname'    => utf8_normalize_nfc(request_var('module_langname', '', true)),
 0249                          'module_mode'        => '',
 0250                          'module_auth'        => '',
 0251                      );
 0252                  }
 0253                  
 0254                  $module_data = array();
 0255   
 0256                  $module_data['module_basename'] = request_var('module_basename', (string) $module_row['module_basename']);
 0257                  $module_data['module_enabled'] = request_var('module_enabled', (int) $module_row['module_enabled']);
 0258                  $module_data['module_display'] = request_var('module_display', (int) $module_row['module_display']);
 0259                  $module_data['parent_id'] = request_var('module_parent_id', (int) $module_row['parent_id']);
 0260                  $module_data['module_class'] = $this->module_class;
 0261                  $module_data['module_langname'] = utf8_normalize_nfc(request_var('module_langname', (string) $module_row['module_langname'], true));
 0262                  $module_data['module_mode'] = request_var('module_mode', (string) $module_row['module_mode']);
 0263   
 0264                  $submit = (isset($_POST['submit'])) ? true : false;
 0265   
 0266                  if ($submit)
 0267                  {
 0268                      if (!$module_data['module_langname'])
 0269                      {
 0270                          trigger_error($user->lang['NO_MODULE_LANGNAME'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
 0271                      }
 0272   
 0273                      $module_type = request_var('module_type', 'category');
 0274   
 0275                      if ($module_type == 'category')
 0276                      {
 0277                          $module_data['module_basename'] = $module_data['module_mode'] = $module_data['module_auth'] = '';
 0278                          $module_data['module_display'] = 1;
 0279                      }
 0280   
 0281                      if ($action == 'edit')
 0282                      {
 0283                          $module_data['module_id'] = $module_id;
 0284                      }
 0285   
 0286                      // Adjust auth row
 0287                      if ($module_data['module_basename'] && $module_data['module_mode'])
 0288                      {
 0289                          $fileinfo = $this->get_module_infos($module_data['module_basename']);
 0290                          $module_data['module_auth'] = $fileinfo[$module_data['module_basename']]['modes'][$module_data['module_mode']]['auth'];
 0291                      }
 0292   
 0293                      $errors = $this->update_module_data($module_data);
 0294   
 0295                      if (!sizeof($errors))
 0296                      {
 0297                          $this->remove_cache_file();
 0298      
 0299                          trigger_error((($action == 'add') ? $user->lang['MODULE_ADDED'] : $user->lang['MODULE_EDITED']) . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id));
 0300                      }
 0301                  }
 0302   
 0303                  // Category/not category?
 0304                  $is_cat = (!$module_data['module_basename']) ? true : false;
 0305   
 0306                  // Get module information
 0307                  $module_infos = $this->get_module_infos();
 0308   
 0309                  // Build name options
 0310                  $s_name_options = $s_mode_options = '';
 0311                  foreach ($module_infos as $option => $values)
 0312                  {
 0313                      if (!$module_data['module_basename'])
 0314                      {
 0315                          $module_data['module_basename'] = $option;
 0316                      }
 0317   
 0318                      // Name options
 0319                      $s_name_options .= '<option value="' . $option . '"' . (($option == $module_data['module_basename']) ? ' selected="selected"' : '') . '>' . $this->lang_name($values['title']) . ' [' . $this->module_class . '_' . $option . ']</option>';
 0320   
 0321                      $template->assign_block_vars('m_names', array('NAME' => $option, 'A_NAME' => addslashes($option)));
 0322   
 0323                      // Build module modes
 0324                      foreach ($values['modes'] as $m_mode => $m_values)
 0325                      {
 0326                          if ($option == $module_data['module_basename'])
 0327                          {
 0328                              $s_mode_options .= '<option value="' . $m_mode . '"' . (($m_mode == $module_data['module_mode']) ? ' selected="selected"' : '') . '>' . $this->lang_name($m_values['title']) . '</option>';
 0329                          }
 0330                          
 0331                          $template->assign_block_vars('m_names.modes', array(
 0332                              'OPTION'        => $m_mode,
 0333                              'VALUE'            => $this->lang_name($m_values['title']),
 0334                              'A_OPTION'        => addslashes($m_mode),
 0335                              'A_VALUE'        => addslashes($this->lang_name($m_values['title'])))
 0336                          );
 0337                      }
 0338                  }
 0339                  
 0340                  $s_cat_option = '<option value="0"' . (($module_data['parent_id'] == 0) ? ' selected="selected"' : '') . '>' . $user->lang['NO_PARENT'] . '</option>';
 0341   
 0342                  $template->assign_vars(array_merge(array(
 0343                      'S_EDIT_MODULE'        => true,
 0344                      'S_IS_CAT'            => $is_cat,
 0345                      'S_CAT_OPTIONS'        => $s_cat_option . $this->make_module_select($module_data['parent_id'], ($action == 'edit') ? $module_row['module_id'] : false, false, false, false, true),
 0346                      'S_MODULE_NAMES'    => $s_name_options,
 0347                      'S_MODULE_MODES'    => $s_mode_options,
 0348                      'U_BACK'            => $this->u_action . '&amp;parent_id=' . $this->parent_id,
 0349                      'U_EDIT_ACTION'        => $this->u_action . '&amp;parent_id=' . $this->parent_id,
 0350   
 0351                      'L_TITLE'            => $user->lang[strtoupper($action) . '_MODULE'],
 0352                      
 0353                      'MODULENAME'        => $this->lang_name($module_data['module_langname']),
 0354                      'ACTION'            => $action,
 0355                      'MODULE_ID'            => $module_id,
 0356   
 0357                  ),
 0358                      array_change_key_case($module_data, CASE_UPPER))
 0359                  );
 0360   
 0361                  if (sizeof($errors))
 0362                  {
 0363                      $template->assign_vars(array(
 0364                          'S_ERROR'    => true,
 0365                          'ERROR_MSG'    => implode('<br />', $errors))
 0366                      );
 0367                  }
 0368   
 0369                  return;
 0370   
 0371              break;
 0372          }
 0373   
 0374          // Default management page
 0375          if (sizeof($errors))
 0376          {
 0377              $template->assign_vars(array(
 0378                  'S_ERROR'    => true,
 0379                  'ERROR_MSG'    => implode('<br />', $errors))
 0380              );
 0381          }
 0382   
 0383          if (!$this->parent_id)
 0384          {
 0385              $navigation = strtoupper($this->module_class);
 0386          }
 0387          else
 0388          {
 0389              $navigation = '<a href="' . $this->u_action . '">' . strtoupper($this->module_class) . '</a>';
 0390   
 0391              $modules_nav = $this->get_module_branch($this->parent_id, 'parents', 'descending');
 0392   
 0393              foreach ($modules_nav as $row)
 0394              {
 0395                  $langname = $this->lang_name($row['module_langname']);
 0396   
 0397                  if ($row['module_id'] == $this->parent_id)
 0398                  {
 0399                      $navigation .= ' -&gt; ' . $langname;
 0400                  }
 0401                  else
 0402                  {
 0403                      $navigation .= ' -&gt; <a href="' . $this->u_action . '&amp;parent_id=' . $row['module_id'] . '">' . $langname . '</a>';
 0404                  }
 0405              }
 0406          }
 0407   
 0408          // Jumpbox
 0409          $module_box = $this->make_module_select($this->parent_id, false, false, false, false);
 0410   
 0411          $sql = 'SELECT *
 0412              FROM ' . MODULES_TABLE . "
 0413              WHERE parent_id = {$this->parent_id}
 0414                  AND module_class = '" . $db->sql_escape($this->module_class) . "'
 0415              ORDER BY left_id";
 0416          $result = $db->sql_query($sql);
 0417   
 0418          if ($row = $db->sql_fetchrow($result))
 0419          {
 0420              do
 0421              {
 0422                  $langname = $this->lang_name($row['module_langname']);
 0423   
 0424                  if (!$row['module_enabled'])
 0425                  {
 0426                      $module_image = '<img src="images/icon_folder_lock.gif" alt="' . $user->lang['DEACTIVATED_MODULE'] .'" />';
 0427                  }
 0428                  else
 0429                  {
 0430                      $module_image = (!$row['module_basename'] || $row['left_id'] + 1 != $row['right_id']) ? '<img src="images/icon_subfolder.gif" alt="' . $user->lang['CATEGORY'] . '" />' : '<img src="images/icon_folder.gif" alt="' . $user->lang['MODULE'] . '" />';
 0431                  }
 0432   
 0433                  $url = $this->u_action . '&amp;parent_id=' . $this->parent_id . '&amp;m=' . $row['module_id'];
 0434   
 0435                  $template->assign_block_vars('modules', array(
 0436                      'MODULE_IMAGE'        => $module_image,
 0437                      'MODULE_TITLE'        => $langname,
 0438                      'MODULE_ENABLED'    => ($row['module_enabled']) ? true : false,
 0439                      'MODULE_DISPLAYED'    => ($row['module_display']) ? true : false,
 0440   
 0441                      'S_ACP_CAT_SYSTEM'            => ($this->module_class == 'acp' && $row['module_langname'] == 'ACP_CAT_SYSTEM') ? true : false,
 0442                      'S_ACP_MODULE_MANAGEMENT'    => ($this->module_class == 'acp' && ($row['module_basename'] == 'modules' || $row['module_langname'] == 'ACP_MODULE_MANAGEMENT')) ? true : false,
 0443   
 0444                      'U_MODULE'            => $this->u_action . '&amp;parent_id=' . $row['module_id'],
 0445                      'U_MOVE_UP'            => $url . '&amp;action=move_up',
 0446                      'U_MOVE_DOWN'        => $url . '&amp;action=move_down',
 0447                      'U_EDIT'            => $url . '&amp;action=edit',
 0448                      'U_DELETE'            => $url . '&amp;action=delete',
 0449                      'U_ENABLE'            => $url . '&amp;action=enable',
 0450                      'U_DISABLE'            => $url . '&amp;action=disable')
 0451                  );
 0452              }
 0453              while ($row = $db->sql_fetchrow($result));
 0454          }
 0455          else if ($this->parent_id)
 0456          {
 0457              $row = $this->get_module_row($this->parent_id);
 0458   
 0459              $url = $this->u_action . '&amp;parent_id=' . $this->parent_id . '&amp;m=' . $row['module_id'];
 0460   
 0461              $template->assign_vars(array(
 0462                  'S_NO_MODULES'        => true,
 0463                  'MODULE_TITLE'        => $langname,
 0464                  'MODULE_ENABLED'    => ($row['module_enabled']) ? true : false,
 0465                  'MODULE_DISPLAYED'    => ($row['module_display']) ? true : false,
 0466   
 0467                  'U_EDIT'            => $url . '&amp;action=edit',
 0468                  'U_DELETE'            => $url . '&amp;action=delete',
 0469                  'U_ENABLE'            => $url . '&amp;action=enable',
 0470                  'U_DISABLE'            => $url . '&amp;action=disable')
 0471              );
 0472          }
 0473          $db->sql_freeresult($result);
 0474   
 0475          // Quick adding module
 0476          $module_infos = $this->get_module_infos();
 0477   
 0478          // Build quick options
 0479          $s_install_options = '';
 0480          foreach ($module_infos as $option => $values)
 0481          {
 0482              // Name options
 0483              $s_install_options .= '<optgroup label="' . $this->lang_name($values['title']) . ' [' . $this->module_class . '_' . $option . ']">';
 0484   
 0485              // Build module modes
 0486              foreach ($values['modes'] as $m_mode => $m_values)
 0487              {
 0488                  $s_install_options .= '<option value="' . $option . '::' . $m_mode . '">&nbsp; &nbsp;' . $this->lang_name($m_values['title']) . '</option>';
 0489              }
 0490   
 0491              $s_install_options .= '</optgroup>';
 0492          }
 0493   
 0494          $template->assign_vars(array(
 0495              'U_SEL_ACTION'        => $this->u_action,
 0496              'U_ACTION'            => $this->u_action . '&amp;parent_id=' . $this->parent_id,
 0497              'NAVIGATION'        => $navigation,
 0498              'MODULE_BOX'        => $module_box,
 0499              'PARENT_ID'            => $this->parent_id,
 0500              'S_INSTALL_OPTIONS'    => $s_install_options,
 0501              )
 0502          );
 0503      }
 0504   
 0505      /**
 0506      * Get row for specified module
 0507      */
 0508      function get_module_row($module_id)
 0509      {
 0510          global $db, $user;
 0511   
 0512          $sql = 'SELECT *
 0513              FROM ' . MODULES_TABLE . "
 0514              WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
 0515                  AND module_id = $module_id";
 0516          $result = $db->sql_query($sql);
 0517          $row = $db->sql_fetchrow($result);
 0518          $db->sql_freeresult($result);
 0519          
 0520          if (!$row)
 0521          {
 0522              trigger_error($user->lang['NO_MODULE'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
 0523          }
 0524   
 0525          return $row;
 0526      }
 0527      
 0528      /**
 0529      * Get available module information from module files
 0530      */
 0531      function get_module_infos($module = '', $module_class = false)
 0532      {
 0533          global $phpbb_root_path, $phpEx;
 0534          
 0535          $module_class = ($module_class === false) ? $this->module_class : $module_class;
 0536   
 0537          $directory = $phpbb_root_path . 'includes/' . $module_class . '/info/';
 0538          $fileinfo = array();
 0539   
 0540          if (!$module)
 0541          {
 0542              $dh = @opendir($directory);
 0543   
 0544              if (!$dh)
 0545              {
 0546                  return $fileinfo;
 0547              }
 0548   
 0549              while (($file = readdir($dh)) !== false)
 0550              {
 0551                  // Is module?
 0552                  if (preg_match('/^' . $module_class . '_.+\.' . $phpEx . '$/', $file))
 0553                  {
 0554                      $class = str_replace(".$phpEx", '', $file) . '_info';
 0555   
 0556                      if (!class_exists($class))
 0557                      {
 0558                          include($directory . $file);
 0559                      }
 0560   
 0561                      // Get module title tag
 0562                      if (class_exists($class))
 0563                      {
 0564                          $c_class = new $class();
 0565                          $module_info = $c_class->module();
 0566                          $fileinfo[str_replace($module_class . '_', '', $module_info['filename'])] = $module_info;
 0567                      }
 0568                  }
 0569              }
 0570              closedir($dh);
 0571   
 0572              ksort($fileinfo);
 0573          }
 0574          else
 0575          {
 0576              $filename = $module_class . '_' . basename($module);
 0577              $class = $module_class . '_' . basename($module) . '_info';
 0578   
 0579              if (!class_exists($class))
 0580              {
 0581                  include($directory . $filename . '.' . $phpEx);
 0582              }
 0583   
 0584              // Get module title tag
 0585              if (class_exists($class))
 0586              {
 0587                  $c_class = new $class();
 0588                  $module_info = $c_class->module();
 0589                  $fileinfo[str_replace($module_class . '_', '', $module_info['filename'])] = $module_info;
 0590              }
 0591          }
 0592          
 0593          return $fileinfo;
 0594      }
 0595   
 0596      /**
 0597      * Simple version of jumpbox, just lists modules
 0598      */
 0599      function make_module_select($select_id = false, $ignore_id = false, $ignore_acl = false, $ignore_nonpost = false, $ignore_emptycat = true, $ignore_noncat = false)
 0600      {
 0601          global $db, $user, $auth, $config;
 0602   
 0603          $sql = 'SELECT module_id, module_enabled, module_basename, parent_id, module_langname, left_id, right_id, module_auth
 0604              FROM ' . MODULES_TABLE . "
 0605              WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
 0606              ORDER BY left_id ASC";
 0607          $result = $db->sql_query($sql);
 0608   
 0609          $right = $iteration = 0;
 0610          $padding_store = array('0' => '');
 0611          $module_list = $padding = '';
 0612   
 0613          while ($row = $db->sql_fetchrow($result))
 0614          {
 0615              if ($row['left_id'] < $right)
 0616              {
 0617                  $padding .= '&nbsp; &nbsp;';
 0618                  $padding_store[$row['parent_id']] = $padding;
 0619              }
 0620              else if ($row['left_id'] > $right + 1)
 0621              {
 0622                  $padding = (isset($padding_store[$row['parent_id']])) ? $padding_store[$row['parent_id']] : '';
 0623              }
 0624   
 0625              $right = $row['right_id'];
 0626   
 0627              if (!$ignore_acl && $row['module_auth'])
 0628              {
 0629                  // We use zero as the forum id to check - global setting.
 0630                  if (!p_master::module_auth($row['module_auth'], 0))
 0631                  {
 0632                      continue;
 0633                  }
 0634              }
 0635   
 0636              // ignore this module?
 0637              if ((is_array($ignore_id) && in_array($row['module_id'], $ignore_id)) || $row['module_id'] == $ignore_id)
 0638              {
 0639                  continue;
 0640              }
 0641   
 0642              // empty category
 0643              if (!$row['module_basename'] && ($row['left_id'] + 1 == $row['right_id']) && $ignore_emptycat)
 0644              {
 0645                  continue;
 0646              }
 0647   
 0648              // ignore non-category?
 0649              if ($row['module_basename'] && $ignore_noncat)
 0650              {
 0651                  continue;
 0652              }
 0653   
 0654              $selected = (is_array($select_id)) ? ((in_array($row['module_id'], $select_id)) ? ' selected="selected"' : '') : (($row['module_id'] == $select_id) ? ' selected="selected"' : '');
 0655   
 0656              $langname = $this->lang_name($row['module_langname']);
 0657              $module_list .= '<option value="' . $row['module_id'] . '"' . $selected . ((!$row['module_enabled']) ? ' class="disabled"' : '') . '>' . $padding . $langname . '</option>';
 0658   
 0659              $iteration++;
 0660          }
 0661          unset($padding_store);
 0662   
 0663          return $module_list;
 0664      }
 0665   
 0666      /**
 0667      * Get module branch
 0668      */
 0669      function get_module_branch($module_id, $type = 'all', $order = 'descending', $include_module = true)
 0670      {
 0671          global $db;
 0672   
 0673          switch ($type)
 0674          {
 0675              case 'parents':
 0676                  $condition = 'm1.left_id BETWEEN m2.left_id AND m2.right_id';
 0677              break;
 0678   
 0679              case 'children':
 0680                  $condition = 'm2.left_id BETWEEN m1.left_id AND m1.right_id';
 0681              break;
 0682   
 0683              default:
 0684                  $condition = 'm2.left_id BETWEEN m1.left_id AND m1.right_id OR m1.left_id BETWEEN m2.left_id AND m2.right_id';
 0685              break;
 0686          }
 0687   
 0688          $rows = array();
 0689   
 0690          $sql = 'SELECT m2.*
 0691              FROM ' . MODULES_TABLE . ' m1
 0692              LEFT JOIN ' . MODULES_TABLE . " m2 ON ($condition)
 0693              WHERE m1.module_class = '" . $db->sql_escape($this->module_class) . "'
 0694                  AND m2.module_class = '" . $db->sql_escape($this->module_class) . "'
 0695                  AND m1.module_id = $module_id
 0696              ORDER BY m2.left_id " . (($order == 'descending') ? 'ASC' : 'DESC');
 0697          $result = $db->sql_query($sql);
 0698   
 0699          while ($row = $db->sql_fetchrow($result))
 0700          {
 0701              if (!$include_module && $row['module_id'] == $module_id)
 0702              {
 0703                  continue;
 0704              }
 0705   
 0706              $rows[] = $row;
 0707          }
 0708          $db->sql_freeresult($result);
 0709   
 0710          return $rows;
 0711      }
 0712   
 0713      /**
 0714      * Remove modules cache file
 0715      */
 0716      function remove_cache_file()
 0717      {
 0718          global $cache;
 0719   
 0720          // Sanitise for future path use, it's escaped as appropriate for queries
 0721          $p_class = str_replace(array('.', '/', '\\'), '', basename($this->module_class));
 0722          
 0723          $cache->destroy('_modules_' . $p_class);
 0724   
 0725          // Additionally remove sql cache
 0726          $cache->destroy('sql', MODULES_TABLE);
 0727      }
 0728   
 0729      /**
 0730      * Return correct language name
 0731      */
 0732      function lang_name($module_langname)
 0733      {
 0734          global $user;
 0735   
 0736          return (!empty($user->lang[$module_langname])) ? $user->lang[$module_langname] : $module_langname;
 0737      }
 0738   
 0739      /**
 0740      * Update/Add module
 0741      *
 0742      * @param bool $run_inline if set to true errors will be returned and no logs being written
 0743      */
 0744      function update_module_data(&$module_data, $run_inline = false)
 0745      {
 0746          global $db, $user;
 0747   
 0748          if (!isset($module_data['module_id']))
 0749          {
 0750              // no module_id means we're creating a new category/module
 0751              if ($module_data['parent_id'])
 0752              {
 0753                  $sql = 'SELECT left_id, right_id
 0754                      FROM ' . MODULES_TABLE . "
 0755                      WHERE module_class = '" . $db->sql_escape($module_data['module_class']) . "'
 0756                          AND module_id = " . (int) $module_data['parent_id'];
 0757                  $result = $db->sql_query($sql);
 0758                  $row = $db->sql_fetchrow($result);
 0759                  $db->sql_freeresult($result);
 0760   
 0761                  if (!$row)
 0762                  {
 0763                      if ($run_inline)
 0764                      {
 0765                          return 'PARENT_NO_EXIST';
 0766                      }
 0767   
 0768                      trigger_error($user->lang['PARENT_NO_EXIST'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
 0769                  }
 0770   
 0771                  // Workaround
 0772                  $row['left_id'] = (int) $row['left_id'];
 0773                  $row['right_id'] = (int) $row['right_id'];
 0774   
 0775                  $sql = 'UPDATE ' . MODULES_TABLE . "
 0776                      SET left_id = left_id + 2, right_id = right_id + 2
 0777                      WHERE module_class = '" . $db->sql_escape($module_data['module_class']) . "'
 0778                          AND left_id > {$row['right_id']}";
 0779                  $db->sql_query($sql);
 0780   
 0781                  $sql = 'UPDATE ' . MODULES_TABLE . "
 0782                      SET right_id = right_id + 2
 0783                      WHERE module_class = '" . $db->sql_escape($module_data['module_class']) . "'
 0784                          AND {$row['left_id']} BETWEEN left_id AND right_id";
 0785                  $db->sql_query($sql);
 0786   
 0787                  $module_data['left_id'] = (int) $row['right_id'];
 0788                  $module_data['right_id'] = (int) $row['right_id'] + 1;
 0789              }
 0790              else
 0791              {
 0792                  $sql = 'SELECT MAX(right_id) AS right_id
 0793                      FROM ' . MODULES_TABLE . "
 0794                      WHERE module_class = '" . $db->sql_escape($module_data['module_class']) . "'";
 0795                  $result = $db->sql_query($sql);
 0796                  $row = $db->sql_fetchrow($result);
 0797                  $db->sql_freeresult($result);
 0798   
 0799                  $module_data['left_id'] = (int) $row['right_id'] + 1;
 0800                  $module_data['right_id'] = (int) $row['right_id'] + 2;
 0801              }
 0802   
 0803              $sql = 'INSERT INTO ' . MODULES_TABLE . ' ' . $db->sql_build_array('INSERT', $module_data);
 0804              $db->sql_query($sql);
 0805   
 0806              $module_data['module_id'] = $db->sql_nextid();
 0807   
 0808              if (!$run_inline)
 0809              {
 0810                  add_log('admin', 'LOG_MODULE_ADD', $this->lang_name($module_data['module_langname']));
 0811              }
 0812          }
 0813          else
 0814          {
 0815              $row = $this->get_module_row($module_data['module_id']);
 0816   
 0817              if ($module_data['module_basename'] && !$row['module_basename'])
 0818              {
 0819                  // we're turning a category into a module
 0820                  $branch = $this->get_module_branch($module_data['module_id'], 'children', 'descending', false);
 0821   
 0822                  if (sizeof($branch))
 0823                  {
 0824                      return array($user->lang['NO_CATEGORY_TO_MODULE']);
 0825                  }
 0826              }
 0827   
 0828              if ($row['parent_id'] != $module_data['parent_id'])
 0829              {
 0830                  $this->move_module($module_data['module_id'], $module_data['parent_id']);
 0831              }
 0832   
 0833              $update_ary = $module_data;
 0834              unset($update_ary['module_id']);
 0835   
 0836              $sql = 'UPDATE ' . MODULES_TABLE . '
 0837                  SET ' . $db->sql_build_array('UPDATE', $update_ary) . "
 0838                  WHERE module_class = '" . $db->sql_escape($module_data['module_class']) . "'
 0839                      AND module_id = " . (int) $module_data['module_id'];
 0840              $db->sql_query($sql);
 0841   
 0842              if (!$run_inline)
 0843              {
 0844                  add_log('admin', 'LOG_MODULE_EDIT', $this->lang_name($module_data['module_langname']));
 0845              }
 0846          }
 0847   
 0848          return array();
 0849      }
 0850   
 0851      /**
 0852      * Move module around the tree
 0853      */
 0854      function move_module($from_module_id, $to_parent_id)
 0855      {
 0856          global $db;
 0857   
 0858          $moved_modules = $this->get_module_branch($from_module_id, 'children', 'descending');
 0859          $from_data = $moved_modules[0];
 0860          $diff = sizeof($moved_modules) * 2;
 0861   
 0862          $moved_ids = array();
 0863          for ($i = 0; $i < sizeof($moved_modules); ++$i)
 0864          {
 0865              $moved_ids[] = $moved_modules[$i]['module_id'];
 0866          }
 0867   
 0868          // Resync parents
 0869          $sql = 'UPDATE ' . MODULES_TABLE . "
 0870              SET right_id = right_id - $diff
 0871              WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
 0872                  AND left_id < " . (int) $from_data['right_id'] . '
 0873                  AND right_id > ' . (int) $from_data['right_id'];
 0874          $db->sql_query($sql);
 0875   
 0876          // Resync righthand side of tree
 0877          $sql = 'UPDATE ' . MODULES_TABLE . "
 0878              SET left_id = left_id - $diff, right_id = right_id - $diff
 0879              WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
 0880                  AND left_id > " . (int) $from_data['right_id'];
 0881          $db->sql_query($sql);
 0882   
 0883          if ($to_parent_id > 0)
 0884          {
 0885              $to_data = $this->get_module_row($to_parent_id);
 0886   
 0887              // Resync new parents
 0888              $sql = 'UPDATE ' . MODULES_TABLE . "
 0889                  SET right_id = right_id + $diff
 0890                  WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
 0891                      AND " . (int) $to_data['right_id'] . ' BETWEEN left_id AND right_id
 0892                      AND ' . $db->sql_in_set('module_id', $moved_ids, true);
 0893              $db->sql_query($sql);
 0894   
 0895              // Resync the righthand side of the tree
 0896              $sql = 'UPDATE ' . MODULES_TABLE . "
 0897                  SET left_id = left_id + $diff, right_id = right_id + $diff
 0898                  WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
 0899                      AND left_id > " . (int) $to_data['right_id'] . '
 0900                      AND ' . $db->sql_in_set('module_id', $moved_ids, true);
 0901              $db->sql_query($sql);
 0902   
 0903              // Resync moved branch
 0904              $to_data['right_id'] += $diff;
 0905              if ($to_data['right_id'] > $from_data['right_id'])
 0906              {
 0907                  $diff = '+ ' . ($to_data['right_id'] - $from_data['right_id'] - 1);
 0908              }
 0909              else
 0910              {
 0911                  $diff = '- ' . abs($to_data['right_id'] - $from_data['right_id'] - 1);
 0912              }
 0913          }
 0914          else
 0915          {
 0916              $sql = 'SELECT MAX(right_id) AS right_id
 0917                  FROM ' . MODULES_TABLE . "
 0918                  WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
 0919                      AND " . $db->sql_in_set('module_id', $moved_ids, true);
 0920              $result = $db->sql_query($sql);
 0921              $row = $db->sql_fetchrow($result);
 0922              $db->sql_freeresult($result);
 0923   
 0924              $diff = '+ ' . (int) ($row['right_id'] - $from_data['left_id'] + 1);
 0925          }
 0926   
 0927          $sql = 'UPDATE ' . MODULES_TABLE . "
 0928              SET left_id = left_id $diff, right_id = right_id $diff
 0929              WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
 0930                  AND " . $db->sql_in_set('module_id', $moved_ids);
 0931          $db->sql_query($sql);
 0932      }
 0933   
 0934      /**
 0935      * Remove module from tree
 0936      */
 0937      function delete_module($module_id)
 0938      {
 0939          global $db, $user;
 0940   
 0941          $row = $this->get_module_row($module_id);
 0942   
 0943          $branch = $this->get_module_branch($module_id, 'children', 'descending', false);
 0944   
 0945          if (sizeof($branch))
 0946          {
 0947              return array($user->lang['CANNOT_REMOVE_MODULE']);
 0948          }
 0949   
 0950          // If not move
 0951          $diff = 2;
 0952          $sql = 'DELETE FROM ' . MODULES_TABLE . "
 0953              WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
 0954                  AND module_id = $module_id";
 0955          $db->sql_query($sql);
 0956   
 0957          $row['right_id'] = (int) $row['right_id'];
 0958          $row['left_id'] = (int) $row['left_id'];
 0959   
 0960          // Resync tree
 0961          $sql = 'UPDATE ' . MODULES_TABLE . "
 0962              SET right_id = right_id - $diff
 0963              WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
 0964                  AND left_id < {$row['right_id']} AND right_id > {$row['right_id']}";
 0965          $db->sql_query($sql);
 0966   
 0967          $sql = 'UPDATE ' . MODULES_TABLE . "
 0968              SET left_id = left_id - $diff, right_id = right_id - $diff
 0969              WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
 0970                  AND left_id > {$row['right_id']}";
 0971          $db->sql_query($sql);
 0972   
 0973          add_log('admin', 'LOG_MODULE_REMOVED', $this->lang_name($row['module_langname']));
 0974   
 0975          return array();
 0976   
 0977      }
 0978   
 0979      /**
 0980      * Move module position by $steps up/down
 0981      */
 0982      function move_module_by($module_row, $action = 'move_up', $steps = 1)
 0983      {
 0984          global $db;
 0985   
 0986          /**
 0987          * Fetch all the siblings between the module's current spot
 0988          * and where we want to move it to. If there are less than $steps
 0989          * siblings between the current spot and the target then the
 0990          * module will move as far as possible
 0991          */
 0992          $sql = 'SELECT module_id, left_id, right_id, module_langname
 0993              FROM ' . MODULES_TABLE . "
 0994              WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
 0995                  AND parent_id = " . (int) $module_row['parent_id'] . '
 0996                  AND ' . (($action == 'move_up') ? 'right_id < ' . (int) $module_row['right_id'] . ' ORDER BY right_id DESC' : 'left_id > ' . (int) $module_row['left_id'] . ' ORDER BY left_id ASC');
 0997          $result = $db->sql_query_limit($sql, $steps);
 0998   
 0999          $target = array();
 1000          while ($row = $db->sql_fetchrow($result))
 1001          {
 1002              $target = $row;
 1003          }
 1004          $db->sql_freeresult($result);
 1005   
 1006          if (!sizeof($target))
 1007          {
 1008              // The module is already on top or bottom
 1009              return false;
 1010          }
 1011   
 1012          /**
 1013          * $left_id and $right_id define the scope of the nodes that are affected by the move.
 1014          * $diff_up and $diff_down are the values to substract or add to each node's left_id
 1015          * and right_id in order to move them up or down.
 1016          * $move_up_left and $move_up_right define the scope of the nodes that are moving
 1017          * up. Other nodes in the scope of ($left_id, $right_id) are considered to move down.
 1018          */
 1019          if ($action == 'move_up')
 1020          {
 1021              $left_id = (int) $target['left_id'];
 1022              $right_id = (int) $module_row['right_id'];
 1023   
 1024              $diff_up = (int) ($module_row['left_id'] - $target['left_id']);
 1025              $diff_down = (int) ($module_row['right_id'] + 1 - $module_row['left_id']);
 1026   
 1027              $move_up_left = (int) $module_row['left_id'];
 1028              $move_up_right = (int) $module_row['right_id'];
 1029          }
 1030          else
 1031          {
 1032              $left_id = (int) $module_row['left_id'];
 1033              $right_id = (int) $target['right_id'];
 1034   
 1035              $diff_up = (int) ($module_row['right_id'] + 1 - $module_row['left_id']);
 1036              $diff_down = (int) ($target['right_id'] - $module_row['right_id']);
 1037   
 1038              $move_up_left = (int) ($module_row['right_id'] + 1);
 1039              $move_up_right = (int) $target['right_id'];
 1040          }
 1041   
 1042          // Now do the dirty job
 1043          $sql = 'UPDATE ' . MODULES_TABLE . "
 1044              SET left_id = left_id + CASE
 1045                  WHEN left_id BETWEEN {$move_up_left} AND {$move_up_right} THEN -{$diff_up}
 1046                  ELSE {$diff_down}
 1047              END,
 1048              right_id = right_id + CASE
 1049                  WHEN right_id BETWEEN {$move_up_left} AND {$move_up_right} THEN -{$diff_up}
 1050                  ELSE {$diff_down}
 1051              END
 1052              WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
 1053                  AND left_id BETWEEN {$left_id} AND {$right_id}
 1054                  AND right_id BETWEEN {$left_id} AND {$right_id}";
 1055          $db->sql_query($sql);
 1056   
 1057          $this->remove_cache_file();
 1058   
 1059          return $this->lang_name($target['module_langname']);
 1060      }
 1061  }
 1062   
 1063  ?>