public static function rpc_post_install(Context $ctx)
 {
     $status = array();
     $enabled = (array) $ctx->post('modules');
     // Загружаем отсутствующие модули.
     foreach (modman::getAllModules() as $name => $info) {
         if (in_array($name, $enabled) and !modman::isInstalled($name)) {
             if (!modman::install($name)) {
                 $status[$name] = 'failed';
             } else {
                 $status[$name] = 'installed';
             }
         }
     }
     $ctx->config->modules = $enabled;
     $ctx->config->save();
     $next = new url($ctx->get('destination', '?q=admin'));
     $next->setarg('status', $status);
     self::rpc_rebuild($ctx);
     // Обновляем базу модулей, чтобы выбросить удалённые локальные.
     modman::updateDB();
     return new Redirect($next->string());
 }
 public static function on_get_remove(Context $ctx)
 {
     $ctx->theme = os::path('lib', 'modules', 'modman', 'template.xsl');
     if (!count($modules = modman::getAllModules())) {
         modman::updateDB();
         $modules = modman::getAllModules();
     }
     // Удаляем из списка обязательные модули: их нельзя отключать.
     // Это, за одно, позволит дробить модули без захламления интерфейса
     // и смущения пользователя.
     foreach ($modules as $k => $v) {
         if (empty($v['installed']) or 'required' == @$v['priority']) {
             unset($modules[$k]);
         }
     }
     return self::getXML2($ctx, $modules, array('mode' => 'remove', 'title' => t('Удаление модулей')));
 }