Hi,

How to post render a view with more than one form to show ?

I 'm running in trouble to do so because sf2 frameworks does perfom form validation upon all binded forms.
Where doing a post render of my view bring me to bind all forms.
And so on to validate form's i don't want to, because user simply did not...

My problem seem to be mainly situated in
Symfony\Component\Form\Form

Where bind is always called by bindrequest, and where bindrequest does always call for validators, except when the form is read only.

I may have mis used the framework, reading to this. or not.
I don't know much.

But the process could be a little bit different by involving a new state defining if the user is currently, or not, submiting this Form Object. And so, to validate we must have submitted=true, and inbound=true and valid=true.
Also bind process could be chained to the submission on not to the bind.
But all of this, is much a change, and i want to think i m doing a mistake because solution must be some where in my code or current usage of the fw....


I m also thinking in the use of read only property, because as i said before, it does skip validators calls. Right now, it is a solution, because both forms are instanciated, in the same controller.

But how to do this when there are used within modules and dynamic calls ?



Thanks by advance.
Any help is appreciated.

Symfony\Component\Form\Form
...
    /**
     * Binds POST data to the field, transforms and validates it.
     *
     * @param string|array $clientData The POST data
     */
    public function bind($clientData)
    {
        if ($this->readOnly) {
            return;
        }

        if (is_scalar($clientData) || null === $clientData) {
            $clientData = (string)$clientData;
        }

// Initialize errors in the very beginning so that we don't lose any
        // errors added during listeners
        $this->errors = array();

        $event = new DataEvent($this, $clientData);
        $this->dispatcher->dispatch(Events::preBind, $event);

        $appData = null;
        $normData = null;
        $extraData = array();
        $synchronized = false;

        // Hook to change content of the data bound by the browser
        $event = new FilterDataEvent($this, $clientData);
        $this->dispatcher->dispatch(Events::onBindClientData, $event);
        $clientData = $event->getData();

        if (count($this->children) > 0) {
            if (null === $clientData || '' === $clientData) {
                $clientData = array();
            }

            if (!is_array($clientData)) {
                throw new UnexpectedTypeException($clientData, 'array');
            }

            foreach ($this->children as $name => $child) {
                if (!isset($clientData[$name])) {
                    $clientData[$name] = null;
                }
            }

            foreach ($clientData as $name => $value) {
                if ($this->has($name)) {
                    $this->children[$name]->bind($value);
                } else {
                    $extraData[$name] = $value;
                }
            }

            // If we have a data mapper, use old client data and merge
            // data from the children into it later
            if ($this->dataMapper) {
                $clientData = $this->getClientData();
            }
        }

        if (null === $clientData || '' === $clientData) {
            $clientData = $this->emptyData;

            if ($clientData instanceof \Closure) {
                $clientData = $clientData->__invoke($this);
            }
        }

        // Merge form data from children into existing client data
        if (count($this->children) > 0 && $this->dataMapper) {
$this->dataMapper->mapFormsToData($this->children, $clientData);
        }

        try {
            // Normalize data to unified representation
            $normData = $this->clientToNorm($clientData);
            $synchronized = true;
        } catch (TransformationFailedException $e) {
        }

        if ($synchronized) {
            // Hook to change content of the data in the normalized
            // representation
            $event = new FilterDataEvent($this, $normData);
            $this->dispatcher->dispatch(Events::onBindNormData, $event);
            $normData = $event->getData();

            // Synchronize representations - must not change the content!
            $appData = $this->normToApp($normData);
            $clientData = $this->normToClient($normData);
        }

        $this->bound = true;
        $this->data = $appData;
        $this->normData = $normData;
        $this->clientData = $clientData;
        $this->extraData = $extraData;
        $this->synchronized = $synchronized;

        $event = new DataEvent($this, $clientData);
        $this->dispatcher->dispatch(Events::postBind, $event);

*foreach ($this->validators as $validator) {
            $validator->validate($this);
        }*
    }

    /**
     * Binds a request to the form
     *
     * If the request was a POST request, the data is bound to the form,
     * transformed and written into the form data (an object or an array).
     * You can set the form data by passing it in the second parameter
     * of this method or by passing it in the "data" option of the form's
     * constructor.
     *
     * @param Request $request    The request to bind to the form
     */
    public function bindRequest(Request $request)
    {
        // Store the bound data in case of a post request
        switch ($request->getMethod()) {
            case 'POST':
            case 'PUT':
                $data = array_replace_recursive(
                    $request->request->get($this->getName(), array()),
                    $request->files->get($this->getName(), array())
                );
                break;
            case 'GET':
                $data = $request->query->get($this->getName(), array());
                break;
            default:
throw new FormException(sprintf('The request method "%s" is not supported', $request->getMethod()));
        }

*$this->bind($data);*
    }

--
If you want to report a vulnerability issue on symfony, please send it to 
security at symfony-project.com

You received this message because you are subscribed to the Google
Groups "symfony users" group.
To post to this group, send email to symfony-users@googlegroups.com
To unsubscribe from this group, send email to
symfony-users+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/symfony-users?hl=en

Reply via email to