【问题标题】:Include codeigniter page into non-codeigniter php page将 codeigniter 页面包含到非 codeigniter php 页面中
【发布时间】:2011-06-04 03:05:11
【问题描述】:

我正在开发一个 CMS,它不是自动生成页面,而是生成代码并将其提供给用户以添加到他们的 php 页面。

我正在将应用程序迁移到 CI,但正在为如何设置此过程而苦恼。

通过制作 2 个 codeigniter 索引页面(一个用于主应用程序,另一个用于连接更改初始控制器和索引路径),这几乎可以正常工作,我想要的是这样的:

<?php include("cms/connector.php"); ?>
<html>
..
<body>
<h1>Static</h1>
<?php echo($cms['data']); ?>
</body>

它正确地拉取文件并运行被调用的视图,但视图中的变量没有保存。

不过,我还需要能够定位他们试图获取的 cms 页面:

<?php include("cms/connector.php/cms/2"); ?>

不再工作(我猜是因为没有扩展?)如果我可以让这部分工作我不需要担心变量,因为我可以直接在页面上包含视图

任何想法都会很棒

该应用程序可以托管在各种设置上,所以如果我可以绕过包含直接 url (http) 的需要,我希望它,因为它可能并不总是默认打开。此外,我不想使用 ajax,因为我希望内容能够被搜索引擎很好地提取

【问题讨论】:

  • 您能否澄清“它正确地提取文件并运行被调用的视图,但视图中的变量未保存。”视图中的变量是什么意思?你的意思是什么时候提交表格?或者你的意思是你的视图文件中的变量没有显示出来? “2个codeigniter索引页”是什么意思?你是说两个控制器吗?
  • 对不起,当我说变量没有保存时​​,我只是说它们没有传输到包含它们的页面,但是如果我在页面上显示的视图中回显某些内容,则视图正在工作。我不希望变量被传递,但不确定是否有办法将它们传递给包含它们的文件。
  • 由于我的第二个问题,我正在弄乱两个代码点火器索引页面(根索引页面),试图通过访问 /cms/index2.php 而让第二个进入不同的控制器,其中包含似乎仅适用于索引页面,之后不适用于任何控制器
  • 我很困惑你为什么要访问两个 index.php 文件。 Codeigniter 使用 url 来指定控制器/函数/参数。如果您需要将用户引导到另一个“页面”,为什么不将它们发送到特定的控制器并加载您想要显示的视图?这可能是您的变量未显示的原因...您是否在使用 $this->load->view('myview',$data_to_send_to_view);?
  • 我正在使用的脚本不在 codeigniter 中。我的 codeigniter cms 应用程序理想情况下会吐出用户放在他们网页上的代码。该代码将从mysql中提取内容。

标签: php codeigniter path include


【解决方案1】:

您可以使用 PHP 的cURL module。以下摘自文档中的示例。

<?php
// create a new cURL resource
$ch = curl_init();

// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/cms/connector.php/cms/2");
curl_setopt($ch, CURLOPT_HEADER, 0);

// grab URL and pass it to the browser
curl_exec($ch);

// close cURL resource, and free up system resources
curl_close($ch);
?>

请注意,这将拉取整个文档,包括 doctype、&lt;head&gt; 等。如果您将其包含在另一个页面中,这不是您想要的。您可能想修改 connector.php 以仅输出文档的正文..

【讨论】:

  • 真的……这就是你会做的?
  • 这样做有什么缺点?由于这将托管在不同的设置上,这是缓慢还是经常被禁用?
  • 这真的不是我的观点,我宁愿从站点 B 创建一个 API 访问层。我会重新投票你的反对票,因为我不清楚单独的托管情况,你的答案是可行的。
  • 主机是一样的,但我敢肯定还有不同的方法。我可能只需要在 CI 之外一起编写连接器脚本:/
【解决方案2】:

听起来你在设计一个 api。

(而且我不确定为什么您使用 CI 来处理其中的一半,而使用自定义脚本来处理其余部分。CI 可以满足您的需求。)

以下建议可能很明显或超出您的预期答案,但如果它有帮助,我想把它放在桌面上。

如果我正确理解了您的问题和 cmets,则您的服务器上有网站的用户。您还有一个应用程序,可以为他们提供粘贴到他们网站中的代码,这些代码以某种方式与您服务器上的信息一起使用。

  1. 您需要一个控制器来接收来自粘贴代码的信息请求
  2. 您需要一种方法来验证请求
  3. 用户提供某种变量信息
  4. 验证成功后,您需要根据用户提供的变量返回信息或 html。

Codeigniter 允许您使用基于分段的 url 或查询字符串。它更喜欢 box with segments, but can be configured to work with query strings 并在其中工作。

你可以构造一个包含

的url
  1. 处理请求的控制器和函数的名称(而不是您提到的第二个索引页
  2. 用于验证请求的令牌。理想情况下,这将用于在创建令牌并将其发布给用户时与存储在数据库中的信息进行比较。查看这篇文章:http://www.infoq.com/news/2010/01/rest-api-authentication-schemes 和这篇文章:http://oauth.net/
  3. 用户提供的信息

一个例子:

"example.com/cms/(index.php)/connector/function-name/auth-token/user-info"

一旦您的控制器处理了请求,就将信息返回给用户。

【讨论】:

  • 反之亦然,用户下载我的 cms 应用程序并将其添加到他们的服务器。他们的想法是他们不需要大修他们的网站以使其具有动态内容。我的应用程序将为他们提供将动态内容拉入其预先存在的网页的代码。我想我可能只需要编写一个单独的外部脚本,它只对数据库进行任何需要的调用并组装内容,而不是使用代码点火器
【解决方案3】:

Codeigniter 根据 URI 的环境状态路由应用程序

您需要做的是设置环境并包含索引视图文件,如下所示:

$_SERVER["REQUEST_URI"] = "cms/2";

//Set GET action,method params etc

require_once "path/to/index.php";

当您加载 CI 索引文件时,它会读取 SERVER 变量以及您可能必须找到并执行控制器和方法的其他变量,我还建议您修改库/视图文件,因为它可能会在输出时退出导致您的脚本退出。

您也可能希望查看ob_start() 等以捕获缓冲区

【讨论】:

  • 它似乎只是停留在索引页面,即使我正在设置服务器变量(CI 输出 - 不存在 URI 数据)。
  • 我可能遇到的另一个问题是用户可能希望在一个页面上包含 2 个文本块(可能是关于页面的一个内容块,并为页面的页脚使用一个块)
猜你喜欢
  • 2019-09-22
  • 1970-01-01
  • 1970-01-01
  • 2016-04-03
  • 1970-01-01
  • 2016-08-25
  • 2012-06-02
  • 2014-05-11
  • 2015-06-29
相关资源
最近更新 更多