コード例 #1
0
    protected function replaceLines($template, $modelVars)
    {
        $relationModelList = GeneratorsServiceProvider::getRelationsModelVarsList(GeneratorsServiceProvider::splitFields($this->cache->getFields(), true));
        $fields = GeneratorsServiceProvider::splitFields($this->cache->getFields(), SCOPED_EXPLODE_WANT_ID_RECORD | SCOPED_EXPLODE_WANT_TEXT);
        $template = GeneratorsServiceProvider::replaceTemplateLines($template, '{{field:line}}', function ($line, $fieldVar) use($fields) {
            $fieldText = '';
            foreach ($fields as $field => $type) {
                $fieldText .= str_replace($fieldVar, $field, $line) . "\n";
            }
            if ($fieldText === '') {
                $fieldText = "''";
            }
            return $fieldText;
        });
        $template = GeneratorsServiceProvider::replaceTemplateLines($template, '{{field:line:bool}}', function ($line, $fieldVar) use($fields) {
            $fieldText = '';
            foreach ($fields as $field => $type) {
                if (preg_match('/\\bboolean\\b/', $type)) {
                    $fieldText .= str_replace('{{field:line:bool}}', $field, $line) . "\n";
                }
            }
            return $fieldText;
        });
        $template = GeneratorsServiceProvider::replaceTemplateLines($template, '{{field:line:nobool}}', function ($line, $fieldVar) use($fields) {
            $fieldText = '';
            foreach ($fields as $field => $type) {
                if (!preg_match('/\\bboolean\\b/', $type)) {
                    $fieldText .= str_replace('{{field:line:nobool}}', $field, $line) . "\n";
                }
            }
            return $fieldText;
        });
        // add only unique lines
        $template = GeneratorsServiceProvider::replaceTemplateLines($template, '{{relations:line}}', function ($line, $fieldVar) use($fields, $relationModelList) {
            // we don't need the marker
            $line = str_replace($fieldVar, '', $line);
            $fieldText = '';
            $fieldTexts = [];
            foreach ($fields as $field => $type) {
                // here we override for foreign keys
                if (array_key_exists($field, $relationModelList)) {
                    $modelVars = $relationModelList[$field];
                    // Replace template vars
                    $text = GeneratorsServiceProvider::replaceModelVars($line, $modelVars, '{{relations:', '}}') . "\n";
                    if (array_search($text, $fieldTexts) === false) {
                        $fieldText .= $text;
                        $fieldTexts[] = $text;
                    }
                }
            }
            return $fieldText;
        });
        // add only unique lines
        $template = GeneratorsServiceProvider::replaceTemplateLines($template, '{{relations:line:with_model}}', function ($line, $fieldVar) use($fields, $relationModelList, $modelVars) {
            // we don't need the marker
            $line = str_replace($fieldVar, '', $line);
            $fieldText = '';
            $fieldTexts = [];
            if ($modelVars) {
                // add model
                $text = GeneratorsServiceProvider::replaceModelVars($line, $modelVars, '{{relations:', '}}') . "\n";
                if (array_search($text, $fieldTexts) === false) {
                    $fieldText .= $text;
                    $fieldTexts[] = $text;
                }
            }
            foreach ($fields as $field => $type) {
                // here we override for foreign keys
                if (array_key_exists($field, $relationModelList)) {
                    $relationModelVars = $relationModelList[$field];
                    // Replace template vars
                    $text = GeneratorsServiceProvider::replaceModelVars($line, $relationModelVars, '{{relations:', '}}') . "\n";
                    if (array_search($text, $fieldTexts) === false) {
                        $fieldText .= $text;
                        $fieldTexts[] = $text;
                    }
                }
            }
            return $fieldText;
        });
        if (strpos($template, '{{relations') !== false) {
            $relations = '';
            $foreignModels = [];
            foreach ($fields as $field => $type) {
                if (array_key_exists($field, $relationModelList)) {
                    $relationModelVars = $relationModelList[$field];
                    if (array_search($relationModelVars['camelModels'], $foreignModels) === false) {
                        $foreignField = trim_suffix($field, "_id");
                        $foreignModels[] = $relationModelVars['camelModels'];
                        $foreignFieldList = "'{$relationModelVars['name']}', '{$relationModelVars['id']}'";
                        $relations .= <<<PHP
    /**
     * @param \\{{app_namespace}}\\{$modelVars['CamelModel']} \${$modelVars['camelModel']}
     *
     * @return array {$relationModelVars['CamelModel']}
     */
    public
    function {$relationModelVars['camelModels']}List({$modelVars['CamelModel']} \${$modelVars['camelModel']} = null)
    {
        // fill the foreign list for {$relationModelVars['CamelModel']}
        if (\${$modelVars['camelModel']} !== null) {
            \${$relationModelVars['camelModels']} = !\${$modelVars['camelModel']}->{$foreignField} ? [] : [ \${$modelVars['camelModel']}->{$foreignField}->{$relationModelVars['id']} => \${$modelVars['camelModel']}->{$foreignField}->{$relationModelVars['name']} ];
        } else {
            \${$relationModelVars['camelModels']} = {$relationModelVars['CamelModel']}::query()->get([{$foreignFieldList}])->pluck({$foreignFieldList})->all();
        }
        return \${$relationModelVars['camelModels']};
    }

PHP;
                    }
                }
            }
            $template = str_replace('{{relations}}', $relations, $template);
            if ($relationModelList) {
                $relationsVars = [];
                foreach ($relationModelList as $fieldName => $relationModelVars) {
                    foreach ($relationModelVars as $relationModel => $relationModelVar) {
                        // append
                        if (array_key_exists($relationModel, $relationsVars)) {
                            $relationsVars[$relationModel] .= ", '{$relationModelVar}' => \${$relationModelVar}";
                        } else {
                            $relationsVars[$relationModel] = "'{$relationModelVar}' => \${$relationModelVar}";
                        }
                    }
                }
                $template = GeneratorsServiceProvider::replaceModelVars($template, $relationsVars, '{{relations:compact:', '}}');
            }
        }
        if (strpos($template, '{{auto}}') !== false) {
            $relations = '';
            foreach ($fields as $field => $type) {
                $options = scopedExplode(':', ['(' => ')', '[' => ']', '{' => '}'], $type, null);
                foreach ($options as $option) {
                    if (str_starts_with($option, 'auto')) {
                        $auto = substr($option, 5, -1);
                        $relations .= <<<PHP
        \$input['{$field}'] = {$auto};

PHP;
                    }
                }
            }
            $template = str_replace('{{auto}}', $relations, $template);
        }
        if (strpos($template, '{{bitset:line}}') !== false) {
            $template = GeneratorsServiceProvider::replaceTemplateLines($template, '{{bitset:line}}', function ($line, $fieldVar) use($fields, $modelVars) {
                $line = str_replace($fieldVar, '', $line);
                $text = '';
                foreach ($fields as $field => $type) {
                    if (preg_match('/\\bbitset\\b/', $type)) {
                        $fieldModelVars = GeneratorsServiceProvider::getModelVars($field);
                        $allVars = array_merge($modelVars, $fieldModelVars);
                        $allVars['field'] = $field;
                        $text .= GeneratorsServiceProvider::replaceModelVars($line, $allVars, '{{bitset:', '}}') . "\n";
                    }
                }
                return $text;
            });
        }
        return $template;
    }
コード例 #2
0
 public static function fieldTypeOptions($typeText, $splitOptions = false)
 {
     $openScopes = null;
     $options = scopedExplode(':', ['(' => ')', '[' => ']', '{' => '}'], $typeText, null, SCOPED_EXPLODE_TRIM, $openScopes, $splitOptions ? null : 2);
     $type = array_shift($options);
     if (!$splitOptions) {
         $options = array_shift($options);
     }
     return array($type, $options);
 }