Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Cli/Command/AddOnDisable.php
<?php

namespace XF\Cli\Command;

use
Symfony\Component\Console\Command\Command;
use
Symfony\Component\Console\Helper\QuestionHelper;
use
Symfony\Component\Console\Input\InputArgument;
use
Symfony\Component\Console\Input\InputInterface;
use
Symfony\Component\Console\Output\OutputInterface;
use
Symfony\Component\Console\Question\ConfirmationQuestion;

class
AddOnDisable extends Command
{
    use
AddOnActionTrait;

    protected function
configure()
    {
       
$this
           
->setName('xf:addon-disable')
            ->
setAliases(['xf-addon:disable'])
            ->
setDescription('Disables the specified add-on. If no add-on ID is provided, all enabled add-ons will be disabled.')
            ->
addArgument(
               
'id',
               
InputArgument::OPTIONAL,
               
'Add-On ID'
           
);
    }

    protected function
execute(InputInterface $input, OutputInterface $output)
    {
       
$addOnManager = \XF::app()->addOnManager();

       
/** @var QuestionHelper $helper */
       
$helper = $this->getHelper('question');

       
$id = $input->getArgument('id');
        if (
$id)
        {
           
$addOn = $this->checkEditableAddOn($id, $error);
            if (!
$addOn)
            {
               
$output->writeln('<error>' . $error . '</error>');
                return
1;
            }

            if (!
$addOn->isActive())
            {
               
$output->writeln('This add-on is already disabled.');
                return
0; // the effect is the same as success so lets treat it like that
           
}

           
$question = new ConfirmationQuestion('<question>' . \XF::phrase('please_confirm_that_you_want_to_disable_following_add_on:') . ' (' . $addOn->title . ' ' . $addOn->version_string . ') (y/n)</question>');
           
$response = $helper->ask($input, $output, $question);
            if (!
$response)
            {
                return
1;
            }

           
$addOns = [$addOn];
           
$setDisabledCache = false;
        }
        else
        {
           
$addOns = $addOnManager->getInstalledAddOns();

           
$question = new ConfirmationQuestion('<question>' . \XF::phrase('you_sure_you_want_to_disable_all_add_ons') . '</question>');
           
$response = $helper->ask($input, $output, $question);
            if (!
$response)
            {
                return
1;
            }
           
$setDisabledCache = true;
        }

       
$db = \XF::db();
       
$db->beginTransaction();

       
$cache = [];
        foreach (
$addOns AS $addOnId => $addOn)
        {
            if (!
$addOn->canEdit() || !$addOn->isActive())
            {
                unset(
$addOns[$addOnId]);
                continue;
            }

           
$installed = $addOn->getInstalledAddOn();
           
$installed->setOption('rebuild_active_change', false);
           
$installed->active = false;
           
$installed->save(true, false);

            if (
$setDisabledCache)
            {
               
$cache[] = $addOnId;
            }
        }

       
$db->commit();

        foreach (
$addOns AS $addOn)
        {
           
$this->runSubAction($output, $addOn, 'active-change');
        }

        if (
$cache)
        {
           
$addOnRepo = \XF::repository('XF:AddOn');
           
$addOnRepo->setDisabledAddOnsCache($cache);
        }

        return
0;
    }
}