Multiplier: 動的コンポーネント

インタラクティブコンポーネントを動的に作成するためのツール

典型的な例から始めましょう:eコマースサイトに商品のリストがあり、それぞれについてカートに商品を追加するためのフォームを表示したいとします。可能なバリアントの1つは、リスト全体を1つのフォームでラップすることです。しかし、Nette\Application\UI\Multiplierははるかに便利な方法を提供します。

Multiplierを使用すると、複数のコンポーネントのファクトリを便利に定義できます。これはネストされたコンポーネントの原則に基づいて機能します – Nette\ComponentModel\Containerから継承する各コンポーネントは、他のコンポーネントを含むことができます。

ドキュメントのコンポーネントモデルに関する章、またはHonza Tvrdíkによる講演を参照してください。

Multiplierの本質は、コンストラクタで渡されたコールバックを使用して子を動的に作成できる親の役割を果たすことです。例を参照してください。

protected function createComponentShopForm(): Multiplier
{
	return new Multiplier(function () {
		$form = new Nette\Application\UI\Form;
		$form->addInteger('count', '商品数:')
			->setRequired();
		$form->addSubmit('send', 'カートに追加');
		return $form;
	});
}

これで、テンプレートで各商品についてフォームを簡単にレンダリングできます – そして、それぞれが本当にユニークなコンポーネントになります。

{foreach $items as $item}
	<h2>{$item->title}</h2>
	{$item->description}

	{control "shopForm-$item->id"}
{/foreach}

{control} タグで渡される引数は、次のことを示す形式です。

  1. shopForm コンポーネントを取得する
  2. そして、そこから子 $item->id を取得する

ポイント 1. の最初の呼び出しでは、shopForm はまだ存在しないため、そのファクトリ createComponentShopForm が呼び出されます。取得されたコンポーネント(Multiplierのインスタンス)で、特定のフォームのファクトリが呼び出されます – これは、コンストラクタでMultiplierに渡した匿名関数です。

foreachの次の反復では、createComponentShopForm メソッドは呼び出されません(コンポーネントは存在します)が、異なる子を探しているため($item->id は各反復で異なります)、匿名関数が再度呼び出され、新しいフォームが返されます。

残っているのは、フォームが実際に意図した商品をカートに追加することを確認することだけです – 現在、各商品のフォームはまったく同じです。Multiplierのプロパティ(および一般的にNette Frameworkのコンポーネントファクトリ)が役立ちます。つまり、各ファクトリは最初の引数として作成されるコンポーネントの名前を受け取ります。この場合、それは $item->id であり、これはまさに必要なデータです。したがって、フォームの作成を少し変更するだけで十分です。

protected function createComponentShopForm(): Multiplier
{
	return new Multiplier(function ($itemId) {
		$form = new Nette\Application\UI\Form;
		$form->addInteger('count', '商品数:')
			->setRequired();
		$form->addHidden('itemId', $itemId);
		$form->addSubmit('send', 'カートに追加');
		return $form;
	});
}
バージョン: 4.0