embedFormしたフォームオブジェクトの動的schema設定

とあるフォームオブジェクトから別のフォームオブジェクトをマージするような形式で使える便利な::embedForm()メソッド
そのまま使うんであれば特に問題ないのだけれども、動的にスキーマやバリデータを変更したい時とかが厄介なのでメモしとこ。

symfony 1.x legacy websiteでのProductPhotoFormのスキーマを呼び出す方法。

<?php
// lib/form/doctrine/ProductForm.class.php

/**
 * ProductPhotoのウィジェット取得
 * @param Int $i newPhotoウィジェットが保持する配列キー
 * @param ProductPhotoのウィジェット配列名
 */
public function getProductPhotoWidget($i, $name)
{
    // newPhotoウィジェットが持つウィジェット取得
    $widget = $this->getWidget('newPhoto')->getFields();

    // $keyをキーとするwidgetがなければFALSEを返す
    if (!isset($widget[$i])) {
        return FALSE;
    }

    // キーが$keyのウィジェット取得
    $widget = $widget[$i]->getFields();

    // $nameをキーとするwidgetがなければFALSEを返す
    if (!isset($widget[$name])) {
        return FALSE;
    }

    return $widget[$name]->getFields();
}

ループの最初に生成されたcaptionウィジェット(構成はここを参照)を取得するには、

<?php
$form = new ProductForm();
$widget = $form(0, 'caption');

とすれば取得できる。取得した$widgetから$widget->setOption()などのメソッドが使用できるようになる。
今回作成したメソッド内にある $this->getWidget('newPhoto') を $this->getValidator('newPhoto') に変えればバリデータが取得できる。