Files
2020-09-14 16:36:40 +08:00

174 lines
5.4 KiB
PHP

<?php
namespace App\Classes\CodeGenerator\Common;
use Illuminate\Support\Str;
class GeneratorField
{
/** @var string */
public $name;
public $dbInput;
public $htmlInput;
public $htmlType;
public $fieldType;
public $description;
/** @var array */
public $htmlValues;
/** @var string */
public $migrationText;
public $foreignKeyText;
public $validations;
/** @var bool */
public $isSearchable = true;
public $isFillable = true;
public $isPrimary = false;
public $inForm = true;
public $inIndex = true;
public $inView = true;
public $isNotNull = false;
/**
* @param Column $column
* @param $dbInput
*/
public function parseDBType($dbInput, $column = null)
{
$this->dbInput = $dbInput;
if (!is_null($column)) {
$this->dbInput = ($column->getLength() > 0) ? $this->dbInput.','.$column->getLength() : $this->dbInput;
$this->dbInput = (!$column->getNotnull()) ? $this->dbInput.':nullable' : $this->dbInput;
}
$this->prepareMigrationText();
}
public function parseHtmlInput($htmlInput)
{
$this->htmlInput = $htmlInput;
$this->htmlValues = [];
if (empty($htmlInput)) {
$this->htmlType = 'text';
return;
}
if (Str::contains($htmlInput, 'selectTable')) {
$inputsArr = explode(':', $htmlInput);
$this->htmlType = array_shift($inputsArr);
$this->htmlValues = $inputsArr;
return;
}
$inputsArr = explode(',', $htmlInput);
$this->htmlType = array_shift($inputsArr);
if (count($inputsArr) > 0) {
$this->htmlValues = $inputsArr;
}
}
public function parseOptions($options)
{
$options = strtolower($options);
$optionsArr = explode(',', $options);
if (in_array('s', $optionsArr)) {
$this->isSearchable = false;
}
if (in_array('p', $optionsArr)) {
// if field is primary key, then its not searchable, fillable, not in index & form
$this->isPrimary = true;
$this->isSearchable = false;
$this->isFillable = false;
$this->inForm = false;
$this->inIndex = false;
$this->inView = false;
}
if (in_array('f', $optionsArr)) {
$this->isFillable = false;
}
if (in_array('if', $optionsArr)) {
$this->inForm = false;
}
if (in_array('ii', $optionsArr)) {
$this->inIndex = false;
}
if (in_array('iv', $optionsArr)) {
$this->inView = false;
}
}
private function prepareMigrationText()
{
$inputsArr = explode(':', $this->dbInput);
$this->migrationText = '$table->';
$fieldTypeParams = explode(',', array_shift($inputsArr));
$this->fieldType = array_shift($fieldTypeParams);
$this->migrationText .= $this->fieldType."('".$this->name."'";
if ($this->fieldType == 'enum') {
$this->migrationText .= ', [';
foreach ($fieldTypeParams as $param) {
$this->migrationText .= "'".$param."',";
}
$this->migrationText = substr($this->migrationText, 0, strlen($this->migrationText) - 1);
$this->migrationText .= ']';
} else {
foreach ($fieldTypeParams as $param) {
$this->migrationText .= ', '.$param;
}
}
$this->migrationText .= ')';
foreach ($inputsArr as $input) {
$inputParams = explode(',', $input);
$functionName = array_shift($inputParams);
if ($functionName == 'foreign') {
$foreignTable = array_shift($inputParams);
$foreignField = array_shift($inputParams);
$this->foreignKeyText .= "\$table->foreign('".$this->name."')->references('".$foreignField."')->on('".$foreignTable."');";
} else {
$this->migrationText .= '->'.$functionName;
$this->migrationText .= '(';
$this->migrationText .= implode(', ', $inputParams);
$this->migrationText .= ')';
}
}
$this->migrationText .= ';';
}
public static function parseFieldFromFile($fieldInput)
{
$field = new self();
$field->name = $fieldInput['name'];
$field->parseDBType($fieldInput['dbType']);
$field->parseHtmlInput(isset($fieldInput['htmlType']) ? $fieldInput['htmlType'] : '');
$field->validations = isset($fieldInput['validations']) ? $fieldInput['validations'] : '';
$field->isSearchable = isset($fieldInput['searchable']) ? $fieldInput['searchable'] : false;
$field->isFillable = isset($fieldInput['fillable']) ? $fieldInput['fillable'] : true;
$field->isPrimary = isset($fieldInput['primary']) ? $fieldInput['primary'] : false;
$field->inForm = isset($fieldInput['inForm']) ? $fieldInput['inForm'] : true;
$field->inIndex = isset($fieldInput['inIndex']) ? $fieldInput['inIndex'] : true;
$field->inView = isset($fieldInput['inView']) ? $fieldInput['inView'] : true;
return $field;
}
public function __get($key)
{
if ($key == 'fieldTitle') {
return Str::title(str_replace('_', ' ', $this->name));
}
return $this->$key;
}
}