首页 文章

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

提问于
浏览
0

我正在访问许多不同的网站以获取信息列表,我希望在获取信息时显示此信息 . 现在我正在使用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如果你点击该页面底部的'Click to view prices from all 43 links',你会看到 . 我正在使用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 /上的信息页 .

调用函数来获取价格的函数也是在php文件中,所以我需要在php文件中命中一个函数而不只是调用file.php?param1 = foo,我需要实际命中它函数在文件中 . 我有Jquery,现在只是想弄明白并让它做我需要的东西,呃 . 我正在寻找,任何帮助将不胜感激 .

1 回答

  • 1

    不,我没有JS框架

    先解决这个问题 . 您不希望自己处理XMLHTTPRequests . jQuery是SO的规范JS库,非常漂亮 .

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

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

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

    • 获取站点ID并从相应的URL获取数据

    • 将数据渲染为某种数据传输格式,HTML或JSON .

    然后,这是一个简单的问题,即制作用户获取的页面,其中包含使得ajax调用数据获取器的Javascript代码,然后直接在页面中推送HTML,或者将数据转换为HTML然后将其转换为这页纸 .

    你会注意到Smarty从来没有参与其中 . ;)

    这个解决方案对于除了一小部分要异步轮询的站点之外的任何东西都是非常不切实际的 . 如果您需要数十个或数百个站点的行,这意味着每个客户端将需要针对每个正常的页面浏览向您的站点发出数十或数百个请求 . 如果超过一两个人一次加载页面,这将屠宰您的服务器 .

    你能告诉我们更多关于你在做什么以及你想要完成什么的事情吗?有很多方法可以缓解这个问题,但它们都取决于你正在做什么 .


    更新您的问题编辑 .

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

    而不是这样做,我只想获得第一个返回的数组,其中包含单独的信息,并将这些值动态添加到表格行中 .

    所以,这是最终的问题 . 你想异步做某事 . PHP does not have a built-in generalized way to perform asynchronous tasks. 有几种方法可以解决这个问题 .

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

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

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

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

相关问题