PHP の Yii フレームワークを使用する際のエラーの解決策と提案、yii Framework_PHP チュートリアル

WBOY
リリース: 2016-07-13 09:44:19
オリジナル
881 人が閲覧しました

PHP の Yii フレームワーク、yii フレームワークの使用におけるいくつかのエラー解決策と提案

この記事は、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 シナリオとセキュリティ フィールド
現在のモデル シーンを表示します:
リーリー

シーンのセキュリティフィールドを表示します。安全なフィールドとは、ユーザーが送信したときにこれらのデータが Yii によってフィルタリングされないことを意味します。 Web ページで送信されたものの一部が不足していることがわかり、長い間調整した後、そのシナリオで一部がフィルタされていることがわかりました。


$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)); 

ログイン後にコピー

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1049138.htmlTechArticlePHP的Yii框架使用中的一些错误解决方法与建议,yii框架 此文意在记录 Yii 开发过程中的小问题解决方案,不全面,不权威,不是教程。自己...
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート