Ubiquity  2.0.3
php rapid development framework
CRUDTrait.php
Go to the documentation of this file.
1 <?php
2 
4 
13 
20 class CRUDTrait{
21 
22  private $views=["index"=>"@framework/crud/index.html","form"=>"@framework/crud/form.html","display"=>"@framework/crud/display.html"];
23 
24  abstract protected function _createMethod($access,$name,$parameters="",$return="",$content="",$comment="");
25 
26  abstract protected function _createClass($template,$classname,$namespace,$uses,$extendsOrImplements,$classContent);
27 
28  abstract public function _getAdminFiles();
29 
30  abstract protected function _createController($controllerName,$variables=[],$ctrlTemplate='controller.tpl',$hasView=false,$jsCallback="");
31 
32 
33  public function frmAddCrudController(){
34  $config=Startup::getConfig();
35  $resources=CacheManager::getModels($config, true);
36  $resources=\array_combine($resources, $resources);
37  $resourcesList=$this->jquery->semantic()->htmlDropdown("resources-list","",$resources);
38  $resourcesList->asSelect("crud-model");
39  $viewList=$this->jquery->semantic()->htmlDropdown("view-list","",$this->views);
40  $viewList->asSelect("crud-views",true);
41  $viewList->setDefaultText("Select views");
42  $viewList->setProperty("style", "display: none;");
43  $frm=$this->jquery->semantic()->htmlForm("crud-controller-frm");
44  $frm->addExtraFieldRule("crud-model", "exactCount[1]");
45  $frm->addExtraFieldRules("crud-name", ["empty",["checkController","Controller {value} already exists!"]]);
46  $this->jquery->exec(Rule::ajax($this->jquery, "checkController", $this->_getAdminFiles()->getAdminBaseRoute() . "/_controllerExists/crud-name", "{}", "result=data.result;", "postForm", [ "form" => "crud-controller-frm" ]), true);
47 
48  $frm->setValidationParams(["on"=>"blur","inline"=>true]);
49  $frm->setSubmitParams($this->_getAdminFiles()->getAdminBaseRoute()."/addCrudController","#frm");
50  $this->jquery->change("#ck-add-route", "$('#div-new-route').toggle($(this).is(':checked'));");
51  $this->jquery->jsonOn("change", "#ck-add-route", $this->_getAdminFiles()->getAdminBaseRoute() . "/_addCRUDRoute", "post", [ "context" => "$('#crud-controller-frm')","params" => "$('#crud-controller-frm').serialize()","jsCondition" => "$('#ck-add-route').is(':checked')" ]);
52 
53  $this->jquery->click("#validate-btn",'$("#crud-controller-frm").form("submit");');
54  $this->jquery->execOn("click", "#cancel-btn", '$("#frm").html("");');
55  $this->jquery->exec("$('#crud-viewer-ck').checkbox();",true);
56  $this->jquery->exec("$('#crud-events-ck').checkbox();",true);
57  $this->jquery->exec("$('#ck-add-route').checkbox();",true);
58 
59 
60  $this->jquery->exec('$("#crud-files-ck").checkbox({onChange:function(){ $("#view-list").toggle($("#crud-files-ck").checkbox("is checked"));}});',true);
61  $this->jquery->renderView($this->_getAdminFiles()->getViewAddCrudController(),["controllerNS"=>Startup::getNS ( "controllers" )]);
62  }
63 
64  public function _addCRUDRoute(){
65  if (URequest::isPost()) {
66  $result=[ ];
68 
69  $controller="\\".$_POST["crud-name"];
70  $controller=ClassUtils::getClassSimpleName($controller);
71  $result["route-path"]=$controller;
72  echo json_encode($result);
73  }
74  }
75 
76  public function addCrudController(){
77  $classContent="";
78  $route="";$routeName="";
79  $uses=[];
80  $controllerNS=Startup::getNS("controllers");
81  if(URequest::isPost()){
82  $messages=[];
83  $crudControllerName=ucfirst($_POST["crud-name"]);
84  $routeName=$crudControllerName;
85  $resource=UString::doubleBackSlashes($_POST["crud-model"]);
86  $this->_createMethod("public", "__construct","","","\n\t\tparent::__construct();\n\$this->model=\"{$resource}\";");
87  if(isset($_POST["crud-viewer"])){
88  $uses[]="use controllers\\crud\\viewers\\{$crudControllerName}Viewer;";
89  $uses[]="use Ubiquity\\controllers\\admin\\viewers\\ModelViewer;";
90 
91  $classContent.=$this->_createMethod("protected", "getModelViewer","",": ModelViewer","\n\t\treturn new {$crudControllerName}Viewer(\$this);");
92  $messages[]=$this->createModelViewerClass($crudControllerName);
93  }
94  if(isset($_POST["crud-events"])){
95  $uses[]="use controllers\\crud\\events\\{$crudControllerName}Events;";
96  $uses[]="use Ubiquity\\controllers\\crud\\CRUDEvents;";
97 
98  $classContent.=$this->_createMethod("protected", "getEvents","",": CRUDEvents","\n\t\treturn new {$crudControllerName}Events();");
99  $messages[]=$this->createEventsClass($crudControllerName);
100  }
101 
102  if(isset($_POST["crud-files"])){
103  $uses[]="use controllers\\crud\\files\\{$crudControllerName}Files;";
104  $uses[]="use Ubiquity\\controllers\\crud\\CRUDFiles;";
105  $classContent.=$this->_createMethod("protected", "getFiles","",": CRUDFiles","\n\t\treturn new {$crudControllerName}Files();");
106  $crudFiles=$_POST["crud-views"];
107  $crudFiles=explode(",", $crudFiles);
108  $classFilesContent=[];
109  foreach ($crudFiles as $file){
110  if(isset($this->views[$file])){
111  $frameworkViewname=$this->views[$file];
112  $this->createCrudView($frameworkViewname,$crudControllerName, $file);
113  $classFilesContent[]=$this->_createMethod("public", "getView".ucfirst($file),"","","\n\t\treturn \"".$crudControllerName."/".$file.".html\";");
114  }
115  }
116  $messages[]=$this->createCRUDFilesClass($crudControllerName,implode("",$classFilesContent));
117  }
118  if(isset($_POST["ck-add-route"])){
119  $route=$_POST["route-path"];
120  if(UString::isNotNull($route)){
121  if(!UString::startswith($route, "/")){
122  $route="/".$route;
123  }
124  $routeName=$route;
125  $route="\n * @route(\"{$route}\",\"inherited\"=>true,\"automated\"=>true)";
126  }
127  }
128  $uses=implode("\n", $uses);
129  $messages[]=$this->_createController($crudControllerName,["%routeName%"=>$routeName,"%route%"=>$route,"%resource%"=>$resource,"%uses%"=>$uses,"%namespace%"=>$controllerNS,"%baseClass%"=>"\\Ubiquity\\controllers\\crud\\CRUDController","%content%"=>$classContent],"crudController.tpl");
130  echo implode("", $messages);
131  $this->jquery->get($this->_getAdminFiles()->getAdminBaseRoute() . "/_refreshControllers/refresh", "#dtControllers", [ "jqueryDone" => "replaceWith","hasLoader" => false,"dataType" => "html" ]);
132  echo $this->jquery->compile($this->view);
133  }
134  }
135 
136  protected function createModelViewerClass($crudControllerName){
137  $ns=Startup::getNS("controllers")."crud\\viewers";
138  $uses="\nuse Ubiquity\\controllers\\admin\\viewers\\ModelViewer;";
139  return $this->_createClass("class.tpl", $crudControllerName."Viewer", $ns, $uses, "extends ModelViewer", "\t//use override/implement Methods");
140  }
141 
142  protected function createEventsClass($crudControllerName){
143  $ns=Startup::getNS("controllers")."crud\\events";
144  $uses="\nuse Ubiquity\\controllers\\crud\\CRUDEvents;";
145  return $this->_createClass("class.tpl", $crudControllerName."Events", $ns, $uses, "extends CRUDEvents", "\t//use override/implement Methods");
146  }
147 
148  protected function createCRUDFilesClass($crudControllerName,$classContent=""){
149  $ns=Startup::getNS("controllers")."crud\\files";
150  $uses="\nuse Ubiquity\\controllers\\crud\\CRUDFiles;";
151  return $this->_createClass("class.tpl", $crudControllerName."Files", $ns, $uses, "extends CRUDFiles", $classContent);
152  }
153 
154  protected function createCrudView($frameworkName,$controllerName,$newName){
155  $folder=ROOT . DS . "views" . DS .$controllerName;
156  UFileSystem::safeMkdir($folder);
157  $blocks=$this->view->getBlockNames($frameworkName);
158  $content=["{% extends \"".$frameworkName."\" %}\n"];
159  foreach ($blocks as $blockname){
160  $content[]="{% block ".$blockname." %}\n\t{{ parent() }}\n{% endblock %}\n";
161  }
162  return UFileSystem::save($folder. DS .$newName.".html", implode("", $content));
163  }
164 }
createCrudView($frameworkName, $controllerName, $newName)
Definition: CRUDTrait.php:154
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
createCRUDFilesClass($crudControllerName, $classContent="")
Definition: CRUDTrait.php:148
static doubleBackSlashes($value)
Definition: UString.php:93
static getModels(&$config, $silent=false)
static getNS($part="controllers")
Definition: Startup.php:45
_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)