0

ZendFrameworkを使用して構築された既存のWebサイトに機能を追加したいと思います。このWebサイトの問題の1つは、Webページのさまざまな位置でページが頻繁に更新されることです。私がやりたいのは、組み込みのZendフレームワーク関数を使用して、Webページが更新された後も同じ位置を維持することです。

例:ユーザーがページの下部をクリックすると、同じページが再読み込みされますが、ページの上部では再読み込みされず、ユーザーが最後にクリックした場所に留まります。

そんなことありますか?

ありがとうございました

4

3 に答える 3

1

これを実現するには、Javascript (フロントエンド) と Zend Framework (バックエンド) を組み合わせて使用​​する必要があります。

これは、ユーザーの Cookie/セッションを使用していることを前提としています。

  1. ページ上の任意の場所で Javascript を使用して、マウス クリックを検出するイベント ハンドラーを作成します。イベント ハンドラーで、eventオブジェクトを使用して、マウス位置の x 座標と y 座標を取得します。(マウスクリックイベント座標)
  2. ユーザーのマウス座標を受け入れるエンドポイントを Zend Framework に設定します。例えば:http://localhost/user/updateCoordinates?x=12&y=100
  3. マウス クリックで、イベント ハンドラーが AJAX クエリを実行し、#2 で設定したエンドポイントに座標を送信します。
  4. Zend Framework では、これらの座標をユーザー セッション/Cookie に保存します (後で追跡できるようにします)。
  5. ページの読み込み時に、セッションから値を取得し、Javascript コードを出力して、その座標まで自動的にスクロールします。また、Cookie は既に使用されているため、x 座標と y 座標を削除します。
于 2012-10-16T15:40:14.637 に答える
0

ZF の既存のコンポーネントを使用して、新しいプラグインでそれらを組み合わせることができます。

1) 私の場合、ZF 構造に保存された新しい ZF プラグイン: /library/My/Controller/Plugin/ActionHistory.php

final class My_Controller_Plugin_ActionHistory extends Zend_Controller_Plugin_Abstract
{

/** @var bool flag indicating whether current action has been already logged */
private $dispatched = false;

/**
 * @param Zend_Controller_Request_Abstract $request
 * @return void
 */
public function pushStack(Zend_Controller_Request_Abstract $request) {
    $storage = $this->getStorage();
    $storage->stack[] = $request;
    // limit the depth of the stack
    if (count($storage->stack) > $this->getMaxDepth()) {
        array_shift($storage->stack);
    }
    // mark current action as dispatched (influences getBacklink())
    $this->dispatched = true;
}

public function popStack() {
    $storage = $this->getStorage();
    return array_pop($storage->stack);
}

/**
 * Returns request to previous action (not current).
 *
 * @return Zend_Controller_Request_Abstract|null
 */
public function getBacklink() {
    $storage = $this->getStorage();
    $depth = count($storage->stack);
    // points to top of the stack
    $backlinkIndex = $depth - 1;
    if ($this->dispatched) {
        // current action has been already logged, "backlink" is second from the top
        --$backlinkIndex;
    }

    return ($backlinkIndex >= 0 ? $storage->stack[$backlinkIndex] : null);
}

/**
 * Returns stack with performed actions
 * @return array
 */
public function getStack() {
    return $this->getStorage()->stack;
}

/**
 * @return Zend_Session_Namespace
 */
private function getStorage() {
    static $storage = null;
    if ($storage === null) {
        $storage = new Zend_Session_Namespace(get_class($this), true);
        if (!is_array($storage->stack)) {
            // initialize stack if needed
            $storage->stack = array();
        }
    }
    return $storage;
}

/**
 * Returns maximal depth of the action history
 * @return int
 */
private function getMaxDepth() {
    return 3;
}
}

2) このコードをどこかに配置して、履歴をスタックにプッシュします。アプリケーションへのロギングと連携するなど、履歴のみを使用することも、すべての履歴を保存することもできます。あなた次第です:

// this code is example of usage in another ZF controller plugin class
$actionHistory = Zend_Controller_Action_HelperBroker::getStaticHelper("ActionHistory");
if ($actionHistory) {
    // $this => instance of Zend_Controller_Plugin_Abstract
    $actionHistory->pushStack($this->getRequest());
}

3) 次に、アクション履歴をそのように処理したいコントローラでこのプラグインを使用できます。

// check if there is an backlink stored in actionStack, if yes than use it
if (($actionHistory = $this->getHelper('actionHistory'))) {
$request = $actionHistory->getBacklink();
if ($request) {
    $actionHistory->popStack();
    // use any of your redirect classes or simle redirector helper
    // right path to previous site is accesible by $request->getUserParams()
    $this->redirect($request->getUserParams());
}
}

それだけです:)必要なものを変更できることを願っていますが、このソリューションの理論と利点は十分に明らかです...

于 2012-11-06T12:27:03.560 に答える
0

リフレッシュの直前にウィンドウのスクロール位置を記録し、それを Cookie に保存するために JavaScript を使用することができます。

次に、次のページが読み込まれたら、Cookie を確認し、その位置までスクロールして削除します。Web ページに動的なサイズの要素 (例: アコーディオン メニューの展開) がある場合、これはうまく機能しません。

個人的には、私はこれを避けようとします。ときどき、スクロール バーを操作するのが好きな Web サイトにアクセスして、私を助けようとします。多くの場合、彼らはそれを間違えて、Web ページが使用できなくなります。実際のリロードを行う代わりに、ページ (ajax?) を動的に更新することができるかもしれません。

于 2012-10-16T15:38:32.880 に答える