#!/usr/bin/env php $source_dir) { echo "➡️ [$index]: $project_root/$source_dir\n"; } $selected = readline("❔ Select source dir [default: 0]: "); $selected = empty($selected) ? 0 : $selected; if (!isset($source_dirs[$selected])) { echo "⛔ Invalid selection\n"; exit(2); } $source_dir = $project_root . '/' . $source_dirs[$selected]; $source_dir = rtrim($source_dir, '/') . '/'; $namespaces = array_keys($composer_arr['autoload']['psr-4']); $namespace = $namespaces[$selected]; echo "✔️ Source dir: {$source_dir} with namespace: {$namespace}\n"; // Copy files echo "ℹ️ Copy files\n"; copyFile($project_root . '/config/Configuration.php', '<' . '?php $others_config = scandir(__DIR__); $loaded = false; foreach ($others_config as $file) { if ($file == basename(__FILE__)) continue; if (substr($file, -4) == \'.php\') { require_once __DIR__ . \'/\' . $file; $loaded = true; } } if (!$loaded) { class Configuration { public const DB_TYPE = \'sqlite\'; // MySQL public const DB_HOST = \'localhost\'; public const DB_USER = \'username\'; public const DB_PASS = \'****************\'; public const DB_NAME = \'databasename\'; // SQLite public const DB_FILEPATH = __DIR__ . \'/../../data/database.db\'; } } $protocol = (!empty($_SERVER[\'HTTPS\']) && $_SERVER[\'HTTPS\'] !== \'off\') ? "https://" : "http://"; $host = $_SERVER[\'HTTP_HOST\']; $uri = $_SERVER[\'REQUEST_URI\']; // obsahuje aj query string define(\'URL_PREFIX\', $protocol.$host.str_replace(basename($_SERVER[\'SCRIPT_NAME\']), \'\', $_SERVER[\'SCRIPT_NAME\'])); '); copyFile($source_dir . 'Maintenance.php', '<' . '?php namespace ' . rtrim($namespace, '\\') . '; class Maintenance extends \TPsoft\DBmodel\Maintenance { public function database() { if (!$this->existsTable(\'options\')) { $this->checkDBTable(\'options\', \' `key` VARCHAR(255) NOT NULL PRIMARY KEY, `value` VARCHAR(255) NOT NULL \'); $this->dbver(1); } $dbver = $this->dbver(); if ($dbver == 1) { // create new } } protected function settings(string $key, ?string $value = null): string|false { if (is_null($value)) { return $this->dbh->getOne(sprintf(\'SELECT `value` FROM `options` WHERE `key` = %s\', $this->dbh->quote($key))); } else { $db_type = $this->dbh->getDBtype(); switch ($db_type) { case \'mysql\': return $this->dbh->query(sprintf( \'INSERT INTO `options` (`key`, `value`) VALUES (%s, %s) ON DUPLICATE KEY UPDATE `value` = %s\', $this->dbh->quote($key), $this->dbh->quote($value), $this->dbh->quote($value) )) !== false; break; case \'sqlite\': return $this->dbh->query(sprintf( \'INSERT INTO `options` (`key`, `value`) VALUES (%s, %s) ON CONFLICT(`key`) DO UPDATE SET `value` = %s\', $this->dbh->quote($key), $this->dbh->quote($value), $this->dbh->quote($value) )) !== false; break; default: new \Exception(\'Unknown DB type: \' . $db_type); return false; break; } } } protected function dbver(?string $ver = null) { return $this->settings(\'version\', $ver); } } '); copyFile($source_dir . 'Init.php', '<' . '?php require __DIR__ . \'/../vendor/autoload.php\'; use \TPsoft\DBmodel\DBmodel; use \\' . $namespace . 'Maintenance; global $dbh; if (Configuration::DB_TYPE == \'mysql\') { $dbh = new DBmodel(sprintf(\'mysql:host=%s;dbname=%s;charset=utf8mb4\', Configuration::DB_HOST, Configuration::DB_NAME), Configuration::DB_USER, Configuration::DB_PASS); } else if (Configuration::DB_TYPE == \'sqlite\') { $dbh = new DBmodel(sprintf(\'sqlite:%s\', Configuration::DB_FILEPATH)); } else { throw new Exception(\'Unknown database type\'); } $maintenance = new Maintenance($dbh); $maintenance->database(); '); copyFile($project_root . '/scripts/createModel.php', '<' . '?php require_once __DIR__ . \'/../src/Init.php\'; use \TPsoft\DBmodel\Creator; global $dbh; $creator = new Creator($dbh); $creator->rootDir(realpath(__DIR__.\'/../src/\')); $creator->interact(); '); // Change composer.json if (!isset($composer_arr['autoload']['files'])) { $composer_arr['autoload']['files'] = []; } $composer_arr['autoload']['files'][] = 'config/Configuration.php'; if (!isset($composer_arr['scripts'])) { $composer_arr['scripts'] = []; } if (!isset($composer_arr['scripts']['model'])) { $composer_arr['scripts']['model'] = 'php scripts/createModel.php'; } $composer_json = json_encode($composer_arr, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); $composer_json = preg_replace_callback( '/^( +)/m', fn($m) => str_repeat("\t", intdiv(strlen($m[1]), 4)), $composer_json ); $suc = file_put_contents($project_root . '/composer.json', $composer_json); if ($suc) { echo "✅ File changed: $project_root/composer.json\n"; } else { echo "🔴 Failed to change file: $project_root/composer.json\n"; } /** * Functions */ function findProjectRoot(string $startDir): ?string { $dir = realpath($startDir); if (!$dir) return null; while ($dir && $dir !== dirname($dir)) { if (is_file($dir . '/vendor/autoload.php')) { return $dir; } $dir = dirname($dir); } return null; } function copyFile(string $destination, string $content): bool { $dir = dirname($destination); if (!file_exists($dir)) { mkdir($dir, 0777, true); } if (file_exists($destination)) { echo "⚠️ File already exists: $destination\n"; $confirm = readline("❔ Overwrite? (y - yes, other - no): "); if ($confirm != 'y') { return false; } } $suc = file_put_contents($destination, $content) !== false; if ($suc) { echo "✅ File created: $destination\n"; } else { echo "🔴 Failed to create file: $destination\n"; } return $suc; }