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; }
private function getUrlPattern() { if (null == $this->_url_pattern) { $this->_url_pattern = File::getAllFilesPattern($this->container->getParameter('sf.web_assets_dir')); } return $this->_url_pattern; }
/** * {@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)); } } }); }
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')); }
/** * {@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())); }