मेरे पास एक कस्टम फॉर्म प्रकार है जिसका उपयोग मैं अपने फॉर्म में ड्रैग और ड्रॉप छवि अपलोडर प्रस्तुत करने के लिए कर रहा हूं। यह एक listing ऑब्जेक्ट में फ़ाइलें जोड़ने के लिए है और इसलिए यदि उपयोगकर्ता इसे अपडेट करने के लिए listing ऑब्जेक्ट पर वापस आता है या यदि वे पृष्ठ को रीफ्रेश करते हैं, तो मैं उन फ़ाइलों को प्रदर्शित करने में सक्षम होना चाहता हूं जो वे ' पहले ही अपलोड कर चुके हैं।

ListingController.php

/**
 * @Route("/account/listings/update/{id}", name="listing_update", requirements={"id": "\d+"})
 * @ParamConverter("listing", class="DirectoryPlatform\AppBundle\Entity\Listing")
 */
public function updateAction(Request $request, Listing $listing)
{
    $existingFiles = $this->get('punk_ave.file_uploader')->getFiles(array('folder' => 'tmp/attachments/' . $listing->getId()));
    if ($this->getUser() !== $listing->getUser()) {
        throw $this->createAccessDeniedException('You are not allowed to access this page.');
    }

    $form = $this->createForm(ListingType::class, $listing, [
        'currency' => $this->getParameter('app.currency'),
        'hierarchy_categories' => new Hierarchy($this->getDoctrine()->getRepository('AppBundle:Category'), 'category', 'categories'),
        'hierarchy_locations' => new Hierarchy($this->getDoctrine()->getRepository('AppBundle:Location'), 'location', 'locations'),
    ]);
    $form->handleRequest($request);


    if ($form->isSubmitted() && $form->isValid()) {
        /** @var Listing $listing */
        $listing = $form->getData();

        try {
            $em = $this->getDoctrine()->getManager();
            $em->persist($listing);

            /** @var Image $image */
            foreach ($listing->getImages() as $image) {
                if (empty($image->getImageName())) {
                    $em->remove($image);
                }
            }

            $em->flush();
            $this->addFlash('success', $this->get('translator')->trans('Listing has been successfully saved.'));
        } catch (\Exception $e) {
            $this->addFlash('danger', $this->get('translator')->trans('An error occurred when saving listing object.'));
        }

        return $this->redirectToRoute('listing_update', ['id' => $listing->getId()]);
    }

    return $this->render('FrontBundle::Listing/update.html.twig', [
        'listing' => $listing,
        'editId' => $listing->getId(),
        'existingFiles' => $existingFiles,
        'form' => $form->createView(),
    ]);
}

विचाराधीन चर $existingFiles है जिसे मैं render() विधि में पारित करने का प्रयास कर रहा हूं ताकि उन्हें टहनी में प्रदर्शित किया जा सके

dropzone.html.twig

{% block dropzone_widget %}
<div class="{{ class }}">

    {% for file in existingFiles %}
    <img src="/uploads/tmp/attachments/{{ listing.getId }}/large/{{ file }}">
    {% endfor %}
</div>
{% endblock %}

DropzoneType.php

<?php
namespace DirectoryPlatform\FrontBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\FormType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;

class DropZoneType extends AbstractType
{
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
        // default form options
        'class' => 'file-uploader'
        ));
    }

    public function getBlockPrefix()
    {
        return "dropzone";
    }
    /**
     * {@inheritdoc}
     */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars['class'] = $options['class'];
    }
        public function getParent()
    {
        return FormType::class;
    }
}

लेकिन मुझे एक त्रुटि मिल रही है Variable "existingFiles" does not exist.

संपादित करें: मेरी config.yml सहित

config.yml

# Twig Configuration
twig:
    debug: '%kernel.debug%'
    strict_variables: '%kernel.debug%'
    form_themes:
      - 'AppBundle:Form:bootstrap.html.twig'
      - 'AppBundle:Form:collection.html.twig'
      - 'AppBundle:Form:dropzone.html.twig'
    globals:
        google_maps_api_key: "%google_maps_api_key%"
        google_analytics_code: "%google_analytics_code%"
        enable_registration: "%enable_registration%"
0
Dan185 25 सितंबर 2018, 21:00

1 उत्तर

सबसे बढ़िया उत्तर

चूंकि आपके पास ड्रॉपज़ोन टाइप फॉर्म प्रकार है और (मुझे लगता है) आपने इसे अपने लिस्टिंग टाइप फॉर्म प्रकार में एक बच्चे के रूप में जोड़ा है, आप इसे इस तरह के विकल्प की तरह पास कर सकते हैं:

  1. मौजूदा फ़ाइलों को नियंत्रक से ListingType के विकल्प के रूप में पास करें:

    // ListingController.php
    
    $form = $this->createForm(ListingType::class, $listing, [
        'currency' => $this->getParameter('app.currency'),
        'hierarchy_categories' => new Hierarchy($this->getDoctrine()->getRepository('AppBundle:Category'), 'category', 'categories'),
        'hierarchy_locations' => new Hierarchy($this->getDoctrine()->getRepository('AppBundle:Location'), 'location', 'locations'),
        'existingFiles' => $existingFiles
    ]);
    
  2. मौजूदा फाइलों को ListingType से DropzoneType के विकल्प के रूप में पास करें:

    // ListingType.php
    
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $existingFiles = $options['existingFiles'];
    
        $builder
            ...
            ->add('dropzone', DropZoneType::class, [
                // other options          
               'existingFiles' => $existingFiles
            ]);
    }
    
  3. DropZoneType में अपनी मौजूदा फ़ाइलें प्राप्त करें और इसे प्रपत्र दृश्य चर के रूप में सेट करें:

    // DropZoneType.php
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars['class'] = $options['class'];
        $view->vars['existingFiles'] = $options['existingFiles'] ?? []; // in case no existing files are given
    }
    

फिर आप उन्हें अपने dropzone.html.twig में रेंडर कर सकते हैं जैसा कि आप वर्तमान में करते हैं।

1
iiirxs 25 सितंबर 2018, 21:26