Dynamische Formulare

Für den Fall, dass ein Form Model wechselnde Eigenschaften haben soll, gibt es dynamische Form Models. Dieser Artikel erklärt dieses Konzept, ohne genauer auf den Sinn einzugehen. Verwendet wird es unter anderem bei den Options. Diesen Artikel kannst du ohne Weiteres überspringen.

DynamicDispatchable

Implementiere n2n\dispatch\DynamicDispatchable, um die Eigenschaften deines Form Models dynamisch festzulegen.

class ExampleDynForm implements DynamicDispatchable {
    private $values = array();

    public function setup(DispatchModel $dispatchModel) {
        $nameProperty = new ScalarProperty(new DynamicAccessProxy('name'), false);
        $dispatchModel->addProperty($nameProperty);
        
        $birthdayProperty = new DateTimeProperty(new DynamicAccessProxy('birthday'), false);
        $birthdayProperty->setDateStyle(DateTimeFormat::STYLE_MEDIUM);
        $birthdayProperty->setTimeStyle(DateTimeFormat::STYLE_NONE);
        $dispatchModel->addProperty($birthdayProperty);
    }

    public function getPropertyValue($name) {
        if (isset($this->values[$name])) return $this->values[$name];
        return null;
    }

    public function setPropertyValue($name, $value) {
        $this->values[$name] = $value;
    }
    
    private function _validation(BindingDefinition $bd) {
        $bd->val(array('name', 'birthday'), new ValNotEmpty());
    }
    
    public function save() {
        // submit code
    }
}

Die gewünschten Eigenschaften kannst du nun in der setup()-Methode dynamisch zusammenstellen, indem du sie über n2n\dispatch\model\DispatchModel::addProperty() registrierst. n2n stellt standardmässig folgende Eigenschafts-Typen zur Verfügung:

  • n2n\dispatch\property\impl\ScalarProperty
  • n2n\dispatch\property\impl\DateTimeProperty
  • n2n\dispatch\property\impl\FileProperty
  • n2n\dispatch\property\impl\ObjectProperty

Alle diese Eigenschafts-Typen erwarten einen n2n\reflection\property\AccessProxy als ersten Parameter. Nutze in dynamischen Form Models hierzu Instanzen von n2n\dispatch\property\DynamicAccessProxy, über welche du auch den Eigenschafts-Namen definieren kannst. Den Zweck der weiteren Parameter kannst du der PHPDoc jener Klassen entnehmen.

Weiter werden in dynamischen Form Models für die Werte aller Eigenschaften die Getter- und Setter-Methoden getPropertyValue($name) und setPropertyValue($name, $value) genutzt.

Das Arbeiten mit dynamischen Form Models in Views unterscheidet sich nicht von statischen.

<?php $formHtml->open($exampleDynForm) ?>
    <?php $formHtml->messageList() ?>

    <div>
        <?php $formHtml->label('name') ?>
        <div><?php $formHtml->input('name') ?></div>
    </div>
    <div>
        <?php $formHtml->label('birthday') ?>
        <div><?php $formHtml->input('birthday') ?></div>
    </div>
        
    <?php $formHtml->buttonSubmit('save', 'Save') ?>
<?php $formHtml->close() ?>

Auch im Controller kann ein dynamisches Form Model wie gewohnt "dispatched" werden.

class ExampleController extends ControllerAdapter {
    public function index() {
        $exampleDynForm = new ExampleDynForm();
        
        if ($this->dispatch($exampleDynForm, 'save')) {
            // do something
        }
        
        $this->forward('view\dynForm.html', array('exampleDynForm' => $exampleDynForm));
    }
}
« Eigenschaften annotieren Mags »

Kommentare

Du musst eingeloggt sein, damit du Beiträge erstellen kannst.

Fragen