Пример #1
0
 /**
  * Загрузка файлов
  * Метод переписан для поддержки 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->_('Не задан тип')))))));
     }
 }
Пример #2
0
 /**
  * Определяем массив опций и дергаем родительский конструктор
  *
  * @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);
 }
Пример #3
0
 /**
  * Возвращает оригинальную форму создания/редактирования свойства после ее модификации
  *
  * @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;
 }
Пример #4
0
 /**
  * Возвращает форму создания/редактирования страницы
  *
  * @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;
 }