/** * Валидация элемента * * @param int $value * @return boolean */ public function isValid($value) { $params = $this->getAttribs(); if (!isset($params['mediatype'])) { $params['mediatype'] = 'image'; } $this->setValue((int) $value); $value = $this->getValue(); if ($value === 0 && $this->isRequired()) { $this->_messages = array($this->translate->_('Не выбран файл')); return false; } require_once 'Phorm/Media.php'; $Media = new Phorm_Media(); if ($MediaInfo = $Media->getMediaInfo($value)) { if ($MediaInfo['mediatype'] == $params['mediatype']) { return true; } else { $this->_messages = array($this->translate->_('Неверный тип файла')); return false; } } elseif ($this->isRequired()) { $this->_messages = array($this->translate->_('Не выбран файл')); return false; } return true; }
/** * Рисуем элемент * * @param string $name Имя HTML-элемента * @param mixed $value Значение элемента * @param array $params Массив параметров * @param array $attribs Массив атрибутов HTML-элемента * @return string */ public function mediaFile($name, $value = null, array $params = array(), $attribs = null) { $translate = $params['translate']; unset($params['translate']); $jquery_handler = ZendX_JQuery_View_Helper_JQuery::getJQueryHandler(); /** * Переделываем свойство mediatype в data-mediatype (для совместимости с JQuery.data()) */ if (!isset($params['mediatype'])) { $params['mediatype'] = 'image'; } $params['data-mediatype'] = $params['mediatype']; unset($params['mediatype']); /** * Имя элемента типа File делаем просто рандомным, на форме обрабатываться будет поле hidden */ $params['id'] = uniqid(); /** * Значение может быть массивом MediaInfo или числом mediaid * Если значение не является массивом, то приводим его к массиву MediaInfo */ if (!is_array($value) && $value > 0) { require_once 'Phorm/Media.php'; $Media = new Phorm_Media(); if ($MediaInfo = $Media->getMediaInfo($value)) { $value = $MediaInfo; } } /** * Добавляем базовый JS */ //$this->jquery->addJavascriptFile($this->view->BaseUrl().'/ui/phorm/phorm.js'); $this->jquery->addJavascriptFile($this->view->BaseUrl() . '/ui/js/jquery.livequery.min.js'); $this->jquery->addJavascriptFile($this->view->BaseUrl() . '/ui/blueimp/js/jquery.fileupload.js'); /** @todo мб перенести в phorm.js поскольку подпорка под IE требует переопределения Phorm_Controller_Module_Control_Media::uploadAction */ $forceIframeTransport = false; $agent = new Zend_Http_UserAgent(); $device = $agent->getDevice(); if (strtolower($device->getBrowser()) == 'internet explorer' && $device->getBrowserVersion() <= 8) { $this->jquery->addJavascriptFile($this->view->BaseUrl() . '/ui/blueimp/js/jquery.iframe-transport.js'); $forceIframeTransport = true; } $url = isset($params['url']) ? ', url: "' . $params['url'] . '"' : ''; $js = sprintf('var %s; %s("#%s").livequery(function(){%s = %s(this).phormMediaUploader(%s)});', 'var_' . $params['id'], $jquery_handler, $params['id'], 'var_' . $params['id'], $jquery_handler, '{type:"' . $params['data-mediatype'] . '", forceIframeTransport: ' . (int) $forceIframeTransport . $url . '}'); $js = sprintf('%s("%s").livequery(function(){%s(this).phormMediaUploader(%s).setValue($(this).data("mediainfo"))});', $jquery_handler, '[data-mediatype]', $jquery_handler, '{type:"' . $params['data-mediatype'] . '", forceIframeTransport: ' . (int) $forceIframeTransport . $url . '}'); $this->jquery->addOnLoad($js); /** * Устанавливаем пришедшие значения */ if (!empty($value)) { $params['data-mediainfo'] = Zend_Json::encode($value); //$js = sprintf('%s.setValue(%s)','var_' . $params['id'],Zend_Json::encode($value)); //$this->jquery->addOnLoad($js); } /** * Возвращаем поле выбора файла и hidden в котором хранится mediaid */ return $this->view->formFile($params['id'], $params) . $this->view->formHidden($name); }
/** * Загрузка файлов * Метод переписан для поддержки 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 array $data Массив данных о разделе * @return array */ protected function _saveFiles($data) { /** * Отвязываем от раздела все файлы */ $this->_db->delete('pw_categories_media', 'categoryid=' . (int) $data['categoryid'] . " AND mediatype!='image'"); /** * Массив файлов */ if (isset($data['files'])) { /** * Вставляем массив файлов */ if (is_array($data['files'])) { require_once 'Phorm/Media.php'; $Media = new Phorm_Media(); $files = $this->getFilteredValuesByTableCols('pw_categories_media', $data['files']); $itr = 0; foreach ($files as $file) { if ($MediaInfo = $Media->getMediaInfo($file['mediaid'])) { $file['sortorder'] = $itr++; $file['mediatype'] = $MediaInfo['mediatype']; $file['categoryid'] = $data['categoryid']; $file['filepath'] = $MediaInfo['filepath']; $file['fileext'] = $MediaInfo['fileext']; $this->_db->insert('pw_categories_media', $file); } } } } return $data; }