2014-02-21 5 views
0

Я изменяю свой веб-сайт отдела, который позволяет пользователю вводить автора и рейтинг.yii фреймворк ошибки проверки не может показать

Но я не могу показать сообщение об ошибке проверки при вводе не целого числа в тексте ранга.

array('dataset_id, author_id, rank', 'numerical', 'integerOnly'=>true), 

<?php echo $form->error($model,'rank'); ?> 

также в файле контроллера, когда я добавить

if ($author['rank'] == $rank && $author['name'] == $name) { 
         $model->addError("warning", "Duplicate input"); 

в файле вида также не может показать любую вещь, просто обновите страницу пустой текст поля

<?php echo $form->errorSummary($model); ?> 

Это DatasetAuthor модель нормы

public function rules() 
{ 
    // NOTE: you should only define rules for those attributes that 
    // will receive user inputs. 
    return array(
     array('dataset_id ,rank,author_name', 'required'), 
     array('dataset_id, author_id, rank', 'numerical', 'integerOnly'=>true), 
        // The following rule is used by search(). 
     // Please remove those attributes that should not be searched. 
     array('id, dataset_id, author_id, doi_search, author_name_search , orcid_search , rank_search', 'safe', 'on'=>'search'), 
    ); 
} 

функция контроллера

public function actionCreate1() { 
    $model = new DatasetAuthor; 

    // Uncomment the following line if AJAX validation is needed 
    // $this->performAjaxValidation($model); 
    //this is fake information 
    $model->dataset_id = 1; 
    //update 
    if (!isset($_SESSION['authors'])) 
     $_SESSION['authors'] = array(); 

    $authors = $_SESSION['authors']; 

    if (isset($_POST['DatasetAuthor'])) { 



     $ranks = trim($_POST['DatasetAuthor']['rank']); 
     $names = trim($_POST['DatasetAuthor']['author_name']); 
     if (substr($names, -1) == ";") 
      $names = substr($names, 0, -1); 
     $valid = true; 
     $namearray = array(); 
     if ($names != "") 
      $namearray = explode(";", $names); 
    //   var_dump($namearray); 
     if ($ranks == "") 
      $rankarray = array(); 
     else 
      $rankarray = explode(";", $ranks); 
    //   var_dump($rankarray); 
    //   if (count($namearray) != count($rankarray)) { 
    //    $model->addError("error", "the number of name and rank are different!"); 
    //    $valid = false; 
    //   } 
     //test names 
     if ($valid) { 
      foreach ($namearray as $name) { 
       if ($name == "") { 
        $model->addError("author_name", "name can't be blank!"); 
        $valid = false; 
        break; 
       } 
      } 
     } 
     //test ranks 
     if ($valid) { 
      foreach ($rankarray as $rank) { 
    //     if ($rank == "") { 
    //      $model->addError("error", "rank can't be blank!"); 
    //      $valid = false; 
    //      break; 
    //     } 
       if (!is_numeric($rank)) { 
        $model->addError("rank", "rank should be an integer!"); 
        $valid = false; 
        break; 
       } 
      } 
     } 
//   var_dump(count($rankarray)." test"); 
     if ($valid) { 

      foreach ($namearray as $index => $name) { 
       if ($index < count($rankarray)) { 
        $rank = $rankarray[$index]; 
       } else { 
        $rank = 1; 

        while (true) { 
         $found = true; 
         //find the maximum one in the authors array 
         foreach ($authors as $author) { 
          if ($author['rank'] == $rank){ 
           $found = false; 
           break; 
          } 
         } 
         if($found) 
          break; 

         $rank++; 
        } 


       } 

       $valid = true; 

       //check if there is duplicate input     
       foreach ($authors as $key => $author) { 
        if ($author['rank'] == $rank && $author['name'] == $name) { 
         $model->addError("rank", "Duplicate input"); 
         $valid = false; 
         break; 
        } 
       } 

       if ($valid) { 

        //store author dataset 
        $model->rank = $rank; 
        $model->author_name = $name; 
        $id = 0; 
        if ($this->storeAuthor($model, $id)) { 

         $newItem = array('rank' => $rank, 'id' => $id, 'name' => $name); 

         array_push($authors, $newItem); 
         $_SESSION['authors'] = $authors; 
         $vars = array('authors'); 
         Dataset::storeSession($vars); 
        } else { 
         $model->addError("error", "database operation failure, please log out first and log in again."); 
        } 
       } 
      } 
     } 
    } 
    // $model = new DatasetAuthor; 
    $author_model = new CArrayDataProvider($authors); 
    $model = new DatasetAuthor; 
    $this->render('create1', array(
     'model' => $model, 
     'author_model' => $author_model, 
    )); 
} 

просмотров

 <?php echo $form->errorSummary($model); ?> 

      <?= $form->textField($model, 'author_id') ?> 

     <?php echo $form->error($model, 'author_id'); ?> 

     <?= $form->textField($model, 'rank',array('size' => 60, 'maxlength' => 200)) ?> 
     <?php echo $form->error($model, 'rank'); ?> 

ответ

1

Первый параметр CModel::addError() должен быть именем атрибута класса. В вашем случае либо name, и/или rank.

if ($author['rank'] == $rank && $author['name'] == $name) { 
    $model->addError("rank", "Duplicate input"); 

UPDATE

Из кода контроллера, вы не передавая данные формы в модель. Вот почему поля пустые. Также вы не звоните ни в $model->save(), ни в $model->validate(), который фактически проверяет rules(). Вызов из них устранит необходимость в большинстве проверок действительности, которые вы добавили в свой контроллер.

public function actionCreate1(){ 
    $model->dataset_id = 1; 
    .... 
    if(isset($_POST['DatasetAuthor'])){ 
     $model->setAttributes($_POST['DatasetAuthor']);// pass form data into model 
     .... 
     if($model->save()){ //calls validate() before saving 
      //redirect 
     } 
    } 
    .... 
} 
+0

спасибо, но первая часть массива ('DataSet_ID, author_id, звание', 'числовая', 'integerOnly' => верно), ошибка ($ модель, 'AUTHOR_ID') ; ?> почему он не может показать – AntiGMO

+0

Где находится 'array (..)' code? Также для отображения ошибки ранга вы используете ошибку 'echo $ form-> ($ model, 'rank')' – topher

+0

извините, это должна быть ошибка ($ model, 'rank'); ?>. Я запутался. Я установил правила в модели только для целочисленного ранга, но он не может отображать сообщения об ошибках, просто обновить страницу и установить текстовое поле пустым. – AntiGMO

Смежные вопросы