使用AJAX从Smarty调用PHP函数,无需用户操作

时间:2010-08-13 17:00:32

标签: php ajax smarty

我要点击很多不同的网站来获取信息列表,我希望在获取信息时显示这些信息。现在我正在使用Smarty模板,我想做的是:

伪代码:

{foreach $page} 
  $smarty_var = use AJAX to call a PHP function
  Render out a new table row on the fly w/ the newly assigned var   
  <tr><td>{$smarty_var}</td></tr>
{/foreach}

我对AJAX知之甚少,我很久以前就用它了,它与此类似,但并不完全,用户采取了行动。不,我没有JS框架。我是否会离开这里应该怎么做?基本上我想在数据可用时显示一个表行,每个表行都是从另一个站点获取数据的请求。

当然,我会告诉你我要做的事情:http://bookscouter.com/prices.php?isbn=0132184745+&x=19&y=6 如果您点击该页面底部的“点击查看所有43个链接的价格”,您将看到。我正在使用cURL获取我想要价格的所有页面。然后为每个页面我想得到的价格。所以每个页面都会启动一个运行一些有趣代码的函数:

function parseTBDOTpageNew($page, $isbn)
{
    $first_cut = preg_split('/<table[^>]*>/', $page);
    $second_cut = preg_split('/<td[^>]*>/', $first_cut[2]);
    if(strstr($second_cut[4], "not currently buying this book") == true)
    {
        return "\$0.00";
    }
    $third_cut = preg_split('/<b[^>]*>/', $second_cut[9]);
    $last_cut = preg_split('/</', $third_cut[3]);
    return $last_cut[0];
}

从另一个函数调用此函数,该函数将从上面函数返回的价格,公司名称和数组中的链接添加到发送给smarty的另一个更大的数组中。而不是这样做,我只想获得第一个返回的数组,其中包含单独的信息,并将值添加到表格行中。

我将接受你对Jquery的建议,我开始的是一个onload函数,它接收要解析的$页面,而我正处于写作的中间:foreach页面获取信息并吐出一些html w / the页面上的信息。

调用函数获取价格的函数也是在php文件中,所以我需要在php文件中命中函数而不只是调用file.php?param1 = foo,我需要它实际上命中了文件中的函数。我有Jquery,现在只是试图找出它并让它做我需要的,呃。我正在寻找,任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

  

不,我没有适当的JS框架

先修复此问题。您想要自己处理XMLHTTPRequests。 jQuery是SO的规范JS库,非常漂亮。

  

基本上我想在数据可用时显示一个表行,每个表行都是从另一个站点获取数据的请求。

你要处理多少行?它们都必须异步加载吗?

让我们以一种直截了当的方式解决这个问题。创建一个只执行以下操作的脚本:

  1. 获取网站ID并从相应的网址
  2. 获取数据
  3. 将数据渲染为某种数据传输格式,HTML或JSON。
  4. 然后,这是一个简单的问题,即制作用户获取的页面,其中包含使得ajax调用数据获取器的Javascript代码,然后直接在页面中推送HTML,或者将数据转换为HTML然后将其推入页面。

    你会注意到Smarty真的没有参与其中。 ;)

    这个解决方案非常不实用,不仅仅是为了异步轮询一小部分网站。如果您需要数十个或数百个站点的行,这意味着每个客户端都需要为每个正常的综合浏览量向您的站点发出数十或数百个请求。如果一个或多个人一次加载页面,这将宰杀您的服务器。

    您能告诉我们更多关于您正在做什么以及您想要实现的目标的信息吗?有很多方法可以缓解这个问题,但它们都取决于你正在做什么。


    更新您的问题编辑。

    首先,请考虑使用实际的HTML解析器而不是正则表达式。 The DOM非常强大,您可以使用XPath定位特定元素。

      

    而不是这样做,我只想获得第一个带有个别信息的数组,并将这些值动态添加到表格行中。

    所以,这是最终的问题。你想异步做某事。 PHP没有内置的通用方法来执行异步任务。有几种方法可以解决这个问题。

    第一个就像我上面所描述的那样。您不必在页面加载时执行任何 curl请求,而是将工作分配给最终用户,并让最终用户的浏览器逐个向您的抓取脚本发出请求,填写结果。

    第二种是使用异步工作队列,如Gearman。它有excellent PHP support via a PECL extension。您可以编写一个或多个可以接受请求的工作程序,并始终保持它们的运行。游泳池越大,你可以做的事情就越多。返回所有数据后,您可以在模板引擎上抛出完整的数据集,并将其调用好。

    您甚至可以将这两者结合起来,让用户通过ajax只获取一个或两个或三个额外请求来获取部分返回数据。哎呀,您甚至可以在后台启动作业并立即返回页面,然后通过ajax请求后台作业的结果。

    无论你采用哪种方式处理它,都会遇到巨大的问题。你正在抓人的网站。你很可能经常在某人的网站上搜索 。不是每个人都对此感到满意。您应该认真考虑缓存结果,甚至与每个供应商核实,看看他们是否有可以查询的API或数据导出。