-1

セットアップの詳細を読むのが面倒な場合は、最後の 2 つの段落にスキップしてください...

私は、直線的な PHP+JavaScript CMS から、jQuery と Ajax の機能を備えたオブジェクト指向の PHP モデルに移行しています。次の設定で、できるだけ多くのコードを集中化しようとしています。

index.php

  • (require_once() を介して) setup.php (一般的な変数 (ディレクトリなど)、定数、設定、デバッグのオンとオフの切り替えなどへの簡単なアクセス)、actions.php (jQuery.ajax() によって使用されるファイルへの呼び出し)データを送信する関数またはオブジェクトを決定します)、functions.php (その他の関数)、objects.php (通常、MySQL データベースとの間で受信/送信データを準備するために使用されるオブジェクト)
  • functions.js、jQuery (Google から)、tiny_mce、fancybox を呼び出します (これらの最後の 2 つは問題の変数ではない可能性がありますが、いずれにせよ言及したいと思います)
  • jQuery.ajax() がコンテンツをロードする場所を持つように div#content を含めます

functions.js

  • $(#content).html... を介して index.php の div#content にコンテンツをロードするためのスクリプトが含まれています。
  • フォーム コンテンツを準備するためのスクリプトが含まれています。.ajax() を使用して actions.php にデータを送信し、サーバーからの成功またはエラー メッセージを受け取り、ユーザーにメッセージを表示します。
  • フォームに .live('submit') メソッドを追加する doc.ready 関数が含まれています

/inc/ フォルダ

  • .ajax() を介してインデックスの div#content にロードするための PHP ファイル (主にフォーム) が含まれています

ほとんどすべてが正常に動作します。機能しない部分は、インデックスの div#content にロードされたフォームが、インデックスによって既にロードされているさまざまな PHP ファイル (つまり、setup.php および functions.php) にアクセスできないことです。これらのフォームは、それ自体を設定するために時折機能を必要とします。

たとえば、ユーザーが編集または削除できるように、Web サイトのすべてのページを表示する「フォーム」があります。私の古い CMS モデルでは、その関数 (getPages() と呼びましょう) を functions.php に格納して、ページが単純に getPages(); をエコーできるようにしていました。

現在、フォームは getPages() 関数にアクセスできません。これは、.ajax() によってロードされたファイルが、index.php によってロードされた functions.php を認識しないためです。これを回避するには、require_once('functions.php'); を追加します。/inc/ フォルダー内のすべてのファイルの先頭に、しかし私はむしろしたくありません。私は自分のフォームが単なるフォームであることを望んでいます。

以前は、PHP と POST/GET だけでフォームを所定の位置にロードしていました。これにより、インデックス ヘッダー、必要なファイル、および新しいコンテンツが 1 つのまとまりのあるファミリとして再ロードされます。では、Ajax とそのリロードの欠如を組み合わせて、どうすれば同じ結果を得ることができるでしょうか? それは可能ですか?私はこれについて間違った方法で進んでいますか?

いくつかのメモ:

  • もしあれば、jQuery、JavaScript、または PHP ソリューションを好むでしょう。私がやっていることのほとんどはすでに私にとって新しいものなので、別のライブラリを追加すると頭が爆発するかもしれません. …でもそれしかないなら… やるべきことはやる。
  • 必要に応じていくつかのコードをコピーして貼り付けることができますが、オンラインで利用できるファイルはありません。それは私のXAMPP開発サーバーにあります
  • これらのファイルはすべて私のサーバー上にあるため、考慮すべきクロスドメイン ビッドネスは明らかに存在しません。

前もって感謝します!

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。ユーザーの新しいページが別のページのサブページであるかどうかを判断するために (以下のフォームでは親と呼ばれる)、a<SELECT>が作成され<OPTION>、PHP 関数 (functions.php にあります) を介して sが取り込まれます。ファイル) 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#content に取り込みます。functions.php ファイルは index.php によって読み込まれますが、.ajax() を使用すると、新しいコンテンツが必要な関数を呼び出すことができなくなります。

すべてが正常に機能していることに疑いの余地はありませんが、.ajax() によってロードされるすべてのファイルで functions.php を要求するという私の回避策のファンではありません。もしあれば、私は代替手段を探しています。

4

3 に答える 3

0

「関数」は、元の要求 (index.php) とは完全に別の要求であるため、ajax 呼び出しではアクセスできません。これらの呼び出しには独自の呼び出しスタック (いわば) があり、以前の要求については何も知りません。回避策はありません。他のファイルで定義されているこれらの関数にアクセスする必要がある場合は、それらのファイルを含める/要求する必要があります。includeファイルで/を使用したくない場合はrequire、実装を再考する必要があります。

于 2012-06-19T00:13:37.927 に答える
0

これは回避策ではなく、PHP の仕組みです。PHP はサーバー側であるため、別のサーバー呼び出しでロードした関数に接続することはできません。それらは接続しません。PHPはこのために作られました。これを使って。

于 2012-06-19T00:20:33.420 に答える
0

簡単な要約: php ファイルで関数を使用したいが、require_onceそこに定義されたファイルがなくてもかまいません。2 つの解決策:

  1. そのファイルを直接ロードしないでください。ただし、関数ファイルをロードして必要なファイルをインクルードする 1 つの単純なファイル (たとえば、`/pagecontent.php?page=pagename.php で呼び出されます) (名前をホワイトリストに登録し、含めないでください)ランダムファイル)。
  2. 設定を作成しauto_prependます。
于 2012-06-18T23:32:14.953 に答える