Ejemplo n.º 1
0
 private function getRichTextFilesPattern()
 {
     if (null === $this->richtext_files_pattern) {
         $this->richtext_files_pattern = \Symforce\AdminBundle\Entity\File::getRichTextFilesPattern($this->container->getParameter('sf.web_assets_dir'));
     }
     return $this->richtext_files_pattern;
 }
Ejemplo n.º 2
0
 private function getUrlPattern()
 {
     if (null == $this->_url_pattern) {
         $this->_url_pattern = File::getAllFilesPattern($this->container->getParameter('sf.web_assets_dir'));
     }
     return $this->_url_pattern;
 }
Ejemplo n.º 3
0
 /**
  * {@inheritDoc}
  */
 public function buildForm(FormBuilderInterface $builder, array $options)
 {
     $builder->addViewTransformer(new FileTransformer($this->container->getParameter('sf.web_assets_dir')));
     $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) use($options) {
         // respond to the event, modify data, or form elements
         $data = $event->getData();
         $object = $event->getForm()->getParent()->getData();
         if (!$object) {
             return;
         }
         $crop = null;
         if (isset($options['img_config'])) {
             $crop = $data['crop'];
             $data = $data['url'];
         }
         $admin = $this->container->get('sf.admin.loader')->getAdminByClass($options['sf_admin_class']);
         $oldValue = $admin->getReflectionProperty($options['sf_admin_property'])->getValue($object);
         $pattern = \Symforce\AdminBundle\Entity\File::getFilesPattern($this->container->getParameter('sf.web_assets_dir'));
         if ($data && preg_match($pattern, $data, $ls)) {
             $em = $admin->getManager();
             $file = $em->getRepository('Symforce\\AdminBundle\\Entity\\File')->loadByUUID($ls[1]);
             $object_id = $admin->getId($object);
             if ($object_id) {
                 $file->setEntityId($object_id);
             }
             if ($crop) {
                 $this->container->get('sf.admin.imagine')->resize($file, $crop, $options['img_config']);
             }
             if ($file->getSessionId()) {
                 if ($oldValue) {
                     $em->remove($oldValue);
                 }
                 $file->setIsHtmlFile(false);
                 $file->setSessionId(null);
                 $em->persist($file);
                 $event->setData($file);
             } else {
                 $event->setData($file);
             }
         } else {
             $event->setData(null);
         }
     });
     $builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) use($options) {
         if (isset($options['required']) && $options['required']) {
             $data = $event->getData();
             $form = $event->getForm();
             if (empty($data['url'])) {
                 $error = $this->container->get('translator')->trans('form.file.required', array('%field%' => isset($options['label']) ? $options['label'] : $form->getName()));
                 $form->addError(new \Symfony\Component\Form\FormError($error));
             }
         }
     });
 }
Ejemplo n.º 4
0
 public function resize(\Symforce\AdminBundle\Entity\File $file, $_crop, array $config)
 {
     $crop = json_decode($_crop, true);
     $imagine = $this->getImagine();
     $box_size = new \Imagine\Image\Box($config[0][0] / $crop['width'], $config[0][1] / $crop['height']);
     $crop_point = new \Imagine\Image\Point($box_size->getWidth() * $crop['left'], $box_size->getHeight() * $crop['top']);
     $crop_size = new \Imagine\Image\Box($config[0][0], $config[0][1]);
     while ($crop_point->getX() + $crop_size->getWidth() > $box_size->getWidth()) {
         if ($crop_point->getX() < 1) {
             break;
         }
         $crop_point = new \Imagine\Image\Point($crop_point->getX() - 1, $crop_point->getY());
     }
     while ($crop_point->getY() + $crop_size->getHeight() > $box_size->getHeight()) {
         if ($crop_point->getY() < 1) {
             break;
         }
         $crop_point = new \Imagine\Image\Point($crop_point->getX(), $crop_point->getY() - 1);
     }
     $options = array('quality' => 100);
     $img = $imagine->load(stream_get_contents($file->getContent()));
     $img->resize($box_size)->crop($crop_point, $crop_size);
     $data = $img->get($file->getExt(), $options);
     $stream = fopen('php://memory', 'r+');
     fwrite($stream, $data);
     rewind($stream);
     $file->setContent($stream);
     if ($config[1][0] && $config[1][1]) {
         $small_box = new \Imagine\Image\Box($config[1][0], $config[1][1]);
         $img = $imagine->load($data)->resize($small_box);
         $small_data = $img->get($file->getExt(), $options);
         $small_stream = fopen('php://memory', 'r+');
         fwrite($small_stream, $small_data);
         rewind($small_stream);
         $file->setPreview($small_stream);
     }
     $file->setUpdated(new \DateTime('now'));
 }
Ejemplo n.º 5
0
 /**
  * {@inheritDoc}
  */
 public function buildForm(FormBuilderInterface $builder, array $options)
 {
     //$builder->addViewTransformer( new HtmlTransformer() ) ;
     $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) use($options) {
         // respond to the event, modify data, or form elements
         $data = $event->getData();
         $object = $event->getForm()->getParent()->getData();
         if (!$object) {
             return;
         }
         $admin = $this->container->get('sf.admin.loader')->getAdminByClass($options['sf_admin_class']);
         $em = $admin->getManager();
         $className = $admin->getClassName();
         $property_name = $options['sf_admin_property'];
         $oldValue = $admin->getReflectionProperty($property_name)->getValue($object);
         if ($data) {
             $pattern = \Symforce\AdminBundle\Entity\File::getRichTextFilesPattern($this->container->getParameter('sf.web_assets_dir'));
             preg_match_all($pattern, $data, $ms, PREG_SET_ORDER);
             $repo = $em->getRepository('Symforce\\AdminBundle\\Entity\\File');
             $object_id = $admin->getId($object);
             $is_debug = $this->container->getParameter('kernel.debug');
             if ($ms) {
                 foreach ($ms as $ma) {
                     $file = $repo->loadByUUID($ma[1]);
                     $file_changed = false;
                     if ($file && $file->getIsHtmlFile()) {
                         if ($is_debug) {
                             if ($className !== $file->getClassName()) {
                                 $file->setClassName($className);
                                 $file_changed = true;
                             }
                             if ($property_name !== $file->getPropertyName()) {
                                 $file->setPropertyName($property_name);
                                 $file_changed = true;
                             }
                         } else {
                             if ($className !== $file->getClassName() || $property_name !== $file->getPropertyName()) {
                                 continue;
                             }
                         }
                         /*
                                                             $this->container->get('sf.admin.loader')->getAdminByClass($object)->addEvent('flushed', function($object, $admin) use($file, $em ){
                            \Dev::dump($file);
                            $em->refresh($file);
                            \Dev::dump($file);
                            exit;
                                                             });
                         */
                         if ($object_id && $object_id !== $file->getEntityId()) {
                             $file->setEntityId($object_id);
                             $file_changed = true;
                         }
                         if ($file->getSessionId()) {
                             $file->setSessionId(null);
                             $file_changed = true;
                         }
                         if ($file_changed) {
                             $em->persist($file);
                         }
                     }
                 }
             }
         } else {
             // check nullable
             $event->setData('');
         }
     });
 }
 /**
  * @Route("/upload/save/{admin_name}/{field_name}", name="sf_upload_save")
  * @Template()
  */
 public function imageAction(Request $request, $admin_name, $field_name)
 {
     $entity_id = (int) $request->get('id');
     $loader = $this->container->get('sf.admin.loader');
     if (!$loader->hasAdminName($admin_name)) {
         return $this->onError(sprintf('admin `%s` not exists(%d)!', $admin_name, __LINE__));
     }
     $admin = $loader->getAdminByName($admin_name);
     $config = $admin->getDoctrineConfigBy('file', $field_name);
     if (!$config) {
         return $this->onError(sprintf('admin `%s` file `%s` not exists(%d)!', $admin_name, $field_name, __LINE__));
     }
     $option = $admin->getFormOption($field_name);
     if (!$option) {
         return $this->onError(sprintf('admin `%s` file `%s` not exists(%d)!', $admin_name, $field_name, __LINE__));
     }
     /**
      * @var \Symfony\Component\HttpFoundation\File\UploadedFile
      */
     $handel = $request->files->get('attachment');
     if (!$handel || !$handel->isValid()) {
         return $this->onError('upload invalid');
     }
     $ext = strtolower(pathinfo($handel->getClientOriginalName(), PATHINFO_EXTENSION));
     if (!in_array($ext, $option['ext'])) {
         return $this->onError(sprintf('only allow (%s) you upload %s', join(', ', $option['ext']), $ext));
     }
     $session_id = $this->getRequest()->getSession()->getId();
     $file = new File();
     $file->setSessionId($session_id);
     $file->setName($handel->getClientOriginalName());
     $file->setExt($ext);
     $file->setSize($handel->getClientSize());
     $file->setType($handel->getMimeType());
     $file->setClassName($admin->getClassName());
     $file->setPropertyName($field_name);
     $file->setEntityId($entity_id);
     $stream = fopen($handel->getPathname(), 'rb');
     $data = stream_get_contents($stream);
     $file->setContent($data);
     $em = $this->get('doctrine')->getManager();
     $_file = $em->getRepository('Symforce\\AdminBundle\\Entity\\File')->loadByURL($request->get('url'));
     if ($_file && $admin->getClassName() === $_file->getClassName() && $field_name === $_file->getPropertyName() && $entity_id === $_file->getEntityId() && $session_id === $_file->getSessionId()) {
         $em->remove($_file);
     }
     $em->persist($file);
     $em->flush();
     return $this->sendJSON(array('url' => $this->getParameter('sf.web_assets_dir') . $file->__toString(), 'name' => $file->getName(), 'ext' => $ext, 'size' => $file->getSize()));
 }