跳到最後兩段,如果你不能打擾閱讀設置的細節...PHP文件無法訪問加載功能
我從轉變一個線性PHP + JavaScript CMS到面向對象的PHP模型,並帶有一些花裏胡哨的la jQuery和Ajax。我想集中儘可能多的代碼儘可能與以下設置:
的index.php
- 呼叫(通過require_once())setup.php(輕鬆訪問常用變量(如目錄),常量,首選項,打開和關閉調試等),actions.php(jQuery.ajax()用於確定將數據發送到哪個函數或對象的文件),functions.php(輔助函數),對象.php(使用的對象,通常用於將輸入/輸出數據傳入/傳出MySQL數據庫)
- 調用functions.js,jQuery(來自Google),tiny_mce和fancybox(後兩者很可能不是變量LEM,但我想我會提到他們無論如何)
- 包括DIV#內容,以便jQuery.ajax()有一個地方加載內容
functions.js
- 包括腳本通過$(#content).html將內容加載到index.php的div#內容中...
- 包括用於準備表單內容的腳本,使用.ajax()將數據發送到actions.php,接受成功或錯誤消息服務器,並向用戶顯示消息
- includ ES,增加了一個.live一個doc.ready函數( '提交')方法將形式
/INC /文件夾
- 包括經由.ajax的PHP文件,大多的形式,用於加載()進入索引的div#內容
大多數一切正常。 不起作用的部分是,加載到索引div#內容的表單無法訪問已由索引加載的各種PHP文件(即setup.php和functions.php)。這些形式需要偶爾的功能來填充自己。
例如,我有一個「表單」,顯示網站中的所有頁面,以便用戶可以編輯或刪除它們。在我的舊CMS模型中,我將這個函數(我們稱之爲getPages())存儲在functions.php中,以便頁面可以簡單地回顯getPages();
當前表單無法訪問getPages()函數,因爲由.ajax()加載的文件無法識別index.php加載的functions.php。我可以通過添加一個require_once('functions.php')來解決這個問題。到/ inc /文件夾中每個文件的頂部,但我寧可不要。我寧願我的表格只是表格。
過去,我只是使用PHP和POST/GET將表單加載到位,這明顯將索引標頭,所需文件和新內容重新加載爲一個有凝聚力的家族。那麼,我怎樣才能得到與Ajax相同的結果以及它沒有重新加載?它甚至有可能嗎?我是否以這種錯誤的方式去做?
一些注意事項:
- 我寧願一個jQuery,JavaScript或PHP的解決方案,如果有的話。我正在做的大部分工作對我來說已經是新的了,因此添加另一個庫可能會讓我的頭部爆炸。 ......但如果這是唯一的方法......我會做我必須做的。
- 雖然我很高興根據需要複製/粘貼一些代碼,但是沒有任何文件可以在線獲得;這只是我的XAMPP開發服務器上
- ,因爲這些文件都是我的服務器上,有明顯的不跨域bidness在
感謝因素提前!
的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>
,並通過一個PHP函數(位於函數中)填充<OPTION>
.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>
總結:阿賈克斯()拉動上述add_page.php到index.php中的DIV#內容。即使functions.php文件已被index.php加載,但使用.ajax()可防止新內容能夠調用它所需的函數。
儘管我不懷疑所有事情都應該如此,但我不是我的解決方法的粉絲,這就是要求每個由.ajax()加載的文件的functions.php。我正在尋找替代品,如果有的話。
現在真的,你有沒有例子? – Norse
無論你如何詳細解釋它,如果你不顯示一些代碼,它不會幫助你解決問題。 – tradyblix
在您輸入所有內容的時候,您可以輸入您的代碼的簡化版本,讓我們稱之爲「示例代碼」,向我們展示您的文本牆圍繞着想要定義的內容。 –