Ubiquity  2.0.3
php rapid development framework
CreateControllersTrait.php
Go to the documentation of this file.
1 <?php
2 
4 
13 
21 
22  private $views=["CRUD"=>["index"=>"@framework/crud/index.html","form"=>"@framework/crud/form.html","display"=>"@framework/crud/display.html"],
23  "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"]
24  ];
25 
26  abstract protected function _createMethod($access,$name,$parameters="",$return="",$content="",$comment="");
27 
28  abstract protected function _createClass($template,$classname,$namespace,$uses,$extendsOrImplements,$classContent);
29 
30  abstract public function _getAdminFiles();
31 
32  abstract protected function _createController($controllerName,$variables=[],$ctrlTemplate='controller.tpl',$hasView=false,$jsCallback="");
33 
34 
35  public function frmAddCrudController(){
36  $config=Startup::getConfig();
37  $resources=CacheManager::getModels($config, true);
38  $resources=\array_combine($resources, $resources);
39  $resourcesList=$this->jquery->semantic()->htmlDropdown("resources-list","",$resources);
40  $resourcesList->asSelect("crud-model");
41  $viewList=$this->jquery->semantic()->htmlDropdown("view-list","",$this->views["CRUD"]);
42  $viewList->asSelect("crud-views",true);
43  $viewList->setDefaultText("Select views");
44  $viewList->setProperty("style", "display: none;");
45  $frm=$this->jquery->semantic()->htmlForm("crud-controller-frm");
46  $frm->addExtraFieldRule("crud-model", "exactCount[1]");
47  $frm->addExtraFieldRules("crud-name", ["empty",["checkController","Controller {value} already exists!"]]);
48  $this->jquery->exec(Rule::ajax($this->jquery, "checkController", $this->_getAdminFiles()->getAdminBaseRoute() . "/_controllerExists/crud-name", "{}", "result=data.result;", "postForm", [ "form" => "crud-controller-frm" ]), true);
49 
50  $frm->setValidationParams(["on"=>"blur","inline"=>true]);
51  $frm->setSubmitParams($this->_getAdminFiles()->getAdminBaseRoute()."/addCrudController","#frm");
52  $this->jquery->change("#ck-add-route", "$('#div-new-route').toggle($(this).is(':checked'));");
53  $this->jquery->jsonOn("change", "#ck-add-route", $this->_getAdminFiles()->getAdminBaseRoute() . "/_addCtrlRoute/crud", "post", [ "context" => "$('#crud-controller-frm')","params" => "$('#crud-controller-frm').serialize()","jsCondition" => "$('#ck-add-route').is(':checked')" ]);
54 
55  $this->jquery->click("#validate-btn",'$("#crud-controller-frm").form("submit");');
56  $this->jquery->execOn("click", "#cancel-btn", '$("#frm").html("");');
57  $this->jquery->exec("$('#crud-datas-ck').checkbox();",true);
58 
59  $this->jquery->exec("$('#crud-viewer-ck').checkbox();",true);
60  $this->jquery->exec("$('#crud-events-ck').checkbox();",true);
61  $this->jquery->exec("$('#ck-add-route').checkbox();",true);
62 
63 
64  $this->jquery->exec('$("#crud-files-ck").checkbox({onChange:function(){ $("#view-list").toggle($("#crud-files-ck").checkbox("is checked"));}});',true);
65  $this->jquery->renderView($this->_getAdminFiles()->getViewAddCrudController(),["controllerNS"=>Startup::getNS ( "controllers" )]);
66  }
67 
68  public function _addCtrlRoute($type){
69  if (URequest::isPost()) {
70  $result=[ ];
72 
73  $controller="\\".$_POST[$type."-name"];
74  $controller=ClassUtils::getClassSimpleName($controller);
75  $result["route-path"]=$controller;
76  echo json_encode($result);
77  }
78  }
79 
80  public function addCrudController(){
81  $classContent="";
82  $route="";$routeName="";
83  $uses=[];
84  $controllerNS=Startup::getNS("controllers");
85  if(URequest::isPost()){
86  $messages=[];
87  $crudControllerName=ucfirst($_POST["crud-name"]);
88  $routeName=$crudControllerName;
89  $resource=UString::doubleBackSlashes($_POST["crud-model"]);
90  $this->_createMethod("public", "__construct","","","\n\t\tparent::__construct();\n\$this->model=\"{$resource}\";");
91 
92  if(isset($_POST["crud-datas"])){
93  $uses[]="use controllers\\crud\\datas\\{$crudControllerName}Datas;";
94  $uses[]="use Ubiquity\\controllers\\crud\\CRUDDatas;";
95 
96  $classContent.=$this->_createMethod("protected", "getAdminData","",": CRUDDatas","\t\treturn new {$crudControllerName}Datas(\$this);");
97  $messages[]=$this->createCRUDDatasClass($crudControllerName);
98  }
99 
100  if(isset($_POST["crud-viewer"])){
101  $uses[]="use controllers\\crud\\viewers\\{$crudControllerName}Viewer;";
102  $uses[]="use Ubiquity\\controllers\\admin\\viewers\\ModelViewer;";
103 
104  $classContent.=$this->_createMethod("protected", "getModelViewer","",": ModelViewer","\t\treturn new {$crudControllerName}Viewer(\$this);");
105  $messages[]=$this->createModelViewerClass($crudControllerName);
106  }
107  if(isset($_POST["crud-events"])){
108  $uses[]="use controllers\\crud\\events\\{$crudControllerName}Events;";
109  $uses[]="use Ubiquity\\controllers\\crud\\CRUDEvents;";
110 
111  $classContent.=$this->_createMethod("protected", "getEvents","",": CRUDEvents","\t\treturn new {$crudControllerName}Events(\$this);");
112  $messages[]=$this->createEventsClass($crudControllerName);
113  }
114 
115  if(isset($_POST["crud-files"])){
116  $uses[]="use controllers\\crud\\files\\{$crudControllerName}Files;";
117  $uses[]="use Ubiquity\\controllers\\crud\\CRUDFiles;";
118  $classContent.=$this->_createMethod("protected", "getFiles","",": CRUDFiles","\t\treturn new {$crudControllerName}Files();");
119  $crudFiles=$_POST["crud-views"];
120  $crudFiles=explode(",", $crudFiles);
121  $classFilesContent=[];
122  foreach ($crudFiles as $file){
123  if(isset($this->views["CRUD"][$file])){
124  $frameworkViewname=$this->views["CRUD"][$file];
125  $this->createCrudView($frameworkViewname,$crudControllerName, $file);
126  $classFilesContent[]=$this->_createMethod("public", "getView".ucfirst($file),"","","\t\treturn \"".$crudControllerName."/".$file.".html\";");
127  }
128  }
129  $messages[]=$this->createCRUDFilesClass($crudControllerName,implode("",$classFilesContent));
130  }
131  if(isset($_POST["ck-add-route"])){
132  $route=$_POST["route-path"];
133  if(UString::isNotNull($route)){
134  if(!UString::startswith($route, "/")){
135  $route="/".$route;
136  }
137  $routeName=$route;
138  $route="\n * @route(\"{$route}\",\"inherited\"=>true,\"automated\"=>true)";
139  }
140  }
141  $uses=implode("\n", $uses);
142  $messages[]=$this->_createController($crudControllerName,["%routeName%"=>$routeName,"%route%"=>$route,"%resource%"=>$resource,"%uses%"=>$uses,"%namespace%"=>$controllerNS,"%baseClass%"=>"\\Ubiquity\\controllers\\crud\\CRUDController","%content%"=>$classContent],"crudController.tpl");
143  echo implode("", $messages);
144  $this->jquery->get($this->_getAdminFiles()->getAdminBaseRoute() . "/_refreshControllers/refresh", "#dtControllers", [ "jqueryDone" => "replaceWith","hasLoader" => false,"dataType" => "html" ]);
145  echo $this->jquery->compile($this->view);
146  }
147  }
148 
149  public function frmAddAuthController(){
150  $config=Startup::getConfig();
151  $viewList=$this->jquery->semantic()->htmlDropdown("view-list","",$this->views["auth"]);
152  $viewList->asSelect("auth-views",true);
153  $viewList->setDefaultText("Select views");
154  $viewList->setProperty("style", "display: none;");
155  $authControllers=CacheManager::getControllers("Ubiquity\\controllers\\auth\\AuthController",false,true);
156  $authControllers=array_combine($authControllers, $authControllers);
157  $ctrlList=$this->jquery->semantic()->htmlDropdown("ctrl-list","Ubiquity\\controllers\\auth\\AuthController",$authControllers);
158  $ctrlList->asSelect("baseClass");
159  $ctrlList->setDefaultText("Select base class");
160 
161  $frm=$this->jquery->semantic()->htmlForm("auth-controller-frm");
162  $frm->addExtraFieldRules("auth-name", ["empty",["checkController","Controller {value} already exists!"]]);
163  $this->jquery->exec(Rule::ajax($this->jquery, "checkController", $this->_getAdminFiles()->getAdminBaseRoute() . "/_controllerExists/auth-name", "{}", "result=data.result;", "postForm", [ "form" => "auth-controller-frm" ]), true);
164 
165  $frm->setValidationParams(["on"=>"blur","inline"=>true]);
166  $frm->setSubmitParams($this->_getAdminFiles()->getAdminBaseRoute()."/addAuthController","#frm");
167  $this->jquery->change("#ck-add-route", "$('#div-new-route').toggle($(this).is(':checked'));");
168  $this->jquery->jsonOn("change", "#ck-add-route", $this->_getAdminFiles()->getAdminBaseRoute() . "/_addCtrlRoute/auth", "post", [ "context" => "$('#auth-controller-frm')","params" => "$('#auth-controller-frm').serialize()","jsCondition" => "$('#ck-add-route').is(':checked')" ]);
169 
170  $this->jquery->click("#validate-btn",'$("#auth-controller-frm").form("submit");');
171  $this->jquery->execOn("click", "#cancel-btn", '$("#frm").html("");');
172  $this->jquery->exec("$('#ck-add-route').checkbox();",true);
173  $this->jquery->exec('$("#auth-files-ck").checkbox({onChange:function(){ $("#view-list").toggle($("#auth-files-ck").checkbox("is checked"));}});',true);
174  $this->jquery->renderView($this->_getAdminFiles()->getViewAddAuthController(),["controllerNS"=>Startup::getNS ( "controllers" )]);
175  }
176 
177  public function addAuthController(){
178 
179  if(URequest::isPost()){
180  $classContent="";
181  $route="";$routeName="";
182  $baseClass="\\".$_POST["baseClass"];
183 
184  if($baseClass=="\\Ubiquity\\controllers\\auth\\AuthController"){
185  $controllerTemplate="authController.tpl";
186  $uses=["use Ubiquity\\controllers\\Startup;","use Ubiquity\\utils\\http\\USession;","use Ubiquity\\utils\\http\\URequest;"];
187  }else{
188  $controllerTemplate="authController_.tpl";
189  $uses=[];
190  }
191  $controllerNS=Startup::getNS("controllers");
192 
193  $messages=[];
194  $authControllerName=ucfirst($_POST["auth-name"]);
195  $routeName=$authControllerName;
196  if(isset($_POST["auth-files"])){
197  $uses[]="use controllers\\auth\\files\\{$authControllerName}Files;";
198  $uses[]="use Ubiquity\\controllers\\auth\\AuthFiles;";
199  $classContent.=$this->_createMethod("protected", "getFiles","",": AuthFiles","\t\treturn new {$authControllerName}Files();");
200  $authFiles=$_POST["auth-views"];
201  $authFiles=explode(",", $authFiles);
202  $classFilesContent=[];
203  foreach ($authFiles as $file){
204  if(isset($this->views["auth"][$file])){
205  $frameworkViewname=$this->views["auth"][$file];
206  $this->createCrudView($frameworkViewname,$authControllerName, $file);
207  $classFilesContent[]=$this->_createMethod("public", "getView".ucfirst($file),"","","\t\treturn \"".$authControllerName."/".$file.".html\";");
208  }
209  }
210  $messages[]=$this->createAuthFilesClass($authControllerName,implode("",$classFilesContent));
211  }
212  if(isset($_POST["ck-add-route"])){
213  $route=$_POST["route-path"];
214  if(UString::isNotNull($route)){
215  if(!UString::startswith($route, "/")){
216  $route="/".$route;
217  }
218  $routeName=$route;
219  $route="\n * @route(\"{$route}\",\"inherited\"=>true,\"automated\"=>true)";
220  }
221  }
222  $uses=implode("\n", $uses);
223  $messages[]=$this->_createController($authControllerName,["%routeName%"=>$routeName,"%route%"=>$route,"%uses%"=>$uses,"%namespace%"=>$controllerNS,"%baseClass%"=>$baseClass,"%content%"=>$classContent],$controllerTemplate);
224  echo implode("", $messages);
225  $this->jquery->get($this->_getAdminFiles()->getAdminBaseRoute() . "/_refreshControllers/refresh", "#dtControllers", [ "jqueryDone" => "replaceWith","hasLoader" => false,"dataType" => "html" ]);
226  echo $this->jquery->compile($this->view);
227  }
228  }
229 
230  protected function createCRUDDatasClass($crudControllerName){
231  $ns=Startup::getNS("controllers")."crud\\datas";
232  $uses="\nuse Ubiquity\\controllers\\crud\\CRUDDatas;";
233  return $this->_createClass("class.tpl", $crudControllerName."Datas", $ns, $uses, "extends CRUDDatas", "\t//use override/implement Methods");
234  }
235 
236  protected function createModelViewerClass($crudControllerName){
237  $ns=Startup::getNS("controllers")."crud\\viewers";
238  $uses="\nuse Ubiquity\\controllers\\admin\\viewers\\ModelViewer;";
239  return $this->_createClass("class.tpl", $crudControllerName."Viewer", $ns, $uses, "extends ModelViewer", "\t//use override/implement Methods");
240  }
241 
242  protected function createEventsClass($crudControllerName){
243  $ns=Startup::getNS("controllers")."crud\\events";
244  $uses="\nuse Ubiquity\\controllers\\crud\\CRUDEvents;";
245  return $this->_createClass("class.tpl", $crudControllerName."Events", $ns, $uses, "extends CRUDEvents", "\t//use override/implement Methods");
246  }
247 
248  protected function createCRUDFilesClass($crudControllerName,$classContent=""){
249  $ns=Startup::getNS("controllers")."crud\\files";
250  $uses="\nuse Ubiquity\\controllers\\crud\\CRUDFiles;";
251  return $this->_createClass("class.tpl", $crudControllerName."Files", $ns, $uses, "extends CRUDFiles", $classContent);
252  }
253 
254  protected function createAuthFilesClass($authControllerName,$classContent=""){
255  $ns=Startup::getNS("controllers")."auth\\files";
256  $uses="\nuse Ubiquity\\controllers\\auth\\AuthFiles;";
257  return $this->_createClass("class.tpl", $authControllerName."Files", $ns, $uses, "extends AuthFiles", $classContent);
258  }
259 
260  protected function createCrudView($frameworkName,$controllerName,$newName){
261  $folder=ROOT . DS . "views" . DS .$controllerName;
262  UFileSystem::safeMkdir($folder);
263  try{
264  $blocks=$this->view->getBlockNames($frameworkName);
265  if(sizeof($blocks)>0){
266  $content=["{% extends \"".$frameworkName."\" %}\n"];
267  foreach ($blocks as $blockname){
268  $content[]="{% block ".$blockname." %}\n\t{{ parent() }}\n{% endblock %}\n";
269  }
270  }else{
271  $content=[$this->view->getCode($frameworkName)];
272  }
273  }catch(\Exception $e){
274  $content=[$this->view->getCode($frameworkName)];
275  }
276  return UFileSystem::save($folder. DS .$newName.".html", implode("", $content));
277  }
278 }
static isPost()
Returns true if the request is sent by the POST method.
Definition: URequest.php:109
_createClass($template, $classname, $namespace, $uses, $extendsOrImplements, $classContent)
static asJSON()
Sets the response content-type to application/json.
Definition: UResponse.php:72
createCrudView($frameworkName, $controllerName, $newName)
static doubleBackSlashes($value)
Definition: UString.php:93
static getModels(&$config, $silent=false)
static getNS($part="controllers")
Definition: Startup.php:45
static getControllers($subClass="\biquity\ontrollers\ontroller", $backslash=false, $includeSubclass=false)
_createMethod($access, $name, $parameters="", $return="", $content="", $comment="")
_createController($controllerName, $variables=[], $ctrlTemplate='controller.tpl', $hasView=false, $jsCallback="")
static getClassSimpleName($classnameWithNamespace)
Definition: ClassUtils.php:135
static startswith($hay, $needle)
Definition: UString.php:12
static save($filename, $content, $flags=LOCK_EX)