【问题标题】:call a php controller with ajax (how to disable layout)使用 ajax 调用 php 控制器(如何禁用布局)
【发布时间】:2009-11-24 12:12:57
【问题描述】:

我会解释更多,因为可能不够清楚

我想将 ajax url 设置为:www.domain/controller/method 我已经用普通的 php 准备好了一切。

但如果我必须使用 ajax 来执行此操作,我将无法获得预期的结果。 结果应该是一些 json 变量被回显给我。 我不完全清楚为什么。

在萤火虫中,我可以看到请求标头与响应标头不同。 我在响应中看到了布局视图。我还不知道如何绕过它。 basecontroller 为布局创建视图,但我没有用 basecontroller 扩展 ajaxcontroller? 现在我正在运行它抛出了另一个我调用的脚本,但如果我更喜欢它 我可以用第一种方法。

请问大家有什么建议吗?

编辑

似乎在下面的cmets之后我需要提供一些逻辑来禁用布局?

第一次尝试:

class testController extends baseController implements IController
{

    public function testit()
    {
    $this->disableLayout = TRUE;
    $check='testit';
    $data =array();
    header('Content-type: application/json');

            $output = array(
            "check" => $check,
            "user" => $data
            );

            $this->content = json_encode($output);

            exit(0); // Stop script.

    }
}

谢谢,理查德

【问题讨论】:

  • 在您提出请求的地方添加一些代码。目前尚不清楚您不了解哪一部分并需要帮助。
  • 我研究了 WEB2BB 框架(文档很糟糕 =( )。看来您需要做的就是在您的操作中获取 FrontController 实例,然后 $fc->setBody($JSONString); 其中JSON 字符串是您的 JSON 数据。
  • 其实我错了,你必须“破解” baseController 才能让你禁用布局。
  • 在这里,试试这个:pastebin.com/f66481a6e
  • 可能是因为你使用了exit(0);

标签: php ajax model-view-controller


【解决方案1】:

我在这里猜测,但我认为您正试图根据请求的方式从同一操作中提供不同的内容。

要检测 Ajax 请求页面的天气,您可以使用浏览器发送的特定标头。

通常发送最新的 JavaScript 库

X-Requested-With:XMLHttpRequest

header 连同他们的 ajax 请求。如果你的不是,你可以很容易地使用这样的东西发送它:

//Just example using raw XMLHttpRequest
var request = new XMLHttpRequest();     
request.setRequestHeader("X-Requested-With", "XMLHttpRequest");
//If you use Javascript library, see the documentation how to set custom request headers.
//But as I said most modern libraries already send X-Requested-With

然后在 PHP 中,您可以使用以下代码块检查请求是否是使用 Ajax 发出的:

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) &&
           strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { 
   //Send JSON.
} else {
   //Send HTML.
}

编辑: 正如Elzo Valugi 所提到的,在您的操作中输出 JSON 时不要忘记使用正确的内容类型:

header('Content-type: application/json');

在发送任何 JSON 之前,否则您可能会遇到一些 JavaScript 库的问题。


这或多或少是请求 + 响应标头的外观。请注意,我实际上在这里发送了一些不需要的东西,例如原型版本等。

【讨论】:

  • 也许可以告诉我们您正在使用哪个 php 框架。其中一些有自己的自定义函数来发送标头。但似乎标题对您来说只是一个小问题。据我所知,您也没有获得正确的内容(您获得的是整页而不是 JSON)。这意味着您在检测中有错误,或者您正在发送布局 + JSON。有一种方法可以禁用某些操作的布局,也许这就是您正在寻找的。例如,如果您使用 Zend PHP Framework,那么禁用布局的函数是: $this->_helper->layout->disableLayout();
  • 嗯,不完全是。这是不同的控制器和不同的方法。但我猜布局导致发送不同的标题。我不知道为什么或在哪里发送布局标题?后者是我的问题。如果我从单个脚本运行它而不是抛出控制器,标题看起来就像你的一样。所以必须找出为什么发送布局标题。
  • @Maiku 来自phpro.org,我是进阶版或者WEB2BB框架
【解决方案2】:

根据您在视图中的框架,您应该返回带有 json 标头的视图,并且没有来自布局模型的其他信息。

header('Content-type: application/json');

还取决于您如何解析 AJAX 请求的结果,您可能需要将响应类型设置为“json”。

我在 Zend Framework 中处理 Ajax 请求和 JSON 时所做的是

$this->_helper->layout->disableLayout();

<?php echo $this->json($this->data) ?>

json helper 将添加标题。

【讨论】:

  • 谢谢,我编辑了我的问题。这是我在响应中看到的布局。ajax 工作正常。我不知道如何不设置其他标题。
  • 我还添加了一些来自 ZF 经验的示例。
  • 谢谢@Elzo,我也得出结论,我必须在我的小框架中以某种方式禁用布局。
【解决方案3】:

我通常创建一个单独的控制器来处理 Ajax 请求。例如,/ajax/getusers/?page=2 可能会返回分页用户网格第二页的 HTML。我喜欢这种方法,因为它提醒我将应用程序逻辑和 UI 构建逻辑分开。

或者,您可以在每个 ajax 请求中传入一个查询字符串,例如:www.domain.com/controller/method/?ajax=1,然后在出现时隐藏您的布局组件。

【讨论】:

  • 谢谢,我已经制作了一个单独的控制器,与 fr-work 中的其他控制器相同。这里唯一的问题是如何隐藏布局的东西。
  • 啊,我没看到你用的是什么框架。在 CodeIgnitor 中,每个方法都必须明确说明要加载哪个 View,我认为大多数 php 框架都是这样工作的。
【解决方案4】:

您需要重写 basecontroller 类的析构函数。复制控制器类中的析构函数并修改模板文件。也许你使用一个空文件。不需要破解

【讨论】:

    猜你喜欢
    • 2014-08-14
    • 2012-11-04
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    • 2020-04-13
    相关资源
    最近更新 更多