.ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録

.検索

.メインメニュー

.フォーラムメニュー

.オンライン状況
21 人のユーザが現在オンラインです。 (21 人のユーザが フォーラム を参照しています。)

登録ユーザ: 0
ゲスト: 21

もっと...

.
.リンク集

メイン
   CakePHP モデル(Model)
     DBを使用しないモデルでバリデーションを使いたい
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
gunny
投稿日時: 2010-2-8 11:06
Baker ユーザ
登録日: 2007-3-4
居住地:
投稿: 28
DBを使用しないモデルでバリデーションを使いたい
DBを使用しないモデルでバリデーションがうまく使用できず困っています。
JSONのAPIを使用したアプリを作りことになり、モデル側で

<?php
$useTable 
false;
$validate arary(....);
?>


としています。
また、諸所の事情で、フォームの要素も、name="data[Model][field]"の形ではなく、name="field" のような形になっております。
これに対してコントローラ内で

<?php
foreach($this->params['form'] as $key => $val){
  
$this->data[Model][$key] = $val;
}
$this->Model->set($this->data);
if(!
$this->Model->validates()) render('input')
else 
render('confirm')
?>


のようにして、input.ctp内で

<input type="text" name="field" value="<?php echo $this->data[Model][field]" />
<?php echo $this->Model->error(); ?>

のようにしているのですが、エラーが表示されません。
本来はDatesourceなど使って正しく作るべきなのでしょうか、Detasourceの使い方がいまひとつ理解しきれず、一旦validationの昨日の見つかっておこうと思っているのですが、どなたか問題点、解決方法をご教示いただけませんでしょうか。
よろしくお願い致します。
hiromi2424
投稿日時: 2010-2-8 12:31
Baker 常連
登録日: 2009-11-23
居住地: 新潟
投稿: 58
Re: DBを使用しないモデルでバリデーションを使いたい
その考え方で問題ないと思いますが、例文のtypoが多くてどこが間違っているのかはっきりしません。
なので動く例文を貼りますのでご自身のコードと比べていただけますか。

以下、「Event」といったモデルの、「nofield」というフィールドに対しての例です。

Controller(controllers/events_controller.php)

<?php
class EventsController extends AppController{
    var 
$name 'Events';
    var 
$helpers = array('Form');
    function 
add(){
        if(isset(
$this->params['form']) && !empty($this->params['form'])){
            foreach(
$this->params['form'] as $key => $val){
                
$this->data['Event'][$key] = $val;
            }
        }
        
        if(!empty(
$this->data)){
            
$this->Event->set($this->data);
            
$this->Event->validates();
        }
    }
}
?>



Model(models/event.php)

<?php
class Event extends AppModel {
    var 
$name 'Event';
    
    var 
$validate = array(
        
'nofield'    => array(
            
'rule' => array('maxLength''200'),
            
'required' => true
        
),
    );
}
?>


View(view/events/add.ctp)

<?php
$value 
= @$this->data['Event']['nofield'];
?>
<input type="text" name="nofield" value="<?php echo $value ?>" />
<?php
    
echo $form->error('nofield');
?>


----------------
単純な質問はCakeQsも使ってあげてください。
twitter
Blog

gunny
投稿日時: 2010-2-8 14:43
Baker ユーザ
登録日: 2007-3-4
居住地:
投稿: 28
Re: DBを使用しないモデルでバリデーションを使いたい
ご指摘ありがとうございます。
コード拝見しているのですが、内容としては同じだと思っています。
しかし、実際にはviewのなかで$form->error('fieldName');を呼んでも、エラー内容が表示されません。
$controller->Model->validateinErrors
の中には、json形式で意図するエラーが入っているのですが、$form->error('fieldName');の出力がありません。
[phpcode]
if(!$this->Model->validates()) render('input');
[/phpchode]
のように明示的にviewを指定しているのがいけないのでしょうか?
gunny
投稿日時: 2010-2-9 11:10
Baker ユーザ
登録日: 2007-3-4
居住地:
投稿: 28
Re: DBを使用しないモデルでバリデーションを使いたい
Datasourceを設定し、view側も$this->data[Model][field]のように直しました。
この状態でcontroller内で
$this->Model->validates();
を実行すると、正しくバリデーションが行われ、エラーがある場合元のフォームに戻るのですが、エラーメッセージが、

<div class="error-message">&quot;</div>

になっています。
validateionErrorsをみると期待通りの値(エラーのある項目のみ、モデルで設定したメッセージが入っている)になっているのですが、フォーム側ではvalidateionを通っている要素に対しても、modelで設定しているエラーメッセージでなく

<div class="error-message">"</div>

が出ています。何か原因思い当たる方おられましたらご教示いただけると助かります。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 


. .