0

3つの要素を取り除き、<select>ユーザーが通常の<input type="text">コントロールに日付を入力できるようにする標準的な方法は何ですか?

要件は次のとおりです。

  • 日付形式はD/M/Yである必要があります
  • 既存の日付を正しく印刷する必要があります
  • 日付の検証を破ることはできません

私はこれに関する合理的なドキュメントを見つけることができません、私と同じくらい無知なユーザーによって書かれたフォーラムスレッドをハックするだけですxD

明確化:CakePHPタグに注意してください。私はすでに通常のPHPで日付を処理する方法を知っています。フレームワークのデフォルト機能を調整するために使用できる正確なCakePHPメカニズムについてのヘルプが必要です(実際には、オーバーライドではなく調整を意味します)。

これまでのところ、これをモデルに追加しました。

public $validate = array(
    'fecha' => array(
        array(
            'rule' => 'notEmpty',
            'required' => true,
        ),
        array(
            'rule' => array('date', 'dmy'),
        ),
    )
);

...そして私はビュー内でこのようなフィールドを構成しました:

echo $this->Form->input(
    'Foo.fecha',
    array(
        'type' => 'text',
    )
);

...しかし、これでできることは、ユーザー入力を読み取って検証することだけです。前の日付が正しく印刷されず、新しい日付が正しく保存されません。

4

3 に答える 3

2

これが私の発見の要約です。適切なメカニズムは、モデルコールバックメソッドを使用して2つの日付形式を切り替えることであるようです。

  • データベース形式、例:2012-08-28
  • 表示形式、例:28/08/2012

手順:

  1. AppModelカスタム形式(別名「表示形式」)とMySQLのデフォルト形式(別名「DB形式」)を変換するための2つのユーティリティメソッドを追加します。
  2. afterFind()DBから読み取ったときに表示形式に変換するフィルターをモデルに追加します。
  3. フォームコントロールをとしてレンダリングし'type' => 'text'ます。
  4. 'rule' => array('date', 'dmy')モデル内のフィールドに検証ルールを追加します。
  5. beforeSave()保存する直前にDB形式に変換するフィルターをモデルに追加します。

これらのステップは、とコールバック、および場合によってはのような他のいくつかを実装する動作でカプセル化できます。この動作は、データ配列を直接適用して処理し、両方の形式間で日付を変換します(モデルにテーブルが添付されている場合)。コードは簡単ではありませんが、実行可能であり、すべてが透過的になります。afterFind()beforeSave()beforeFind()AppModel

欠点:

  • コードをMySQLのみにします(ただし、MySQLのみではありませんか?
  • ローカライズが困難になります。
  • 日付の計算を行う必要がある場合は、人間が読める形式の文字列を使用していることに気付くでしょう。

次の3つの形式を使用できると、より堅実になります。

  • データベース形式、例:2012-08-28
  • 表示形式、例:28/08/2012
  • PHPの内部形式(UnixタイムスタンプやDateTimeオブジェクトなど)

悲しいことに、CakePHPコアはそのために設計されておらず、この方法で実装しようとすると、すべてが複雑になり始めます。

于 2012-08-27T06:55:18.527 に答える
1

唯一可能な方法は、ユーザーがやりたいことを入力できるようにし、フォームなどを送信したいときにその有効性を確認することです。または、jQueryのdatepickerを使用することをお勧めします。

于 2012-08-24T12:05:34.290 に答える
0

ヘルパーを使用して入力フィールドを作成する場合は、のメソッドのtypeオプションがあります。たとえば、これを試してください。inputformhelper

<?php
echo $this->Form->input('birth_dt', array(
    'type'  => 'text',
    'label' => 'Date of birth',
));

編集:(コメントを読んだ後)

その場合の解決策は、フォームの送信後、またはajaxvalidationを使用して入力値を検証することです。

于 2012-08-24T12:07:33.113 に答える