/**
  * Bootstrap method to be called during application bootstrap stage.
  *
  * @param Application $app the application currently running
  */
 public function bootstrap($app)
 {
     $app->i18n->translations['extensions-manager'] = ['class' => 'yii\\i18n\\PhpMessageSource', 'basePath' => __DIR__ . DIRECTORY_SEPARATOR . 'messages'];
     DeferredQueueEvent::on(DeferredController::className(), DeferredController::EVENT_DEFERRED_QUEUE_COMPLETE, [DeferredQueueCompleteHandler::className(), 'handleEvent']);
     if ($app instanceof \yii\console\Application) {
         $app->controllerMap['extension'] = ExtensionController::className();
         $app->on(Application::EVENT_BEFORE_ACTION, function () {
             $module = ExtensionsManager::module();
             if ($module->autoDiscoverMigrations === true) {
                 if (isset(Yii::$app->params['yii.migrations']) === false) {
                     Yii::$app->params['yii.migrations'] = [];
                 }
                 /** @var array $extensions */
                 $extensions = $module->getExtensions();
                 foreach ($extensions as $name => $ext) {
                     if ($ext['composer_type'] === Extension::TYPE_DOTPLANT && $module->discoverDotPlantMigrations === false) {
                         continue;
                     }
                     $extData = ComposerInstalledSet::get()->getInstalled($ext['composer_name']);
                     $packageMigrations = ExtensionDataHelper::getInstalledExtraData($extData, 'migrationPath', true);
                     $packagePath = '@vendor/' . $ext['composer_name'];
                     foreach ($packageMigrations as $migrationPath) {
                         Yii::$app->params['yii.migrations'][] = "{$packagePath}/{$migrationPath}";
                     }
                 }
             }
         });
     }
 }
 /**
  * @param bool $onlyActive load configurables only for active extensions
  * @return array
  */
 public static function getConfigurables($onlyActive = false)
 {
     $installed = ComposerInstalledSet::get()->getInstalled();
     $configurables = [];
     foreach ($installed as $package) {
         $packageConfigurablesFile = ArrayHelper::getValue($package, 'extra.configurables', null);
         if ($packageConfigurablesFile === null || true === $onlyActive && false === ExtensionsManager::module()->extensionIsActive($package['name'])) {
             continue;
         }
         $fn = Yii::getAlias('@vendor') . DIRECTORY_SEPARATOR . $package['name'] . DIRECTORY_SEPARATOR . $packageConfigurablesFile;
         if (file_exists($fn) && is_readable($fn)) {
             $packageConfigurables = (include $fn);
             array_walk($packageConfigurables, function (&$item) use($package) {
                 $item['package'] = $package['name'];
                 $item['sectionNameTranslated'] = ExtensionDataHelper::getLocalizedDataField($package, Extension::TYPE_YII, 'name');
             });
             $configurables = ArrayHelper::merge($configurables, $packageConfigurables);
         }
     }
     return $configurables;
 }
 /**
  * Runs separated ReportingTask
  *
  * @param $command
  * @param $groupName
  * @return array
  * @throws ServerErrorHttpException
  */
 private static function runTask($command, $groupName)
 {
     $task = ExtensionDataHelper::buildTask($command, $groupName);
     if ($task->registerTask()) {
         DeferredHelper::runImmediateTask($task->model()->id);
         Yii::$app->response->format = Response::FORMAT_JSON;
         return ['queueItemId' => $task->model()->id];
     } else {
         throw new ServerErrorHttpException("Unable to start task");
     }
 }
 public function testGetOtherPackageDataStringAsArray()
 {
     $name = ExtensionDataHelper::getOtherPackageData(Json::decode(file_get_contents(__DIR__ . '/../../data/installed-no-extra.json')), 'name', true);
     $this->assertTrue(in_array('devgroup/yii2-extensions-manager', $name));
 }
 /**
  * Activates/Deactivates Extension
  *
  * @param $packageName
  * @param integer $state
  * @param integer $runMigrations
  * @return bool
  */
 private function process($packageName, $state = 1, $runMigrations = 1)
 {
     $actionText = 0 === (int) $state ? 'deactivated' : 'activated';
     if (true === isset($this->extensions[$packageName]['is_active'])) {
         if ($runMigrations === 1) {
             $chain = new ReportingChain();
             ExtensionDataHelper::prepareMigrationTask($this->extensions[$packageName], $chain, (int) $state ? ExtensionsManager::MIGRATE_TYPE_UP : ExtensionsManager::MIGRATE_TYPE_DOWN, ExtensionsManager::EXTENSION_DEACTIVATE_DEFERRED_GROUP);
             if (null !== ($firstTaskId = $chain->registerChain())) {
                 DeferredHelper::runImmediateTask($firstTaskId);
             } else {
                 $this->stderr("Unable to run task chain\n");
             }
         }
         $this->extensions[$packageName]['is_active'] = $state;
         if (true === $this->writeConfig()) {
             $this->stdout(str_replace('{actionText}', $actionText, 'Extension successfully {actionText}.') . PHP_EOL);
             //this means successfully termination. Because process starts in command line shell
             return 0;
         }
     } else {
         $this->stdout(str_replace('{actionText}', $actionText, 'You trying to {actionText} not existing extension!') . PHP_EOL);
     }
     return 1;
 }
Ejemplo n.º 6
0
        </div>
    </div>
    <div class="col-md-9">
        <div class="extensions-controller__list-extensions box box-solid">
            <div class="box-header clearfix">
                <h3 class="box-title pull-left">
                    <?php 
echo Yii::t('extensions-manager', 'Installed extensions');
?>
                </h3>
            </div>
        <?php 
echo GridView::widget(['id' => 'extensions-list', 'dataProvider' => $dataProvider, 'layout' => $gridTpl, 'tableOptions' => ['class' => 'table table-bordered table-hover table-responsive'], 'pager' => ['options' => ['class' => 'pagination pull-right']], 'columns' => [['label' => Yii::t('extensions-manager', 'Name'), 'attribute' => 'composer_name', 'content' => function ($data) use($nameBlockTpl, $composerSet) {
    $name = ExtensionDataHelper::getLocalizedDataField($composerSet->getInstalled($data["composer_name"]), Extension::TYPE_YII, 'name');
    $description = ExtensionDataHelper::getLocalizedDataField($composerSet->getInstalled($data["composer_name"]), Extension::TYPE_YII, 'description');
    $activateButton = 0 == $data['is_active'] ? Yii::$app->user->can('extensions-manager-activate-extension') ? Html::button(Yii::t('extensions-manager', 'Activate'), ['class' => 'btn btn-success btn-xs', 'data-action' => 'run-ext-task', 'data-ext-task' => ExtensionsManager::ACTIVATE_DEFERRED_TASK, 'data-package-name' => $data["composer_name"]]) : '' : (Yii::$app->user->can('extensions-manager-deactivate-extension') ? Html::button(Yii::t('extensions-manager', 'Deactivate'), ['class' => 'btn btn-warning btn-xs', 'data-action' => 'run-ext-task', 'data-ext-task' => ExtensionsManager::DEACTIVATE_DEFERRED_TASK, 'data-package-name' => $data["composer_name"]]) : '');
    $removeButton = $data['is_core'] == 0 && Yii::$app->user->can('extensions-manager-uninstall-extension') ? Html::button(Yii::t('extensions-manager', 'Uninstall'), ['class' => 'btn btn-danger btn-xs', 'data-action' => 'run-ext-task', 'data-ext-task' => ExtensionsManager::UNINSTALL_DEFERRED_TASK, 'data-package-name' => $data["composer_name"]]) : '';
    $buttons = $removeButton . Html::button(Yii::t('extensions-manager', 'Check updates'), ['class' => 'btn btn-warning btn-xs', 'data-action' => 'run-ext-task', 'data-ext-task' => ExtensionsManager::CHECK_UPDATES_DEFERRED_TASK, 'data-package-name' => $data["composer_name"]]) . Html::button(Yii::t('extensions-manager', 'Details') . '  ' . Icon::show('refresh fa-spin', ['style' => 'display: none;'], 'fa'), ['class' => 'btn btn-info btn-xs', 'data-package-name' => $data["composer_name"], 'data-action' => 'ext-info']) . $activateButton;
    return sprintf($nameBlockTpl, $name, $description, $buttons, str_replace(['\\', '/'], '', $data["composer_name"]));
}], ['label' => Yii::t('extensions-manager', 'Version'), 'content' => function ($data) use($composerSet) {
    return ExtensionDataHelper::getLocalizedDataField($composerSet->getInstalled($data["composer_name"]), Extension::TYPE_YII, 'version');
}, 'options' => ['width' => '150px']], ['label' => Yii::t('extensions-manager', 'Type'), 'attribute' => 'composer_type', 'content' => function ($data) {
    $types = Extension::getTypes();
    return isset($types[$data['composer_type']]) ? $types[$data['composer_type']] : Yii::t('extensions-manager', 'Undefined extension type');
}, 'options' => ['width' => '150px']], ['label' => Yii::t('extensions-manager', 'Active'), 'attribute' => 'is_active', 'content' => function ($data) {
    return Yii::$app->formatter->asBoolean($data["is_active"]);
}, 'options' => ['width' => '150px']]]]);
?>
        </div>
    </div>
</div>
 /**
  * Prepares migration command
  *
  * @param array $ext
  * @param ReportingChain $chain
  * @param string $way
  * @param $group
  */
 public static function prepareMigrationTask(array $ext, ReportingChain $chain, $way = ExtensionsManager::MIGRATE_TYPE_UP, $group)
 {
     if ($ext['composer_type'] == Extension::TYPE_DOTPLANT) {
         $extData = ComposerInstalledSet::get()->getInstalled($ext['composer_name']);
         $packageMigrations = ExtensionDataHelper::getInstalledExtraData($extData, 'migrationPath', true);
         $packagePath = '@vendor' . '/' . $ext['composer_name'] . '/';
         foreach ($packageMigrations as $migrationPath) {
             $migrateTask = self::buildTask([realpath(Yii::getAlias('@app') . '/yii'), 'migrate/' . $way, '--migrationPath=' . $packagePath . $migrationPath, '--color=0', '--interactive=0', '--disableLookup=true', ExtensionsManager::MIGRATE_TYPE_DOWN == $way ? 68888 : ''], $group);
             $chain->addTask($migrateTask);
         }
     }
 }