PHPackages                             elisdn/yii2-composite-form - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Framework](/categories/framework)
4. /
5. elisdn/yii2-composite-form

ActiveYii2-extension[Framework](/categories/framework)

elisdn/yii2-composite-form
==========================

Nested forms base class for Yii2 Framework.

1.1.0(8y ago)53211.8k↓17.7%16[4 PRs](https://github.com/ElisDN/yii2-composite-form/pulls)8BSD-3-ClausePHP

Since Jun 28Pushed 5y ago7 watchersCompare

[ Source](https://github.com/ElisDN/yii2-composite-form)[ Packagist](https://packagist.org/packages/elisdn/yii2-composite-form)[ RSS](/packages/elisdn-yii2-composite-form/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependencies (2)Versions (3)Used By (8)

Composite Form for Yii2 Framework
=================================

[](#composite-form-for-yii2-framework)

The extension allows to create nested form models.

Installation
------------

[](#installation)

Install with composer:

```
composer require elisdn/yii2-composite-form
```

Usage samples
-------------

[](#usage-samples)

Create any simple form model for SEO information:

```
class MetaForm extends Model
{
    public $title;
    public $description;
    public $keywords;

    public function rules()
    {
        return [
            [['title'], 'string', 'max' => 255],
            [['description', 'keywords'], 'string'],
        ];
    }
}
```

and for characteristics:

```
class ValueForm extends Model
{
    public $value;

    private $_characteristic;

    public function __construct(Characteristic $characteristic, $config = [])
    {
        $this->_characteristic = $characteristic;
        parent::__construct($config);
    }

    public function rules()
    {
        return [
            ['value', 'safe'],
        ];
    }

    public function attributeLabels()
    {
        return [
            'value' => $this->_characteristic->name,
        ];
    }

    public function getCharacteristicId()
    {
        return $this->_characteristic->id;
    }
}
```

And create a composite form model which uses both as an internal forms:

```
use elisdn\compositeForm\CompositeForm;

/**
 * @property MetaForm $meta
 * @property ValueForm[] $values
 */
class ProductCreateForm extends CompositeForm
{
    public $code;
    public $name;

    public function __construct($config = [])
    {
        $this->meta = new MetaForm();
        $this->values = array_map(function (Characteristic $characteristic) {
            return new ValueForm($characteristic);
        }, Characteristic::find()->orderBy('sort')->all());
        parent::__construct($config);
    }

    public function rules()
    {
        return [
            [['code', 'name'], 'required'],
            [['code', 'name'], 'string', 'max' => 255],
            [['code'], 'unique', 'targetClass' => Product::className()],
        ];
    }

    protected function internalForms()
    {
        return ['meta', 'values'];
    }
}
```

That is all. After all just use external `$form` and internal `$form->meta` and `$form->values` models for `ActiveForm`:

```

    Common
