Seditio Source
Root |
./othercms/dotclear-2.22/plugins/maintenance/_admin.php
<?php
/**
 * @brief maintenance, a plugin for Dotclear 2
 *
 * @package Dotclear
 * @subpackage Plugins
 *
 * @copyright Olivier Meunier & Association Dotclear
 * @copyright GPL-2.0-only
 */
if (!defined('DC_CONTEXT_ADMIN')) {
    return;
}

// Sidebar menu
$_menu['Plugins']->addItem(
   
__('Maintenance'),
   
$core->adminurl->get('admin.plugin.maintenance'),
   
dcPage::getPF('maintenance/icon.svg'),
   
preg_match('/' . preg_quote($core->adminurl->get('admin.plugin.maintenance')) . '(&.*)?$/', $_SERVER['REQUEST_URI']),
   
$core->auth->check('admin', $core->blog->id)
);

// Admin behaviors
$core->addBehavior('dcMaintenanceInit', ['dcMaintenanceAdmin', 'dcMaintenanceInit']);
$core->addBehavior('adminDashboardFavorites', ['dcMaintenanceAdmin', 'adminDashboardFavorites']);
$core->addBehavior('adminDashboardContents', ['dcMaintenanceAdmin', 'adminDashboardItems']);
$core->addBehavior('adminDashboardOptionsForm', ['dcMaintenanceAdmin', 'adminDashboardOptionsForm']);
$core->addBehavior('adminAfterDashboardOptionsUpdate', ['dcMaintenanceAdmin', 'adminAfterDashboardOptionsUpdate']);
$core->addBehavior('adminPageHelpBlock', ['dcMaintenanceAdmin', 'adminPageHelpBlock']);
$core->addBehavior('pluginsToolsHeaders', ['dcMaintenanceAdmin', 'pluginsToolsHeaders']);

/**
@ingroup PLUGIN_MAINTENANCE
@nosubgrouping
@brief Maintenance plugin admin class.

Group of methods used on behaviors.
 */
class dcMaintenanceAdmin
{
   
/**
     * Register default tasks.
     *
     * @param      dcMaintenance  $maintenance  dcMaintenance instance
     */
   
public static function dcMaintenanceInit(dcMaintenance $maintenance)
    {
       
$maintenance
           
->addTab('maintenance', __('Servicing'), ['summary' => __('Tools to maintain the performance of your blogs.')])
            ->
addTab('backup', __('Backup'), ['summary' => __('Tools to back up your content.')])
            ->
addTab('dev', __('Development'), ['summary' => __('Tools to assist in development of plugins, themes and core.')])

            ->
addGroup('optimize', __('Optimize'))
            ->
addGroup('index', __('Count and index'))
            ->
addGroup('purge', __('Purge'))
            ->
addGroup('other', __('Other'))
            ->
addGroup('zipblog', __('Current blog'))
            ->
addGroup('zipfull', __('All blogs'))

            ->
addGroup('l10n', __('Translations'), ['summary' => __('Maintain translations')])

            ->
addTask('dcMaintenanceCache')
            ->
addTask('dcMaintenanceCSP')
            ->
addTask('dcMaintenanceIndexposts')
            ->
addTask('dcMaintenanceIndexcomments')
            ->
addTask('dcMaintenanceCountcomments')
            ->
addTask('dcMaintenanceSynchpostsmeta')
            ->
addTask('dcMaintenanceLogs')
            ->
addTask('dcMaintenanceVacuum')
            ->
addTask('dcMaintenanceZipmedia')
            ->
addTask('dcMaintenanceZiptheme')
        ;
    }

   
/**
     * Favorites
     *
     * @param      dcCore        $core   dcCore instance
     * @param      dcFavorites   $favs   favs
     */
   
public static function adminDashboardFavorites(dcCore $core, dcFavorites $favs)
    {
       
$favs->register('maintenance', [
           
'title'        => __('Maintenance'),
           
'url'          => $core->adminurl->get('admin.plugin.maintenance'),
           
'small-icon'   => [dcPage::getPF('maintenance/icon.svg'),dcPage::getPF('maintenance/icon-dark.svg')],
           
'large-icon'   => [dcPage::getPF('maintenance/icon.svg'),dcPage::getPF('maintenance/icon-dark.svg')],
           
'permissions'  => 'admin',
           
'active_cb'    => ['dcMaintenanceAdmin', 'adminDashboardFavoritesActive'],
           
'dashboard_cb' => ['dcMaintenanceAdmin', 'adminDashboardFavoritesCallback'],
        ]);
    }

   
/**
     * Is maintenance plugin active
     *
     * @param      string  $request  The request
     * @param      array   $params   The parameters
     *
     * @return     bool    true if maintenance plugin is active else false
     */
   
public static function adminDashboardFavoritesActive($request, $params)
    {
        return
$request == 'plugin.php' && isset($params['p']) && $params['p'] == 'maintenance';
    }

   
/**
     * Favorites hack.
     *
     * This updates maintenance fav icon text
     * if there are tasks required maintenance.
     *
     * @param      dcCore       $core   The core
     * @param      arrayObject  $fav    The fav
     */
   
public static function adminDashboardFavoritesCallback(dcCore $core, $fav)
    {
       
// Check user option
       
$core->auth->user_prefs->addWorkspace('maintenance');
        if (!
$core->auth->user_prefs->maintenance->dashboard_icon) {
            return;
        }

       
// Check expired tasks
       
$maintenance = new dcMaintenance($core);
       
$count       = 0;
        foreach (
$maintenance->getTasks() as $t) {
            if (
$t->expired() !== false) {
               
$count++;
            }
        }

        if (!
$count) {
            return;
        }

       
$fav['title'] .= '<br />' . sprintf(__('One task to execute', '%s tasks to execute', $count), $count);
       
$fav['large-icon'] = [dcPage::getPF('maintenance/icon-update.svg'), dcPage::getPF('maintenance/icon-dark-update.svg')];
    }

   
/**
     * Dashboard items stack.
     *
     * @param      dcCore       $core   The core
     * @param      arrayObject  $items  The items
     */
   
public static function adminDashboardItems(dcCore $core, $items)
    {
       
$core->auth->user_prefs->addWorkspace('maintenance');
        if (!
$core->auth->user_prefs->maintenance->dashboard_item) {
            return;
        }

       
$maintenance = new dcMaintenance($core);

       
$lines = [];
        foreach (
$maintenance->getTasks() as $t) {
           
$ts = $t->expired();
            if (
$ts === false) {
                continue;
            }

           
$lines[] = '<li title="' . (
               
$ts === null ?
               
__('This task has never been executed.')
                :
               
sprintf(
                   
__('Last execution of this task was on %s.'),
                   
dt::dt2str($core->blog->settings->system->date_format, $ts) . ' ' .
                   
dt::dt2str($core->blog->settings->system->time_format, $ts)
                )
            ) .
'">' . $t->task() . '</li>';
        }

        if (empty(
$lines)) {
            return;
        }

       
$items[] = new ArrayObject([
           
'<div id="maintenance-expired" class="box small"><h3>' .
           
dcAdminHelper::adminIcon([dcPage::getPF('maintenance/icon.svg'),dcPage::getPF('maintenance/icon-dark.svg')], true, '', '', 'icon-small') . ' ' .
           
__('Maintenance') . '</h3>' .
           
'<p class="warning no-margin">' . sprintf(__('There is a task to execute.', 'There are %s tasks to execute.', count($lines)), count($lines)) . '</p>' .
           
'<ul>' . implode('', $lines) . '</ul>' .
           
'<p><a href="' . $core->adminurl->get('admin.plugin.maintenance') . '">' . __('Manage tasks') . '</a></p>' .
           
'</div>',
        ]);
    }

   
/**
     * User preferences form.
     *
     * This add options for superadmin user
     * to show or not expired taks.
     *
     * @param      dcCore  $core   The core
     */
   
public static function adminDashboardOptionsForm(dcCore $core)
    {
       
$core->auth->user_prefs->addWorkspace('maintenance');

        echo
       
'<div class="fieldset">' .
       
'<h4>' . __('Maintenance') . '</h4>' .

       
'<p><label for="maintenance_dashboard_icon" class="classic">' .
       
form::checkbox('maintenance_dashboard_icon', 1, $core->auth->user_prefs->maintenance->dashboard_icon) .
       
__('Display overdue tasks counter on maintenance dashboard icon') . '</label></p>' .

       
'<p><label for="maintenance_dashboard_item" class="classic">' .
       
form::checkbox('maintenance_dashboard_item', 1, $core->auth->user_prefs->maintenance->dashboard_item) .
       
__('Display overdue tasks list on dashboard items') . '</label></p>' .

           
'</div>';
    }

   
/**
     * User preferences update.
     *
     * @param      string  $user_id  The user identifier
     */
   
public static function adminAfterDashboardOptionsUpdate($user_id = null)
    {
        global
$core;

        if (
is_null($user_id)) {
            return;
        }

       
$core->auth->user_prefs->addWorkspace('maintenance');
       
$core->auth->user_prefs->maintenance->put('dashboard_icon', !empty($_POST['maintenance_dashboard_icon']), 'boolean');
       
$core->auth->user_prefs->maintenance->put('dashboard_item', !empty($_POST['maintenance_dashboard_item']), 'boolean');
    }

   
/**
     * Build a well sorted help for tasks.
     *
     * This method is not so good if used with lot of tranlsations
     * as it grows memory usage and translations files size,
     * it is better to use help ressource files
     * but keep it for exemple of how to use behavior adminPageHelpBlock.
     * Cheers, JC
     *
     * @param      arrayObject  $blocks  The blocks
     */
   
public static function adminPageHelpBlock($blocks)
    {
       
$found = false;
        foreach (
$blocks as $block) {
            if (
$block == 'maintenancetasks') {
               
$found = true;

                break;
            }
        }
        if (!
$found) {
            return;
        }

       
$maintenance = new dcMaintenance($GLOBALS['core']);

       
$res_tab = '';
        foreach (
$maintenance->getTabs() as $tab_obj) {
           
$res_group = '';
            foreach (
$maintenance->getGroups() as $group_obj) {
               
$res_task = '';
                foreach (
$maintenance->getTasks() as $t) {
                    if (
$t->group() != $group_obj->id()
                        ||
$t->tab() != $tab_obj->id()) {
                        continue;
                    }
                    if ((
$desc = $t->description()) != '') {
                       
$res_task .= '<dt>' . $t->task() . '</dt>' .
                           
'<dd>' . $desc . '</dd>';
                    }
                }
                if (!empty(
$res_task)) {
                   
$desc = $group_obj->description ?: $group_obj->summary;

                   
$res_group .= '<h5>' . $group_obj->name() . '</h5>' .
                        (
$desc ? '<p>' . $desc . '</p>' : '') .
                       
'<dl>' . $res_task . '</dl>';
                }
            }
            if (!empty(
$res_group)) {
               
$desc = $tab_obj->description ?: $tab_obj->summary;

               
$res_tab .= '<h4>' . $tab_obj->name() . '</h4>' .
                    (
$desc ? '<p>' . $desc . '</p>' : '') .
                   
$res_group;
            }
        }
        if (!empty(
$res_tab)) {
           
$res          = new ArrayObject();
           
$res->content = $res_tab;   // @phpstan-ignore-line
           
$blocks[]     = $res;
        }
    }

   
/**
     * Add javascript for plugin configuration.
     *
     * @param      dcCore  $core    The core
     * @param      string  $module  The module
     *
     * @return     mixed
     */
   
public static function pluginsToolsHeaders(dcCore $core, $module)
    {
        if (
$module == 'maintenance') {
            return
dcPage::jsModuleLoad('maintenance/js/settings.js');
        }
    }
}