Skip to content

Commit

Permalink
Adds cookbook recipe for using input filters in forms
Browse files Browse the repository at this point in the history
Signed-off-by: Frank Brückner <dev@froschdesignstudio.de>
  • Loading branch information
froschdesign committed Nov 4, 2022
1 parent 2e9a2f2 commit d428d84
Show file tree
Hide file tree
Showing 2 changed files with 145 additions and 0 deletions.
143 changes: 143 additions & 0 deletions docs/book/cookbook/input-filter-in-forms.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
# Using Input Filters in Forms of laminas-form

The following examples shows _two_ potential use cases of laminas-inputfilter within forms of [laminas-form](https://docs.laminas.dev/laminas-form/).

## Define the Input Filter in a Form

An input filter can be [defined directly in a form class](https://docs.laminas.dev/laminas-form/v3/quick-start/#hinting-to-the-input-filter) itself, using `Laminas\InputFilter\InputFilterProviderInterface`.
This interface provides one method (`getInputFilterSpecification()`) that is used by a form of laminas-form to create an input filter.

[Create a form as separate class](https://docs.laminas.dev/laminas-form/v3/quick-start/#factory-backed-form-extension) using the [`init` method](https://docs.laminas.dev/laminas-form/v3/advanced/#initialization), implement the interface `Laminas\InputFilter\InputFilterProviderInterface` and define the inputs via configuration array, e.g. `module/Album/src/Form/AlbumForm.php`:

<!-- markdownlint-disable MD033 -->
<pre class="language-php" data-line="7,10,26-48"><code>
namespace Album\Form;

use Laminas\Filter\StringTrim;
use Laminas\Filter\StripTags;
use Laminas\Form\Element\Text;
use Laminas\Form\Form;
use Laminas\InputFilter\InputFilterProviderInterface;
use Laminas\Validator\StringLength;

final class AlbumForm extends Form implements InputFilterProviderInterface
{
public function init(): void
{
// Add form elements
$this->add([
'name' => 'title',
'type' => Text::class,
'options' => [
'label' => 'Title',
],
]);

// …
}

public function getInputFilterSpecification(): array
{
return [
// Add inputs
[
'name' => 'title',
'filters' => [
['name' => StripTags::class],
['name' => StringTrim::class],
],
'validators' => [
[
'name' => StringLength::class,
'options' => [
'min' => 1,
'max' => 100,
],
],
],
],
// …
];
}
}
</code></pre>
<!-- markdownlint-enable MD033 -->

## Adding an Input Filter Defined as a Separate Class to a Form

### Create Input Filter

[Create an input filter as separate class](../intro.md), e.g. `module/Album/src/InputFilter/AlbumInputFilter.php`:

```php
namespace Album\InputFilter;

use Laminas\Filter\StringTrim;
use Laminas\Filter\StripTags;
use Laminas\Validator\StringLength;
use Laminas\InputFilter\InputFilter;

final class AlbumInputFilter extends InputFilter
{
public function init(): void
{
// Add inputs
$this->add(
[
'name' => 'title',
'filters' => [
['name' => StripTags::class],
['name' => StringTrim::class],
],
'validators' => [
[
'name' => StringLength::class,
'options' => [
'min' => 1,
'max' => 100,
],
],
],
]
);

// …
}
}
```

### Create Form and Add Input Filter

An input filter can be added directly in a form class itself, using the class name of the input filter or whatever name the input filter is registered under.

Create a form as separate class using the `init` method and set the input filter via the `setInputFilterByName()` method of `Laminas\Form\Form`, e.g. `module/Album/src/Form/AlbumForm.php`:

<!-- markdownlint-disable MD033 -->
<pre class="language-php" data-line="11-12"><code>
namespace Album\Form;

use Album\InputFilter\AlbumInputFilter;
use Laminas\Form\Element\Text;
use Laminas\Form\Form;

final class AlbumForm extends Form
{
public function init(): void
{
// Set the input filter
$this->setInputFilterByName(AlbumInputFilter::class);

// Add form elements
$this->add([
'name' => 'title',
'type' => Text::class,
'options' => [
'label' => 'Title',
],
]);

// …
}
}
</code></pre>
<!-- markdownlint-enable MD033 -->
2 changes: 2 additions & 0 deletions mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ nav:
- "Application Integration":
- "Usage in a laminas-mvc application": application-integration/usage-in-a-laminas-mvc-application.md
- "Usage in a mezzio application": application-integration/usage-in-a-mezzio-application.md
- Cookbook:
- "Using Input Filters in Forms of laminas-form": cookbook/input-filter-in-forms.md
site_name: laminas-inputfilter
site_description: 'Normalize and validate input sets from the web, APIs, the CLI, and more, including files.'
repo_url: 'https://github.com/laminas/laminas-inputfilter'
Expand Down

0 comments on commit d428d84

Please sign in to comment.