我已经将一个小部件添加到具有Page类的页面。 widget php代码返回一个PaginatedList,它使用$ SidebarView标签在我的Page.ss模板中成功呈现。
如何劫持分页点击以使用新模板呈现小部件?我假设在索引方法上测试is_ajax并执行$ this-> renderWith('myTemplate')不会起作用,因为我只想用新模板而不是整个页面渲染窗口小部件。
这是我目前从Zauberfisch的原始答案中提取的Page.php代码:
public function index( SS_HTTPRequest $request ) {
$page = $this->data();
if ( $request->isAjax() ) {
$widgetArea = $page->Sidebar();
$widget = $widgetArea->Widgets()->filter( 'ClassName', 'ScbWidget' );
return $widget->renderWith( 'ScbTemplate' );
} else {
return array();
}
}
这是我的widget php代码,它将分页列表返回给我的模板:
public function ScbList() {
$list = new PaginatedList( CatalogItem::get()->filter( array( 'SchoolChoirRelease' => 1 ) ), Controller::curr()->getRequest() );
$list->setPageLength( $this->ShowPerPage );
return $list;
}
当分页列表返回到没有ajax的模板时,一切都按预期工作 - ?start = 2返回列表偏移2项。当我劫持链接并使用新模板渲染窗口小部件时,我的列表未在新模板中呈现。这是我的js:
ajaxify = function( href, callback ) {
$.ajax( {
url: href,
success: function( data ) {
callback( data );
}
});
};
hijackSubmit = function() {
jqueryMap.$pagination.on( 'click', 'a', function( e ) {
e.preventDefault();
var href = $( this ).attr( 'href' );
ajaxify( href, function( data ) {
jqueryMap.$container.html( data );
} );
});
};
答案 0 :(得分:1)
在SilverStripe中,可以呈现任何类型为ViewableData
的对象。 Page是ViewableData
的子类,但Widget
也是如此。 SilverStripe中的许多对象都会扩展ViewableData
。
这意味着您已经走上正轨。 我假设你有两个变量:
$request
类型SS_HTTPRequest
的请求对象$request = $this->getRequest()
)$page
类型为Page
或子类的页面对象
(如果你在控制器中,你可以这样得到:$page = $this->data()
)现在你应该可以做到:
if ($request->isAjax()) {
$widgetArea = $page->SideBar();
$widget = $widgetArea->Widgets()->filter('ClassName', 'MyWidget')->First();
return $widget->renderWith('MyWidgetTemplate');
}
// do something else
注意:如果$request->isAjax()
永远不是真的,请在javascript中调用时将?ajax=1
添加到网址。 ?ajax=1
会让SilverStripe知道这是一个ajax请求。