基本的に ZfcUser を基盤として使用するカスタム User モジュールに取り組んでいます。すべてのアプリケーションは異なり、ユーザーに関するさまざまなメタ情報を必要とするため、構成配列を使用してこれを簡単に構成できるようにしたいと考えています。
モジュールのグローバル構成ファイルでカスタム フォーム フィールドを定義し、モジュールの onBootstrap で ZfcUser\Form\Register の init イベントを使用して ZfcUser 登録フォームを拡張します。要するに、私はこのようなことをしたいです:
$sharedEvents->attach('ZfcUser\Form\Register',
'init',
function($e) use ($sm)
{
/* @var $form \ZfcUser\Form\Register */
$form = $e->getTarget();
// Get relevant config
$config = $sm->get('config');
if ( array_key_exists('redev_user', $config) && is_array($config['redev_user']) )
{
if ( array_key_exists('custom_fields', $config['redev_user']) && is_array($config['redev_user']['custom_fields']) )
{
foreach ($config['redev_user']['custom_fields'] as $curCustomField)
{
$form->add($curCustomField);
}
}
}
[...]
私の構成ファイルでは、次のようにカスタム フォーム フィールドを定義します。
<?php
return array(
'redev_user' => array(
'custom_fields' => array(
// Custom fields which will be added to the registration form
array(
'name' => 'firstname',
'type' => 'text',
'options' => array(
'label' => 'First name',
),
),
バリデーターについても同じことを行います。それらは構成ファイルで定義され、onBootstrap のフォーム要素に添付されます。
Doctrineフォーム要素が必要な場合を除いて、これはすべてうまく機能します。私の特定のケースでは、国の選択ボックスに DoctrineModule\Form\Element\ObjectSelect を使用したいと思います。私の設定では、これは次のようになります。
array(
'name' => 'country',
'type' => 'DoctrineModule\Form\Element\ObjectSelect',
'options' => array(
'label' => 'Country',
//'object_manager' => $sm->get('Doctrine\ORM\EntityManager'),
'target_class' => 'RedevUser\Entity\Country',
'property' => 'countryname',
'is_method' => false,
'find_method' => array(
'name' => 'findBy',
'params' => array(
'criteria' => array(),
'orderBy' => array('countryname' => 'ASC'),
),
),
),
),
object_manager のコメントアウトされた行に注意してください。ObjectSelect 要素には、明らかに ObjectManager が必要です。問題は、構成に基づいてフォームをレンダリングするときに ObjectManager をどのように挿入するかです。
フォーム要素を自分でレンダリングしてから、DoctrineModule\Form\Element のインターフェイスまたは基本クラスのインスタンスであるかどうかを確認することを考えていました。ただし、そのような基本クラスまたはインターフェイスは存在しないことが判明しました。これらの要素に共通しているのは、getProxy があることだけです。現在、onBootstrap のコードは次のようになっています。
foreach ($config['redev_user']['custom_fields'] as $curCustomField)
{
$formElemFactory = $form->getFormFactory();
$elem = $formElemFactory->createElement($curCustomField);
if ($elem instanceof \DoctrineModule\Form\Element\ObjectSelect)
{
// Inject ObjectManager
$elem->getProxy()->setObjectmanager($sm->get('Doctrine\ORM\EntityManager'));
}
$form->add($elem);
}
しかし、Doctrine のさまざまなフォーム要素の種類をチェックしたくはありません。また、このようにするのは少し汚いようです。これをより良く/よりきれいにする方法についての意見やアイデアはありますか?