public static function addContent(Fieldset $form, $elements, $prefix = null, $datatypeId = null)
{
if (empty($elements)) {
return;
}
if (!empty($prefix) and $datatypeId === null) {
$datatypeId = mt_rand();
}
if (is_array($elements)) {
$return = array();
foreach ($elements as $element) {
$return[] = self::addContent($form, $element, $prefix, $datatypeId);
}
return $return;
} elseif ($elements instanceof Element) {
if (!empty($prefix)) {
$id = $elements->getAttribute('id');
if (empty($id)) {
$id = $elements->getAttribute('name');
}
$elements->setAttribute('id', $id . $datatypeId);
$elements->setAttribute('name', $prefix . '[' . $elements->getAttribute('name') . ']');
}
$form->add($elements);
return $elements;
} elseif (is_string($elements)) {
if (!empty($prefix)) {
$elements = preg_replace('~name="(.+)(([|\\[).*(]|\\]))?"~iU', 'name="' . $prefix . '[$1]$2"', $elements);
$elements = preg_replace('~name\\\\x3D\\\\x22(.+)(\\\\x5B.*\\\\x5D)?\\\\x22~iU', 'name\\\\x3D\\\\x22' . $prefix . '\\\\x5B$1\\\\x5D$2\\\\x22', $elements);
$elements = preg_replace('~id="(.+)"~iU', 'id="${1}' . $datatypeId . '"', $elements);
$elements = preg_replace('~for="(.+)"~iU', 'for="${1}' . $datatypeId . '"', $elements);
$elements = preg_replace('~id\\\\x3D\\\\x22"(.+)\\\\x22~iU', 'id\\\\x3D\\\\x22${1}' . $datatypeId . '\\\\x22', $elements);
$elements = preg_replace('~for\\\\x3D\\\\x22"(.+)\\\\x22~iU', 'for\\\\x3D\\\\x22${1}' . $datatypeId . '\\\\x22', $elements);
$elements = preg_replace('~(?:(?!(?<=value=)))("|\')#(.+)("|\')~iU', '${1}#${2}' . $datatypeId . '${3}', $elements);
}
$hiddenElement = new Element('hidden' . uniqid());
$hiddenElement->setAttribute('content', $elements);
$form->add($hiddenElement);
return $hiddenElement;
} else {
throw new Exception('Invalid element ' . __CLASS__ . '::' . __METHOD__ . ')');
}
}
/** * Load mixed prevalue editor * * @return string */ public function load() { $config = $this->getConfig(); $listDir = $this->getDatatype()->getDatatypesList(); $options = array(); foreach ($listDir as $dir) { $options[$dir] = $dir; } $datatypes = empty($config['datatypes']) ? array() : $config['datatypes']; foreach ($datatypes as $datatypeId => $datatypeConfig) { //Get datatypes $object = $this->loadDatatype($datatypeConfig['name']); //Force configuration $object->getPrevalueEditor()->setConfig(empty($datatypeConfig['config']) ? null : serialize($datatypeConfig['config'])); //Initiliaze prefix $prefix = 'datatypes[' . $datatypeId . ']'; //Create form $fieldset = new Fieldset(); $hidden = new Element\Hidden(); $hidden->setName($prefix . '[name]'); $hidden->setValue($datatypeConfig['name']); $fieldset->add($hidden); $label = new Element\Text(); $label->setName($prefix . '[label]'); $label->setAttribute('class', 'form-control'); $label->setLabel('Label'); $label->setAttribute('id', 'label' . $datatypeId); $label->setValue(empty($datatypeConfig['label']) ? '' : $datatypeConfig['label']); $fieldset->add($label); AbstractForm::addContent($fieldset, $object->getPrevalueEditor()->load(), $prefix); $datatypes[$datatypeId]['fieldset'] = $fieldset; } $data = array(); $data['datatypes'] = $datatypes; $data['modelOptions'] = $options; return $this->addPath(__DIR__)->render('mixed-prevalue.phtml', $data); }