Автоустановка приложений на демо сайт

Создаем контроллер в каком нибудь из приложений

  • Прописываем namespace наименование приложение (папка в корне сайта, mspre)
  • Указываем ссылку demoSiteUrl на сайт куда будет отправлено приложение
// core/components/minishop2/controllers/install.class.php

<?php
ini_set('display_errors', 1);

if (!class_exists('msManagerController')) {
    require_once dirname(__FILE__) . '/manager.class.php';
}

/**
 * The home manager controller for mspre.
 *
 */
class Minishop2InstallManagerController extends msManagerController {
    protected $namespace = 'mspre';
    protected $demoSiteUrl = 'http://s920.h1.bumodx.ru/upload.php';

    /**
     * @return string
     */
    public function getTemplateFile() {

        // Подпись приложения берется из build.transport.php после успешной установки
        $signature = '';
        ob_start();
        require dirname(dirname(dirname(dirname(dirname(__FILE__))))).'/'.$this->namespace.'/_build/build.transport.php';
        $html = ob_get_clean();

        // Эметируем подключения шаблона
        $file = $this->mspre->config['templatesPath'] . 'install.tpl';

        // Наименование файла
        $packname = $signature.'.transport.zip';

        // Пишем содержимое обратно в файл
        file_put_contents($file, '<div id="mspre-panel-home-div"><br><br><h5>Установка пакета</h5><br><br>'.$html.'</div>');

        // Создание пути до файла
        $file_downloads = MODX_CORE_PATH.'packages/'.$packname;

        // Отправляем файл на сервер
        $this->sendDemoSite($file_downloads,$packname);

        // Возвращаем файл на скачивание клиенту
        $this->file_force_download_ngix($file_downloads);
        return $file;
    }

    /**
     * Отдача файла пользователю
     *
     * @param string $file - полный путь до файла
    */
    private function file_force_download_ngix($file) {
        $rFile = @fopen($file, 'r');
        $rOutput = fopen('php://output', 'w');
        if($rFile){
            header('Content-Disposition: attachment; filename='.basename($file));
            stream_copy_to_stream($rFile, $rOutput);
        }
    }

    /**
     * Отправка файла на демо сайт с последующией автоматической установкой
     *
     * @param string $file - полный путь до файла
     * @param string $packname - полный путь до файла
     * @return string
     */
    private function sendDemoSite($file, $packname) {
        $newfile = MODX_ASSETS_PATH.'extra/'.$packname;
        if (!copy($file, $newfile)) {
            echo "не удалось скопировать $file...\n";
        }
        return file_get_contents($this->demoSiteUrl.'?packname='.$packname);
    }
}

Создаем пункт меню

Ключ словаря: Создать пакет
Действие: install
Пространство имён: minishop2

Добавляем файл в корневую

// upload.php

<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
ini_set("max_execution_time", 50);
define('MODX_API_MODE', true);
require 'index.php';

#$_GET['packname'] = 'mspre-1.1.0-beta.transport.zip';
if (isset($_GET['packname'])) {
    $packname = $_GET['packname'];

    $tmp = explode('.', $packname);
    $tmp = array_pop($tmp);
    if ($tmp == 'zip') {
        $file_url = 'http://s919.h1.bumodx.ru/assets/extra/'.$packname;
        $save_to = MODX_CORE_PATH.'packages/'.$packname;

        $content = file_get_contents($file_url);
        file_put_contents($save_to, $content);

        if (!file_exists($save_to)) {
            echo '<pre>';
            print_r('Ошибка файл не существует'); die;
        }

        // Начинаем инсталяцию файла
        /* @var modProcessorResponse $response */
        // Download Details
        /** @var string $package_url  - URL from the orange 'Download' button on the MODx Extras website */
        $package_url = $file_url;
        #$package_url = 'http://modx.com/extras/download/?id=512403a2f245547611000025';
        $package_signature = substr($packname, 0 , -14);

        if($user = $modx->getObject('modUser', 1)){
            $modx->user = $user;
        }

        $modx->user->addSessionContext('mgr');

        if (!file_exists($modx->getOption('base_path').'core/packages/'.$package_signature)) {
            // Download the package
            $modx->runProcessor('workspace/packages/rest/download',array(
                'info' => $package_url.'::'.$package_signature
            ));
        }

        // Create modTransportPackage object in new modx install
        $scan = $modx->runProcessor('workspace/packages/scanlocal');
        // Run install command
        $response = $modx->runProcessor('workspace/packages/install',array(
            'signature' => $package_signature
        ));

        $dirpath = $modx->getOption('base_path').'core/packages/'.$package_signature.'/';
        $basepath = $modx->getOption('base_path').'core/packages/'.$packname;
        unlink($basepath);

        clear_dir($dirpath);

        echo '<pre>'; 
        print_r($response->response); die;

    }

}

function myscandir($dir)
{
    $list = scandir($dir);
    unset($list[0],$list[1]);
    return array_values($list);
}
// требуется myscandir
function clear_dir($dir = ''){
    $handle = opendir($dir);
    while(false !== ($folder = readdir($handle))){
        if ($folder == '.' or $folder == '..') continue;
        if (is_dir($dir.$folder)){
            clear_dir($dir.$folder."/");
            rmdir($dir.$folder);
        }
        if (is_file($dir.$folder)){
            unlink($dir.$folder);
        }
    }
    closedir($handle);
}
02 декабря 2017, 05:03    9



Наверх