Esempio n. 1
0
 public function downloadAction()
 {
     if ($this->_getParam('obj')) {
         $response = $this->getResponse();
         $etag = md5($this->_getParam('obj'));
         if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag) {
             $this->_sendResponse(304);
         }
         $media = new MediaObject(base64_decode($this->_getParam('obj')));
         if (!$media->mime) {
             $this->_sendResponse(404);
         }
         $response->setHeader('Content-Type', $media->mime);
         $response->setHeader('Content-Disposition', sprintf('attachment; filename="%s"', $media->label));
         $response->setHeader('ETag', $etag);
         if (Core::$env == Core::ENV_PROD) {
             $response->setHeader('Expires', gmdate('D, d M Y H:i:s \\G\\M\\T', time() + 30 * 86400));
         }
         $response->setBody($media->loadBlob('media'));
         $this->_sendResponse();
     } else {
         $this->_sendResponse(404);
     }
 }
Esempio n. 2
0
 /**
  * Populates a data object from a key/value array
  *
  * @param array $data
  * @param \t41\Backend\Mapper $mapper
  * @return \t41\ObjectModel\DataObject
  */
 public function populate(array $data, Backend\Mapper $mapper = null)
 {
     if ($mapper) {
         // @todo fix compatibility with metakeys in array
         $data = $mapper->toDataObject($data, $this->_class);
     }
     // then sent to data object properties
     foreach ($data as $key => $value) {
         // don't use empty() to check $value to avoid zero being ignored
         if (($property = $this->getProperty($key)) !== false && !is_null($value)) {
             if ($value == Property::EMPTY_VALUE) {
                 $property->resetValue();
                 continue;
             }
             if ($property instanceof ObjectProperty || $property instanceof MediaProperty) {
                 if ($property->getParameter('instanceof') == null) {
                     throw new DataObject\Exception("Parameter 'instanceof' for '{$key}' in class should contain a class name");
                 }
                 // Specific case of MediaObject()
                 if ($property->getParameter('instanceof') == 't41\\ObjectModel\\MediaObject') {
                     // new file case : value is a string prepended by  'tmp:'
                     if ($value && substr($value, 0, strlen(MediaObject::TMP_PREFIX)) == MediaObject::TMP_PREFIX) {
                         $parts = explode('|', substr($value, 4));
                         // 0 => hash, 1 => original file name
                         $file = '/tmp/' . $parts[0];
                         if (file_exists($file)) {
                             $media = new MediaObject();
                             $media->setUri(md5(rand() * microtime()));
                             $media->setLabel($parts[1]);
                             $finfo = finfo_open(FILEINFO_MIME_TYPE);
                             $mime = finfo_file($finfo, $file);
                             $media->setMedia($file);
                             // blob property
                             $media->setSize(filesize($file));
                             $media->setMime($mime);
                             $media->save();
                             $property->setValue($media);
                             // media property
                             unlink($file);
                         }
                         continue;
                         // don't go further in this case
                     }
                 }
                 if ($value && $value != Property::EMPTY_VALUE) {
                     if (is_object($value) && get_class($value) == $property->getParameter('instanceof')) {
                         $property->setValue($value);
                     } else {
                         if (substr($value, 0, 4) == 'obj_') {
                             // get object from cache
                             $property->setValue(Core::cacheGet($value));
                         } else {
                             if (substr($value, 0, 1) == Backend::PREFIX) {
                                 /* get & call object's backend to get a full configured object uri */
                                 $backend = ObjectModel::getObjectBackend($property->getParameter('instanceof'));
                                 $value = $backend->buildObjectUri($value, $property->getParameter('instanceof'));
                                 $property->setValue($value instanceof ObjectUri ? $value : new ObjectUri($value));
                             } else {
                                 //$class = $property->getParameter('instanceof');
                                 $backend = ObjectModel::getObjectBackend($property->getParameter('instanceof'));
                                 $value = $backend->buildObjectUri($value, $property->getParameter('instanceof'));
                                 $property->setValue($value);
                             }
                         }
                     }
                 } else {
                     $property->resetValue();
                 }
             } else {
                 if ($property instanceof Property\CollectionProperty) {
                     // @todo handle collection populating here
                 } else {
                     // if value is an array, it is most likely a set of multiple options
                     if (is_array($value)) {
                         $value = implode('|', $value);
                     }
                     $property->setValue($value);
                 }
             }
         }
     }
     return $this;
 }