• Willkommen im Zend Framework Forum

    ZF1 Zend Framework 1 + ZF2 Zend Framework 2

    Das Zend Framework Forum ist seit 2006 die erste Anlaufstelle für Zend Framework Entwickler in Deutschland. Mit über 70.000 Beiträgen und einer steigenden Nutzerzahl bietet das Forum hilfreiche Themen und ZF-Tutorials für professionelle Entwickler, fortgeschrittene Programmierer sowie Zend Framework Einsteiger.
    Wenn dies Dein erster Besuch in der Zend Framework Community ist, lies bitte zuerst die Hilfe - FAQ durch. Du musst Dich registrieren, bevor Du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um die Registrierung zu starten. Du kannst auch jetzt schon Beiträge lesen. Hier im Forum findest Du die Zend Framework Hilfe, die Du suchst!

    Grüße an alle Zend Framework Entwickler. Das Team vom Zend Framework Forum!

    Drupal Agentur

Fehlermeldungen bei Validierung von Collections

st0ffel

New member
Hallo,

ich baue gerade ein Formular über das der User u.a. Dateien hochladen kann. Ich habe das über Collections gelöst:

PHP:
<?php
use Zend\InputFilter;

class Form extends \Zend\Form\Form
{
    const FILE_COUNT = 3;


    public function __construct($name = null, $options = [])
    {
        parent::__construct($name, $options);


        $this->add([
            'name' => 'files',
            'type' => 'collection',
            'options' => [
                'count'         => self::FILE_COUNT,
                'allow_add'     => false,
                'allow_remove'  => false,
                'target_element'=> [
                    'type' => 'file',
                    'attributes' => ['accept' => 'image/*']
                ]
            ]
        ]);


        $this->setInputFilter($this->createInputFilter());
    }


    private function createInputFilter()
    {
        $filter = new InputFilter\InputFilter();


        $filter->add([
            'name' => 'files',
            'type' => InputFilter\FileInput::class,
            'required' => false,
            'validators' => [[
                'name' => 'File\Size',
                'options' => ['max' => '50kB']
            ]]
        ]);


        return $filter;
    }
}
In meiner index.php (ich nutze kein MVC) mache ich folgendes:
PHP:
<?php
$request = new \Zend\Http\PhpEnvironment\Request();

if ($request->isPost()) {
    $form->setData(array_merge(
        $request->getPost()->toArray(),
        $request->getFiles()->toArray()
    ));
    if ($form->isValid()) {
        // ...
        var_dump($form->getData());
        exit;
    }


    var_dump($form->isValid());
    var_dump($form->getMessages());


    exit;
}
Beim Upload einer 70kB großen Datei wird der Size-Validator aufgerufen (Maximum allowed size for file is '50kB' but '70.52kB' detected) und liefert false zurück.

Das Formular ist dementsprechend auch ungültig. Dummerweise liefert Form::getMessages ein leeres Array zurück.

Was übersehe ich bzw. wie komme ich an die Fehlermeldungen der einzelnen Collection-Elemente?

Für Hinweise wäre ich dankbar :)


Gruß,
Marco
 

automatix

New member
Hallo!

Ich weiß nicht, ob es anders funktioniert, ich jedenfalls baue meine Collections über Fieldsets, wie im "Form Collections" Tutorial. D.h. jedes Element der Collection ist ein Fieldset, z.B.:

PHP:
class MyFormOrFieldset
{
    public function init()
    {
        parent::init();
        $this->add(
            [
                'name' => 'servers',
                'type' => 'Zend\Form\Element\Collection',
                'options' => [
                    'label' => _('servers'),
                    'count' => 3,
                    'should_create_template' => true,
                    'template_placeholder' => '__placeholder__',
                    'allow_add' => true,
                    'target_element' => [
                        'type' => 'My\Form\Fieldset\Server'
                    ],
                    'label_attributes' => [...]
                ]
            ]
        );
    }        
}

class ServerFieldset extends Fieldset implements InputFilterProviderInterface
{
    public function init()
    {
        $this->add(
            [
                'type' => 'text',
                'name' => 'name',
                'options' => [
                    'label' => _('server name'),
                    'label_attributes' => [...]
                ],
                'attributes' => [...]
            ]
        );
    }
    public function getInputFilterSpecification()
    {
        return [
            'name' => [
                'validators' => [
                    [
                        'name' => 'Regex',
                        'options' => [
                            'pattern' => '/^[A-Z][0-9]{3}/',
                        ]
                    ],
                ],
            ]
        ];
    }
}
Wie gesagt, möglicherweise geht es auch ohne Verschachtelung von Fieldsets (allein schon weil Collection#targetElement ein ElementInterface erwartet), habe ich aber noch nicht ausprobiert.
 
Zuletzt bearbeitet:

Kaiuwe

Super-Moderator
Dummerweise liefert Form::getMessages ein leeres Array zurück.
Schau mal bitte in den Bugtracker von „Zend\Form“ und „Zend Framework“ selbst, denn ich erinnere mich dunkel, dass es dazu ein Ticket gab.

PHP:
use Zend\InputFilter;

class Form extends \Zend\Form\Form
{
    public function __construct($name = null, $options = [])
    {
        $this->setInputFilter($this->createInputFilter());
    }


    private function createInputFilter()
    {
    }
}
Wirf mal einen Blick in das Code-Beispiel von „automatix“, denn einen „InputFilter“ hinzufügen geht eleganter.
 
Oben