create new command allowing to install thelia using cli tools

This commit is contained in:
Manuel Raynaud
2013-06-05 14:23:05 +02:00
parent bf7ab3c3b8
commit 785b450537
5 changed files with 242 additions and 34 deletions

1
.gitignore vendored
View File

@@ -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/*

View 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);
}
}

View File

@@ -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>

View File

@@ -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
{
}

View File

@@ -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%