Passed
Push — master ( 282e34...da194b )
by Jean-Christophe
06:14
created

ScaffoldController::createAuthFilesClass()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
eloc 3
dl 0
loc 4
ccs 0
cts 4
cp 0
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 2
crap 2
1
<?php
2
3
namespace Ubiquity\scaffolding;
4
5
use Ubiquity\controllers\Startup;
6
use Ubiquity\utils\base\UFileSystem;
7
use Ubiquity\utils\base\UString;
8
use Ubiquity\controllers\admin\utils\CodeUtils;
9
use Ubiquity\utils\base\UIntrospection;
10
use Ubiquity\cache\ClassUtils;
11
12
abstract class ScaffoldController {
13
	public static $views = [ "CRUD" => [ "index" => "@framework/crud/index.html","form" => "@framework/crud/form.html","display" => "@framework/crud/display.html" ],
14
			"auth" => [ "index" => "@framework/auth/index.html","info" => "@framework/auth/info.html","noAccess" => "@framework/auth/noAccess.html","disconnected" => "@framework/auth/disconnected.html","message" => "@framework/auth/message.html","baseTemplate" => "@framework/auth/baseTemplate.html" ] ];
15
16
	protected abstract function getTemplateDir();
17
18
	protected abstract function storeControllerNameInSession($controller);
19
20
	public abstract function showSimpleMessage($content, $type, $title = null, $icon = "info", $timeout = NULL, $staticName = null);
21
22
	protected abstract function _addMessageForRouteCreation($path, $jsCallback = "");
23
24
	public function _createMethod($access, $name, $parameters = "", $return = "", $content = "", $comment = "") {
25
		$templateDir = $this->getTemplateDir ();
26
		$keyAndValues = [ "%access%" => $access,"%name%" => $name,"%parameters%" => $parameters,"%content%" => $content,"%comment%" => $comment,"%return%" => $return ];
27
		return UFileSystem::openReplaceInTemplateFile ( $templateDir . "method.tpl", $keyAndValues );
28
	}
29
30 2
	public function _createController($controllerName, $variables = [], $ctrlTemplate = 'controller.tpl', $hasView = false, $jsCallback = "") {
31 2
		$message = "";
32 2
		$templateDir = $this->getTemplateDir ();
33 2
		$controllersNS = \rtrim ( Startup::getNS ( "controllers" ), "\\" );
34 2
		$controllersDir = \ROOT . \DS . str_replace ( "\\", \DS, $controllersNS );
35 2
		$controllerName = \ucfirst ( $controllerName );
36 2
		$filename = $controllersDir . \DS . $controllerName . ".php";
37 2
		if (\file_exists ( $filename ) === false) {
38 2
			$namespace = "";
39 2
			if ($controllersNS !== "") {
40 2
				$namespace = "namespace " . $controllersNS . ";";
41
			}
42 2
			$msgView = "";
43 2
			$indexContent = "";
44 2
			if ($hasView) {
45 1
				$viewDir = \ROOT . \DS . "views" . \DS . $controllerName . \DS;
46 1
				UFileSystem::safeMkdir ( $viewDir );
47 1
				$viewName = $viewDir . \DS . "index.html";
48 1
				UFileSystem::openReplaceWriteFromTemplateFile ( $templateDir . "view.tpl", $viewName, [ "%controllerName%" => $controllerName,"%actionName%" => "index" ] );
49 1
				$msgView = "<br>The default view associated has been created in <b>" . UFileSystem::cleanPathname ( \ROOT . \DS . $viewDir ) . "</b>";
50 1
				$indexContent = "\$this->loadView(\"" . $controllerName . "/index.html\");";
51
			}
52 2
			$variables = \array_merge ( $variables, [ "%controllerName%" => $controllerName,"%indexContent%" => $indexContent,"%namespace%" => $namespace ] );
53 2
			UFileSystem::openReplaceWriteFromTemplateFile ( $templateDir . $ctrlTemplate, $filename, $variables );
54 2
			$msgContent = "The <b>" . $controllerName . "</b> controller has been created in <b>" . UFileSystem::cleanFilePathname ( $filename ) . "</b>." . $msgView;
55 2
			if (isset ( $variables ["%path%"] ) && $variables ["%path%"] !== "") {
56
				$msgContent .= $this->_addMessageForRouteCreation ( $variables ["%path%"], $jsCallback );
57
			}
58 2
			$this->storeControllerNameInSession ( $controllersNS . "\\" . $controllerName );
59 2
			$message = $this->showSimpleMessage ( $msgContent, "success", null, "checkmark circle", NULL, "msgGlobal" );
60
		} else {
61
			$message = $this->showSimpleMessage ( "The file <b>" . $filename . "</b> already exists.<br>Can not create the <b>" . $controllerName . "</b> controller!", "warning", null, "warning circle", 100000, "msgGlobal" );
62
		}
63 2
		return $message;
64
	}
65
66
	public function addCrudController($crudControllerName, $resource, $crudDatas = null, $crudViewer = null, $crudEvents = null, $crudViews = null, $routePath = '') {
67
		$classContent = "";
68
		$uses = [ ];
69
		$controllerNS = Startup::getNS ( "controllers" );
70
		$messages = [ ];
71
		$routeName = $crudControllerName;
72
		$this->_createMethod ( "public", "__construct", "", "", "\n\t\tparent::__construct();\n\$this->model=\"{$resource}\";" );
73
74
		if (isset ( $crudDatas )) {
75
			$uses [] = "use controllers\\crud\\datas\\{$crudControllerName}Datas;";
76
			$uses [] = "use Ubiquity\\controllers\\crud\\CRUDDatas;";
77
78
			$classContent .= $this->_createMethod ( "protected", "getAdminData", "", ": CRUDDatas", "\t\treturn new {$crudControllerName}Datas(\$this);" );
79
			$messages [] = $this->createCRUDDatasClass ( $crudControllerName );
80
		}
81
82
		if (isset ( $crudViewer )) {
83
			$uses [] = "use controllers\\crud\\viewers\\{$crudControllerName}Viewer;";
84
			$uses [] = "use Ubiquity\\controllers\\admin\\viewers\\ModelViewer;";
85
86
			$classContent .= $this->_createMethod ( "protected", "getModelViewer", "", ": ModelViewer", "\t\treturn new {$crudControllerName}Viewer(\$this);" );
87
			$messages [] = $this->createModelViewerClass ( $crudControllerName );
88
		}
89
		if (isset ( $crudEvents )) {
90
			$uses [] = "use controllers\\crud\\events\\{$crudControllerName}Events;";
91
			$uses [] = "use Ubiquity\\controllers\\crud\\CRUDEvents;";
92
93
			$classContent .= $this->_createMethod ( "protected", "getEvents", "", ": CRUDEvents", "\t\treturn new {$crudControllerName}Events(\$this);" );
94
			$messages [] = $this->createEventsClass ( $crudControllerName );
95
		}
96
97
		if (isset ( $crudViews )) {
98
			$crudViews = explode ( ",", $crudViews );
99
			$uses [] = "use controllers\\crud\\files\\{$crudControllerName}Files;";
100
			$uses [] = "use Ubiquity\\controllers\\crud\\CRUDFiles;";
101
			$classContent .= $this->_createMethod ( "protected", "getFiles", "", ": CRUDFiles", "\t\treturn new {$crudControllerName}Files();" );
102
			$classFilesContent = [ ];
103
			foreach ( $crudViews as $file ) {
104
				if (isset ( self::$views ["CRUD"] [$file] )) {
105
					$frameworkViewname = self::$views ["CRUD"] [$file];
106
					$this->createCrudView ( $frameworkViewname, $crudControllerName, $file );
107
					$classFilesContent [] = $this->_createMethod ( "public", "getView" . ucfirst ( $file ), "", "", "\t\treturn \"" . $crudControllerName . "/" . $file . ".html\";" );
108
				}
109
			}
110
			$messages [] = $this->createCRUDFilesClass ( $crudControllerName, implode ( "", $classFilesContent ) );
111
		}
112
		if ($routePath != null) {
113
			if (UString::isNotNull ( $routePath )) {
114
				if (! UString::startswith ( $routePath, "/" )) {
115
					$routePath = "/" . $routePath;
116
				}
117
				$routeName = $routePath;
118
				$routePath = "\n * @route(\"{$routePath}\",\"inherited\"=>true,\"automated\"=>true)";
119
			}
120
		}
121
		$uses = implode ( "\n", $uses );
122
		$messages [] = $this->_createController ( $crudControllerName, [ "%routeName%" => $routeName,"%route%" => $routePath,"%resource%" => $resource,"%uses%" => $uses,"%namespace%" => $controllerNS,"%baseClass%" => "\\Ubiquity\\controllers\\crud\\CRUDController","%content%" => $classContent ], "crudController.tpl" );
123
		echo implode ( "\n", $messages );
124
	}
125
126
	public function addAuthController($authControllerName, $baseClass, $authViews = null, $routePath = "") {
127
		$classContent = "";
128
		if ($baseClass == "\\Ubiquity\\controllers\\auth\\AuthController") {
129
			$controllerTemplate = "authController.tpl";
130
			$uses = [ "use Ubiquity\\utils\\http\\USession;","use Ubiquity\\utils\\http\\URequest;" ];
131
		} else {
132
			$controllerTemplate = "authController_.tpl";
133
			$uses = [ ];
134
		}
135
		$controllerNS = Startup::getNS ( "controllers" );
136
137
		$messages = [ ];
138
		$routeName = $authControllerName;
139
		if (isset ( $authViews )) {
140
			$authViews = explode ( ",", $authViews );
141
			$uses [] = "use controllers\\auth\\files\\{$authControllerName}Files;";
142
			$uses [] = "use Ubiquity\\controllers\\auth\\AuthFiles;";
143
			$classContent .= $this->_createMethod ( "protected", "getFiles", "", ": AuthFiles", "\t\treturn new {$authControllerName}Files();" );
144
			$classFilesContent = [ ];
145
			foreach ( $authViews as $file ) {
146
				if (isset ( self::$views ["auth"] [$file] )) {
147
					$frameworkViewname = self::$views ["auth"] [$file];
148
					$this->createCrudView ( $frameworkViewname, $authControllerName, $file );
149
					$classFilesContent [] = $this->_createMethod ( "public", "getView" . ucfirst ( $file ), "", "", "\t\treturn \"" . $authControllerName . "/" . $file . ".html\";" );
150
				}
151
			}
152
			$messages [] = $this->createAuthFilesClass ( $authControllerName, implode ( "", $classFilesContent ) );
153
		}
154
		if ($routePath != null) {
155
			if (UString::isNotNull ( $routePath )) {
156
				if (! UString::startswith ( $routePath, "/" )) {
157
					$routePath = "/" . $routePath;
158
				}
159
				$routeName = $routePath;
160
				$routePath = "\n * @route(\"{$routePath}\",\"inherited\"=>true,\"automated\"=>true)";
161
			}
162
		}
163
		$uses = implode ( "\n", $uses );
164
		$messages [] = $this->_createController ( $authControllerName, [ "%routeName%" => $routeName,"%route%" => $routePath,"%uses%" => $uses,"%namespace%" => $controllerNS,"%baseClass%" => $baseClass,"%content%" => $classContent ], $controllerTemplate );
165
		echo implode ( "\n", $messages );
166
	}
167
168
	public function _createClass($template, $classname, $namespace, $uses, $extendsOrImplements, $classContent) {
169
		$namespaceVar = "";
170
		if (UString::isNotNull ( $namespace )) {
171
			$namespaceVar = "namespace {$namespace};";
172
		}
173
		$variables = [ "%classname%" => $classname,"%namespace%" => $namespaceVar,"%uses%" => $uses,"%extendsOrImplements%" => $extendsOrImplements,"%classContent%" => $classContent ];
174
		$templateDir = $this->getTemplateDir ();
175
		$directory = UFileSystem::getDirFromNamespace ( $namespace );
176
		UFileSystem::safeMkdir ( $directory );
177
		$filename = UFileSystem::cleanFilePathname ( $directory . \DS . $classname . ".php" );
178
		if (! file_exists ( $filename )) {
179
			UFileSystem::openReplaceWriteFromTemplateFile ( $templateDir . $template, $filename, $variables );
180
			$message = $this->showSimpleMessage ( "The <b>" . $classname . "</b> class has been created in <b>" . $filename . "</b>.", "success", "Creation", "checkmark circle" );
181
		} else {
182
			$message = $this->showSimpleMessage ( "The file <b>" . $filename . "</b> already exists.<br>Can not create the <b>" . $classname . "</b> class!", "warning", "Creation", "warning circle" );
183
		}
184
		return $message;
185
	}
186
187
	public function _newAction($controller, $action, $parameters = null, $content = '', $routeInfo = null, $createView = false) {
188
		$templateDir = $this->getTemplateDir ();
189
		$msgContent = "";
190
		$r = new \ReflectionClass ( $controller );
191
		if (! method_exists ( $controller, $action )) {
192
			$ctrlFilename = $r->getFileName ();
193
			$content = CodeUtils::indent ( $content, 2 );
194
			$fileContent = \implode ( "", UIntrospection::getClassCode ( $controller ) );
0 ignored issues
show
Bug introduced by
It seems like Ubiquity\utils\base\UInt...tClassCode($controller) can also be of type false; however, parameter $pieces of implode() does only seem to accept array, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

194
			$fileContent = \implode ( "", /** @scrutinizer ignore-type */ UIntrospection::getClassCode ( $controller ) );
Loading history...
195
			$fileContent = \trim ( $fileContent );
196
			$posLast = \strrpos ( $fileContent, "}" );
197
			if ($posLast !== false) {
198
				if ($createView) {
199
					$viewname = $this->_createViewOp ( ClassUtils::getClassSimpleName ( $controller ), $action );
200
					$content .= "\n\t\t\$this->loadView('" . $viewname . "');\n";
201
					$msgContent .= "<br>Created view : <b>" . $viewname . "</b>";
202
				}
203
				$routeAnnotation = "";
204
				if (is_array ( $routeInfo )) {
205
					$name = "route";
206
					$path = $routeInfo ["path"];
207
					$routeProperties = [ '"' . $path . '"' ];
208
					$methods = $routeInfo ["methods"];
209
					if (UString::isNotNull ( $methods )) {
210
						$routeProperties [] = '"methods"=>' . $this->getMethods ( $methods );
211
					}
212
					if (isset ( $routeInfo ["ck-Cache"] )) {
213
						$routeProperties [] = '"cache"=>true';
214
						if (isset ( $routeInfo ["duration"] )) {
215
							$duration = $routeInfo ["duration"];
216
							if (\ctype_digit ( $duration )) {
217
								$routeProperties [] = '"duration"=>' . $duration;
218
							}
219
						}
220
					}
221
					$routeProperties = \implode ( ",", $routeProperties );
222
					$routeAnnotation = UFileSystem::openReplaceInTemplateFile ( $templateDir . "annotation.tpl", [ "%name%" => $name,"%properties%" => $routeProperties ] );
223
224
					$msgContent .= $this->_addMessageForRouteCreation ( $path );
225
				}
226
				$parameters = CodeUtils::cleanParameters ( $parameters );
227
				$actionContent = UFileSystem::openReplaceInTemplateFile ( $templateDir . "action.tpl", [ "%route%" => "\n" . $routeAnnotation,"%actionName%" => $action,"%parameters%" => $parameters,"%content%" => $content ] );
1 ignored issue
show
Bug introduced by
Are you sure $routeAnnotation of type false|string can be used in concatenation? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

227
				$actionContent = UFileSystem::openReplaceInTemplateFile ( $templateDir . "action.tpl", [ "%route%" => "\n" . /** @scrutinizer ignore-type */ $routeAnnotation,"%actionName%" => $action,"%parameters%" => $parameters,"%content%" => $content ] );
Loading history...
228
				$fileContent = \substr_replace ( $fileContent, "\n%content%", $posLast - 1, 0 );
229
				if (! CodeUtils::isValidCode ( '<?php ' . $content )) {
230
					echo $this->showSimpleMessage ( "Errors parsing action content!", "warning", "Creation", "warning circle", null, "msgControllers" );
231
					return;
232
				} else {
233
					if (UFileSystem::replaceWriteFromContent ( $fileContent . "\n", $ctrlFilename, [ '%content%' => $actionContent ] )) {
234
						$msgContent = "The action <b>{$action}</b> is created in controller <b>{$controller}</b>" . $msgContent;
235
						echo $this->showSimpleMessage ( $msgContent, "info", "Creation", "info circle", null, "msgControllers" );
236
					}
237
				}
238
			}
239
		} else {
240
			echo $this->showSimpleMessage ( "The action {$action} already exists in {$controller}!", "error", "Creation", "warning circle", null, "msgControllers" );
241
		}
242
	}
243
244
	protected function getMethods($strMethods) {
245
		$methods = \explode ( ",", $strMethods );
246
		$result = [ ];
247
		foreach ( $methods as $method ) {
248
			$result [] = '"' . $method . '"';
249
		}
250
		return "[" . \implode ( ",", $result ) . "]";
251
	}
252
253
	protected function _createViewOp($controller, $action) {
254
		$viewName = $controller . "/" . $action . ".html";
255
		UFileSystem::safeMkdir ( \ROOT . \DS . "views" . \DS . $controller );
256
		$templateDir = $this->getTemplateDir ();
257
		UFileSystem::openReplaceWriteFromTemplateFile ( $templateDir . "view.tpl", \ROOT . \DS . "views" . \DS . $viewName, [ "%controllerName%" => $controller,"%actionName%" => $action ] );
258
		return $viewName;
259
	}
260
261
	protected function createCRUDDatasClass($crudControllerName) {
262
		$ns = Startup::getNS ( "controllers" ) . "crud\\datas";
263
		$uses = "\nuse Ubiquity\\controllers\\crud\\CRUDDatas;";
264
		return $this->_createClass ( "class.tpl", $crudControllerName . "Datas", $ns, $uses, "extends CRUDDatas", "\t//use override/implement Methods" );
265
	}
266
267
	protected function createModelViewerClass($crudControllerName) {
268
		$ns = Startup::getNS ( "controllers" ) . "crud\\viewers";
269
		$uses = "\nuse Ubiquity\\controllers\\admin\\viewers\\ModelViewer;";
270
		return $this->_createClass ( "class.tpl", $crudControllerName . "Viewer", $ns, $uses, "extends ModelViewer", "\t//use override/implement Methods" );
271
	}
272
273
	protected function createEventsClass($crudControllerName) {
274
		$ns = Startup::getNS ( "controllers" ) . "crud\\events";
275
		$uses = "\nuse Ubiquity\\controllers\\crud\\CRUDEvents;";
276
		return $this->_createClass ( "class.tpl", $crudControllerName . "Events", $ns, $uses, "extends CRUDEvents", "\t//use override/implement Methods" );
277
	}
278
279
	protected function createCRUDFilesClass($crudControllerName, $classContent = "") {
280
		$ns = Startup::getNS ( "controllers" ) . "crud\\files";
281
		$uses = "\nuse Ubiquity\\controllers\\crud\\CRUDFiles;";
282
		return $this->_createClass ( "class.tpl", $crudControllerName . "Files", $ns, $uses, "extends CRUDFiles", $classContent );
283
	}
284
285
	protected function createAuthFilesClass($authControllerName, $classContent = "") {
286
		$ns = Startup::getNS ( "controllers" ) . "auth\\files";
287
		$uses = "\nuse Ubiquity\\controllers\\auth\\AuthFiles;";
288
		return $this->_createClass ( "class.tpl", $authControllerName . "Files", $ns, $uses, "extends AuthFiles", $classContent );
289
	}
290
291
	protected function createCrudView($frameworkName, $controllerName, $newName) {
292
		$folder = \ROOT . \DS . "views" . \DS . $controllerName;
293
		UFileSystem::safeMkdir ( $folder );
294
		try {
295
			$teInstance = Startup::getTempateEngineInstance ();
296
			if (isset ( $teInstance )) {
297
				$blocks = $teInstance->getBlockNames ( $frameworkName );
298
				if (sizeof ( $blocks ) > 0) {
299
					$content = [ "{% extends \"" . $frameworkName . "\" %}\n" ];
300
					foreach ( $blocks as $blockname ) {
301
						$content [] = "{% block " . $blockname . " %}\n\t{{ parent() }}\n{% endblock %}\n";
302
					}
303
				} else {
304
					$content = [ $teInstance->getCode ( $frameworkName ) ];
305
				}
306
			}
307
		} catch ( \Exception $e ) {
308
			$content = [ $teInstance->getCode ( $frameworkName ) ];
309
		}
310
		if (isset ( $content )) {
311
			return UFileSystem::save ( $folder . \DS . $newName . ".html", implode ( "", $content ) );
312
		}
313
	}
314
}
315
316