<?phpnamespaceFresh;
classFormextendsView{
/**
* The View object which this form implicitly references (because they have the same name)
*/public$refView;
publicfunctioninitialize(){
$this->addQuery('//form',[$this,'handleForm']);
$this->addCompileHandler('form-input',[$this,'handleFormInput']);
// $this->addRuntimeHandler('find',[$this,'find']);// $this->addRuntimeHandler('formatObjectValue',[$this,'formatObjectValue']);// $this->addFormatter('markdown',[$this,'mdToHtml']);
}
publicfunctionsetView($viewObj){
$this->refView = $viewObj;
}
protectedfunctionhandleFormInput($compiler,$inputNode,$table){
$varName = $table;
$propName = $inputNode->getAttribute('name');
$placeholder = $compiler->placeholderFor('<?=$'.$varName.'->'.$propName.'; ?>');
$inputNode->setAttribute('value',$placeholder);
if ($inputNode->type=='file'){
$form = $inputNode->form;
$form->enctype = "multipart/form-data";
}
}
protectedfunctionhandleForm(\RBDoc $doc, \FreshForm $form, \RBCompiler $compiler, \RBNode $node){
//cleanse the form of php//load the view which this form relates to// get the list of entities from the view// get the first entity// get the table// set input values & innertexts to print the database value// output the compiled form// Add "smarter" value-setting for input types like select or textarea// Add enctype (if file input found),method,action to form// compile an id-based lookup for that table$placeholder = $compiler->placeholderFor($node);
$node->parentNode->replaceChild($doc->createTextNode($placeholder),$node);
$node->addHiddenInput('id','');
$view = $this->refView;
$entities = $view->getEntities();
$entity = $entities[0] ?? null;
if ($entity==null)thrownew \Exception("We could not find a view for this form named '{$form->name}'");
foreach ($this->compileHandlers['form'] as$handler){
$handler($form,$doc,$compiler,$node);
}
// var_dump($routes);// exit;$table = $entity->getAttribute('rb-table');
// $lookup = 'id:<?=$id? >';$varName = $table;
$inputNodes = $doc->xpath('.//*[@name]',$node);
foreach ($inputNodesas$input){
$this->executeCompileHandlers('form-input',$compiler,$input,$table);
}
$node->action = $compiler->placeholderFor("<?=\$submit_url;?>");
$node->method = 'POST';
$node->addHiddenInput('fresh_table',$table);
$escTable = var_export($table,true);
$phpOpen =
<<<PHP
<?php
\$table = {$escTable};
\$find = 'id:'.\$id.';';
\$list = \$this->callHandler('find',\$table,\$find);
foreach (\$list as \${$varName}){ ?>
PHP;
$compiler->placeholderPrepend($placeholder,$phpOpen);
$phpClose =
<<<PHP
<?php
}
?>
PHP;
$compiler->placeholderAppend($placeholder,$phpClose);
return;
}
/**
* Get an array of elements which are:
* 1. child of a <form> tag
* 2. Have a name attribute
* 3. NOT a <form> tag itself
*
* @return an array of elements or an empty array if none found
*/publicfunctiongetInputs(){
$compiler = new \RBCompiler();
$dirtySource = file_get_contents($this->file);
$cleanSource = $compiler->cleanSource($dirtySource);
$preDocHandlers = $this->compileHandlers['pre-doc'];
foreach ($preDocHandlersas$handler){
$cleanSource = $handler($cleanSource,$dirtySource,$compiler,$this);
}
$doc = new \RBDoc($cleanSource);
$inputs = $doc->xpath('//form//*[@name]');
$list=[];
foreach ($inputsas$i)if (strtolower($i->tagName)!='form')$list[] = $i;
return$list;
}
}