この記事は、Yii 開発プロセスにおける小さな問題の解決策を記録することを目的としています。これは包括的ではなく、権威がなく、チュートリアルでもありません。自分で書いたものなので、今後も使えると思いますので、覚えておいてください。
1. Yii での Js および Css ファイルの紹介。
最も単純な質問から始めましょう。これは問題ではありません。単なる文法です。 js ファイルは protected と同じレベルの js フォルダーに配置され、css ファイルは protected と同じレベルの css フォルダーに配置されているとします。まあ、仕様は次のとおりです。対応するビューではインターフェイスは次のように記述されています。 css 関数と js 関数のパラメーターが異なります... (このため、調整に 1 時間かかりました..)
登録された js ファイルの 2 番目のパラメータは、js が配置される場所です。 CClientScript::POS_HEAD は Head 部分に配置されます。 CClientScript::POS_BEGIN は、Body の先頭に配置されます。特別な要件はありません。登録する CSS ファイルの 2 番目のパラメータはここをクリックしてください。 ...
Jquery のような js の場合、 registerCoreScript を使用しても不可解なエラーは発生しません...
2. Yii isNewRecord の修正
Yii のモデルの isNewRecord 属性は非常に便利で、この属性に基づいてケースバイケースで議論できます。ただし、トランザクション メカニズムやその他の状況をオンにして、挿入後にデータがロールバックされると、レコードはデータベースに存在しなくなりますが、isNewRecord は false になります。これは、新しいレコードではなくなったことを意味します。解決策は、主キーを使用してデータベースにアクセスし、それが新しいレコードであるかどうかを判断することです。この属性を使用する前に、まず次のように処理する必要があります。次のモデルは Post で、主キーは id です:
3.Yii は非表示の入力フィールドを生成します
入力フィールドを自分で書くのは簡単ですが (display:none だけですよね)、場合によっては Yii のフォーム コード形式に従わなければならない場合もあります。とにかく 1 文だけ...
4. Yii はドロップダウン メニューを生成します
フォームにドロップダウン メニューが必要な場合は、Chtml の listdata が非常に便利です。データベース内のフィールドの可能性が 0 と 1 など少数しかない場合は、次のように書くことができます:
この時点で表示されるのは、はいといいえのドロップダウン メニューです。「はい」を選択して送信すると、このフィールドには 1 が入力され、「いいえ」には 0 が入力されます。もちろん、これはそれほど単純ではありません。モデルに関数を追加してドロップダウン メニューの配列を生成し、それをビューで呼び出すことができます。この関数のデータは自分で書き込むことも、データベースから見つけることもできます。以下では Listdata が使用されています。これは、モデル内の ID がキーであり、名前が値であることを具体的に意味します。
リーリー5.Yii トランザクションメカニズムをオンにします
複数のレコードをデータベースに同時に保存する場合、トランザクション メカニズムを有効にする必要がある場合があります。 Yii でトランザクション メカニズムを有効にするのは簡単で、たった 3 つの文で十分です。
より完全なものは次のようになります:
でも私は普段こうやってますので、その効果はご自身で体験してみてください…
リーリー6. 関連テーブルの同じフィールドをクエリするとエラーが発生します。
2 つのテーブルを作成することがありますが、その 2 つのテーブルには同じフィールドがあります。CDbCriteria を使用して関連クエリ検索を実行する場合、追加の設定が行われていない場合、クエリ エラーが発生します。これはおそらく、Mysql ステートメントがあいまいであることを意味します。現時点では、メインテーブルにエイリアスを設定するだけでよく、関連するフィールドをクエリするときに名前を追加することに注意してください。
例: 2 つのモデル、Post と User には ID があり、次のように記述できます:
7. ファイルのアップロード
そういえば、これは Yii ではありません。基本的にはネイティブの HTML と PHP です。めんどくさい場合は、ここに置いておきます。
以下は HTML で、アクションは独自の URL に変更され、ID と名前も独自に定義されます。
これは、サーバーがファイルを受信して保存するためのコードです。最終的に、ファイルは添付フォルダーのファイル フォルダーに保存されます。 リーリー
以下は、既存のファイルを old_file パスからattached/fileの現在の日付フォルダーに移動します。ここのモバイルでは名前変更を使用していますリーリー
8.YIi シナリオとセキュリティ フィールド
現在のモデル シーンを表示します:
リーリー
$arr = $model->getSafeAttributeNames($model->scenario); var_dump($arr);
强制赋值避免 rule 规则过滤字段。用 setAttributes 可以强制取消 Yii 的安全过滤,只要第二个参数赋值为 false 就好。但是这也只能对这个 Model 生成时就拥有的字段生效,如果要对包括自己定义的所有字段不过滤,还是要定义场景然后在 rule 里指定安全字段比较好。
if(isset($_GET['Po'])) $model->setAttributes($_GET['Post'],false);
检查日期格式合法性
有时我们需要检验用户填写的日期是否合法,可以用下面的函数。
function checkDatetime($dateStr, $format = "Y-m-d H:i:s") { $time = strtotime($dateStr); $checkDate = date($format, $time); return $checkDate == $dateStr; }
Yii 渲染多个 model
相信新手都有疑惑,_form 里面的表单都是渲染一个 model 然后提交给 controller 保存数据的,如果想要渲染多个 model 怎么办呢?
下面,我们假设有两个 model 类,分别叫做 Person 和 Addr,我们想要做的是在一个 Person 的 _form 里再渲染几个 Addr 的 model ,意思是一个人可以有几个地址。基本思路其实还是很简单,就是你在 controller 里定义要渲染的 model 然后传给 view 界面,最后依然在 controller 里接收 Post 过来的数据。主要是写法问题而已,我相信下面大家都能看懂,有疑问的童鞋再留言好了。
//在 controller 里面 $model=new Person; /* $addrs 存储 Addr model 的数组,放几个你就看着办吧*/ $addrs = array(); if(isset($_POST['Person'])) { $model->attributes = $_POST['Person']; /*此处省略一堆逻辑*/ foreach($_POST['Addr'] as $one_addr) { $addr = new Addr(); $addr->attributes = $one_addr; /*此处省略另一堆逻辑*/ } } $this->render('create',array( 'model'=>$model, 'addrs' => $addrs, )); //在 view 里面 /*可以循环输出你的多个 model */ $num = count($addrs); for($i = 0;$i < $num;++$i) { echo $form->labelEx($addrs[$i],"[{$i}]postcode"); echo $form->textField($addrs[$i],"[{$i}]postcode",array('size'=>10,'maxlength'=>10)); ...; } /*也可以通过数字指定输出某个 model */ echo $form->labelEx($addrs[0],"[0]postcode"); echo $form->textField($addrs[0],"[0]postcode",array('size'=>10,'maxlength'=>10));