如何使用javascript访问模型方法

时间:2014-05-19 14:52:46

标签: php jquery cakephp

请查看下面的CakePHP代码

Flip2.php (型号)

<?php
class Flip2 extends AppModel {
    var $name = 'Flip2';
    public $useTable = false;

        //Increment the correct_answer field of the specific user
        public function correctAnswer($userID=89, $word)
        {
            $setQuery = "UPDATE `users_words` SET `correctanswer` = `correctanswer`+1 WHERE `userid`=$userID && `wordid`='$word' ";
            query($setQuery);

        }


}

Flip2Controller.php (控制器)

<?php
class Flip2Controller extends AppController {

    public function index()
    {
    }       
}
?>

index.ctp (查看)

<?php
//echo $this->Html->css(array('bootstrap', 'mark', 'style'));
echo $this->Html->script(array('timer','swfobject','bootstrap.min.js'));
?>
<style>
#hideall {
    display: none;
    opacity: 0.7;
    position: fixed;
    height: 100%;
    width: 100%;
    top: 0;
    left: 0;
    background: #000;
    border: 1px solid #cecece;
    z-index: 1;
    vertical-align:middle;
    text-align:center;
}

.removeCardflip{
    transition: rotateY(0deg);
    -webkit-transition: rotateY(0deg);
    transition-duration: 0s;    
}

/*  SECTIONS  */
.section {
    clear: both;
    padding: 0 10px 0 10px;
    margin: 0px;
}

</style>

<div id="hideall">
    <?php //echo $this->Html->image('progress.gif', array('alt' => 'Wait', 'style' => 'text-align:center; padding-top:200px;'));?>
</div>

<!--<div class="wrapper" style="border: 1px solid red; width: 100%;">-->
    <div class="section group" style="margin-top: 50px;">
        <div class="col span_3_of_3">
            <h3 style="margin:0px; font-size:22px;">Play word game: </h3>
        </div>
    </div>


    <div class="">
        <div>
            <div>
                <span class="remainWords"><?php //echo count($words);?></span> oxxxxxxxxxxxxxxxf <?php //echo $totalWords;?>
            </div>

            <div>
                <?php
                echo $this->Html->image("comic_edit.png",
                                        array(
                                            "alt" => "Pareto List",
                                            "id" => "paretoList",
                                            'url' => "javascript:;"
                                        )
                                    );
                ?>
            </div>
        </div>
    </div>




    <div class="container"><div class="row">






<?php



    foreach($worddeck as $worcard)
    {
    ?>
        <div class="xy col-lg-3 col-md-4 col-sm-6 img-rounded" id="card1" style="width:250px; height:200px; background-color:grey; heiht:170px; margin: 10px 10px;">
            <div id="enside1" >
                <h1 data-pos="<?php //echo ; ?>" ><?php echo $worcard['unique_wordsforcards']['en_word']; $enSpell = $worcard['unique_wordsforcards']['en_word']; ?></h1>       
            </div>

            <div id="ptside1" style="display:none;">

            <?php echo $phonemer[$enSpell]; ?>
                <p><?php echo $worcard['unique_wordsforcards']['hint']; ?></p>
            </div>
            <div id="cntrol1">
                <button type="button" id="2" class="a btn btn-success mr5 btn-lg">Acertei</button>
                <button type="button" id="2" class="e btn btn-danger mr5 btn-lg">Errei</button>
            </div>
        </div>
    <?php
    }
?>





    </div></div>


    <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
    <!-- Include all compiled plugins (below), or include individual files as needed -->
<script type="text/javascript">
$(document).ready(function(){


   $( ".btn-danger" ).click(function(){
        console.log("Red Button");
        var toclose = $(this).parent().parent();
        $.ajax({
          url: "../img/media.jpg",
        }).done(function() {
            console.log( "The act has been done");
            toclose.toggle();
          });
   }); 


   $( ".btn-success" ).click(function(){
        console.log("Red Button");
        var toclose = $(this).parent().parent();
        $.ajax({
          url: "../img/media.jpg",
        }).done(function() {
            console.log( "The act has been done");
            toclose.toggle();
          });
   }); 

  $( ".xy" ).click(function(){

    $(this).find("#enside1").toggle();
    $(this).find("#ptside1").toggle();
    console.log(this);
  });

});


</script>

现在,我需要做的是,这个。当用户单击Acertei按钮时,我需要执行函数correctAnswer。我是PHP和CakePHP的新手,所以当点击一个按钮时,我真的很困惑如何做到这一点。有什么建议吗?

2 个答案:

答案 0 :(得分:3)

你有

<div id="cntrol1">
    <button type="button" id="2" class="a btn btn-success mr5 btn-lg">Acertei</button>
    <button type="button" id="2" class="e btn btn-danger mr5 btn-lg">Errei</button>
</div>

您应该为每个按钮使用不同的ID。

您可以使用ajax:

调用correctAnswer函数

将按钮更改为

<button type="button" id="2" data-word="<?php $worcard['unique_wordsforcards']['en_word'] ?>" class="a btn btn-success mr5 btn-lg">Acertei</button>

然后在$(document).ready()

中添加以下代码
  $(document).ready(function(){
      $(".btn-success").click(function(){
          var word = $(this).data('word');
          $.post('/flip2/correct.json', { word: word })
          .done(function(data) {
              alert('Saved');
          });

我不确定用户部分的工作原理。您应该在会话中拥有该功能,而不是发送给该功能。我硬编码用户89并添加了一种发送单词的方式。

答案 1 :(得分:1)

使用适当的模型方法

模型中的函数correctAnswer最好使用updateAll编写:

public function correctAnswer($userId, $word) {
    return $this->updateAll(
        array('correctanswer' => 'correctanswer + 1'),
        array(
            'userid' => $userId,
            'wordid' => $word
        )
    );
}

以这种方式编写的输入($userId$word)将被适当地转义,不会受到sql注入的影响。

创建控制器操作

应用程序的Web门户是控制器操作,创建一个简单的函数,调用模型方法,并将其写入output json

public function correct() {
    $postData = $this->request->data;
    $word = $this->request->data['word'];
    $userId = $this->Auth->user('id');

    $result = false;
    if ($userId && $word) {
        $result = $this->Flip2->correctAnswer($userId, $word);
    }

    $this->set('_serialize', array('result'));
    $this->set('result', $result);
}

请注意

  • 它只能通过邮寄请求工作。
  • Auth组件(会话)用于获取当前用户ID,它不是用户定义的输入。
  • 定义此函数使其可以作为json响应。
  • 无需使用上述代码创建视图文件。

请务必setup your app to handle json requests

  

添加Router :: parseExtensions('json');在您的路由文件中,当使用.json扩展名完成请求时,CakePHP将自动切换视图类,或者Accept头是application / json。

调用控制器操作

所需的js将采用以下形式:

$(".btn-success").click(function(){
    var word = ...;
    $.post(
      '/flip2/correct.json',
      {word: word},
      function (data) {
        console.log(data);
        // {result: bool}
      }
    );
});

请注意:

  • 网址以.json结尾,这是一种简单而强大的方式,可以激发CakePHP作为json进行响应。
  • 这是一个帖子请求。
  • 响应将采用控制器操作中_serialize定义的格式。