在symfony(Doctrine)中更新实体时删除图片

时间:2015-05-19 11:52:07

标签: symfony http doctrine-orm symfony-http-foundation

我在使用Symfony(Doctrine)进行文件管理时遇到问题。关键是文件上传成功,问题是当我更新存储包含图片的字段的实体时,图片被删除

我想知道如何更改(不创建)实体,将输入文件类型保留为空,表示之前保留的图像已被删除

我将代码留在下面。

问候和谢谢。

ENTITY:

public function getAbsolutePath()
    {
        return null === $this->getLogo()
        ? null
        : $this->getUploadRootDir().'/'.$this->getLogo();
    }

    public function getWebPath()
    {
        return null === $this->getLogo()
        ? null
        : $this->getUploadDir().'/'.$this->getLogo();
    }

    protected function getUploadRootDir()
    {
        // la ruta absoluta del directorio donde se deben
        // guardar los archivos cargados
        return __DIR__.'/../../../../web/' . $this->getUploadDir();
    }

    protected function getUploadDir()
    {
        // se deshace del __DIR__ para no meter la pata
        // al mostrar el documento/imagen cargada en la vista.
        return 'images/agencies';
    }

    public function filename()
    {
        // Comprueba si la agencia dispone de identificador para ponerlo como nombre de logo.
        if ($this->getId() != null || $this->getId() != '')
            $filename = $this->getId() . '.' . $this->getlogo()->getClientOriginalExtension();
        else 
            $filename = $this->getlogo()->getClientOriginalName();

        // Devuelve el nombre de fichero generado.
        return $filename;
    }

    public function upload()
    {
        if (null === $this->getLogo()) 
        {
            return;
        }

        $this->getLogo()->move(
                $this->getUploadRootDir(),
                $this->filename()
        );

        //$this->logo = $this->getUploadDir().$this->getLogo()->getClientOriginalName();
        $this->logo = $this->filename();

    }

CONTROLLER

/**
     * Formulario para lo configuración de los datos de la agencia.
     * @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response
     */
    public function formConfigDataAction()
    {
        // Consulta los datos de la agencia.
        $em = $this->getDoctrine()->getManager();
        $agency = $em->getRepository('PanelBundle:Agencies')->find($this->getUser()->getId());

        // Crea el formulario según 'AgenciesType' pasando los datos seleccionados.
        $form = $this->createForm(new AgenciesConfigDataType(), $agency);

        // Recoge la petición.
        $request = $this->getRequest();

        // Comprueba si se han obtenidos datos mediante POST.
        if ($request->getMethod() == 'POST')
        {
            // Asocia el formulario con los datos de la petición.
            $form->handleRequest($request);

            // Comprueba si los datos recibidos son válidos.
            if ($form->isValid())
            {
                // Sube la imagen
                $agency->upload();

                // Almacena los cambios.
                $em->flush();

                // Genera la alerta.
                $this->addFlash(
                        'success',
                        'Se ha guardado la nueva configuración.'
                );
            }
            else
            {
                // Genera la alerta.
                $this->addFlash(
                    'danger',
                    'Existen campos no válidos. Comprueba los datos introducidos.'
                );
             }

             // Redirige al usuario.
             return $this->redirect($this->generateUrl('agencies_form_config_data'));
        }

        // Renderiza la vista.
        return $this->render('PanelBundle:Agencies:form-config-data.html.twig', array(
                'form' => $form->createView(),
                'logo' => $agency->getLogo()
        ));
    }

VIEW

    <div class="form-group col-lg-6">
        {{ form_label(form.logo, 'Subir nuevo logotipo') }}
        {{ form_widget(form.logo) }}
        {{ form_errors(form.logo) }}
        <span class="help-block">Recomendamos un tamaño no superior a 400px x 250px</span>
    </div>

1 个答案:

答案 0 :(得分:-1)

文件上传过程已在documentation中得到很好的解释,您无需在每个操作中调用dnsdomainname: Unknown host 0 sandbox has stopped 方法,请按照here的说明使用生命周期回调。