diff --git a/core/lib/Thelia/Controller/Install/InstallController.php b/core/lib/Thelia/Controller/Install/InstallController.php index 75594868a..648ae843e 100644 --- a/core/lib/Thelia/Controller/Install/InstallController.php +++ b/core/lib/Thelia/Controller/Install/InstallController.php @@ -26,12 +26,14 @@ use Thelia\Install\CheckPermission; /** * Class InstallController + * * @package Thelia\Controller\Install - * @author Manuel Raynaud + * @author Manuel Raynaud + * @author Guillaume MOREL */ class InstallController extends BaseInstallController { - public function index() + public function indexAction() { //$this->verifyStep(1); @@ -40,57 +42,109 @@ class InstallController extends BaseInstallController return $this->render("index.html"); } - public function checkPermission() + /** + * Integration tests + * + * @return \Symfony\Component\HttpFoundation\Response + */ + public function checkPermissionAction() { + $args = array(); var_dump('step2'); //$this->verifyStep(2); - $permission = new CheckPermission(); + $checkPermission = new CheckPermission(true, $this->getTranslator()); + $args['isValid'] = $isValid = $checkPermission->exec(); + $args['validationMessages'] = $checkPermission->getValidationMessages(); $this->getSession()->set("step", 2); - return $this->render("step-2.html"); + + return $this->render("step-2.html", $args); } + /** + * Database connexion tests + * + * @return \Symfony\Component\HttpFoundation\Response + */ public function databaseConnection() { + var_dump('step 3 bis'); + } + + /** + * Database connexion tests + * + * @return \Symfony\Component\HttpFoundation\Response + */ + public function databaseConnectionAction() + { + var_dump('step 3'); + exit(); //$this->verifyStep(2); //$permission = new CheckPermission(); $this->getSession()->set("step", 3); + return $this->render("step-3.html"); } - public function databaseSelection() + /** + * Database selection + * + * @return \Symfony\Component\HttpFoundation\Response + */ + public function databaseSelectionAction() { //$this->verifyStep(2); //$permission = new CheckPermission(); $this->getSession()->set("step", 4); + return $this->render("step-4.html"); } - public function generalInformation() + /** + * Set general informations + * + * @return \Symfony\Component\HttpFoundation\Response + */ + public function generalInformationAction() { //$this->verifyStep(2); //$permission = new CheckPermission(); $this->getSession()->set("step", 5); + return $this->render("step-5.html"); } - public function thanks() + /** + * Display Thanks page + * + * @return \Symfony\Component\HttpFoundation\Response + */ + public function thanksAction() { //$this->verifyStep(2); //$permission = new CheckPermission(); $this->getSession()->set("step", 6); + return $this->render("thanks.html"); } + /** + * Verify each steps and redirect if one step has already been passed + * + * @param int $step Step number + * + * @return bool + */ protected function verifyStep($step) { $session = $this->getSession(); diff --git a/core/lib/Thelia/Install/BaseInstall.php b/core/lib/Thelia/Install/BaseInstall.php index 11b8d0999..86928236a 100644 --- a/core/lib/Thelia/Install/BaseInstall.php +++ b/core/lib/Thelia/Install/BaseInstall.php @@ -25,15 +25,28 @@ use Thelia\Install\Exception\AlreadyInstallException; /** * Class BaseInstall + * * @author Manuel Raynaud */ abstract class BaseInstall { + /** @var bool If Installation wizard is launched by CLI */ + protected $isConsoleMode = true; + /** - * Verify if an installation already exists + * Constructor + * + * @param bool $verifyInstall Verify if an installation already exists */ public function __construct($verifyInstall = true) { + + // Check if install wizard is launched via CLI + if (php_sapi_name() == 'cli') { + $this->isConsoleMode = true; + } else { + $this->isConsoleMode = false; + } /* TODO : activate this part if (file_exists(THELIA_ROOT . '/local/config/database.yml') && $verifyInstall) { throw new AlreadyInstallException("Thelia is already installed"); diff --git a/core/lib/Thelia/Install/CheckPermission.php b/core/lib/Thelia/Install/CheckPermission.php index e57185c36..d924bac35 100644 --- a/core/lib/Thelia/Install/CheckPermission.php +++ b/core/lib/Thelia/Install/CheckPermission.php @@ -23,57 +23,172 @@ namespace Thelia\Install; +use RecursiveDirectoryIterator; +use RecursiveIteratorIterator; +use Symfony\Component\Translation\TranslatorInterface; +use Thelia\Core\Translation\Translator; + /** * Class CheckPermission + * + * Take care of integration tests (files permissions) + * * @package Thelia\Install - * @author Manuel Raynaud + * @author Manuel Raynaud + * @author Guillaume MOREL */ class CheckPermission extends BaseInstall { - const DIR_CONF = 'local/config'; - const DIR_LOG = 'log'; - const DIR_CACHE = 'cache'; + const DIR_CONF = 'local/config'; + const DIR_LOG = 'log'; + const DIR_CACHE = 'cache'; - private $directories = array(); - private $validation = array(); - private $valid = true; + /** @var array Directory needed to be writable */ + protected $directoriesToBeWritable = array( + self::DIR_CONF, + self::DIR_LOG, + self::DIR_CACHE, + ); - public function __construct($verifyInstall = true) + protected $validationMessages = array(); + + /** @var bool If permissions are OK */ + protected $isValid = true; + + /** @var TranslatorInterface Translator Service */ + protected $translator = null; + + /** + * Constructor + * + * @param bool $verifyInstall If verify install + * @param Translator $translator Translator Service + * necessary for install wizard + */ + public function __construct($verifyInstall = true, Translator $translator = null) { + $this->translator = $translator; - - $this->directories = array( - self::DIR_CONF => THELIA_ROOT . 'local/config', - self::DIR_LOG => THELIA_ROOT . 'DIR_LOG', - self::DIR_CACHE => THELIA_ROOT . 'DIR_CACHE' - ); - - $this->validation = array( - self::DIR_CONF => array( - "text" => sprintf("config directory(%s)...", $this->directories[self::DIR_CONF]), - "status" => true - ), - self::DIR_LOG => array( - "text" => sprintf("DIR_CACHE directory(%s)...", $this->directories[self::DIR_LOG]), - "status" => true - ), - self::DIR_CACHE => array( - "text" => sprintf("DIR_LOG directory(%s)...", $this->directories[self::DIR_CACHE]), - "status" => true - ) - ); + foreach ($this->directoriesToBeWritable as $directory) { + $this->validationMessages[$directory] = array( + 'text' => '', + 'hint' => '', + 'status' => true + ); + } parent::__construct($verifyInstall); } + /** + * Perform file permission check + * + * @return bool + */ public function exec() { - foreach ($this->directories as $key => $directory) { - if(is_writable($directory) === false) { - $this->valid = false; - $this->validation[$key]["status"] = false; + foreach ($this->directoriesToBeWritable as $directory) { + $fullDirectory = THELIA_ROOT . $directory; + $this->validationMessages[$directory]['text'] = $this->getI18nText($fullDirectory, true); + if (is_writable($fullDirectory) === false) { + if (!$this->makeDirectoryWritable($fullDirectory)) { + $this->isValid = false; + $this->validationMessages[$directory]['status'] = false; + $this->validationMessages[$directory]['text'] = $this->getI18nText($fullDirectory, false); + $this->validationMessages[$directory]['hint'] = $this->getI18nHint($fullDirectory); + } } } + + return $this->isValid; } -} \ No newline at end of file + + /** + * Get validation messages + * + * @return array + */ + public function getValidationMessages() + { + return $this->validationMessages; + } + + /** + * Make a directory writable (recursively) + * + * @param string $directory path to directory + * + * @return bool + */ + protected function makeDirectoryWritable($directory) + { + chmod($directory, 0777); + $iterator = new RecursiveIteratorIterator( + new RecursiveDirectoryIterator($directory) + ); + foreach ($iterator as $item) { + chmod($item, 0777); + } + + return (is_writable(THELIA_ROOT . $directory) === true); + } + + + + /** + * Get Translated text about the directory state + * + * @param string $directory Directory being checked + * @param bool $isValid If directory permission is valid + * + * @return string + */ + protected function getI18nText($directory, $isValid) + { + if ($this->translator !== null) { + if ($isValid) { + $sentence = 'Your directory %directory% is writable'; + } else { + $sentence = 'Your directory %directory% is not writable'; + } + + $translatedText = $this->translator->trans( + $sentence, + array( + '%directory%' => $directory + ), + 'install-wizard' + ); + } else { + $translatedText = sprintf('Your directory %s needs to be writable', $directory); + } + + return $translatedText; + } + + /** + * Get Translated hint about the directory state + * + * @param string $directory Directory being checked + * + * @return string + */ + protected function getI18nHint($directory) + { + if ($this->translator !== null) { + $sentence = 'chmod 777 %directory% on your server with admin rights could help'; + $translatedText = $this->translator->trans( + $sentence, + array( + '%directory%' => $directory + ), + 'install-wizard' + ); + } else { + $translatedText = sprintf('chmod 777 %s on your server with admin rights could help', $directory); + } + + return $translatedText; + } +} diff --git a/templates/install/layout.tpl b/templates/install/layout.tpl index 4539ce32f..6b38292e2 100644 --- a/templates/install/layout.tpl +++ b/templates/install/layout.tpl @@ -38,7 +38,6 @@ - {intl l='Édité par OpenStudio'} - {intl l='Forum Thelia'} - {intl l='Contributions Thelia'} - {intl l='interface par Steaw-Webdesign'}

{module_include location='in_footer'} diff --git a/templates/install/step-2.html b/templates/install/step-2.html index fc24d25cb..a05267c7c 100644 --- a/templates/install/step-2.html +++ b/templates/install/step-2.html @@ -24,15 +24,14 @@
-

We will check some rights to files and directories...

+

{intl l="Checking directory permissions ..."}

    -
  • Duis mollis, est non commodo luctus, nisi erat porttitor ligula.
  • -
  • Duis mollis, est non commodo luctus, nisi erat porttitor ligula.
  • -
  • Duis mollis, est non commodo luctus, nisi erat porttitor ligula.
  • -
  • Duis mollis, est non commodo luctus, nisi erat porttitor ligula.
  • -
  • Duis mollis, est non commodo luctus, nisi erat porttitor ligula.
  • -
  • Duis mollis, est non commodo luctus, nisi erat porttitor ligula.
  • -
  • Duis mollis, est non commodo luctus, nisi erat porttitor ligula.
  • + {foreach from=$validationMessages item=validationMessage} +
  • + {$validationMessage.text nofilter} + {if !$validationMessage.status} - {$validationMessage.hint nofilter}{/if} +
  • + {/foreach}