2

Symfony (Doctrine) を使用したファイル管理に問題があります。ポイントは、ファイルが正常にアップロードされることです。問題は、画像を含むフィールドを格納するエンティティを更新すると、画像が削除されることです。

エンティティを変更する (作成しない) 方法を知りたいのですが、フォームの入力ファイルの種類を空のままにしておくと、画像は以前に保持され、削除されません

以下にコードを残します。

ご挨拶と感謝。

実在物:

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();

    }

コントローラ

/**
     * 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()
        ));
    }

見る

    <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>
4

1 に答える 1