如果您无法阅读有关设置的详细信息,请跳至最后两段......
我正在从一个线性的PHP + JavaScript CMS过渡到面向对象的PHP模型,其中包含一些jQuery和Ajax。我试图通过以下设置集中尽可能多的代码:
的index.php
functions.js
/ inc / folder
大多数一切正常。 不起作用的部分是加载到索引的div#内容中的表单无法访问索引已经加载的各种PHP文件(即setup.php和functions.php)。这些形式需要偶尔的功能才能填充自己。
例如,我有一个“表单”,显示网站中的所有页面,以便用户可以编辑或删除它们。在我的旧CMS模型中,我会在functions.php中存储该函数(让我们称之为getPages()),这样页面就可以简单地回显getPages();
目前表单无法访问getPages()函数,因为.ajax()加载的文件无法识别index.php加载的functions.php。我可以通过添加require_once('functions.php')来解决这个问题。到/ inc /文件夹中每个文件的顶部,但我不想。我宁愿我的表格只是形式。
过去,我只使用PHP和POST / GET将表单加载到位,这显然会将索引标题,必需文件和新内容重新加载为一个有凝聚力的系列。那么如何与Ajax一起获得相同的结果并且缺少重新加载?它甚至可能吗?我是以错误的方式解决这个问题吗?
一些注意事项:
提前致谢!
index.php(此文件中的所有内容似乎都正常工作)...
<?php
require_once('setup.php');
require_once('functions.php'); //functions.php calls to objects.php
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
...
<link href="styles/styles.css" type="text/css" media="screen" rel="stylesheet" />
<link href="fancybox/jquery.fancybox-1.3.4.css" type="text/css" media="screen" rel="stylesheet" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.18/jquery-ui.min.js"></script>
...
<script src="js/functions.js"></script>
</head>
<body>
<div id="pagewrapper">
<div id="header">unimportant header content</div><!-- /header -->
<div id="nav_area">
<ul id="nav">
<li class="parent">Pages</li>
<ul class="children">
<li class="child" onclick="navto('inc/add_page.php');">Add a Page</li>
</ul>
</ul>
</div><!-- mana_nav_area -->
<div id="content"><!-- This is the DIV where the forms will appear -->
<?php
echo getPagesAsSelect(); //the function works here, although it doesn't make any sense to put it here. It's only here for illustrative purposes.
?>
</div><!-- mana_content -->
</div><!-- pagewrapper -->
</body>
</html>
functions.js(此文件中的所有内容似乎都正常工作)...
jQuery(document).ready(function(){
// called by index.php, this function adds an event handler to our example form
...
$("#add_page_form").live("submit", function () { add_page(); return false; });
...
});
function navto(destination) {
// use JQuery's ajax method to control main navigation
var request = $.ajax({
url: destination
});
request.done(function(msg) {
$("#content").html( msg );
});
request.fail(function(jqXHR, textStatus) {
alert( "Request failed: " + textStatus );
});
}
function add_page() {
// this function grabs the data from the add_page_form and sends it to actions.php
// actions.php determines what function or object to send it to
// JS-based security is not an issue at this time
var serialized = $('#add_page_form').serialize();
var dataString = 'action=add_page&' + serialized;
var destination = 'actions.php';
var jqXHR = $.ajax({
type: "GET",
url: destination,
data: dataString,
cache: true,
error: function(response) {
$('msg').append(response);
},
success: function(response) {
$('#msg').append(response);
}
});
return false;
}
示例页面:add_page.php,为用户提供了为其网站创建页面的机会。为了确定用户的新页面是否是另一个页面的子页面(后者在下面的表格中称为父页面),创建<SELECT>
并填充<OPTION>
s PHP函数(位于functions.php文件中),名为getPagesAsSelect()。
<?php
// if I leave this code in place, it works
require_once('../functions.php'); //(you may recall that this file is in an /inc folder)
// this require_once() is the one I'd like to remove if possible
?>
<fieldset id="fieldset">
<legend>Add a Page</legend>
<form id="add_page_form" name="add_page" action="" method="get">
<label for="name">Page Name:</label>
<input type="text" id="name" name="name" value="" /><br />
<label for="parent">Parent:</label>
<select id="parent" name="parent">
<option value="0">No parent</option>
<?php
echo getPagesAsSelect();
// getPagesAsSelect() queries the database and returns eligible
// pages as a series of <option value="pageID">pageName</option>
// Unless functions.php is loaded on this page, this call fails
// and the page stops loading here
?>
</select>
<br />
<input id="submit_add_page" type="submit" name="add_page" value="Submit" class="save" /><input type="reset" value="Cancel" class="cancel" />
</form>
<div id="msg"><!-- where success or error messages show upon completion --></div>
</fieldset>
总结一下:.ajax()将上面的add_page.php拉入index.php的div#内容。即使由index.php加载了functions.php文件,使用.ajax()也可以阻止新内容调用所需的函数。
虽然我不怀疑一切正常,但我并不喜欢我的解决方法,即要求.ajax()加载每个文件的functions.php。我正在寻找替代品,如果有的话。
答案 0 :(得分:0)
小摘要:你想在php文件中使用一个函数,而不必在那里有require_once
文件及其定义。 2解决方案:
auto_prepend
设置。答案 1 :(得分:0)
在ajax调用中无法访问您的“函数”,因为它们是与原始函数(index.php)完全不同的请求。这些调用具有它们自己的调用堆栈(可以这么说)并且对先前的请求一无所知。没有工作。如果需要访问其他文件中定义的那些函数,则必须包含/要求这些文件。如果您不想在文件中使用include
/ require
,那么您需要重新考虑您的实施。
答案 2 :(得分:0)
这不是一种解决方法,而是PHP的工作方式。因为PHP是服务器端,所以无法连接到在其他服务器调用中加载的函数。他们没有连接。 PHP是为此而制作的。使用它。