Ajax模板Silverstripe小部件

时间:2014-02-20 23:16:43

标签: silverstripe

我已经将一个小部件添加到具有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 );
        } );
    });
};

1 个答案:

答案 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请求。