当前位置: 代码迷 >> 综合 >> October cms-Backend (后端-controller和ajax)
  详细解决方案

October cms-Backend (后端-controller和ajax)

热度:8   发布时间:2023-12-06 17:39:18.0

后端

Controllers & AJAX

Introduction 介绍

后端实现了MVC模式。
控制器管理后端页面并实现各种功能,如表单和列表。
本文描述了如何开发后端控制器以及如何配置控制器行为。

每个controller都是一个PHP脚本
该脚本位于Plugin目录的/controllers子目录中。

controller的view是在其目录下的.htm文件

controller的目录名与控制器类名小写保持一致

视图目录也可以包含控制器配置文件。控制器目录结构示例:

plugins/acme/blog/controllers/users/                <=== Controller view 目录_partial.htm        <=== Controller partial 文件config_form.yaml    <=== Controller config 文件index.htm           <=== Controller view 文件Users.php             <=== Controller 类Plugin.php
Class definition 类定义

控制器类必须继承\Backend\classes\Controller类。
与任何其他插件类一样,控制器应该属于插件名称空间( plugin namespace)。
插件中使用的控制器的最基本表示如下:

namespace Acme\Blog\Controllers;class Posts extends \Backend\Classes\Controller {public function index()    // <=== Action method{}
}

通常每个控制器实现处理单一类型数据(a single type of data)(如博客文章或类别)的功能。
下面描述的所有后端行为都采用这种约定。

Controller properties controller属性

后端控制器基类定义了许多属性,这些属性允许配置页面外观和管理页面安全性

属性 描述
$fatalError 允许存储action方法中生成的致命异常,以便将其显示在视图中。
$user 包含对后端用户对象的引用。
$suppressView 允许阻止视图显示。可以在操作方法或控制器构造函数中进行更新。
$params 路由参数数组
$action 当前请求中正在执行的操作方法的名称。
$publicActions 定义了无需后端用户身份验证即可使用的一系列操作。可以在类定义中覆盖。
$requiredPermissions 查看此页面所需的权限。可以在类定义或控制器构造函数中设置。有关详细信息,请参见用户和权限。
$pageTitle 设置page title,能在action方法中设置
$bodyClass 用于自定义布局的body类属性。可以在控制器构造函数或action方法中设置。
$guarded controller特定方法,不应称为actions,能在controller构造器里面扩展
$layout 为控制器视图指定自定义布局(看下方layouts)

Actions, views and routing 动作 视图和路由

actions(公共controller方法)与view文件(对应于该动作的页面)是一一对应的
后端视图文件使用php语法
例如:对应index方法的index.htm

<h1>Hello World</h1>

该页面的URL由作者名称,插件名称,控制器名称和操作名称组成。

backend/[author name]/[plugin name]/[controller name]/[action name]

上面的Controller结果如下:

http://example.com/backend/acme/blog/users/index

Passing data to views 传递data到视图

使用控制器的$ vars属性将任何数据直接传递到您的视图:

$this->vars['myVariable'] = 'value';

视图中可直接访问$ vars属性里面的变量

<p>The variable value is <?= $myVariable ?></p>

Setting the navigation context 设置导航内容

插件可以在插件注册文件( plugin registration file)中注册后端导航菜单和子菜单。
导航上下文确定当前后端页面激活的后端菜单和子菜单。您可以使用BackendMenu类设置导航内容:

BackendMenu::setContext('Acme.Blog', 'blog', 'categories');

第一个参数指定作者和插件名称。
第二个参数设置菜单。
可选的第三个参数指定子菜单。
通常您在控制器构造函数中调用BackendMenu :: setContext

namespace Acme\Blog\Controllers;class Categories extends \Backend\Classes\Controller {public function __construct()
{parent::__construct();BackendMenu::setContext('Acme.Blog', 'blog', 'categories');
}

您可以使用controller类的$ pageTitle属性设置后端页面的标题(请注意,表单和列表行为可以为您完成此操作):

$this->pageTitle = 'Blog categories';

Using AJAX handlers 用ajax方法

后端AJAX框架使用与前端页面相同的AJAX库。该库会自动加载到后端页面上。

Back-end AJAX handlers 后端ajax

后端AJAX方法可以在controller类或widgets中定义。
在控制器类中,AJAX被定义为公共方法,其名称以“ on”字符串开头
如onCreateTemplate,onGetTemplateList等。
后端AJAX可以返回数据数组,引发异常或重定向到另一个页面(请参阅AJAX事件处理程序)。
您可以使用$ this-> vars设置变量,并使用控制器的makePartial方法呈现部分并将其内容作为响应数据的一部分返回。

public function onOpenTemplate()
{if (Request::input('someVar') != 'someValue') {throw new ApplicationException('Invalid value');}$this->vars['foo'] = 'bar';return ['partialContents' => $this->makePartial('some-partial')];
}
Triggering AJAX requests 发起ajax请求

参看前端ajax库章节 用法一样

注意:您可以使用前缀widget :: onName专门针对某个窗口小部件的AJAX处理程序。有关更多详细信息,请参见 widget AJAX handler article。

Controller middleware controller中间件

你可以定义中间件在后端controllers
为您提供一种方便的机制来更改HTTP请求的响应
例如,您可能希望为控制器中的某些操作指定HTTP标头,或者如果用户不符合特定条件,则将其重定向。
October中间件在response发送到浏览器之前 在cms处理request请求之后执行

为了使用中间件 你需要在controller的__construct()方法中调用middleware()

public function __construct()
{parent::__construct();$this->middleware(function ($request, $response) {// Middleware functionality});
}

middleware()方法需要一个带有两个参数的回调,$ request提供请求信息,$ response提供响应对象。回调应该返回$ response对象并进行修改。

例如,要将Test-Header标头添加到您的响应中,可以执行以下操作:

public function __construct()
{parent::__construct();$this->middleware(function ($request, $response) {$response->headers->set('Test-Header', 'Test');return $response;});
}

您还可以使用only()和exception()修饰符来控制哪些操作将使用中间件。例如,要限制中间件仅在索引操作上运行,您可以执行以下操作:

public function __construct()
{parent::__construct();$this->middleware(function ($request, $response) {// Middleware functionality})->only('index');
}

或者,对除索引操作以外的所有操作运行中间件:

public function __construct()
{parent::__construct();$this->middleware(function ($request, $response) {// Middleware functionality})->except('index');
}
  相关解决方案