. */ /* */ /*************************************************************************************/ namespace Thelia\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\DependencyInjection\Tests\Compiler\CheckExceptionOnInvalidReferenceBehaviorPassTest; 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") ->setHelp("The thelia:install command install Thelia database and create config file needed.") ; } 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)', '' )); $this->checkPermission($output); do { $connectionInfo = $this->getConnectionInfo($input, $output); } while(false === $connection = $this->tryConnection($connectionInfo, $output)); $this->createDatabase($connection, $connectionInfo["dbName"]); $output->writeln(array( "", "Creating Thelia database, please wait", "" )); $this->insertSql($connection, $connectionInfo["dbName"]); $output->writeln(array( "", "Database created without errors", "Creating file configuration, please wait", "" )); $this->createConfigFile($connectionInfo); $output->writeln(array( "", "Config file created with success. Your thelia is installed", "" )); } protected function checkPermission(OutputInterface $output) { $output->writeln(array( "Checking some permissions" )); $confDir = THELIA_ROOT . "local/config"; $cacheDir = THELIA_ROOT . "cache"; $logDir = THELIA_ROOT . "log"; $conf = is_writable($confDir); $cache = is_writable($cacheDir); $log = is_writable($logDir); $output->writeln(array( sprintf( "config directory(%s)... %s", $confDir, $conf ? "Ok" : "Fail" ), sprintf( "cache directory(%s)... %s" ,$cacheDir, $cache ? "Ok" : "Fail" ), sprintf( "log directory(%s)... %s", $logDir, $log ? "Ok" : "Fail" ), )); if ($conf === false || $cache === false || $log === false) { $output->writeln(array( "", "Please put correct permission and reload install process" )); exit; } } 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; $iquery( sprintf( "CREATE DATABASE IF NOT EXISTS %s CHARACTER SET utf8", $dbName ) ); } protected function tryConnection($connectionInfo, OutputInterface $output) { $dsn = "mysql:host=%s"; try { $connection = new \PDO( sprintf($dsn, $connectionInfo["host"]), $connectionInfo["username"], $connectionInfo["password"] ); } catch (\PDOException $e) { $output->writeln(array( "Wrong connection information" )); 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("%s", $text); } }