Pastebin

acp_extensions.php

von Kirk
Beschreibung:
Fix aktivate/deactivate Extensons for IE
Snippet erstellt:
25.01.2020 16:31
Snippet wird automatisch gelöscht:
24.04.2020 17:31

Dein Code:
  1. <?php
  2. /**
  3. *
  4. * This file is part of the phpBB Forum Software package.
  5. *
  6. * @copyright (c) phpBB Limited <https://www.phpbb.com>
  7. * @license GNU General Public License, version 2 (GPL-2.0)
  8. *
  9. * For full copyright and license information, please see
  10. * the docs/CREDITS.txt file.
  11. *
  12. */
  13.  
  14. use phpbb\exception\exception_interface;
  15. use phpbb\exception\version_check_exception;
  16.  
  17. /**
  18. * @ignore
  19. */
  20. if (!defined('IN_PHPBB'))
  21. {
  22.         exit;
  23. }
  24.  
  25. class acp_extensions
  26. {
  27.         var $u_action;
  28.         var $tpl_name;
  29.         var $page_title;
  30.  
  31.         private $config;
  32.         private $template;
  33.         private $user;
  34.         private $log;
  35.         private $request;
  36.         private $phpbb_dispatcher;
  37.         private $ext_manager;
  38.         private $phpbb_container;
  39.         private $php_ini;
  40.  
  41.         function main($id, $mode)
  42.         {
  43.                 // Start the page
  44.                 global $config, $user, $template, $request, $phpbb_extension_manager, $phpbb_root_path, $phpbb_log, $phpbb_dispatcher, $phpbb_container;
  45.  
  46.                 $this->config = $config;
  47.                 $this->template = $template;
  48.                 $this->user = $user;
  49.                 $this->request = $request;
  50.                 $this->log = $phpbb_log;
  51.                 $this->phpbb_dispatcher = $phpbb_dispatcher;
  52.                 $this->ext_manager = $phpbb_extension_manager;
  53.                 $this->phpbb_container = $phpbb_container;
  54.                 $this->php_ini = $this->phpbb_container->get('php_ini');
  55.  
  56.                 $this->user->add_lang(array('install', 'acp/extensions', 'migrator'));
  57.  
  58.                 $this->page_title = 'ACP_EXTENSIONS';
  59.  
  60.                 $action = $this->request->variable('action', 'list');
  61.                 $ext_name = $this->request->variable('ext_name', '');
  62.  
  63.                 // What is a safe limit of execution time? Half the max execution time should be safe.
  64.                 $safe_time_limit = ($this->php_ini->getNumeric('max_execution_time') / 2);
  65.                 $start_time = time();
  66.  
  67.                 // Cancel action
  68.                 if ($this->request->is_set_post('cancel'))
  69.                 {
  70.                         $action = 'list';
  71.                         $ext_name = '';
  72.                 }
  73.  
  74.                 if (in_array($action, array('enable', 'disable', 'delete_data')) && !check_link_hash($this->request->variable('hash', ''), $action . '.' . $ext_name))
  75.                 {
  76.                         trigger_error('FORM_INVALID', E_USER_WARNING);
  77.                 }
  78.  
  79.                 /**
  80.                 * Event to run a specific action on extension
  81.                 *
  82.                 * @event core.acp_extensions_run_action_before
  83.                 * @var  string  action                  Action to run; if the event completes execution of the action, should be set to 'none'
  84.                 * @var  string  u_action                Url we are at
  85.                 * @var  string  ext_name                Extension name from request
  86.                 * @var  int             safe_time_limit Safe limit of execution time
  87.                 * @var  int             start_time              Start time
  88.                 * @var  string  tpl_name                Template file to load
  89.                 * @since 3.1.11-RC1
  90.                 * @changed 3.2.1-RC1                    Renamed to core.acp_extensions_run_action_before, added tpl_name, added action 'none'
  91.                 */
  92.                 $u_action = $this->u_action;
  93.                 $tpl_name = '';
  94.                 $vars = array('action', 'u_action', 'ext_name', 'safe_time_limit', 'start_time', 'tpl_name');
  95.                 extract($this->phpbb_dispatcher->trigger_event('core.acp_extensions_run_action_before', compact($vars)));
  96.  
  97.                 // In case they have been updated by the event
  98.                 $this->u_action = $u_action;
  99.                 $this->tpl_name = $tpl_name;
  100.  
  101.                 // If they've specified an extension, let's load the metadata manager and validate it.
  102.                 if ($ext_name)
  103.                 {
  104.                         $md_manager = $this->ext_manager->create_extension_metadata_manager($ext_name);
  105.  
  106.                         try
  107.                         {
  108.                                 $md_manager->get_metadata('all');
  109.                         }
  110.                         catch (exception_interface $e)
  111.                         {
  112.                                 $message = call_user_func_array(array($this->user, 'lang'), array_merge(array($e->getMessage()), $e->get_parameters()));
  113.                                 trigger_error($message . adm_back_link($this->u_action), E_USER_WARNING);
  114.                         }
  115.                 }
  116.  
  117.                 // What are we doing?
  118.                 switch ($action)
  119.                 {
  120.                         case 'none':
  121.                                 // Intentionally empty, used by extensions that execute additional actions in the prior event
  122.                                 break;
  123.  
  124.                         case 'set_config_version_check_force_unstable':
  125.                                 $force_unstable = $this->request->variable('force_unstable', false);
  126.  
  127.                                 if ($force_unstable)
  128.                                 {
  129.                                         $s_hidden_fields = build_hidden_fields(array(
  130.                                                 'force_unstable'        => $force_unstable,
  131.                                         ));
  132.  
  133.                                         confirm_box(false, $this->user->lang('EXTENSION_FORCE_UNSTABLE_CONFIRM'), $s_hidden_fields);
  134.                                 }
  135.                                 else
  136.                                 {
  137.                                         $this->config->set('extension_force_unstable', false);
  138.                                         trigger_error($this->user->lang['CONFIG_UPDATED'] . adm_back_link($this->u_action));
  139.                                 }
  140.                                 break;
  141.  
  142.                         case 'list':
  143.                         default:
  144.                                 if (confirm_box(true))
  145.                                 {
  146.                                         $this->config->set('extension_force_unstable', true);
  147.                                         trigger_error($this->user->lang['CONFIG_UPDATED'] . adm_back_link($this->u_action));
  148.                                 }
  149.  
  150.                                 $this->list_enabled_exts();
  151.                                 $this->list_disabled_exts();
  152.                                 $this->list_available_exts();
  153.  
  154.                                 $this->template->assign_vars(array(
  155.                                         'U_VERSIONCHECK_FORCE'  => $this->u_action . '&amp;action=list&amp;versioncheck_force=1',
  156.                                         'FORCE_UNSTABLE'                => $this->config['extension_force_unstable'],
  157.                                         'U_ACTION'                              => $this->u_action,
  158.                                 ));
  159.  
  160.                                 $this->tpl_name = 'acp_ext_list';
  161.                         break;
  162.  
  163.                         case 'enable_pre':
  164.                                 try
  165.                                 {
  166.                                         $md_manager->validate_enable();
  167.                                 }
  168.                                 catch (exception_interface $e)
  169.                                 {
  170.                                         $message = call_user_func_array(array($this->user, 'lang'), array_merge(array($e->getMessage()), $e->get_parameters()));
  171.                                         trigger_error($message . adm_back_link($this->u_action), E_USER_WARNING);
  172.                                 }
  173.  
  174.                                 $extension = $this->ext_manager->get_extension($ext_name);
  175.  
  176.                                 $this->check_is_enableable($extension);
  177.  
  178.                                 if ($this->ext_manager->is_enabled($ext_name))
  179.                                 {
  180.                                         redirect($this->u_action);
  181.                                 }
  182.  
  183.                                 if (confirm_box(true))
  184.                                 {
  185.                                         redirect($this->u_action . '&amp;action=enable&amp;ext_name=' . urlencode($ext_name) . '&amp;hash=' . generate_link_hash('enable.' . $ext_name));
  186.                                 }
  187.                                 else
  188.                                 {
  189.                                         confirm_box(false, $this->user->lang('EXTENSION_ENABLE_CONFIRM', $md_manager->get_metadata('display-name')), build_hidden_fields(array(
  190.                                                 'i'                     => $id,
  191.                                                 'mode'          => $mode,
  192.                                                 'action'        => 'enable_pre',
  193.                                                 'ext_name'      => $ext_name,
  194.                                         )));
  195.                                 }
  196.                         break;
  197.  
  198.                         case 'enable':
  199.                                 try
  200.                                 {
  201.                                         $md_manager->validate_enable();
  202.                                 }
  203.                                 catch (exception_interface $e)
  204.                                 {
  205.                                         $message = call_user_func_array(array($this->user, 'lang'), array_merge(array($e->getMessage()), $e->get_parameters()));
  206.                                         trigger_error($message . adm_back_link($this->u_action), E_USER_WARNING);
  207.                                 }
  208.  
  209.                                 $extension = $this->ext_manager->get_extension($ext_name);
  210.  
  211.                                 $this->check_is_enableable($extension);
  212.  
  213.                                 try
  214.                                 {
  215.                                         while ($this->ext_manager->enable_step($ext_name))
  216.                                         {
  217.                                                 // Are we approaching the time limit? If so we want to pause the update and continue after refreshing
  218.                                                 if ((time() - $start_time) >= $safe_time_limit)
  219.                                                 {
  220.                                                         meta_refresh(0, $this->u_action . '&amp;action=enable&amp;ext_name=' . urlencode($ext_name) . '&amp;hash=' . generate_link_hash('enable.' . $ext_name));
  221.                                                         trigger_error('EXTENSION_ENABLE_IN_PROGRESS', E_USER_NOTICE);
  222.                                                 }
  223.                                         }
  224.  
  225.                                         // Update custom style for admin area
  226.                                         $this->template->set_custom_style(array(
  227.                                                 array(
  228.                                                         'name'          => 'adm',
  229.                                                         'ext_path'      => 'adm/style/',
  230.                                                 ),
  231.                                         ), array($phpbb_root_path . 'adm/style'));
  232.  
  233.                                         $this->log->add('admin', $this->user->data['user_id'], $this->user->ip, 'LOG_EXT_ENABLE', time(), array($ext_name));
  234.                                 }
  235.                                 catch (\phpbb\db\migration\exception $e)
  236.                                 {
  237.                                         trigger_error($this->user->lang('MIGRATION_EXCEPTION_ERROR', $e->getLocalisedMessage($this->user)), E_USER_WARNING);
  238.                                 }
  239.  
  240.                                 if ($this->request->is_ajax())
  241.                                 {
  242.                                         $actions = $this->output_actions('enabled', [
  243.                                                 'DISABLE'       => $this->u_action . '&amp;action=disable_pre&amp;ext_name=' . urlencode($ext_name),
  244.                                         ]);
  245.  
  246.                                         $json_response = new \phpbb\json_response;
  247.                                         $json_response->send(array(
  248.                                                 'EXT_ENABLE_SUCCESS'    => true,
  249.                                                 'ACTIONS'                               => $actions,
  250.                                         ));
  251.                                 }
  252.                                 trigger_error($this->user->lang('EXTENSION_ENABLE_SUCCESS') . adm_back_link($this->u_action), E_USER_NOTICE);
  253.                         break;
  254.  
  255.                         case 'disable_pre':
  256.                                 if (!$this->ext_manager->is_enabled($ext_name))
  257.                                 {
  258.                                         redirect($this->u_action);
  259.                                 }
  260.  
  261.                                 if (confirm_box(true))
  262.                                 {
  263.                                         redirect($this->u_action . '&amp;action=disable&amp;ext_name=' . urlencode($ext_name) . '&amp;hash=' . generate_link_hash('disable.' . $ext_name));
  264.                                 }
  265.                                 else
  266.                                 {
  267.                                         confirm_box(false, $this->user->lang('EXTENSION_DISABLE_CONFIRM', $md_manager->get_metadata('display-name')), build_hidden_fields(array(
  268.                                                 'i'                     => $id,
  269.                                                 'mode'          => $mode,
  270.                                                 'action'        => 'disable_pre',
  271.                                                 'ext_name'      => $ext_name,
  272.                                         )));
  273.                                 }
  274.                         break;
  275.  
  276.                         case 'disable':
  277.                                 if (!$this->ext_manager->is_enabled($ext_name))
  278.                                 {
  279.                                         redirect($this->u_action);
  280.                                 }
  281.  
  282.                                 while ($this->ext_manager->disable_step($ext_name))
  283.                                 {
  284.                                         // Are we approaching the time limit? If so we want to pause the update and continue after refreshing
  285.                                         if ((time() - $start_time) >= $safe_time_limit)
  286.                                         {
  287.                                                 $this->template->assign_var('S_NEXT_STEP', true);
  288.  
  289.                                                 meta_refresh(0, $this->u_action . '&amp;action=disable&amp;ext_name=' . urlencode($ext_name) . '&amp;hash=' . generate_link_hash('disable.' . $ext_name));
  290.                                                 trigger_error('EXTENSION_DISABLE_IN_PROGRESS', E_USER_NOTICE);
  291.                                         }
  292.                                 }
  293.                                 $this->log->add('admin', $this->user->data['user_id'], $this->user->ip, 'LOG_EXT_DISABLE', time(), array($ext_name));
  294.  
  295.                                 if ($this->request->is_ajax())
  296.                                 {
  297.                                         $actions = $this->output_actions('disabled', [
  298.                                                 'ENABLE'                => $this->u_action . '&amp;action=enable_pre&amp;ext_name=' . urlencode($ext_name),
  299.                                                 'DELETE_DATA'   => $this->u_action . '&amp;action=delete_data_pre&amp;ext_name=' . urlencode($ext_name),
  300.                                         ]);
  301.  
  302.                                         $json_response = new \phpbb\json_response;
  303.                                         $json_response->send(array(
  304.                                                 'EXT_DISABLE_SUCCESS'   => true,
  305.                                                 'ACTIONS'                               => $actions,
  306.                                         ));
  307.                                 }
  308.                                 trigger_error($this->user->lang('EXTENSION_DISABLE_SUCCESS') . adm_back_link($this->u_action), E_USER_NOTICE);
  309.                         break;
  310.  
  311.                         case 'delete_data_pre':
  312.                                 if ($this->ext_manager->is_enabled($ext_name))
  313.                                 {
  314.                                         redirect($this->u_action);
  315.                                 }
  316.  
  317.                                 if (confirm_box(true))
  318.                                 {
  319.                                         redirect($this->u_action . '&amp;action=delete_data&amp;ext_name=' . urlencode($ext_name) . '&amp;hash=' . generate_link_hash('delete_data.' . $ext_name));
  320.                                 }
  321.                                 else
  322.                                 {
  323.                                         confirm_box(false, $this->user->lang('EXTENSION_DELETE_DATA_CONFIRM', $md_manager->get_metadata('display-name')), build_hidden_fields(array(
  324.                                                 'i'                     => $id,
  325.                                                 'mode'          => $mode,
  326.                                                 'action'        => 'delete_data_pre',
  327.                                                 'ext_name'      => $ext_name,
  328.                                         )));
  329.                                 }
  330.                         break;
  331.  
  332.                         case 'delete_data':
  333.                                 if ($this->ext_manager->is_enabled($ext_name))
  334.                                 {
  335.                                         redirect($this->u_action);
  336.                                 }
  337.  
  338.                                 try
  339.                                 {
  340.                                         while ($this->ext_manager->purge_step($ext_name))
  341.                                         {
  342.                                                 // Are we approaching the time limit? If so we want to pause the update and continue after refreshing
  343.                                                 if ((time() - $start_time) >= $safe_time_limit)
  344.                                                 {
  345.                                                         $this->template->assign_var('S_NEXT_STEP', true);
  346.  
  347.                                                         meta_refresh(0, $this->u_action . '&amp;action=delete_data&amp;ext_name=' . urlencode($ext_name) . '&amp;hash=' . generate_link_hash('delete_data.' . $ext_name));
  348.                                                         trigger_error('EXTENSION_DELETE_DATA_IN_PROGRESS', E_USER_NOTICE);
  349.                                                 }
  350.                                         }
  351.                                         $this->log->add('admin', $this->user->data['user_id'], $this->user->ip, 'LOG_EXT_PURGE', time(), array($ext_name));
  352.                                 }
  353.                                 catch (\phpbb\db\migration\exception $e)
  354.                                 {
  355.                                         trigger_error($this->user->lang('MIGRATION_EXCEPTION_ERROR', $e->getLocalisedMessage($this->user)), E_USER_WARNING);
  356.                                 }
  357.  
  358.                                 if ($this->request->is_ajax())
  359.                                 {
  360.                                         $actions = $this->output_actions('disabled', [
  361.                                                 'ENABLE'                => $this->u_action . '&amp;action=enable_pre&amp;ext_name=' . urlencode($ext_name),
  362.                                         ]);
  363.  
  364.                                         $json_response = new \phpbb\json_response;
  365.                                         $json_response->send(array(
  366.                                                 'EXT_DELETE_DATA_SUCCESS'       => true,
  367.                                                 'ACTIONS'                                       => $actions,
  368.                                         ));
  369.                                 }
  370.                                 trigger_error($this->user->lang('EXTENSION_DELETE_DATA_SUCCESS') . adm_back_link($this->u_action), E_USER_NOTICE);
  371.                         break;
  372.  
  373.                         case 'details':
  374.                                 // Output it to the template
  375.                                 $meta = $md_manager->get_metadata('all');
  376.                                 $this->output_metadata_to_template($meta);
  377.  
  378.                                 if (isset($meta['extra']['version-check']))
  379.                                 {
  380.                                         try
  381.                                         {
  382.                                                 $updates_available = $this->ext_manager->version_check($md_manager, $this->request->variable('versioncheck_force', false), false, $this->config['extension_force_unstable'] ? 'unstable' : null);
  383.  
  384.                                                 $this->template->assign_vars(array(
  385.                                                         'S_UP_TO_DATE' => empty($updates_available),
  386.                                                         'UP_TO_DATE_MSG' => $this->user->lang(empty($updates_available) ? 'UP_TO_DATE' : 'NOT_UP_TO_DATE', $md_manager->get_metadata('display-name')),
  387.                                                 ));
  388.  
  389.                                                 $this->template->assign_block_vars('updates_available', $updates_available);
  390.                                         }
  391.                                         catch (exception_interface $e)
  392.                                         {
  393.                                                 $message = call_user_func_array(array($this->user, 'lang'), array_merge(array($e->getMessage()), $e->get_parameters()));
  394.  
  395.                                                 $this->template->assign_vars(array(
  396.                                                         'S_VERSIONCHECK_FAIL' => true,
  397.                                                         'VERSIONCHECK_FAIL_REASON' => ($e->getMessage() !== 'VERSIONCHECK_FAIL') ? $message : '',
  398.                                                 ));
  399.                                         }
  400.                                         $this->template->assign_var('S_VERSIONCHECK', true);
  401.                                 }
  402.                                 else
  403.                                 {
  404.                                         $this->template->assign_var('S_VERSIONCHECK', false);
  405.                                 }
  406.  
  407.                                 $this->template->assign_vars(array(
  408.                                         'U_BACK'                                => $this->u_action . '&amp;action=list',
  409.                                         'U_VERSIONCHECK_FORCE'  => $this->u_action . '&amp;action=details&amp;versioncheck_force=1&amp;ext_name=' . urlencode($md_manager->get_metadata('name')),
  410.                                 ));
  411.  
  412.                                 $this->tpl_name = 'acp_ext_details';
  413.                         break;
  414.                 }
  415.  
  416.                 /**
  417.                 * Event to run after a specific action on extension has completed
  418.                 *
  419.                 * @event core.acp_extensions_run_action_after
  420.                 * @var  string  action                  Action that has run
  421.                 * @var  string  u_action                Url we are at
  422.                 * @var  string  ext_name                Extension name from request
  423.                 * @var  int             safe_time_limit Safe limit of execution time
  424.                 * @var  int             start_time              Start time
  425.                 * @var  string  tpl_name                Template file to load
  426.                 * @since 3.1.11-RC1
  427.                 */
  428.                 $u_action = $this->u_action;
  429.                 $tpl_name = $this->tpl_name;
  430.                 $vars = array('action', 'u_action', 'ext_name', 'safe_time_limit', 'start_time', 'tpl_name');
  431.                 extract($this->phpbb_dispatcher->trigger_event('core.acp_extensions_run_action_after', compact($vars)));
  432.  
  433.                 // In case they have been updated by the event
  434.                 $this->u_action = $u_action;
  435.                 $this->tpl_name = $tpl_name;
  436.         }
  437.  
  438.         /**
  439.         * Lists all the enabled extensions and dumps to the template
  440.         *
  441.         * @return null
  442.         */
  443.         public function list_enabled_exts()
  444.         {
  445.                 $enabled_extension_meta_data = array();
  446.  
  447.                 foreach ($this->ext_manager->all_enabled() as $name => $location)
  448.                 {
  449.                         $md_manager = $this->ext_manager->create_extension_metadata_manager($name);
  450.  
  451.                         try
  452.                         {
  453.                                 $meta = $md_manager->get_metadata('all');
  454.                                 $enabled_extension_meta_data[$name] = array(
  455.                                         'META_DISPLAY_NAME' => $md_manager->get_metadata('display-name'),
  456.                                         'META_VERSION' => $meta['version'],
  457.                                 );
  458.  
  459.                                 if (isset($meta['extra']['version-check']))
  460.                                 {
  461.                                         try
  462.                                         {
  463.                                                 $force_update = $this->request->variable('versioncheck_force', false);
  464.                                                 $updates = $this->ext_manager->version_check($md_manager, $force_update, !$force_update);
  465.  
  466.                                                 $enabled_extension_meta_data[$name]['S_UP_TO_DATE'] = empty($updates);
  467.                                                 $enabled_extension_meta_data[$name]['S_VERSIONCHECK'] = true;
  468.                                                 $enabled_extension_meta_data[$name]['U_VERSIONCHECK_FORCE'] = $this->u_action . '&amp;action=details&amp;versioncheck_force=1&amp;ext_name=' . urlencode($md_manager->get_metadata('name'));
  469.                                         }
  470.                                         catch (exception_interface $e)
  471.                                         {
  472.                                                 // Ignore exceptions due to the version check
  473.                                         }
  474.                                 }
  475.                                 else
  476.                                 {
  477.                                         $enabled_extension_meta_data[$name]['S_VERSIONCHECK'] = false;
  478.                                 }
  479.                         }
  480.                         catch (exception_interface $e)
  481.                         {
  482.                                 $message = call_user_func_array(array($this->user, 'lang'), array_merge(array($e->getMessage()), $e->get_parameters()));
  483.                                 $this->template->assign_block_vars('disabled', array(
  484.                                         'META_DISPLAY_NAME'             => $this->user->lang('EXTENSION_INVALID_LIST', $name, $message),
  485.                                         'S_VERSIONCHECK'                => false,
  486.                                 ));
  487.                         }
  488.                         catch (\RuntimeException $e)
  489.                         {
  490.                                 $enabled_extension_meta_data[$name]['S_VERSIONCHECK'] = false;
  491.                         }
  492.                 }
  493.  
  494.                 uasort($enabled_extension_meta_data, array($this, 'sort_extension_meta_data_table'));
  495.  
  496.                 foreach ($enabled_extension_meta_data as $name => $block_vars)
  497.                 {
  498.                         $block_vars['NAME'] = $name;
  499.                         $block_vars['U_DETAILS'] = $this->u_action . '&amp;action=details&amp;ext_name=' . urlencode($name);
  500.  
  501.                         $this->template->assign_block_vars('enabled', $block_vars);
  502.  
  503.                         $this->output_actions('enabled', array(
  504.                                 'DISABLE'               => $this->u_action . '&amp;action=disable_pre&amp;ext_name=' . urlencode($name),
  505.                         ));
  506.                 }
  507.         }
  508.  
  509.         /**
  510.         * Lists all the disabled extensions and dumps to the template
  511.         *
  512.         * @return null
  513.         */
  514.         public function list_disabled_exts()
  515.         {
  516.                 $disabled_extension_meta_data = array();
  517.  
  518.                 foreach ($this->ext_manager->all_disabled() as $name => $location)
  519.                 {
  520.                         $md_manager = $this->ext_manager->create_extension_metadata_manager($name);
  521.  
  522.                         try
  523.                         {
  524.                                 $meta = $md_manager->get_metadata('all');
  525.                                 $disabled_extension_meta_data[$name] = array(
  526.                                         'META_DISPLAY_NAME' => $md_manager->get_metadata('display-name'),
  527.                                         'META_VERSION' => $meta['version'],
  528.                                 );
  529.  
  530.                                 if (isset($meta['extra']['version-check']))
  531.                                 {
  532.                                         $force_update = $this->request->variable('versioncheck_force', false);
  533.                                         $updates = $this->ext_manager->version_check($md_manager, $force_update, !$force_update);
  534.  
  535.                                         $disabled_extension_meta_data[$name]['S_UP_TO_DATE'] = empty($updates);
  536.                                         $disabled_extension_meta_data[$name]['S_VERSIONCHECK'] = true;
  537.                                         $disabled_extension_meta_data[$name]['U_VERSIONCHECK_FORCE'] = $this->u_action . '&amp;action=details&amp;versioncheck_force=1&amp;ext_name=' . urlencode($md_manager->get_metadata('name'));
  538.                                 }
  539.                                 else
  540.                                 {
  541.                                         $disabled_extension_meta_data[$name]['S_VERSIONCHECK'] = false;
  542.                                 }
  543.                         }
  544.                         catch (version_check_exception $e)
  545.                         {
  546.                                 $disabled_extension_meta_data[$name]['S_VERSIONCHECK'] = false;
  547.                         }
  548.                         catch (exception_interface $e)
  549.                         {
  550.                                 $message = call_user_func_array(array($this->user, 'lang'), array_merge(array($e->getMessage()), $e->get_parameters()));
  551.                                 $this->template->assign_block_vars('disabled', array(
  552.                                         'META_DISPLAY_NAME'             => $this->user->lang('EXTENSION_INVALID_LIST', $name, $message),
  553.                                         'S_VERSIONCHECK'                => false,
  554.                                 ));
  555.                         }
  556.                         catch (\RuntimeException $e)
  557.                         {
  558.                                 $disabled_extension_meta_data[$name]['S_VERSIONCHECK'] = false;
  559.                         }
  560.                 }
  561.  
  562.                 uasort($disabled_extension_meta_data, array($this, 'sort_extension_meta_data_table'));
  563.  
  564.                 foreach ($disabled_extension_meta_data as $name => $block_vars)
  565.                 {
  566.                         $block_vars['NAME'] = $name;
  567.                         $block_vars['U_DETAILS'] = $this->u_action . '&amp;action=details&amp;ext_name=' . urlencode($name);
  568.  
  569.                         $this->template->assign_block_vars('disabled', $block_vars);
  570.  
  571.                         $this->output_actions('disabled', array(
  572.                                 'ENABLE'                => $this->u_action . '&amp;action=enable_pre&amp;ext_name=' . urlencode($name),
  573.                                 'DELETE_DATA'   => $this->u_action . '&amp;action=delete_data_pre&amp;ext_name=' . urlencode($name),
  574.                         ));
  575.                 }
  576.         }
  577.  
  578.         /**
  579.         * Lists all the available extensions and dumps to the template
  580.         *
  581.         * @return null
  582.         */
  583.         public function list_available_exts()
  584.         {
  585.                 $uninstalled = array_diff_key($this->ext_manager->all_available(), $this->ext_manager->all_configured());
  586.  
  587.                 $available_extension_meta_data = array();
  588.  
  589.                 foreach ($uninstalled as $name => $location)
  590.                 {
  591.                         $md_manager = $this->ext_manager->create_extension_metadata_manager($name);
  592.  
  593.                         try
  594.                         {
  595.                                 $meta = $md_manager->get_metadata('all');
  596.                                 $available_extension_meta_data[$name] = array(
  597.                                         'META_DISPLAY_NAME' => $md_manager->get_metadata('display-name'),
  598.                                         'META_VERSION' => $meta['version'],
  599.                                 );
  600.  
  601.                                 if (isset($meta['extra']['version-check']))
  602.                                 {
  603.                                         $force_update = $this->request->variable('versioncheck_force', false);
  604.                                         $updates = $this->ext_manager->version_check($md_manager, $force_update, !$force_update);
  605.  
  606.                                         $available_extension_meta_data[$name]['S_UP_TO_DATE'] = empty($updates);
  607.                                         $available_extension_meta_data[$name]['S_VERSIONCHECK'] = true;
  608.                                         $available_extension_meta_data[$name]['U_VERSIONCHECK_FORCE'] = $this->u_action . '&amp;action=details&amp;versioncheck_force=1&amp;ext_name=' . urlencode($md_manager->get_metadata('name'));
  609.                                 }
  610.                                 else
  611.                                 {
  612.                                         $available_extension_meta_data[$name]['S_VERSIONCHECK'] = false;
  613.                                 }
  614.                         }
  615.                         catch (version_check_exception $e)
  616.                         {
  617.                                 $available_extension_meta_data[$name]['S_VERSIONCHECK'] = false;
  618.                         }
  619.                         catch (exception_interface $e)
  620.                         {
  621.                                 $message = call_user_func_array(array($this->user, 'lang'), array_merge(array($e->getMessage()), $e->get_parameters()));
  622.                                 $this->template->assign_block_vars('disabled', array(
  623.                                         'META_DISPLAY_NAME'             => $this->user->lang('EXTENSION_INVALID_LIST', $name, $message),
  624.                                         'S_VERSIONCHECK'                => false,
  625.                                 ));
  626.                         }
  627.                 }
  628.  
  629.                 uasort($available_extension_meta_data, array($this, 'sort_extension_meta_data_table'));
  630.  
  631.                 foreach ($available_extension_meta_data as $name => $block_vars)
  632.                 {
  633.                         $block_vars['NAME'] = $name;
  634.                         $block_vars['U_DETAILS'] = $this->u_action . '&amp;action=details&amp;ext_name=' . urlencode($name);
  635.  
  636.                         $this->template->assign_block_vars('disabled', $block_vars);
  637.  
  638.                         $this->output_actions('disabled', array(
  639.                                 'ENABLE'                => $this->u_action . '&amp;action=enable_pre&amp;ext_name=' . urlencode($name),
  640.                         ));
  641.                 }
  642.         }
  643.  
  644.         /**
  645.         * Output actions to a block
  646.         *
  647.         * @param string $block
  648.         * @param array $actions
  649.         * @return array List of actions to be performed on the extension
  650.         */
  651.         private function output_actions($block, $actions)
  652.         {
  653.                 $vars_ary = array();
  654.                 foreach ($actions as $lang => $options)
  655.                 {
  656.                         $url = $options;
  657.                         if (is_array($options))
  658.                         {
  659.                                 $url = $options['url'];
  660.                         }
  661.  
  662.                         $vars = array(
  663.                                 'L_ACTION'                      => $this->user->lang('EXTENSION_' . $lang),
  664.                                 'L_ACTION_EXPLAIN'      => (isset($this->user->lang['EXTENSION_' . $lang . '_EXPLAIN'])) ? $this->user->lang('EXTENSION_' . $lang . '_EXPLAIN') : '',
  665.                                 'U_ACTION'                      => $url,
  666.                                 'ACTION_AJAX'           => 'ext_' . strtolower($lang),
  667.                         );
  668.  
  669.                         if (isset($options['color']))
  670.                         {
  671.                                 $vars['COLOR'] = $options['color'];
  672.                         }
  673.  
  674.                         $this->template->assign_block_vars($block . '.actions', $vars);
  675.  
  676.                         $vars_ary[] = $vars;
  677.                 }
  678.  
  679.                 return $vars_ary;
  680.         }
  681.  
  682.         /**
  683.         * Sort helper for the table containing the metadata about the extensions.
  684.         */
  685.         protected function sort_extension_meta_data_table($val1, $val2)
  686.         {
  687.                 return strnatcasecmp($val1['META_DISPLAY_NAME'], $val2['META_DISPLAY_NAME']);
  688.         }
  689.  
  690.         /**
  691.         * Outputs extension metadata into the template
  692.         *
  693.         * @param array $metadata Array with all metadata for the extension
  694.         * @return null
  695.         */
  696.         public function output_metadata_to_template($metadata)
  697.         {
  698.                 $this->template->assign_vars(array(
  699.                         'META_NAME'                     => $metadata['name'],
  700.                         'META_TYPE'                     => $metadata['type'],
  701.                         'META_DESCRIPTION'      => (isset($metadata['description'])) ? $metadata['description'] : '',
  702.                         'META_HOMEPAGE'         => (isset($metadata['homepage'])) ? $metadata['homepage'] : '',
  703.                         'META_VERSION'          => $metadata['version'],
  704.                         'META_TIME'                     => (isset($metadata['time'])) ? $metadata['time'] : '',
  705.                         'META_LICENSE'          => $metadata['license'],
  706.  
  707.                         'META_REQUIRE_PHP'              => (isset($metadata['require']['php'])) ? $metadata['require']['php'] : '',
  708.                         'META_REQUIRE_PHP_FAIL' => (isset($metadata['require']['php'])) ? false : true,
  709.  
  710.                         'META_REQUIRE_PHPBB'            => (isset($metadata['extra']['soft-require']['phpbb/phpbb'])) ? $metadata['extra']['soft-require']['phpbb/phpbb'] : '',
  711.                         'META_REQUIRE_PHPBB_FAIL'       => (isset($metadata['extra']['soft-require']['phpbb/phpbb'])) ? false : true,
  712.  
  713.                         'META_DISPLAY_NAME'     => (isset($metadata['extra']['display-name'])) ? $metadata['extra']['display-name'] : '',
  714.                 ));
  715.  
  716.                 foreach ($metadata['authors'] as $author)
  717.                 {
  718.                         $this->template->assign_block_vars('meta_authors', array(
  719.                                 'AUTHOR_NAME'           => $author['name'],
  720.                                 'AUTHOR_EMAIL'          => (isset($author['email'])) ? $author['email'] : '',
  721.                                 'AUTHOR_HOMEPAGE'       => (isset($author['homepage'])) ? $author['homepage'] : '',
  722.                                 'AUTHOR_ROLE'           => (isset($author['role'])) ? $author['role'] : '',
  723.                         ));
  724.                 }
  725.         }
  726.  
  727.         /**
  728.         * Checks whether the extension can be enabled. Triggers error if not.
  729.         * Error message can be set by the extension.
  730.         *
  731.         * @param \phpbb\extension\extension_interface $extension Extension to check
  732.         */
  733.         protected function check_is_enableable(\phpbb\extension\extension_interface $extension)
  734.         {
  735.                 $message = $extension->is_enableable();
  736.                 if ($message !== true)
  737.                 {
  738.                         if (empty($message))
  739.                         {
  740.                                 $message = $this->user->lang('EXTENSION_NOT_ENABLEABLE');
  741.                         }
  742.                         else if (is_array($message))
  743.                         {
  744.                                 $message = implode('<br>', $message);
  745.                         }
  746.  
  747.                         trigger_error($message . adm_back_link($this->u_action), E_USER_WARNING);
  748.                 }
  749.         }
  750. }

Quellcode

Hier kannst du den Code kopieren und ihn in deinen bevorzugten Editor einfügen. Alternativ kannst du den gesamten Eintrag auch als Datei herunterladen.