0

CGridViewに日付を次のように表示します: "22.6.2012 22:53" with:

array('name' => 'date',
            'value' => date("j.n.Y G:i", strtotime($model->date))
        ),

しかし、私のフィルターでは、結果を取得するために(データベースにある)この形式で検索する必要があります:"2012-06-2222:53"。

CGridViewに表示される形式でフィルターを機能させるにはどうすればよいですか?答えを検索しましたが、見つかりませんでした。モデルsearch()にこの属性の日付関数を追加してみました。

$criteria->compare('date', date("j.n.Y G:i", strtotime($this->date), true);

しかし、それから私はただ空のリストを取得します:)

助けていただければ幸いです。

4

3 に答える 3

1

valueまず、日付のフォーマットを制御するためにプロパティを使用するべきではありません。適切な方法は、typeプロパティをに設定'date'し、まだこれを行っていない場合はCApplication.language、適切なロケールをターゲットにするように設定することです。

CJuiDatePickerフィルタの場合、ウィジェットを使用してユーザーが視覚的に日付を選択できるようにするのがユーザーにとって最適です。ここにそれを行う方法についての短くて要点のガイドがあります。

アップデート:

を使用した列のフォーマットtype == 'date'は、を介して行われCGridView.formatterます。明示的に値を設定しない場合、デフォルトは'format'アプリケーションコンポーネントが何であれです。そのため、その場でを指定して構成できますCFormatter。または、アプリケーションのフォーマッターを使用したいが、わずかな変更を加えるだけで実行できます。

$formatter = clone Yii::app()->format;
$formatter->dateFormat = 'whatever'; // or $formatter->dateTimeFormat

次に、このインスタンスをに割り当てますCGridView.formatter

于 2012-06-22T21:28:22.237 に答える
0

compare()は入力を使用してSQLセンテンスを作成するため、入力を目的の形式に変更する必要がありました。

私の機能:

function changeDateToDBformat($datum) {
        if (strstr($datum, '.') || strstr($datum, ':')) {
            $formats = array('!j.n', '!j.n.Y', '!j.n.Y H:i', '!n.Y H:i', '!n.Y', '!H:i', '!j.n.Y H', '!n.Y H', '!Y H:i', '!Y H');
            $date = false;

            foreach ($formats as $format) {
                $date = DateTime::createFromFormat($format, $datum);
                if (!($date === false)) {
                    $izbraniFormat = $format;
                    break;
                }
            }

            if (!$date === false) {
                $datum1 = $date->format('Y-m-d H:i');
                $date2 = DateTime::createFromFormat(substr($izbraniFormat, 1, strlen($izbraniFormat)), $datum);
                $datum2 = $date2->format('Y-m-d H:i');

                $datumcas1 = explode(' ', $datum1);
                $datumcas2 = explode(' ', $datum2);

                $prvidatum = explode('-', $datumcas1[0]);
                $drugidatum = explode('-', $datumcas2[0]);
                $koncniDatum = '';
                for ($a = 0; $a < sizeof($prvidatum); $a++) {
                    if ($prvidatum[$a] == $drugidatum[$a])
                        $koncniDatum .= '-' . $prvidatum[$a];
                }
                $koncniCas = '';
                $prvicas = explode('-', $datumcas1[1]);
                $drugicas = explode('-', $datumcas2[1]);
                for ($a = 0; $a < sizeof($prvicas); $a++) {
                    if ($prvicas[$a] == $drugicas[$a])
                        $koncniCas .= ':' . $prvicas[$a];
                }
                $koncniDatum = substr($koncniDatum, 1, strlen($koncniDatum));
                if (strlen($koncniCas) > 0)
                    $koncniDatum .= ' ' . substr($koncniCas, 1, strlen($koncniCas));

                $datum = $koncniDatum;
            }
        }
        return $datum;
    }
//translations:
//izbrani == selected
//datum == date
//cas == time
//koncni == end
//prvi == first
//drugi == second

これにより、ユーザーは「jnY H:i」の形式で日付を入力でき、この形式の一部(jn、nY、YH:i、...)も入力できます。

ジョンとニックに助けてくれてありがとう!リンク

于 2012-06-27T15:28:06.407 に答える
0

他の多くの人と同じように、私もこれに苦労しました。グリッドをうまく表示することは問題ではありませんでしたが、ローカライズされた日時でのフィルタリングは問題でした!そこで、独自のフォーマッターを作成しsearch()、モデルの関数で(検索パラメーターをに渡すときにcompare())使用しました。これは魅力のように機能します。ローカリゼーションの日付/日時フィールドでフィルタリングできるようになりました(オランダ語を使用)。

"30-12-2018" becomes "2018-12-30"
">30-12-2018" becomes ">2018-12-30"
"30-12-2018 23:59:49" becomes "2018-12-30 23:59:49"
">=30-12-2018 23:59:49" becomes ">=2018-12-30 23:59:49"

私のローカリゼーション:

// dateFormat['short'] = 'dd-MM-yyyy'
// timeFormat['medium'] = 'HH:mm:ss'
Yii::app()->format->datetimeFormat = strtr(Yii::app()->locale->dateTimeFormat, 
                            array("{0}" => Yii::app()->locale->getTimeFormat('medium'),
                                  "{1}" => Yii::app()->locale->getDateFormat('short')));
       Yii::app()->format->dateFormat = 'short';
       Yii::app()->format->timeFormat = 'medium';

私のCGridViewには、次の日時列が含まれています。

'mutation_date_time:dateTime'

そして(スニペット)いくつかの便利な機能を備えた私自身のフォーマッター:

class Formatter extends CLocalizedFormatter
{
    public function formatWithoutSearchOperator($value)
    {
        // This snippet is taken from CDbCriteria->compare()
        if(preg_match('/^(?:\s*(<>|<=|>=|<|>|=))?(.*)$/',$value,$matches))
        {
            $value=$matches[2];
            $op=$matches[1];
        }
        else
            $op='';

        return $value;
    }

    public function formatOnlySearchOperator($value)
    {
        // This snippet is taken from CDbCriteria->compare()
        if(preg_match('/^(?:\s*(<>|<=|>=|<|>|=))?(.*)$/',$value,$matches))
        {
            $value=$matches[2];
            $op=$matches[1];
        }
        else
            $op='';

        return $op;
    }

    /*
    * Format a localized datetime back to a database datetime (Y-m-d H:i:s).
    * If a comparison operator is given, it is preserved. So strip it if you need to save the date in the database.
    * If no time given, it's also not returned (MySQL database appends '00:00:00' as time to it upon saving).
    * With this function the following localized datetimes just work like the stock datetime filters:
    *   - "30-12-2018" becomes "2018-12-30"
    *   - "30-12-2018 " becomes "1970-01-01" (note the extra space in input)
    *   - ">30-12-2018" becomes ">2018-12-30"
    *   - "30-12-2018 23:59:49" becomes "2018-12-30 23:59:49"
    *   - ">=30-12-2018 23:59:49" becomes ">=2018-12-30 23:59:49"
    * 
    * For save() and afterFind() integration see:
    * https://github.com/YetOpen/i18n-datetime-behavior
    */
    public function formatToDatabaseDatetime($value)
    {
        // get the comparison operator from the string:
        $comparator = $this->onlySearchOperator($value);

        // get the datetime without the comparison operator:
        $datetime = $this->withoutSearchOperator($value);

        // parse the given datetime according to the locale format to a timestamp
        $datetime_parsed = CDateTimeParser::parse(
            $datetime, 
            strtr(
                Yii::app()->locale->datetimeFormat, 
                array(
                    "{0}" => Yii::app()->locale->getTimeFormat(Yii::app()->format->timeFormat),
                    "{1}" => Yii::app()->locale->getDateFormat(Yii::app()->format->dateFormat)
                )
            )
        );

        // if its not a valid date AND time, check if it can be parsed to a date only:
        if($datetime_parsed === false)
        {
            $date_parsed = CDateTimeParser::parse(
                $datetime, 
                Yii::app()->locale->getDateFormat(Yii::app()->format->dateFormat)
            );
        }

        // If no time part given, also output only the date
        if($datetime_parsed===false)
        {
            $transformed = date(
                'Y-m-d', 
                $date_parsed
            );
        }
        else
        {
            $transformed = date(
                'Y-m-d H:i:s', 
                $datetime_parsed
            );
        }

        return  $comparator . $transformed;
    }
}

またsearch()、CActiveRecordモデルの関数内で、以下を使用して、ローカライズされた日時をデータベース内のレコードと比較します。

$criteria->compare('mutation_date_time',Yii::app()->format->toDatabaseDateTime(trim($this->mutation_date_time)),true);

これは仕様によるものであることに注意してくださいtrim()(関数の説明formatToDatabaseDateTime()を参照)。

正しいデータベース形式で直接フィルタリングすることとの大きな違い:無効な日付は「1970-01-01」に変換されます!

フィードバックに感謝します。私のコードが誰かに役立つことを心から願っています。

于 2018-12-13T09:47:51.627 に答える