如何将javascript var传递给ajax remoteFunction?

时间:2010-02-01 02:44:03

标签: javascript ajax cakephp

我有一个观点,生病有3个div:

Div 1:带有复选框的品牌列表。 第2部分:带复选框的类别列表。

Div 3:项目清单。

根据前两个div中选择的内容,将使用所有项目刷新最后一个div。在开始时它会显示所有项目,在我们选择一些品牌和/或类别后按下刷新我想要刷新div 3。

在Javascript中我可以选择哪些类别/品牌,我最大的疑问是如何更新最后一个div ...

以下是我的尝试:

function refresh() {
var brands= /*<code where i get all the brands selected (this will be a js array)>*/
var categories = /*<code where i get all the categories selected (this will be a js array)>*/
<?php echo $ajax->remoteFunction(array('url' => array('controller' => 'items', 
                                                      'action' => 'men', brands, categories),
                                                      'update' => 'itemsContent')); ?>
}

我的问题是: - 如何将js变量传递给php方法? - 如何在cakephp动作中收到js数组?因为品牌和类别将用于过滤为div 3生成结果的查询...

2 个答案:

答案 0 :(得分:3)

您将无法在此使用$ajax帮助程序,因为它只输出一个静态脚本,该脚本在浏览器中的“运行时”无法更改/影响。它只不是为了比它更复杂的东西。

所以,你必须推出自己的JS,但这不应该那么难。您所需要的只是:

  1. 一个Cake动作,根据收到的数据输出一个项目列表(不应该很难)
  2. 一些JS,它确定了哪些品牌和类别被选中(你已经拥有)
  3. 另一部分包装该数据并将其发送到Cake操作的JS
  4. 使用您收到的项目列表更新网站的另一部分JS
  5. 我会看一下jQuery's AJAX functions来完成#3。如果您以这样的格式发布数据,可以在Cake的$this->data中轻松访问它:

    {
        'data[ModelName][categories]' : categories,
        'data[ModelName][brands]'     : brands
    }
    

    关于你的问题:

      

    “如何将js vars传递给php方法?”

    你没有。 PHP在服务器上运行,并且在Javascript在浏览器中运行时已经完成。 JS和PHP之间唯一的“通信”是通过标准的HTTP GET和POST请求,无论请求来自标准浏览器还是JS或Flash或其他什么都无关紧要。

    $ajax帮助器只有一堆可以放入页面的预制Javascript片段,但是你的JS无法以任何方式与$ajax助手“交谈”。

答案 1 :(得分:1)

我和你的情况类似,我在Javascript helper上发现了一些适用的方法。我用codeBlock()包装了一大堆javascript,event()用来连接click事件,但我不确定这比编写原始Javascript要清楚多少。

我发现CakePHP手册的AJAX section对于获得基本设置非常有帮助。然后我使用生成的Javascript并使其更具动态性。

在此示例中,每当用户点击链接时,我都会调用add_topic操作。每次调用它时,我都会增加topicIndex变量并将其作为AJAX调用中的参数传递。 AJAX调用返回几行,这些行插入用户单击的链接上方的表中。

        <tr id="add_topic_row"><td colspan="3">
            <a id="add_topic_link" href="javascript:void(0);">New Topic 
                <?php echo $html->image('icons/add32.png');?></a></td></tr>
        </table>
    </fieldset>
<?php 
    echo $form->end('Submit');
    $addTopicUrl = $html->url(array('action' => 'add_topic')) . '/';
    $script = <<<EOS
var topicIndex = $index;
var addTopicUrl = '$addTopicUrl';
addTopic = function()
{
    new Ajax.Updater(
        'add_topic_row', 
        addTopicUrl + topicIndex, 
        {
            asynchronous:true, 
            evalScripts:true, 
            insertion:Insertion.Before, 
            requestHeaders:['X-Update', 'add_topic']
        });
    topicIndex++; 
}
EOS;
    echo $javascript->codeBlock($script);
    echo $javascript->event('add_topic_link', 'click', 'addTopic();')
?>