在genreated php页面中包含CodeIgniter / Php Web应用程序

时间:2010-11-04 10:56:38

标签: php codeigniter

背景信息:

我有一个用PHP编写的网络应用程序(几步电子商务),我正在用CodeIgniter编写一个新版本。
我必须将它包含在由CMS(sitezen)生成的php页面中。

/* generated html */ 
<?php include('my_app/index.php); ?>
/* generated html */

我无法对CMS部分做任何事情,比如与其他部分合作......

我的问题:
由于我无法在发送标头之前启动会话,因此在使用会话时也会收到警告但我可以禁用它们。

我的解决方法:
我没有找到任何与我的问题相关的帮助。对于旧的php版本,我唯一能想到的解决方法是将ajax请求发送到启动会话的php文件。

这是有效的,但可能有更好/更清洁的解决方案,我不知道如何使用CodeIgniter版本。
我也想避免使用iframe!

如果有人知道这样做的方法,或者有任何提示,我们将非常感谢!

3 个答案:

答案 0 :(得分:1)

CodeIgniter是一个很好的框架,用于执行其中的所有内容(与大多数框架一样),但不喜欢从外部“包含”。 为什么你需要将他纳入另一个CMS?您可以在CodeIgniter中执行CMS(这是CodeIgniter的基础),或者是sitezen中的电子商务。

如果是因为周围的样式,对我来说最好的是它也在CodeIgniter中编码。这不是很好,因为你必须两次保持风格,但它是实现你想要的最干净的方式之一。

警告是有原因的:禁用它们不会阻止结果发生。

您遇到的是尝试启动已启动的会话。为了避免这种情况,您必须为第二个会话指定与第一个会话不同的名称。 (在session_start()之前的通话中,您需要拨打session_name()

坏消息是,一旦会话启动,会话中的先前数据将不再可访问,因此如果CMS在__destruct()的会话中存储内容,则存储$_SESSION数组新数据将与CMS引导程序开头时使用的$_SESSION()不同。

如果你没有开始第二个会话,你会在相同的数组中混合CodeIgniter和sitezen变量(注意名称冲突)。

这样的代码不起作用(因此,据我所知,嵌套会话/恢复会话是不可能的):

<?php
function show() {
    echo "We are on [{$_SESSION['name']}] <br />\n";
}

session_name('SUPERSESSION'); session_start();
$_SESSION['name'] = "Super";

session_name('SESSION_ONE'); session_start();
$_SESSION['name'] = "ONE";

show(); # We are on [ONE]

session_destroy();

session_name('SESSION_TWO'); session_start();
$_SESSION['name'] = "TWO";

show(); # We are on [TWO]

session_destroy();

session_name('SESSION_ONE'); session_start();

show(); # We are on [empty] <- resume sessions does not work

session_destroy();

show(); # We are on [empty] <- nested sessions dont work

session_destroy();

为避免标题已发送警告,请在index.php中使用ob_start()启动代码,最后使用ob_end_flush()

答案 1 :(得分:0)

如果不大量破解CMS,就无法真正做到。

CMS为您提供了执行特定作业的工具,因此您只能使用CMS功能。类似CI是一个帮助开发应用程序的框架。

你真的必须把它包含在CMS页面中吗?

为什么不创建类似的链接:

site.com/my_store_app/codeigniter-stuff

然后只需从CMS中链接到它。您可以重复使用现有模板,因此在视觉上它看起来像是在CMS内部,但您将能够消除所有这些其他问题。

你实际上是在采用两种完全不同的系统并试图将它们粘在一起。

答案 2 :(得分:0)

我不确定它是否适合你,但你可以决定将它们包括在内。另一种选择是直接包含页面。请注意,我不确定这是否可行,但如果确实如此,除了链接之外,您将无法向其发送PHP变量。

include('http://www.example.com/codeigniter/controller/method/id');

试试这个。如果它有效,你可以做这样的事情来控制它:

include('http://www.example.com/codeigniter/'. $controller .'/'. $method .'/'. $id);

注意:会话不适用于此方法。如果你真的想让会话发挥作用,你最好的办法就是分开申请。

www.example.com <-- your cms
www.example.com/store <-- your webstore in CI