create new command allowing to install thelia using cli tools
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -2,6 +2,7 @@ local/config/build.properties
|
|||||||
local/config/config_db.php
|
local/config/config_db.php
|
||||||
local/config/build
|
local/config/build
|
||||||
local/config/database.yml
|
local/config/database.yml
|
||||||
|
local/config/database.yml.sample.save
|
||||||
core/vendor
|
core/vendor
|
||||||
local/config/runtime-conf.xml
|
local/config/runtime-conf.xml
|
||||||
cache/*
|
cache/*
|
||||||
|
|||||||
236
core/lib/Thelia/Command/Install.php
Normal file
236
core/lib/Thelia/Command/Install.php
Normal file
@@ -0,0 +1,236 @@
|
|||||||
|
<?php
|
||||||
|
/*************************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* Thelia */
|
||||||
|
/* */
|
||||||
|
/* Copyright (c) OpenStudio */
|
||||||
|
/* email : info@thelia.net */
|
||||||
|
/* web : http://www.thelia.net */
|
||||||
|
/* */
|
||||||
|
/* This program is free software; you can redistribute it and/or modify */
|
||||||
|
/* it under the terms of the GNU General Public License as published by */
|
||||||
|
/* the Free Software Foundation; either version 3 of the License */
|
||||||
|
/* */
|
||||||
|
/* This program is distributed in the hope that it will be useful, */
|
||||||
|
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
|
||||||
|
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
|
||||||
|
/* GNU General Public License for more details. */
|
||||||
|
/* */
|
||||||
|
/* You should have received a copy of the GNU General Public License */
|
||||||
|
/* along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
/* */
|
||||||
|
/*************************************************************************************/
|
||||||
|
|
||||||
|
namespace Thelia\Command;
|
||||||
|
|
||||||
|
use Symfony\Component\Console\Input\InputInterface;
|
||||||
|
use Symfony\Component\Console\Input\InputOption;
|
||||||
|
use Symfony\Component\Console\Output\OutputInterface;
|
||||||
|
use Symfony\Component\Filesystem\Filesystem;
|
||||||
|
use Thelia\Command\ContainerAwareCommand;
|
||||||
|
use Thelia\Core\Event\TheliaEvents;
|
||||||
|
|
||||||
|
|
||||||
|
class Install extends ContainerAwareCommand
|
||||||
|
{
|
||||||
|
protected function configure()
|
||||||
|
{
|
||||||
|
$this
|
||||||
|
->setName("thelia:install")
|
||||||
|
->setDescription("Install thelia using cli tools. For now Thelia only use mysql database")
|
||||||
|
;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function execute(InputInterface $input, OutputInterface $output)
|
||||||
|
{
|
||||||
|
$output->writeln(array(
|
||||||
|
'',
|
||||||
|
'Welcome to Thelia install process',
|
||||||
|
'You need information about your database configuration (host, username, password, database name, etc)',
|
||||||
|
''
|
||||||
|
));
|
||||||
|
|
||||||
|
$connectionInfo = $this->getConnectionInfo($input, $output);
|
||||||
|
|
||||||
|
if (false === $connection = $this->tryConnection($connectionInfo)) {
|
||||||
|
throw new \RuntimeException("Wrong information, impossible to connect to database");
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->createDatabase($connection, $connectionInfo["dbName"]);
|
||||||
|
|
||||||
|
$output->writeln(array(
|
||||||
|
"",
|
||||||
|
"<info>Creating Thelia database, please wait</info>",
|
||||||
|
""
|
||||||
|
));
|
||||||
|
$this->insertSql($connection, $connectionInfo["dbName"]);
|
||||||
|
|
||||||
|
$output->writeln(array(
|
||||||
|
"",
|
||||||
|
"<info>Database created without errors</info>",
|
||||||
|
"<info>Creating file configuration, please wait</info>",
|
||||||
|
""
|
||||||
|
));
|
||||||
|
|
||||||
|
$this->createConfigFile($connectionInfo);
|
||||||
|
|
||||||
|
$output->writeln(array(
|
||||||
|
"",
|
||||||
|
"<info>Config file created with success. Your thelia is installed</info>",
|
||||||
|
""
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function createConfigFile($connectionInfo)
|
||||||
|
{
|
||||||
|
$fs = new Filesystem();
|
||||||
|
|
||||||
|
$sampleConfigFile = THELIA_ROOT . "/local/config/database.yml.sample";
|
||||||
|
$configFile = THELIA_ROOT . "/local/config/database.yml";
|
||||||
|
|
||||||
|
|
||||||
|
$fs->copy($sampleConfigFile, $configFile, true);
|
||||||
|
|
||||||
|
$configContent = file_get_contents($configFile);
|
||||||
|
|
||||||
|
$configContent = str_replace("%DRIVER%", "mysql", $configContent);
|
||||||
|
$configContent = str_replace("%USERNAME%", $connectionInfo["username"], $configContent);
|
||||||
|
$configContent = str_replace("%PASSWORD%", $connectionInfo["password"], $configContent);
|
||||||
|
$configContent = str_replace(
|
||||||
|
"%DSN%",
|
||||||
|
sprintf("mysql:host=%s;dbname=%s", $connectionInfo["host"], $connectionInfo["dbName"]),
|
||||||
|
$configContent
|
||||||
|
);
|
||||||
|
|
||||||
|
file_put_contents($configFile, $configContent);
|
||||||
|
|
||||||
|
$fs->remove($sampleConfigFile);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function insertSql(\PDO $connection, $dbName)
|
||||||
|
{
|
||||||
|
$connection->query(sprintf("use %s", $dbName));
|
||||||
|
$sql = array();
|
||||||
|
$sql = array_merge(
|
||||||
|
$sql,
|
||||||
|
$this->prepareSql(file_get_contents(THELIA_ROOT . "/install/thelia.sql")),
|
||||||
|
$this->prepareSql(file_get_contents(THELIA_ROOT . "/install/insert.sql"))
|
||||||
|
);
|
||||||
|
|
||||||
|
for ($i = 0; $i < count($sql); $i ++) {
|
||||||
|
$connection->query($sql[$i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function prepareSql($sql)
|
||||||
|
{
|
||||||
|
$sql = str_replace(";',", "-CODE-", $sql);
|
||||||
|
$query = array();
|
||||||
|
|
||||||
|
$tab = explode(";", $sql);
|
||||||
|
|
||||||
|
for($i=0; $i<count($tab); $i++){
|
||||||
|
$queryTemp = str_replace("-CODE-", ";',", $tab[$i]);
|
||||||
|
$queryTemp = str_replace("|", ";", $queryTemp);
|
||||||
|
$query[] = $queryTemp;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $query;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function createDatabase(\PDO $connection, $dbName)
|
||||||
|
{
|
||||||
|
$connection->query(
|
||||||
|
sprintf(
|
||||||
|
"CREATE DATABASE IF NOT EXISTS %s CHARACTER SET utf8",
|
||||||
|
$dbName
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function tryConnection($connectionInfo)
|
||||||
|
{
|
||||||
|
|
||||||
|
$dsn = "mysql:host=%s";
|
||||||
|
|
||||||
|
try {
|
||||||
|
$connection = new \PDO(
|
||||||
|
sprintf($dsn, $connectionInfo["host"]),
|
||||||
|
$connectionInfo["username"],
|
||||||
|
$connectionInfo["password"]
|
||||||
|
);
|
||||||
|
} catch (\PDOException $e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return $connection;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getConnectionInfo(InputInterface $input, OutputInterface $output)
|
||||||
|
{
|
||||||
|
$dialog = $this->getHelperSet()->get('dialog');
|
||||||
|
|
||||||
|
$connectionInfo = array();
|
||||||
|
|
||||||
|
$connectionInfo["host"] = $dialog->askAndValidate(
|
||||||
|
$output,
|
||||||
|
$this->decorateInfo("Database host : "),
|
||||||
|
function ($answer) {
|
||||||
|
$answer = trim($answer);
|
||||||
|
if (is_null($answer)) {
|
||||||
|
throw new \RuntimeException("You must specify database host");
|
||||||
|
}
|
||||||
|
|
||||||
|
return $answer;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
$connectionInfo["dbName"] = $dialog->askAndValidate(
|
||||||
|
$output,
|
||||||
|
$this->decorateInfo("Database Name (if database does not exists, Thelia will try to create it) : "),
|
||||||
|
function ($answer) {
|
||||||
|
$answer = trim($answer);
|
||||||
|
|
||||||
|
if (is_null($answer)) {
|
||||||
|
throw new \RuntimeException("You must specify database name");
|
||||||
|
}
|
||||||
|
|
||||||
|
return $answer;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
$connectionInfo["username"] = $dialog->askAndValidate(
|
||||||
|
$output,
|
||||||
|
$this->decorateInfo("Databse username : "),
|
||||||
|
function ($answer) {
|
||||||
|
$answer = trim($answer);
|
||||||
|
|
||||||
|
if (is_null($answer)) {
|
||||||
|
throw new \RuntimeException("You must sprcify database username");
|
||||||
|
}
|
||||||
|
|
||||||
|
return $answer;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
$connectionInfo["password"] = $dialog->askHiddenResponse(
|
||||||
|
$output,
|
||||||
|
$this->decorateInfo("Database password : ")
|
||||||
|
);
|
||||||
|
|
||||||
|
return $connectionInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function decorateInfo($text)
|
||||||
|
{
|
||||||
|
return sprintf("<info>%s</info>", $text);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -14,6 +14,7 @@
|
|||||||
|
|
||||||
<commands>
|
<commands>
|
||||||
<command class="Thelia\Command\CacheClear"/>
|
<command class="Thelia\Command\CacheClear"/>
|
||||||
|
<command class="Thelia\Command\Install"/>
|
||||||
</commands>
|
</commands>
|
||||||
|
|
||||||
<services>
|
<services>
|
||||||
|
|||||||
@@ -1,30 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*************************************************************************************/
|
|
||||||
/* */
|
|
||||||
/* Thelia */
|
|
||||||
/* */
|
|
||||||
/* Copyright (c) OpenStudio */
|
|
||||||
/* email : info@thelia.net */
|
|
||||||
/* web : http://www.thelia.net */
|
|
||||||
/* */
|
|
||||||
/* This program is free software; you can redistribute it and/or modify */
|
|
||||||
/* it under the terms of the GNU General Public License as published by */
|
|
||||||
/* the Free Software Foundation; either version 3 of the License */
|
|
||||||
/* */
|
|
||||||
/* This program is distributed in the hope that it will be useful, */
|
|
||||||
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
|
|
||||||
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
|
|
||||||
/* GNU General Public License for more details. */
|
|
||||||
/* */
|
|
||||||
/* You should have received a copy of the GNU General Public License */
|
|
||||||
/* along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
||||||
/* */
|
|
||||||
/*************************************************************************************/
|
|
||||||
|
|
||||||
namespace Thelia\Tests\Config\Loader;
|
|
||||||
|
|
||||||
|
|
||||||
class XmlFileLoaderTest extends \PHPUnit_Framework_TestCase
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
database:
|
database:
|
||||||
connection:
|
connection:
|
||||||
driver: mysql
|
driver: %DRIVER%
|
||||||
user: root
|
user: %USERNAME%
|
||||||
password:
|
password: %PASSWORD%
|
||||||
dsn: mysql:dbname=thelia;host:localhost
|
dsn: %DSN%
|
||||||
|
|||||||
Reference in New Issue
Block a user