/**
* Install command
*
* @return void
*/
protected function install()
{
if (!is_writable(PH_CLI_ROOT . '/config.php')) {
echo ' The configuration file is not writable. Please make it writable before continuing.' . PHP_EOL . PHP_EOL;
} else {
// Install config file and database
$input = array('language' => null, 'db_adapter' => null, 'db_name' => null, 'db_username' => null, 'db_password' => null, 'db_host' => defined('DB_HOST') && DB_HOST != '' ? DB_HOST : 'localhost', 'db_prefix' => defined('DB_PREFIX') && DB_HOST != '' ? DB_PREFIX : 'ph_', 'app_uri' => defined('APP_URI') ? APP_URI : '/phire', 'content_path' => defined('CONTENT_PATH') ? CONTENT_PATH : '/phire-content', 'password_encryption' => 4);
$langs = \Pop\I18n\I18n::getLanguages();
$langKeys = array_keys($langs);
$langsList = null;
$i = 1;
foreach ($langs as $key => $value) {
$num = $i < 10 ? ' ' . $i : $i;
$langsList .= ' ' . $num . ' : [' . $key . '] ' . $value . PHP_EOL;
$i++;
}
$db = array('Mysqli', 'Pdo\\Mysql', 'Pdo\\Pgsql', 'Pdo\\Sqlite', 'Pgsql', 'Sqlite');
echo 'Installation' . PHP_EOL;
echo '------------' . PHP_EOL;
echo PHP_EOL;
echo ' Select Language:' . PHP_EOL . PHP_EOL;
echo $langsList . PHP_EOL;
echo PHP_EOL;
$inputLang = -1;
while (!isset($langKeys[$inputLang])) {
$inputLang = self::cliInput(' Enter Language # (Enter for English): ');
if (empty($inputLang)) {
$inputLang = 3;
} else {
$inputLang--;
}
}
$input['language'] = $langKeys[$inputLang];
echo PHP_EOL . ' Select DB Adapter:' . PHP_EOL . PHP_EOL;
foreach ($db as $key => $value) {
echo ' ' . ($key + 1) . ' : ' . $value . PHP_EOL;
}
echo PHP_EOL;
$inputDb = -1;
while (!isset($db[$inputDb])) {
$inputDb = self::cliInput(' Enter DB Adapter #: ');
$inputDb--;
}
$input['db_adapter'] = $db[$inputDb];
if (stripos($input['db_adapter'], 'sqlite') === false) {
$input['db_name'] = self::cliInput(' DB Name: ');
$input['db_username'] = self::cliInput(' DB Username: '******'db_password'] = self::cliInput(' DB Password: '******' DB Host (Enter for \'' . $input['db_host'] . '\'): ');
$input['db_host'] = empty($inputHost) ? 'localhost' : $inputHost;
}
$inputPrefix = self::cliInput(' DB Prefix (Enter for \'' . $input['db_prefix'] . '\'): ');
$input['db_prefix'] = empty($inputPrefix) ? $input['db_prefix'] : $inputPrefix;
$inputAppUri = self::cliInput(' Application URI (Enter for \'' . $input['app_uri'] . '\'): ');
$input['app_uri'] = empty($inputAppUri) ? $input['app_uri'] : $inputAppUri;
$inputContentPath = self::cliInput(' Content Path (Enter for \'' . $input['content_path'] . '\'): ');
$input['content_path'] = empty($inputContentPath) ? $input['content_path'] : $inputContentPath;
// Check the content directory
if (!file_exists(PH_CLI_ROOT . $input['content_path'])) {
echo PHP_EOL . ' The content directory does not exist.' . PHP_EOL . PHP_EOL;
exit;
} else {
$checkDirs = Project::checkDirs(PH_CLI_ROOT . $input['content_path'], true);
if (count($checkDirs) > 0) {
echo PHP_EOL . ' The content directory (or subdirectories) are not writable.' . PHP_EOL . PHP_EOL;
exit;
}
}
echo PHP_EOL . ' ...Checking Database...';
if (stripos($input['db_adapter'], 'sqlite') === false) {
$oldError = ini_get('error_reporting');
error_reporting(E_ERROR);
$dbCheck = \Pop\Project\Install\Dbs::check(array('database' => $input['db_name'], 'username' => $input['db_username'], 'password' => $input['db_password'], 'host' => $input['db_host'], 'type' => str_replace('\\', '_', $input['db_adapter'])));
error_reporting($oldError);
if (null != $dbCheck) {
echo PHP_EOL . PHP_EOL . ' ' . wordwrap($dbCheck, 70, PHP_EOL . ' ') . PHP_EOL . PHP_EOL;
echo ' Please try again.' . PHP_EOL . PHP_EOL;
exit;
}
}
echo '..OK!' . PHP_EOL . ' ...Installing Database...';
$install = $install = new Model\Install();
$install->config(new \ArrayObject($input, \ArrayObject::ARRAY_AS_PROPS), realpath(PH_CLI_ROOT));
// Install initial user
echo 'OK!' . PHP_EOL . PHP_EOL . ' Initial User Setup:' . PHP_EOL . PHP_EOL;
$user = array('email' => null, 'username' => null, 'password' => null);
$email = '';
$username = '';
$password = '';
$emailValidator = new \Pop\Validator\Email();
$usernameValidator = new \Pop\Validator\AlphaNumeric();
while (!$emailValidator->evaluate($email)) {
$email = self::cliInput(' Enter User Email: ');
}
while (strlen($username) < 4 || !$usernameValidator->evaluate($username)) {
$username = self::cliInput(' Enter Username (> 4 characters): ');
}
while (strlen($password) < 6) {
$password = self::cliInput(' Enter Password (> 6 characters): ');
}
$user['email'] = $email;
$user['username'] = $username;
$user['password'] = $password;
echo PHP_EOL . ' ...Saving Initial User...' . PHP_EOL . PHP_EOL;
if (stripos($input['db_adapter'], 'Pdo') !== false) {
$dbInterface = 'Pdo';
$dbType = substr($input['db_adapter'], strpos($input['db_adapter'], '\\') + 1);
} else {
$dbInterface = $input['db_adapter'];
$dbType = null;
}
if (stripos($input['db_adapter'], 'sqlite') !== false) {
$input['db_name'] = PH_CLI_ROOT . $input['content_path'] . '/.htphire.sqlite';
chmod(realpath(PH_CLI_ROOT . $input['content_path'] . '/.htphire.sqlite'), 0777);
}
$db = \Pop\Db\Db::factory($dbInterface, array('type' => $dbType, 'database' => $input['db_name'], 'host' => $input['db_host'], 'username' => $input['db_username'], 'password' => $input['db_password']));
$db->adapter()->query("INSERT INTO " . $input['db_prefix'] . "users (type_id, role_id, username, password, email, verified, failed_attempts, site_ids, created) VALUES (2001, 3001, '" . $user['username'] . "', '" . Model\User::encryptPassword($user['password'], 4) . "', '" . $user['email'] . "', 1, 0, '" . serialize(array(0)) . "', '" . date('Y-m-d H:i:s') . "')");
$db->adapter()->query('UPDATE ' . $input['db_prefix'] . 'config SET value = \'' . $user['email'] . '\' WHERE setting = \'system_email\'');
}
}