我想为使用Zend Framework构建的现有网站添加一项功能。该网站的一个问题是它经常在网页上的不同位置刷新页面。我想要做的是使用内置的Zend框架函数在刷新后在网页中保持相同的位置。
一个示例是:用户点击页面底部,重新加载相同的页面,但不会在页面顶部重新加载,它会保留在用户上次点击的位置。
有这样的事吗?
谢谢
答案 0 :(得分:1)
您必须结合使用Javascript(在前端)和Zend Framework(在后端)来实现这一目标。
假设您正在使用用户cookie /会话。
event
对象获取鼠标位置的x和y坐标。 (Mouse click event coordinates)http://localhost/user/updateCoordinates?x=12&y=100
答案 1 :(得分:0)
您可以使用一些javascript在刷新之前记录窗口的滚动位置,然后将其保存到cookie中。
然后,当下一页加载时,检查cookie,滚动到其位置,然后将其删除。如果网页具有动态大小的元素(例如:扩展的折叠式菜单),这将无法正常工作。
就个人而言,我会尽量避免这种情况。我偶尔会访问一些喜欢用滚动条做的东西的网站,并试着帮助我。通常他们会弄错,网页变得无法使用。也许你可以动态更新页面(ajax?)而不是真正重新加载。
答案 2 :(得分: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());
}
}
多数民众赞成:)希望你能修改你想要的东西,但这个解决方案的理论和好处是明确的......