added set rootDir for Creator, added deduct numeric (unix timestamp) for datetime column, added method existsTable for Maintenance
189 lines
5.1 KiB
PHP
189 lines
5.1 KiB
PHP
<?php
|
|
|
|
namespace TPsoft\DBmodel;
|
|
|
|
class Creator {
|
|
|
|
private DBmodel $dbh;
|
|
private string $rootDir = '';
|
|
|
|
public function __construct(?DBmodel $dbh = null) {
|
|
if (is_null($dbh)) {
|
|
if (!is_null(DBmodel::$instance)) {
|
|
$this->dbh = DBmodel::$instance;
|
|
} else {
|
|
throw new \Exception('DB handler is null');
|
|
}
|
|
} else {
|
|
$this->dbh = $dbh;
|
|
}
|
|
}
|
|
|
|
public function interact() {
|
|
$name = $this->readline('New model name: ');
|
|
$table = $this->readline('Table name: ');
|
|
$entity = $this->readline('Entity name: ');
|
|
if (strlen($entity) <= 0) {
|
|
$entity = $table;
|
|
}
|
|
$model_filepath = $this->rootDir().'/models/'.$name.'.php';
|
|
if ($this->readline("Create MODEL class '$model_filepath'? (y - yes, other - no) ") != 'y') {
|
|
echo "Creating of MODEL class is skipped\n";
|
|
return false;
|
|
}
|
|
$model_dirpath = dirname($model_filepath);
|
|
if (!file_exists($model_dirpath)) {
|
|
if ($this->readline("Create directory '$model_dirpath'? (y - yes, other - no) ") != 'y') {
|
|
echo "Creating of MODEL class is skipped\n";
|
|
return false;
|
|
}
|
|
mkdir($model_dirpath);
|
|
}
|
|
echo "Creating MODEL class ... ";
|
|
if (file_exists($model_filepath)) {
|
|
if ($this->readline("File '$model_filepath' exists. Do you want to replace? (y - yes, other - no) ") != 'y') {
|
|
echo "Creating of MODEL class is skipped\n";
|
|
return false;
|
|
}
|
|
}
|
|
$table_columns = $this->dbh->getTableColumns($table);
|
|
$suc = $this->modelSave($model_filepath, $name, $table, $entity, $table_columns['pks'], $table_columns['columns'], $table_columns['types']);
|
|
echo $suc ? "MODEL class created" : 'Error: MODEL class not created';
|
|
}
|
|
|
|
private function modelSave($filepath, $name, $tablename, $entity, $pks, $columns, $types) {
|
|
if (is_array($pks) && count($pks) > 1) {
|
|
$primary_key_name = "array('".implode("', '", $pks)."')";
|
|
$columns = array_merge($pks, $columns);
|
|
} else {
|
|
if (is_array($pks)) {
|
|
$primary_key_name = "'".$pks[0]."'";
|
|
} else {
|
|
$primary_key_name = "'$pks'";
|
|
}
|
|
}
|
|
$allowed_attributes = array();
|
|
foreach ($columns as $column) {
|
|
$allowed_attributes[] = sprintf("'%s' => '%s'", $column, str_replace("'", '"', $types[$column]));
|
|
}
|
|
if (substr($entity, -3) == 'ies') {
|
|
$entity_one = substr($entity, 0, -3).'y';
|
|
} else if (substr($entity, -2) == 'es') {
|
|
$entity_one = substr($entity, 0, -2);
|
|
} else if (substr($entity, -1) == 's') {
|
|
$entity_one = substr($entity, 0, -1);
|
|
} else {
|
|
$entity_one = $entity;
|
|
}
|
|
$auto_created_dt = in_array('created_dt', $columns)
|
|
? '
|
|
if (is_null($primary_key)
|
|
&& !isset($data[\'created_dt\']))
|
|
{
|
|
$data[\'created_dt\'] = date(\'Y-m-d H:i:s\');
|
|
}'
|
|
: '';
|
|
$auto_changed_dt = in_array('changed_dt', $columns)
|
|
? '
|
|
if (!is_null($primary_key)
|
|
&& is_array($data)
|
|
&& count($data) > 0
|
|
&& !isset($data[\'changed_dt\']))
|
|
{
|
|
$data[\'changed_dt\'] = date(\'Y-m-d H:i:s\');
|
|
}'
|
|
: '';
|
|
$content = '<?'."php
|
|
/*
|
|
TPsoft.org 2000-".date('Y')."
|
|
file for controlers/*.php
|
|
|
|
Milestones:
|
|
".date('Y-m-d H:i')." Created
|
|
*/
|
|
|
|
class ".$name." extends \TPsoft\DBmodel\DBmodel {
|
|
|
|
public $"."tables = array(
|
|
'".$entity."' => array(
|
|
'name' => '".$tablename."',
|
|
'primary_key_name' => ".$primary_key_name.",
|
|
'allow_attributes' => array(
|
|
".implode(",\n\t\t\t\t", $allowed_attributes)."
|
|
)
|
|
),
|
|
);
|
|
|
|
public function exist($"."primary_key = null) {
|
|
return $"."this->existRecord('".$entity."', $"."primary_key);
|
|
}
|
|
|
|
public function ".$entity_one."($"."primary_key = null, $"."data = array()) {".$auto_created_dt.$auto_changed_dt."
|
|
return $"."this->record('".$entity."', $"."primary_key, $"."data);
|
|
}
|
|
|
|
public function ".$entity_one."By($"."colname, $"."colvalue) {
|
|
return $"."this->recordBy('".$entity."', $"."colname, $"."colvalue);
|
|
}
|
|
|
|
public function ".$entity_one."Save($"."data = array()) {
|
|
return $"."this->".$entity_one."($"."this->exist($"."data) ? $"."data : null, $"."data);
|
|
}
|
|
|
|
public function ".$entity_one."Empty() {
|
|
return $"."this->recordEmpty('".$entity."');
|
|
}
|
|
|
|
public function ".$entity_one."Attributes() {
|
|
return $"."this->typesAttributes('".$entity."');
|
|
}
|
|
|
|
public function ".$entity_one."Count() {
|
|
return $"."this->count('".$entity."');
|
|
}
|
|
|
|
public function getList($"."search = array(), $"."reverse = false, $"."concat_or = false) {
|
|
return $"."this->search('".$entity."')
|
|
->where($"."search, $"."concat_or)
|
|
->order(array(".$primary_key_name." => $"."reverse ? 'DESC' : 'ASC'))
|
|
->toArray();
|
|
}
|
|
|
|
public function ".$entity_one."Combo($"."col_key, $"."col_value, $"."add_empty = false) {
|
|
return $"."this->search('".$entity."')
|
|
->toCombo($"."col_key, $"."col_value, $"."add_empty);
|
|
}
|
|
|
|
}
|
|
|
|
?".">
|
|
";
|
|
return file_put_contents($filepath, $content);
|
|
}
|
|
|
|
/* ----------------------------------------------------
|
|
* HELPDER METHODS
|
|
*/
|
|
public function readline($question, $default = null) {
|
|
ob_flush();
|
|
$line = readline($question);
|
|
if (!is_null($default)
|
|
&& strlen($line) <= 0)
|
|
{
|
|
return $default;
|
|
}
|
|
return $line;
|
|
}
|
|
|
|
public function rootDir(?string $dir = null) {
|
|
if (!is_null($dir)) {
|
|
$this->rootDir = $dir;
|
|
}
|
|
if (strlen($this->rootDir) > 0) return $this->rootDir;
|
|
return dirname(dirname(__FILE__));
|
|
}
|
|
|
|
}
|
|
|
|
?>
|