Je travaille sur Symfony et j'ai un problème qui est le suivant: -

OrderAdminController:

<?php
namespace AppBundle\Controller;

use Symfony\Component\HttpFoundation\Request;
use Sonata\AdminBundle\Controller\CRUDController as Controller;
use AppBundle\Entity\Order;
use AppBundle\Entity\Month;

class OrderAdminController extends Controller
{

//overriding Default CRUD create action
    public function createAction()
    {

        $request = $this->getRequest();
         // this is the code where i am trying to change the coming values of ofrm fileds
         if(!empty($_POST)){
            $key =array_keys($_POST)[0];
            $date_to_floor = $_POST[$key]["date_to_floor"];
            $user_id = $_POST[$key]["assigned"];
            $hours_to_complete = $_POST[$key]["estimate"];
            $final_data = $this->adjust_working_hours($date_to_floor,$user_id,$hours_to_complete);
            $request->request->set('start_datetime', date('n/j/Y H:i',strtotime($final_data['start_date'])));
            $request->request->set('end_datetime', date('n/j/Y H:i',strtotime($final_data['end_date'])));
            $request->request->set('hours_remaining', $final_data['hours_remaining']);
        }
        // the key used to lookup the template
        $templateKey = 'edit';

        $this->admin->checkAccess('create');

        $class = new \ReflectionClass($this->admin->hasActiveSubClass() ? $this->admin->getActiveSubClass() : $this->admin->getClass());

        if ($class->isAbstract()) {
            return $this->render(
                'SonataAdminBundle:CRUD:select_subclass.html.twig',
                array(
                    'base_template' => $this->getBaseTemplate(),
                    'admin' => $this->admin,
                    'action' => 'create',
                ),
                null,
                $request
            );
        }

        $object = $this->admin->getNewInstance();

        $preResponse = $this->preCreate($request, $object);
        if ($preResponse !== null) {
            return $preResponse;
        }

        $this->admin->setSubject($object);

        /** @var $form \Symfony\Component\Form\Form */
        $form = $this->admin->getForm();
        $form->setData($object);
        $form->handleRequest($request);

        if ($form->isSubmitted()) {
            //TODO: remove this check for 4.0
            if (method_exists($this->admin, 'preValidate')) {
                $this->admin->preValidate($object);
            }
            $isFormValid = $form->isValid();

            // persist if the form was valid and if in preview mode the preview was approved
            if ($isFormValid && (!$this->isInPreviewMode($request) || $this->isPreviewApproved($request))) {
                $this->admin->checkAccess('create', $object);

                try {
                    $object = $this->admin->create($object);

                    if ($this->isXmlHttpRequest()) {
                        return $this->renderJson(array(
                            'result' => 'ok',
                            'objectId' => $this->admin->getNormalizedIdentifier($object),
                        ), 200, array());
                    }

                    $this->addFlash(
                        'sonata_flash_success',
                        $this->admin->trans(
                            'flash_create_success',
                            array('%name%' => $this->escapeHtml($this->admin->toString($object))),
                            'SonataAdminBundle'
                        )
                    );

                    // redirect to edit mode
                    return $this->redirectTo($object);
                } catch (ModelManagerException $e) {
                    $this->handleModelManagerException($e);

                    $isFormValid = false;
                }
            }

            // show an error message if the form failed validation
            if (!$isFormValid) {
                if (!$this->isXmlHttpRequest()) {
                    $this->addFlash(
                        'sonata_flash_error',
                        $this->admin->trans(
                            'flash_create_error',
                            array('%name%' => $this->escapeHtml($this->admin->toString($object))),
                            'SonataAdminBundle'
                        )
                    );
                }
            } elseif ($this->isPreviewRequested()) {
                // pick the preview template if the form was valid and preview was requested
                $templateKey = 'preview';
                $this->admin->getShow();
            }
        }

        $view = $form->createView();

        // set the theme for the current Admin Form
        $this->get('twig')->getExtension('form')->renderer->setTheme($view, $this->admin->getFormTheme());

        return $this->render($this->admin->getTemplate($templateKey), array(
            'action' => 'create',
            'form' => $view,
            'object' => $object,
        ), null);
    }
}

Maintenant, ce que j'essaie, c'est que lorsque le formulaire est soumis, je dois modifier certaines valeurs de champ de formulaire en fonction de adjust_working_hours().

Le problème est que si j'ai ajouté ce code:

        $key =array_keys($_POST)[0];
        $date_to_floor = $_POST[$key]["date_to_floor"];
        $user_id = $_POST[$key]["assigned"];
        $hours_to_complete = $_POST[$key]["estimate"];
        $final_data = $this->adjust_working_hours($date_to_floor,$user_id,$hours_to_complete);
        $request->request->set('start_datetime', date('n/j/Y H:i',strtotime($final_data['start_date'])));
        $request->request->set('end_datetime', date('n/j/Y H:i',strtotime($final_data['end_date'])));
        $request->request->set('hours_remaining', $final_data['hours_remaining']);

Avant: if ($form->isSubmitted()) { les valeurs du formulaire d'origine sont enregistrées dans la base de données et non celle modifiée.

Et si j'ajoute le même code après if ($form->isSubmitted()) {, cela indique une erreur:

Vous ne pouvez pas modifier les données du formulaire soumis

Alors, comment changer ces valeurs de champ afin que mes valeurs modifiées soient sauvegardées?

-7
Anant Singh---Alive to Die 16 janv. 2017 à 12:12

2 réponses

Meilleure réponse

La meilleure façon de modifier les données de votre objet avant qu'il ne soit persistant est de remplacer le hook prePersist() de votre classe admin (cette méthode est là exactement pour cela) comme ceci:

public function prePersist($object)
{
    $this->changeFields($object);
}

Si vous voulez faire de même lors de l'édition de l'objet, remplacez simplement preUdpate.

Informations plus détaillées ici: https://sonata-project.org /bundles/admin/master/doc/reference/saving_hooks.html

Quoi que vous vouliez faire lors de l'utilisation de l'administrateur Sonata, vous devez toujours essayer de le faire via votre classe d'administration avant d'essayer de remplacer le contrôleur.

3
Mawcel 20 janv. 2017 à 11:33

Je pense que je comprends vos besoins et à mon humble avis, vous le faites dans le mauvais sens.

Pour réaliser des opérations sur le formulaire soumis, avant ou après l'envoi, consultez la rubrique relative aux événements du formulaire Symfony dans la documentation: https://symfony.com/doc/2.8/form/events.html. Prenez le temps de comprendre le processus complet de symfony Forms car ce n'est pas facile au début.

Ensuite, vous pourrez adapter votre formulaire en fonction de plusieurs choses et valeurs.

Aussi, essayez de rendre votre contrôleur plus léger et plus clair car tbh, c'est trop déroutant. Séparez votre code en fonctions plus petites à l'intérieur d'un service ou en méthonds privés sur le contrôleur.

1
bohr 16 janv. 2017 à 09:21