背景信息:
我有一个用PHP编写的网络应用程序(几步电子商务),我正在用CodeIgniter编写一个新版本。
我必须将它包含在由CMS(sitezen)生成的php页面中。
/* generated html */
<?php include('my_app/index.php); ?>
/* generated html */
我无法对CMS部分做任何事情,比如与其他部分合作......
我的问题:
由于我无法在发送标头之前启动会话,因此在使用会话时也会收到警告但我可以禁用它们。
我的解决方法:
我没有找到任何与我的问题相关的帮助。对于旧的php版本,我唯一能想到的解决方法是将ajax请求发送到启动会话的php文件。
这是有效的,但可能有更好/更清洁的解决方案,我不知道如何使用CodeIgniter版本。
我也想避免使用iframe!
如果有人知道这样做的方法,或者有任何提示,我们将非常感谢!
答案 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