1

日時フォーム フィールドを read_only としてマークしました。この縫い目は効果がないので、デフォルトの twig テンプレートを無効にしました。これはうまくいきます。

{% block datetime_widget %}
    {% if read_only %}
        {{ value.date.year }}-{{ value.date.month }}-{{ value.date.day }} {{ value.time.hour }}:{{ value.time.minute }}
    {% else %}
        {{ parent() }}
    {% endif %}
{% endblock %}

これは私が使用しているフォームタイプです:

/**
 * @ORM\Entity
 */
abstract class BusinessClass
{

    /**
     * @ORM\Column(type="datetime")
     * @var \DateTime
     */
    private $created;

    /**
     * @return \DateTime
     */
    public function getCreated()
    {
        return $this->created;
    }

}

これは、datetime フィールドがフォーム ビルダーに追加される方法です。

$formBuilder->add('created', 'datetime', array('read_only' => true));

ただし、symfony は変更されていない値をフォーム タイプに戻そうとします。読み取り専用なので、get メソッドのみを実装し、set メソッドは実装しませんでした。そのため、次のエラー メッセージが表示されます。

InvalidPropertyException: Neither element "created" nor method "setCreated()" exists in class "Cinergy\ShopBundle\Tests\Functional\TestBundle\Entity\RecurringProduct"

    in /Users/ernst/Source/php/cinergy/shop/vendor/symfony/symfony/src/Symfony/Component/Form/Util/PropertyPath.php line 552
    at PropertyPath->writeProperty(object(RecurringProduct), 'created', null, false, null) in /Users/ernst/Source/php/cinergy/shop/vendor/symfony/symfony/src/Symfony/Component/Form/Util/PropertyPath.php line 318
    at PropertyPath->setValue(object(RecurringProduct), null) in /Users/ernst/Source/php/cinergy/shop/vendor/symfony/symfony/src/Symfony/Component/Form/Extension/Core/DataMapper/PropertyPathMapper.php line 74
    at PropertyPathMapper->mapFormsToData(array('created' => object(Form), 'duration' => object(Form), 'id' => object(Form), 'name' => object(Form), 'price' => object(Form), 'sku' => object(Form), 'updated' => object(Form), '__entity' => object(Form), '__id' => object(Form)), object(RecurringProduct)) in /Users/ernst/Source/php/cinergy/shop/vendor/symfony/symfony/src/Symfony/Component/Form/Form.php line 569
    at Form->bind(object(Request)) in /Users/ernst/Source/php/cinergy/shop/src/Cinergy/DaylightBundle/Controller/BrowserController.php line 123
    at BrowserController->updateAction(object(Request))
    at call_user_func_array(array(object(BrowserController), 'updateAction'), array(object(Request))) in /Users/ernst/Source/php/cinergy/shop/src/Cinergy/CommonBundle/EventListener/TransactionWrapper.php line 34
    at TransactionWrapper->wrappedExecution(object(Request))
    at call_user_func_array(array(object(TransactionWrapper), 'wrappedExecution'), array(object(Request))) in /Users/ernst/Source/php/cinergy/shop/app/bootstrap.php.cache line 1426
    at HttpKernel->handleRaw(object(Request), '1') in /Users/ernst/Source/php/cinergy/shop/app/bootstrap.php.cache line 1390
    at HttpKernel->handle(object(Request), '1', true) in /Users/ernst/Source/php/cinergy/shop/app/bootstrap.php.cache line 1566
    at HttpKernel->handle(object(Request), '1', true) in /Users/ernst/Source/php/cinergy/shop/app/bootstrap.php.cache line 617
    at Kernel->handle(object(Request)) in /Users/ernst/Source/php/cinergy/shop/web/app_dev.php line 28

これはビジネス ロジックの一部であるため、setCreate メソッドを実装したくありません。また、テキスト フィールドでも同じことがうまく機能することにも注意してください。

read_onlyオプションが設定されている場合、symfony が値を設定しないようにする方法についてのアイデアはありますか?

4

2 に答える 2

3

簡単な答えは次のとおりです。disabledの代わりに使用しread_onlyます。

ドキュメントで関連する部分を見つけた後、datetime のレンダリングがread_only正しくないと思います。設定だけread_onlyは何も変えていません。ドキュメントによると、読み取り専用の HTML として赤くする必要があります。

于 2013-03-18T08:11:46.483 に答える
-1

残念ながら、マップされたフィールドが無効に設定されている場合、そのフィールドは保持されません。その値は null になりますが、これはおそらく OP が探しているものではありません。別の解決策は、テンプレートで次のようなことを行うことです。

{% if household.dateAdded is not null %}{{ household.dateAdded|date('m/d/Y') }}
<input type="hidden" name="household[dateAdded]" value="{{ household.dateAdded|date('m/d/Y') }}">
{% endif %}

ここで、household はフォーム名、dateAdded はマップされたフィールド名です。

于 2013-10-09T20:07:24.763 に答える