2012-10-16 2 views
0

젠드 프레임 워크를 사용하여 빌드 된 기존 웹 사이트에 기능을 추가하고 싶습니다. 이 웹 사이트의 문제점 중 하나는 웹 페이지의 여러 위치에서 자주 페이지를 새로 고치는 것입니다. 내가 뭘하고 싶은지 새로 고친 후 웹 페이지에서 동일한 위치를 유지하기 위해 내장 된 젠드 프레임 워크 함수를 사용하는 것입니다.젠드 프레임 워크를 사용하여 마지막으로 클릭 한 위치를 기억하십시오.

예제는 다음과 같습니다. 사용자가 페이지 하단을 클릭하고 동일한 페이지가 다시로드되지만 페이지 상단에 다시로드되지 않습니다. 사용자가 마지막으로 클릭 한 위치를 유지합니다.

그런 것이 있습니까?

+0

나는 이해할 수 없다. 아무것도. 더 많은 정보를 제공해 주시겠습니까? – Carlos

+0

더 좋습니까? – user1186173

+0

링크 ('#')에서 해시를 사용할 수 있으며 실제 새로 고침은 곧바로 해시로 돌아갑니다. – aserwin

답변

0

당신이 바로 새로 고침하기 전에 윈도우의 스크롤 위치를 기록하는 몇 가지 자바 스크립트를 사용할 수 감사, 그냥 쿠키에 저장합니다.

다음 페이지가로드되면 쿠키를 확인하고 해당 위치로 스크롤 한 다음 삭제하십시오. 웹 페이지에 동적으로 크기가 지정된 요소가있는 경우 (예 : 확장 아코디언 메뉴)이 기능은 제대로 작동하지 않습니다.

개인적으로 나는 이것을 피하려고 노력할 것입니다. 때때로 나는 스크롤바로 물건을 만들고 나를 도우려는 웹 사이트를 방문한다. 길은 너무 자주 잘못되어 웹 페이지를 사용할 수 없게됩니다. 어쩌면 진짜 재로드를하는 대신 페이지를 동적으로 업데이트 (아약스?) 할 수 있습니다.

+0

아약스 사용에 대해서는 생각하지 못했지만 전에 제안을 시도했지만 기능이 태그에 포함 된 경우에만 작동합니다. 이 웹 사이트에는 이 하나만 있기 때문에 쿠키를 올바르게 처리하지 못합니다. – user1186173

+0

이 문제는 자바 스크립트만으로 해결되었습니다. 나는 PHP가 어떻게 든 관련되어 있다고 생각하는 느낌을 갖습니다 (zend framework는 PHP입니다). 본문에 있어야하는 자바 스크립트 함수에 대해 말하면 제대로 작동하도록 다시 작성 될 수 있습니다. 스크롤 막대를 스크립팅하지 마십시오. 그냥이 작업에 적합한 도구 인 ajax를 사용하십시오. – goat

+1

나는 그 접근 방식을 취할 것이다. 도움과 조언을 주셔서 감사합니다. – user1186173

1

이것을 달성하려면 Javascript (프론트 엔드)와 Zend Framework (백엔드)의 조합을 사용해야합니다.

사용자 쿠키/세션을 사용한다고 가정합니다.

  1. 페이지의 아무 곳이나 자바 스크립트를 사용하여 마우스 클릭을 감지하는 이벤트 처리기를 만듭니다. 이벤트 처리기에서 event 개체를 사용하여 마우스 위치의 x 및 y 좌표를 가져옵니다. (Mouse click event coordinates)
  2. Zend Framework에서 사용자의 마우스 좌표를 허용하는 엔드 포인트를 설정하십시오. 예를 들면 다음과 같습니다. http://localhost/user/updateCoordinates?x=12&y=100
  3. 마우스를 클릭하면 좌표를 # 2에서 설정 한 끝점으로 보내는 AJAX 쿼리를 이벤트 처리기에서 수행합니다.
  4. 젠드 프레임 워크에서 이러한 좌표를 사용자 세션/쿠키에 저장하십시오 (나중에 추적 할 수 있도록)
  5. 페이지로드시 세션에서 값을 가져 와서 자바 스크립트 코드를 출력하여 자동으로 해당 좌표로 스크롤합니다. 또한 쿠키가 이미 사용 되었기 때문에 쿠키에서 x 및 y 좌표를 제거하십시오.
+0

답장을 보내 주셔서 감사합니다. 귀하가 그렇게 할 수 있다고 생각하지 않았습니다. JavaScript에 익숙하지 않습니다. 현재 코드를 다시 작업해도 작동하지 않으면이 작업을 시도 할 수 있습니다. 다시 한번 감사드립니다. – user1186173

0

u는 ZF의 기존 구성 요소를 사용하여 몇 가지 새로운 플러그인에서 그들을 결합 할 수 있습니다 : 내 경우에는 ZF 구조에 저장

1) 새로운 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) 당신이 그런 행동 기록을 처리 할 경우 다음 U 어떤 컨트롤러에서이 플러그인을 사용할 수 있습니다 : 그것은 당신이 무엇을 수정할 수 있기를 바랍니다 :)

// 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()); 
} 
} 

그게 전부를 이 솔루션의 이론과 이점은 분명합니다.

관련 문제