2012-06-15 41 views
-1

跳到最後兩段,如果你不能打擾閱讀設置的細節...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。我正在尋找替代品,如果有的話。

+0

現在真的,你有沒有例子? – Norse

+0

無論你如何詳細解釋它,如果你不顯示一些代碼,它不會幫助你解決問題。 – tradyblix

+0

在您輸入所有內容的時候,您可以輸入您的代碼的簡化版本,讓我們稱之爲「示例代碼」,向我們展示您的文本牆圍繞着想要定義的內容。 –

回答

0

小概要:你想在一個php文件中使用一個函數,而不必有require_once這個文件,它的定義在那裏。 2個解決方案:

  1. 不要加載該文件直接,但加載功能文件& 1個簡單的文件,然後包括你想要的文件(稱爲具有例如`/pagecontent.php?page=pagename.php(做白名單的名字,千萬不要去,包括隨機的文件)。
  2. 創建auto_prepend設置。
0

你的「功能」是不是在Ajax調用訪問,因爲他們是從原來的(指數完全獨立的請求。 php)這些調用都有自己的調用堆棧(可以這麼說),並且對之前的請求一無所知,沒有任何問題k左右。如果您需要訪問其他文件中定義的功能,則必須包含/需要這些文件。如果你不想在文件中使用include/require,那麼你需要重新考慮你的實現。

0

這不是一個解決方法,它是PHP的工作原理。由於PHP是服務器端,因此無法連接到您在其他服務器調用中加載的函數。他們不連接。 PHP是爲此製作的。用它。