/** * Определяем массив опций и дергаем родительский конструктор * * @param mixed $spec * @param array $options */ public function __construct($spec, $options = null) { $this->translate = Zend_Controller_Front::getInstance()->getParam('bootstrap')->getResource('Translate'); /** * Выделяем дополнительные элементы в отдельную форму и рендерим ее */ require_once 'Phorm/Form.php'; if (isset($options['elements']) && is_array($options['elements'])) { $config = array('elements' => $options['elements']); if (isset($options['paths']['prefixPath'])) { $config['prefixPath'] = array_values($options['paths']['prefixPath']); } if (isset($options['paths']['elementPrefixPath'])) { $config['elementPrefixPath'] = array_values($options['paths']['elementPrefixPath']); } /*foreach ($options as $key=>$option) { if(!in_array($key,array('elements','prefixPath','elementPrefixPath'))) { unset($options[$key]); } }*/ $form = new Phorm_Form(null, null, $config); $form->removeDecorator('Form'); $form->removeDecorator('DtDdWrapper'); $form->setElementsBelongTo($spec . '[]'); $this->renderform = $form->render() . '<div class="clear"></div>'; unset($options['elements'], $config['elements']); foreach ($form->getElements() as $element) { $element->setAttrib('id', null); } $this->form = $form; } /** * Инициализируем родительский конструктор */ parent::__construct($spec, $options); }
/** * Возвращает форму добавления/редактирования виджета * * @param string $section Секция xml-файла * @param array $TypeInfo Массив данных о типе виджета (для расширения формы) * @return Phorm_Form */ public function getWidgetForm($section = 'add', $TypeInfo = array()) { /** * Расширяем базовую форму формой виджета через аналогичную секцию (add или edit) */ $files = array('forms/control/widgets.xml'); if (!empty($TypeInfo)) { $files[] = 'widgets/' . $TypeInfo['template'] . '/' . $TypeInfo['context'] . '.xml'; } /** * Инициализируем объект формы */ $form = new Phorm_Form($files, $section); /** * Добавляем валидацию на тип элемента CategoriesMultiSelect */ foreach ($form->getElements() as $element) { if ($element->getType() == 'Phorm_Form_Element_CategoriesMultiSelect') { $haystack = $element->getMultiOptions(); foreach ($haystack as $key => $val) { $haystack[$key] = is_array($val) ? $val['categoryid'] : $key; } $element->addValidator("InArray", true, array("haystack" => $haystack)); continue; } } /** * Добавляем данные для элементов формы */ if (isset($form->typeid)) { $form->typeid->options = array(0 => $this->_translate->_('---Выберите---')) + $this->getWidgetsTypes(); } if (isset($form->acl)) { $form->acl->options = $this->getRolesList(); } return $form; }
/** * Возвращает форму создания/редактирования раздела * * @param int $categoryid Id текущего раздела * @param string $section Секция формы (add | edit) * @return Phorm_Form */ public function getCategoryForm($categoryid, $section = 'add') { $form = new Phorm_Form('forms/control/categories.xml', $section); /** * Добавляем справочники на элементы */ foreach ($form->getElements() as $element) { $elementname = $element->getName(); switch ($elementname) { case 'moduleid': /** * Список модулей */ // Используйте тип элемента Modules где список модулей накидывается внутри элемента break; case 'insertbefore': /** * Список братьев или детей и позиция относительно них */ $Categories = $section == 'add' ? $this->getChilds($categoryid) : $this->getBrothers($categoryid); foreach ($Categories as $key => $category) { if ($category['categoryid'] == $categoryid) { if (key_exists($key + 1, $Categories)) { $element->setValue($Categories[$key + 1]['categoryid']); } continue; } $element->addMultiOption($category['categoryid'], $this->_translate->_('Перед') . ' «' . $category['categoryname'] . '»'); } $element->addMultiOption(0, $this->_translate->_('В конце')); if (!$element->getValue()) { $element->setValue(0); } break; case 'depends': /** * Связанные разделы */ // Используйте тип элемента Categories где список разделов накидывается внутри элемента break; case 'realcategoryid': /** * Раздел для замещения */ // Используйте тип элемента Categories где список разделов накидывается внутри элемента break; case 'categorypath': /** * Путь раздела */ /*if($CategoryInfo = $this->getCategoryInfo($categoryid)) { $element->setLabel($element->getLabel() . ' (' . $CategoryInfo['fullpath'] . ')'); }*/ break; } } return $form; }