按钮提交的值未在POST

时间:2016-10-19 11:39:00

标签: forms yii2 submit

我正在使用Yii2,我想使用Pjax小部件在帖子上创建评论功能。 注释窗口显示帖子的所有现有注释,这些注释向属于连接用户的那些添加编辑按钮以允许更改。 在此评论列表下,有一个表单,包括textarea和提交按钮,以允许创建评论。 每次用户单击已存在的注释的编辑按钮时,都会显示一个表单以允许更新。

这一切实际上如何运行以及我遇到的麻烦:

  • 我可以无限次更新现有评论,这就是我想要的。

  • 如果在刷新视图帖子页面后,我输入一个新评论 正确提交。但我无法进入另一个,我希望能够发布多个。第二次,POST似乎包含评论的内容但没有 关于提交按钮。因此,我无法识别哪个按钮 被点击了。

  • 我改变后发生同样的事情 现有评论,即我无法为此创建新评论 原因 - 没有关于POST中的提交按钮。

我的问题

如果提交按钮是第一个使用的,它是如何在POST中传输的,这是第一次在刷新页面后使用它?

以下是相关的代码部分

1 - 控制器

/**
 * display a post
 *@param integer $id
 *
 * return a view
 */
public function actionView ($id){

  $post = $this->findModel($id);
  $comment=$this->manageComment($post);

  return $this->render('view', [
        'post_model' => $post,
        'comment_model' => $comment,
    ]);
}
/* 
 * deals with the post according to the submit value
 * if submitted and return the comment under treatment
 * otherwise – not submitted – return a new comment
 *
 *@param $post the post that holds the comments
 *
 * return a Comment model
 */
protected function manageComment($post)
{
   $comment=new Comment;
   if(isset($_POST['Comment']) )
   {


      switch ($_POST['Submit']) {

         case 'create':
            $comment->attributes=$_POST['Comment'];

            if($post->addComment($comment,false))
               {
                   //la création a réussi
                  if($comment->status==Comment::STATUS_PENDING)
                     Yii::$app->session->setFlash('success',
                     Yii::t('app','Thank you for your comment. 
                     Your comment will be visible once it is approved.'));
                     //on renouvelle le commentaire pour éviter d'avoir 
                     //un bouton update (mise à jour)
                     return new Comment;
                  }

         break;

         case 'update':

            $comment=Comment:: find()
                 ->where(['id' => $_POST['Comment']['id']])
                 ->one();
            if($comment->attributes=$_POST['Comment']){

            if($post->addComment($comment,true))
                {

                    //update successful
                    if($comment->status==Comment::STATUS_PENDING)
                        {Yii::$app->session->setFlash('success',
                        Yii::t('app','Thank you for your comment. 
                       Your comment will be visible once it is approved.'));}

                        $comment= new Comment;
                        return $comment;
                 } else { 
                     //la mise à jour a échoué
                     $comment= new Comment;                     
                     return $comment;
                 }
              }else{echo'load failed'; exit();}
        break;

        case 'edit':
           // echo $_POST['Comment']['id']; exit();
            $comment->id = $_POST['Comment']['id'];

            return $comment;

        break;

        default:

     }

   }
     //creation successful
     return $comment;
}

2-In Post view

<!--comment_model is passed by PostController-->
<?= $this->render('@app/views/comment/_create-form', 
['model' => $comment_model, 'post' => $post_model]); ?>

3 - _create-form视图

    <div class="comment-form">
<?php Pjax::begin([ ]);?>     
<!-- this bloc must be part of the Pjax in order for the new 
comment to appear immediately -->
<div class="comment">
    <h4 ><?= Yii::t('app','Comments by users')?></h4>
    <div class="comments">
    <?php $comments= Comment::find()
        ->where (['post_id' => $post->id ])
        ->andWhere(['status' => true])
        ->all();

    foreach($comments as $com){
        $identity= User::findIdentity($com->user_id);
        $firstname=$identity->firstname;
        familyname=$identity->familyname;
        $date= Utils::formatTimestamp($com->created_at);
        $txt1 = Yii::t('app','Posted by ');
        $txt2 =  Yii::t('app',' on ');
        $text_header =$txt1. $firstname.' '.$familyname.$txt2.$date;
        //here we check that $model->id is defined an equal to $com->id
        //to include edition form
        if (isset($model->id) && ($model->id == $com->id)  )//
        {
            //  echo Yii::$app->user->identity->id. '    '.$com->user_id; exit();
            echo $this->render(
                '_one-comment',(['com' => $com, 
                'text_header' => $text_header, 
                'submit_btn' => false,
                 'with_edit_form' => true]));    
        } else 
        {
            $submit_btn=false;
            if (Yii::$app->user->identity->id == $com->user_id) $submit_btn=true; else $submit_btn=false;
            echo $this->render('_one-comment',(['com' => $com, 'text_header' => $text_header, 'submit_btn' => $submit_btn,'with_edit_form' => false]));
        }
    }?>
</div>


<!--this div should be between Pjax::begin and Pjax::end otheswise it is not refreshed-->
    <div id="system-messages" >
        <?php foreach (Yii::$app->session->getAllFlashes() as $type => $message): ?>
            <?php if (in_array($type, ['failure','success', 'danger', 'warning', 'info'])): ?>
                <?= Alert::widget([
                       'options' => ['class' => ' alert-dismissible alert-'.$type],
                       'body' => $message
                ]) ?>
            <?php endif ?>
        <?php endforeach ?>
    </div>
    <?php
    $form = ActiveForm::begin([
        'options' => ['data' => ['pjax' => true]],//'id' => 'content-form'
        // more ActiveForm options
      ]); ?>
         <?= $form->field($model, 'content')
             ->label('Postez un nouveau commentaire')
             ->textarea(['rows' => 6]) ?>
             <?= Html::submitButton('Create comment', 
             ['content' => 'edit','name' =>'Submit','value' => 'create']) ?>

        <?php 
    ActiveForm::end();?>
</div>
<?php Pjax::end()
 ?>

</div>

4 - _one-comment视图

<div class="one-comment">
    <div class="comment-header">
   <?php echo $text_header;?>
   </div>
   <div class="comment-text">
      <?php echo $com->content;?> 
   </div>     
   <div class="comment-submit">
      <?php      
      if ($with_edit_form)
      {
          // echo "with edit ".$com->id; exit();
           echo $this->render('_update-one-comment',(['com' =>$com]));
      } else
      {
          if($submit_btn){
              $form = ActiveForm::begin([
              'options' => [ 'data' => ['pjax' => true]],//'name' => 'one','id' => 'com-form-'.$com->id,
              // more ActiveForm options
              ]); ?>

             <?= $form->field($com, 'id')->hiddenInput()->label(false);?>
                <div class="form-group">
                    <?= Html::submitButton('', [
                      'class' => 'glyphicon glyphicon-pencil sub-btn',
                      'content' => 'edit',
                      'name' =>'Submit','value' => 'edit']) ?>
                </div>

               <?php 
               ActiveForm::end();
           }
       }?>
    </div>
</div>

5 _update-one-comment表格          

 //echo 'dans update-one-comment';print_r($com->toArray()); exit();
 $form = ActiveForm::begin([
        'options' => [ 'data' => ['pjax' => true]],//'name' => 'edit-one','id' => 'edit-com-form-'.$com->id,
        // more ActiveForm options
    ]); ?>
        <?= $form->field($com, 'id')->hiddenInput()->label(false);?>
        <?= $form->field($com, 'created_at')->hiddenInput()->label(false);?>
        <?= $form->field($com, 'updated_at')->hiddenInput()->label(false);?>
        <?= $form->field($com, 'content')
                  ->label('Mise à jour commentaire')
                  ->textarea(['rows' => 6]) ?>

        <div class="form-group">
            <?= Html::submitButton($com->isNewRecord ? 
              Yii::t('app', 'Create comment') : 
              Yii::t('app', 'Update comment'), ['class' => $com->isNewRecord ? 
                                        'btn btn-success' :
                                        'btn btn-primary','name' =>'Submit','value' => 'update']) ?>
        </div>
        <?php 
    ActiveForm::end();
  ?>

6- Post模型的addComment()

    public function addComment($comment, $up=false)
{  
    if(Yii::$app->params['commentNeedApproval'])
       {$comment->status=Comment::STATUS_PENDING;}
    else {$comment->status=Comment::STATUS_APPROVED;}
   $comment->post_id=$this->id;
   $comment->user_id=Yii::$app->user->identity->id;
     if($up){
        $test=$comment->update();    
        if($test) {//($comment->save(false)){
           Yii::$app->session->setFlash('success',Yii::t(
            'app','The comment has been succesfully updated.'));
           return true;
        }
        Yii::$app->session->setFlash('failure',Yii::t(
          'app','The comment could not be updatded.'));       
    }  else 
    {  //création
        if($comment->save()){
             Yii::$app->session->setFlash('success',
            Yii::t('app','The comment has been succesfully recorded.'));
               return true;
          }
          Yii::$app->session->setFlash('failure',
             Yii::t('app',$up.false.'The comment could not be recorded.'));
     }   
      return false;
}

2 个答案:

答案 0 :(得分:0)

为什么要依靠提交按钮名称/值来确定您需要做什么?

$ _ POST [&#39;评论&#39;] [&#39; id&#39;]是一个更好的指标,表明需要做什么。如果有更新,否则创建。

同时确保模型不允许编辑其他人发布的评论。

模型不应设置闪存消息,这是控制器的作业。

&#34;我可以无限次更新现有评论。&#34;当然你可以,从你告诉我们的内容中没有什么可以说你不应该这样做。你不是要检查以防止这种情况。

答案 1 :(得分:0)

由于提交按钮的值并不总是在帖子中传输(它适用于Chromium但不适用于Firefox),我解决了我的问题,在表单中添加隐藏字段并使用它代替提交按钮&# 39; s值。