/** * Загрузка файлов * Метод переписан для поддержки IE8- и загрузку через iframe * * @return void */ public function uploadAction() { Zend_Controller_Action_HelperBroker::removeHelper('viewRenderer'); if (isset($this->_params['type'])) { $filetype = $this->_params['type']; foreach ($_FILES as $filename => $data) { break; } // Определяем имя элемента загружаемого файла // Получаем конфигурацию формы $config = Phorm_Config::xml('forms/control/media.xml', 'upload'); if (isset($config['elements'][$filetype]) && isset($filename)) { // Выделяем из конфигурации формы нужный тип элемента и инициализируем форму с нужным именем элемента $form = new Phorm_Form(null, null, array('elements' => array($filename => $config['elements'][$filetype]))); // Получаем объект элемента из формы $element = $form->getElement($filename); // Валидируем элемент if ($element->isValid($filename)) { // Получаем информацию о файле $fileinfo = $element->getTransferAdapter()->getFileInfo($filename); // Добавляем тип медиа-файла $fileinfo[$filename]['mediatype'] = $filetype; // Сохраняем файл в медиа-библиотеке if ($MediaInfo = $this->Media->saveUploadedFile($fileinfo[$filename])) { // Возвращаем информацию о файле как об объекте медиа-библиотеки exit(Zend_Json::encode(array($MediaInfo))); } else { // Ошибки сохранения exit(Zend_Json::encode(array(array('errors' => array_values($this->Media->_errors))))); } } else { // Ошибки валидации exit(Zend_Json::encode(array(array('errors' => array_values($form->getMessages()))))); } } else { // Ошибка в запросе типа элемента exit(Zend_Json::encode(array(array('errors' => array(array($this->_translate->_('Неверный тип запроса'))))))); } } else { // Ошибка - не указан тип элемента exit(Zend_Json::encode(array(array('errors' => array(array($this->_translate->_('Не задан тип'))))))); } }
/** * Определяем массив опций и дергаем родительский конструктор * * @param mixed $spec * @param array $options */ public function __construct($spec, $options = null) { $this->translate = Zend_Controller_Front::getInstance()->getParam('bootstrap')->getResource('Translate'); /** * Получаем информацию о структуре или структурах */ if (isset($options['structures'])) { $options['structures'] = explode(',', $options['structures']); require_once 'Phorm/Structures.php'; $StructuresModel = new Phorm_Structures(); $structures = array(); $multioptions = array(); foreach ($options['structures'] as $key => $structureid) { if ($StructureInfo = $StructuresModel->getStructureFullInfo($structureid)) { $structures[$StructureInfo['structureid']] = $StructureInfo; } else { unset($options['structures'][$key]); } $multioptions[$StructureInfo['structureid']] = $StructureInfo['structurename']; $options['multioptions'] = $multioptions; } /** * Определяем шаблон формы для элементов структур */ $form_tpl = new Phorm_Form(null, null, array('elements' => $options['elements'])); /** * Создаем форму для каждой из структур */ require_once 'Phorm/Form.php'; foreach ($structures as $structure) { $form = new Phorm_Form(); $form->removeDecorator('Form'); $form->removeDecorator('DtDdWrapper'); foreach ($structure['groups'] as $group) { $form->setElementsBelongTo($spec . '[' . $structure['structureid'] . ']' . '[' . $group['groupid'] . ']'); /** * Добавляем элементы на форму * @todo Добавить обязательность заполнения */ $elements = array(); // массив элементов для добавления в DisplayGroup foreach ($group['properties'] as $property) { /** * Определяем тип используемого элемента */ $type = $property['propertytype']; $realtype = in_array($type, array('select', 'structure', 'dictionary')) && $property['ismultiple'] == 'yes' ? 'multiselect' : $type; if ($element = clone $form_tpl->getElement($realtype)) { // Устанавливаем имя и заголовок элемента $element->setLabel($property['propertyname'])->setName($property['propertyid']); // Допиливаем обычный селект if ($type == 'select' && !empty($property['propertyoptions'])) { $propertyoptions = array(); // ставим ключи массива опций в их значение foreach ($property['propertyoptions'] as $prop) { $propertyoptions[$prop] = $prop; } if ($property['ismultiple'] == 'no') { $propertyoptions = array(null => $this->translate->_('---Выберите---')) + $propertyoptions; } $element->setMultiOptions($propertyoptions); } // Допиливаем селект из другой структуры if ($type == 'structure' && $property['structureid'] > 0) { $propertyoptions = $StructuresModel->getStructureResourcesAsPairs($property['structureid']); if ($property['ismultiple'] == 'no') { $propertyoptions = array(null => $this->translate->_('---Выберите---')) + $propertyoptions; } $element->setMultiOptions($propertyoptions); } // Допиливаем селект из справочника if ($type == 'dictionary' && $property['dictionaryid'] > 0) { $DictionariesModel = new Phorm_Dictionaries(); $propertyoptions = $DictionariesModel->getEntriesListAsPairs($property['dictionaryid']); if ($property['ismultiple'] == 'no') { $propertyoptions = array(null => $this->translate->_('---Выберите---')) + $propertyoptions; } $element->setMultiOptions($propertyoptions); } $form->addElement($element); $elements[] = $property['propertyid']; } } /** * Если групп несколько, то добавляем DisplayGroup * @todo Добавить в опции возможность задавать css-классы */ if (count($structure['groups']) > 1) { $DisplayGroup = $form->addDisplayGroup($elements, 'group-' . $group['groupid'], array('legend' => $group['groupname'])); } } $this->forms[$structure['structureid']] = $form; $this->renderforms[$structure['structureid']] = $form->render(); } unset($options['elements']); } /** * Инициализируем родительский конструктор */ parent::__construct($spec, $options); }
/** * Возвращает оригинальную форму создания/редактирования свойства после ее модификации * * @param Phorm_Form $form Объект модифицированной формы из self::getPropertyFormModified * @return Phorm_Form Оригинальный объект формы, который и надо кидать в шаблон */ public function getPropertyFormOriginal(Phorm_Form $form) { $form->getElement('structureid')->setRequired(true); $form->getElement('propertyoptions')->setRequired(true); $form->getElement('ismultiple')->setRequired(true); return $form; }
/** * Возвращает форму создания/редактирования страницы * * @param string $section Секция xml-файла * @return Phorm_Form * @todo Путь к форме должен зависеть от текущего контроллера... Подумать */ public function getPageForm($section = 'add') { $form = new Phorm_Form('forms/control/page.xml', $section); if ($pageuid = $form->getElement('pageuid')) { $pageuid->addValidator('Callback', true, array('callback' => array($this, 'validateUid'), 'messages' => array('callbackValue' => 'Такой идентификатор уже используется. Укажите другой'))); } return $form; }