/**
* Creates a new Form object
*
* @param string $name The name of the form.
* @param string $source The form source filename without path and .xml extension e.g. "form.default" OR raw XML data
* @param string $viewName The name of the view you're getting the form for.
* @param array $options Options to the Form object
* @param bool $replace Should form fields be replaced if a field already exists with the same group/name?
* @param bool $xpath An optional xpath to search for the fields.
*
* @return Form|null The loaded form or null if the form filename doesn't exist
*
* @throws \RuntimeException If the form exists but cannot be loaded
*/
public function form($name, $source, $viewName, array $options = array(), $replace = true, $xpath = false)
{
// Get a new form instance
$form = new Form($this->container, $name, $options);
// If $source looks like raw XML data, parse it directly
if (strpos($source, '<form') !== false) {
if ($form->load($source, $replace, $xpath) === false) {
throw new FormLoadData();
}
return $form;
}
$formFileName = $this->getFormFilename($source, $viewName);
if (empty($formFileName)) {
if ($this->scaffolding) {
$scaffolding = new ScaffoldingBuilder($this->container);
$xml = $scaffolding->make($source, $viewName);
if (!is_null($xml)) {
return $this->form($name, $xml, $viewName, $options, $replace, $xpath);
}
}
return null;
}
if ($form->loadFile($formFileName, $replace, $xpath) === false) {
throw new FormLoadFile($source);
}
return $form;
}