From a7727d8523037af87569098eed50ed72dd89ad8e Mon Sep 17 00:00:00 2001 From: Olivier PEREZ Date: Mon, 31 Aug 2015 08:56:26 +0200 Subject: [PATCH] Install: Create installation page --- admin/install.php | 61 ++++++++ .../Framadate/Services/InstallService.php | 136 ++++++++++++++++++ app/inc/XXconfig.php | 88 ++++++++++++ app/inc/config.template.php | 6 - app/inc/init.php | 8 +- buildlang.php | 46 ++++++ compare.php | 69 +++++++++ locale/de.json | 1 + locale/en.json | 1 + locale/es.json | 1 + locale/fr.json | 23 ++- locale/it.json | 1 + po2json.php | 15 ++ tpl/admin/config.tpl | 89 ++++++++++++ tpl/admin/install.tpl | 104 ++++++++++++++ tpl/create_poll.tpl | 8 +- 16 files changed, 642 insertions(+), 15 deletions(-) create mode 100644 admin/install.php create mode 100644 app/classes/Framadate/Services/InstallService.php create mode 100644 app/inc/XXconfig.php create mode 100644 buildlang.php create mode 100644 compare.php create mode 100644 po2json.php create mode 100644 tpl/admin/config.tpl create mode 100644 tpl/admin/install.tpl diff --git a/admin/install.php b/admin/install.php new file mode 100644 index 0000000..4fbec15 --- /dev/null +++ b/admin/install.php @@ -0,0 +1,61 @@ + 'Français', + 'en' => 'English', + 'es' => 'Español', + 'de' => 'Deutsch', + 'it' => 'Italiano', +]; + +require_once '../app/inc/init.php'; +define('CONF_FILENAME', ROOT_DIR . '/app/inc/config.php'); + +if (file_exists(CONF_FILENAME)) { + header(('Location: ' . Utils::get_server_name())); + exit; +} + +$error = null; + +if (!empty($_POST)) { + $installService = new InstallService(); + $result = $installService->install($_POST, $smarty); + + if ($result['status'] === 'OK') { + header(('Location: ' . Utils::get_server_name() . '/admin/migration.php')); + exit; + } else { + $error = __('Error', $result['code']); + } +} + +$smarty->assign('error', $error); +$smarty->assign('title', __('Admin', 'Installation')); +$smarty->assign('logsAreReadable', is_readable('../' . LOG_FILE)); +$smarty->display('admin/install.tpl'); \ No newline at end of file diff --git a/app/classes/Framadate/Services/InstallService.php b/app/classes/Framadate/Services/InstallService.php new file mode 100644 index 0000000..2fd6841 --- /dev/null +++ b/app/classes/Framadate/Services/InstallService.php @@ -0,0 +1,136 @@ + + array( + 'appName' => 'Framadate', + 'appMail' => '', + 'responseMail' => '', + 'defaultLanguage' => 'fr', + 'cleanUrl' => true + ), + 'Database configuration' => + array( + 'dbConnectionString' => 'mysql:host=HOST;dbname=SCHEMA;port=3306', + 'dbUser' => 'root', + 'dbPassword' => '', + 'dbPrefix' => 'fd_', + 'migrationTable' => 'framadate_migration' + ) + ); + + function __construct() {} + + public function install($data, Smarty &$smarty) { + // Check values are present + if (empty($data['appName']) || empty($data['appMail']) || empty($data['defaultLanguage']) || empty($data['dbConnectionString']) || empty($data['dbUser'])) { + return $this->error('MISSING_VALUES'); + } + + // Connect to database + $connect = $this->connectTo($data['dbConnectionString'], $data['dbUser'], $data['dbPassword']); + if (!$connect) { + return $this->error('CANT_CONNECT_TO_DATABASE'); + } + + // Create database schema + $this->createDatabaseSchema($connect); + + // Write configuration to conf.php file + $this->writeConfiguration($data, $smarty); + + return $this->ok(); + } + + function connectTo($connectionString, $user, $password) { + try { + $pdo = @new \PDO($connectionString, $user, $password); + $pdo->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE, \PDO::FETCH_OBJ); + $pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); + return $pdo; + } catch(\Exception $e) { + return null; + } + } + + function writeConfiguration($data, Smarty &$smarty) { + foreach($this->fields as $groupKey=>$group) { + foreach ($group as $field=>$value) { + $smarty->assign($field, $data[$field]); + } + } + + $content = $smarty->fetch('admin/config.tpl'); + + $this->writeToFile($content); + } + + /** + * @param $content + */ + function writeToFile($content) { + file_put_contents(CONF_FILENAME, $content); + } + + /** + * Execute SQL installation scripts. + * + * @param \PDO $connect + */ + function createDatabaseSchema($connect) { + $dir = opendir(ROOT_DIR . '/install/'); + while ($dir && ($file = readdir($dir)) !== false) { + if ($file !== '.' && $file !== '..' && strpos($file, '.mysql.auto.sql')) { + $statement = file_get_contents(ROOT_DIR . '/install/' . $file); + $connect->exec($statement); + } + } + } + + /** + * @return array + */ + function ok() { + return array( + 'status' => 'OK', + 'msg' => __f('Installation', 'Ended', Utils::get_server_name()) + ); + } + + /** + * @param $msg + * @return array + */ + function error($msg) { + return array( + 'status' => 'ERROR', + 'code' => $msg + ); + } + +} diff --git a/app/inc/XXconfig.php b/app/inc/XXconfig.php new file mode 100644 index 0000000..6530d13 --- /dev/null +++ b/app/inc/XXconfig.php @@ -0,0 +1,88 @@ +'; + +// Application name +const NOMAPPLICATION = 'Développement OPZ'; + +// Database administrator email +const ADRESSEMAILADMIN = 'framadate-dev@olivierperez.fr'; + +// Email for automatic responses (you should set it to "no-reply") +const ADRESSEMAILREPONSEAUTO = 'no-reply@olivierperez.fr'; + +// Database user +const DB_USER= 'dev_framadate'; + +// Database password +const DB_PASSWORD = 'dev_framadate'; + +// Database server name, leave empty to use a socket +const DB_CONNECTION_STRING = 'mysql:host=localhost;dbname=framadate_dev;port=3306'; + +// Name of the table that store migration script already executed +const MIGRATION_TABLE = 'framadate_migration'; + +// Table name prefix +const TABLENAME_PREFIX = 'fd_'; + +// Default Language using POSIX variant of BC P47 standard (choose in $ALLOWED_LANGUAGES) +const DEFAULT_LANGUAGE = 'fr'; + +// List of supported languages, fake constant as arrays can be used as constants only in PHP >=5.6 +$ALLOWED_LANGUAGES = [ + 'fr' => 'Français', + 'en' => 'English', + 'es' => 'Español', + 'de' => 'Deutsch', + 'it' => 'Italiano', +]; + +// Nom et emplacement du fichier image contenant le titre +const IMAGE_TITRE = 'images/logo-framadate.png'; + +// Clean URLs, boolean +const URL_PROPRE = false; + +// Use REMOTE_USER data provided by web server +const USE_REMOTE_USER = true; + +// Path to the log file +const LOG_FILE = 'admin/stdout.log'; + +// Days (after expiration date) before purge a poll +const PURGE_DELAY = 60; + +// Config +$config = [ + /* general config */ + 'use_smtp' => false, // use email for polls creation/modification/responses notification + /* home */ + 'show_what_is_that' => true, // display "how to use" section + 'show_the_software' => true, // display technical information about the software + 'show_cultivate_your_garden' => true, // display "developpement and administration" information + /* create_classic_poll.php / create_date_poll.php */ + 'default_poll_duration' => 180, // default values for the new poll duration (number of days). + /* create_classic_poll.php */ + 'user_can_add_img_or_link' => true, // user can add link or URL when creating his poll. +]; diff --git a/app/inc/config.template.php b/app/inc/config.template.php index a29b573..9aad34e 100644 --- a/app/inc/config.template.php +++ b/app/inc/config.template.php @@ -58,12 +58,6 @@ $ALLOWED_LANGUAGES = [ 'it' => 'Italiano', ]; -// Path to logo -const LOGOBANDEAU = ''; - -// Path to logo in PDF export -const LOGOLETTRE = ''; - // Nom et emplacement du fichier image contenant le titre const IMAGE_TITRE = 'images/logo-framadate.png'; diff --git a/app/inc/init.php b/app/inc/init.php index 63379ef..ef31bdf 100644 --- a/app/inc/init.php +++ b/app/inc/init.php @@ -34,13 +34,15 @@ if (ini_get('date.timezone') == '') { define('ROOT_DIR', __DIR__ . '/../../'); require_once __DIR__ . '/constants.php'; -require_once __DIR__ . '/config.php'; +@include_once __DIR__ . '/config.php'; require_once __DIR__ . '/i18n.php'; // Smarty require_once __DIR__ . '/smarty.php'; // Connection to database -$connect = new FramaDB(DB_CONNECTION_STRING, DB_USER, DB_PASSWORD); -RepositoryFactory::init($connect); +if (is_file(__DIR__ . '/config.php')) { + $connect = new FramaDB(DB_CONNECTION_STRING, DB_USER, DB_PASSWORD); + RepositoryFactory::init($connect); +} $err = 0; diff --git a/buildlang.php b/buildlang.php new file mode 100644 index 0000000..9677f40 --- /dev/null +++ b/buildlang.php @@ -0,0 +1,46 @@ + + + + + +
 $section) {
+        foreach ($section as $key => $value) {
+            $good[$sectionName][$key] = getFromOther($other, $key, $value, $otherLang);
+        }
+    }
+
+    echo json_encode($good, JSON_PRETTY_PRINT | ~(JSON_ERROR_UTF8 | JSON_HEX_QUOT | JSON_HEX_APOS));
+
+    function getFromOther($other, $goodKey, $default, $otherLang) {
+        foreach ($other as $sectionName => $section) {
+            foreach ($section as $key => $value) {
+                if (
+                    strtolower($key) === strtolower($goodKey) ||
+                    strtolower(trim($key)) === strtolower($goodKey) ||
+                    strtolower(substr($key, 0, strlen($key) - 1)) === strtolower($goodKey) ||
+                    strtolower(trim(substr(trim($key), 0, strlen($key) - 1))) === strtolower($goodKey)
+                ) {
+                    return $value;
+                }
+            }
+        }
+
+        echo '[-]' . $goodKey . "\n";
+
+        return strtoupper($otherLang) . '_' . $default;
+    }
+
+    ?>
+
+ + diff --git a/compare.php b/compare.php new file mode 100644 index 0000000..aa780a4 --- /dev/null +++ b/compare.php @@ -0,0 +1,69 @@ + + + + + +
 $section) {
+        if (!isset($test[$sectionName])) {
+            echo '- section: ' . $sectionName . "\n";
+            $diffSection = true;
+        }
+    }
+    foreach ($test as $sectionName => $section) {
+        if (!isset($good[$sectionName])) {
+            echo '+ section: ' . $sectionName . "\n";
+            $diffSection = true;
+        }
+    }
+
+    if (!$diffSection and array_keys($good)!=array_keys($test)) {
+        var_dump(array_keys($good));
+        var_dump(array_keys($test));
+    } else {
+        echo 'All sections are in two langs.' . "\n";
+    }
+
+
+    $diff = array();
+
+    foreach ($good as $sectionName => $section) {
+        $diffSection = false;
+        foreach($section as $key=>$value) {
+            if (!isset($test[$sectionName][$key])) {
+                $diff[$sectionName]['-'][] = $key;
+                $diffSection = true;
+            }
+        }
+
+        if (!$diffSection and array_keys($good[$sectionName]) != array_keys($test[$sectionName])) {
+            $diff[$sectionName]['order_good'] = array_keys($good[$sectionName]);
+            $diff[$sectionName]['order_test'] = array_keys($test[$sectionName]);
+        }
+    }
+
+    foreach ($test as $sectionName => $section) {
+        foreach($section as $key=>$value) {
+            if (!isset($good[$sectionName][$key])) {
+                $diff[$sectionName]['+'][] = $key;
+            }
+        }
+    }
+    if (count($diff) > 0) {
+        var_dump($diff);
+    }
+    ?>
+
+ + diff --git a/locale/de.json b/locale/de.json index f33b3ac..a6d180d 100644 --- a/locale/de.json +++ b/locale/de.json @@ -261,6 +261,7 @@ "Migration": "Migration", "Purge": "Säuberung", "Logs": "Verlauf", + "Installation": "Installation", "Poll ID": "Umfrage-ID", "Format": "Format", "Title": "Titel", diff --git a/locale/en.json b/locale/en.json index 8f0dbe7..2edcb2b 100644 --- a/locale/en.json +++ b/locale/en.json @@ -259,6 +259,7 @@ "Migration": "Migration", "Purge": "Purge", "Logs": "Logs", + "Installation": "Installation", "Poll ID": "Poll ID", "Format": "Format", "Title": "Title", diff --git a/locale/es.json b/locale/es.json index fbb6c6b..7635590 100644 --- a/locale/es.json +++ b/locale/es.json @@ -261,6 +261,7 @@ "Migration": "ES_Migration", "Purge": "ES_Purge", "Logs": "Histórico", + "Installation": "Instalación", "Poll ID": "ES_ID sondage", "Format": "ES_Format", "Title": "ES_Titre", diff --git a/locale/fr.json b/locale/fr.json index 7e420b5..4c267f0 100644 --- a/locale/fr.json +++ b/locale/fr.json @@ -36,7 +36,8 @@ "Choice": "Choix", "Link": "Lien", "Search": "Chercher", - "Creation date:": "Date de création :" + "Creation date:": "Date de création :", + "ASTERISK": "*" }, "Date": { "dd/mm/yyyy": "jj/mm/aaaa", @@ -261,6 +262,7 @@ "Migration": "Migration", "Purge": "Purge", "Logs": "Historique", + "Installation": "Installation", "Poll ID": "ID sondage", "Format": "Format", "Title": "Titre", @@ -309,6 +311,21 @@ "Author's message": "Réservé à l'auteur", "For sending to the polled users": "Pour diffusion aux sondés" }, + "Installation": { + "AppMail": "Adresse mail de l'application", + "AppName": "Nom de l'application", + "CleanUrl": "URL propres", + "Database": "Base de données", + "DbConnectionString": "Chaîne de connexion", + "DbPassword": "Mot de passe", + "DbPrefix": "Préfixe", + "DbUser": "Utilisateur", + "DefaultLanguage": "Langue par défaut", + "General": "Général", + "Install": "Installer", + "MigrationTable": "Table de migration", + "ResponseMail": "Mail de réponse" + }, "Error": { "Error!": "Erreur !", "Enter a title": "Il faut saisir un titre !", @@ -333,6 +350,8 @@ "Adding vote failed": "Ajout d'un vote échoué", "Comment failed": "Commentaire échoué", "You can't create a poll with hidden results with the following edition option:": "Vous ne pouvez pas créer de sondage avec résulats cachés avec les options d'éditions suivantes : ", - "Failed to delete column": "Échec de la suppression de colonne" + "Failed to delete column": "Échec de la suppression de colonne", + "MISSING_VALUES": "Il manque des valeurs", + "CANT_CONNECT_TO_DATABASE": "Impossible de se connecter à la base de données" } } diff --git a/locale/it.json b/locale/it.json index 977f254..904efa6 100644 --- a/locale/it.json +++ b/locale/it.json @@ -261,6 +261,7 @@ "Migration": "IT_Migration", "Purge": "IT_Purge", "Logs": "Log", + "Installation": "Installazione", "Poll ID": "ID sondaggio", "Format": "Formato", "Title": "Titolo", diff --git a/po2json.php b/po2json.php new file mode 100644 index 0000000..07b77b7 --- /dev/null +++ b/po2json.php @@ -0,0 +1,15 @@ + + + + + +
convert($po);
+print_r($json);
+?>
+ diff --git a/tpl/admin/config.tpl b/tpl/admin/config.tpl new file mode 100644 index 0000000..3254e91 --- /dev/null +++ b/tpl/admin/config.tpl @@ -0,0 +1,89 @@ +'; + +// Application name +const NOMAPPLICATION = '{$appName}'; + +// Database administrator email +const ADRESSEMAILADMIN = '{$appMail}'; + +// Email for automatic responses (you should set it to "no-reply") +const ADRESSEMAILREPONSEAUTO = '{$responseMail}'; + +// Database server name, leave empty to use a socket +const DB_CONNECTION_STRING = '{$dbConnectionString}'; + +// Database user +const DB_USER= '{$dbUser}'; + +// Database password +const DB_PASSWORD = '{$dbPassword}'; + +// Table name prefix +const TABLENAME_PREFIX = '{$dbPrefix}'; + +// Name of the table that store migration script already executed +const MIGRATION_TABLE = '{$migrationTable}'; + +// Default Language +const DEFAULT_LANGUAGE = '{$defaultLanguage}'; + +// List of supported languages, fake constant as arrays can be used as constants only in PHP >=5.6 +$ALLOWED_LANGUAGES = [ + 'fr' => 'Français', + 'en' => 'English', + 'es' => 'Español', + 'de' => 'Deutsch', + 'it' => 'Italiano', +]; + +// Nom et emplacement du fichier image contenant le titre +const IMAGE_TITRE = 'images/logo-framadate.png'; + +// Clean URLs, boolean +const URL_PROPRE = {if in_array($cleanUrl, array('1', 'on', 'true'))}true{else}false{/if}; + +// Use REMOTE_USER data provided by web server +const USE_REMOTE_USER = true; + +// Path to the log file +const LOG_FILE = 'admin/stdout.log'; + +// Days (after expiration date) before purge a poll +const PURGE_DELAY = 60; + +// Config +$config = [ + /* general config */ + 'use_smtp' => true, // use email for polls creation/modification/responses notification + /* home */ + 'show_what_is_that' => true, // display "how to use" section + 'show_the_software' => true, // display technical information about the software + 'show_cultivate_your_garden' => true, // display "developpement and administration" information + /* create_classic_poll.php / create_date_poll.php */ + 'default_poll_duration' => 180, // default values for the new poll duration (number of days). + /* create_classic_poll.php */ + 'user_can_add_img_or_link' => true, // user can add link or URL when creating his poll. +]; + diff --git a/tpl/admin/install.tpl b/tpl/admin/install.tpl new file mode 100644 index 0000000..da314e4 --- /dev/null +++ b/tpl/admin/install.tpl @@ -0,0 +1,104 @@ +{extends 'admin/admin_page.tpl'} + +{block 'main'} +
+
+
+ + {if $error} +
{$error}
+ {/if} + +
+ {__('Installation', 'General')} +
+
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+ + +
+ +
+
+
+
+ +
+ {__('Installation', 'Database')} +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+
+ +
+ +
+ +
+
+
+{/block} diff --git a/tpl/create_poll.tpl b/tpl/create_poll.tpl index c064dbf..a298396 100644 --- a/tpl/create_poll.tpl +++ b/tpl/create_poll.tpl @@ -96,10 +96,6 @@
- +