向 osclass 中的自定义路由提交表单
Submit a Form to Custom Route in osclass
我正在制作一个 osclass 插件。我在网站的管理部分为我的插件添加了一个页面。我还为我的插件创建了一个路由。
我想做的是在管理员的插件页面上创建一个表单。此表单的 action 属性将是我自定义路由的基础 url。然后,当管理员提交时,该表单将在基础 url 中添加一个参数查询字符串。具体来说,查询字符串应包含一个 id 参数,例如 ?id=1
.
这是我的资料:
<form action="<?php echo osc_route_admin_url('my-custom-route'); ?>" method="get">
<h2>User Profile form</h2>
<select name="id">
//...options, each one's value is a registered user
</select>
<input type="submit" value="Submit">
</form>
我测试过这个表格。 osclass 没有让我在我的自定义路线 url 下车,而是将我重定向到管理仪表板的 url(查询字符串中包含正确的 id 以及一个 octoken)。我需要它来触发我的自定义路线。
我已经通过在表单所在的同一页面上打印 link 来测试自定义路由。当通过单击 link 访问时,自定义路由工作正常。
感谢任何能提供帮助的人!
我最终确实弄明白了这一点,或者至少找到了一种方法。您可以使用 renderplugin_controller
挂钩。只要用户请求 url 到管理区域中的自定义路由,就会触发此挂钩。要向其添加名为 controller
的回调,我在插件的 bootstrap class:
的构造函数中添加了一行
function __construct() {
//...
osc_add_hook( 'renderplugin_controller', array($this, 'controller'));`
//...
}
然后,挂钩 controller
方法在 renderplugin_controller
挂钩为 运行 时检查 url 中的路由参数。如果路由参数存在,并且它属于我的插件,我有一个单独的控制器 class,它被实例化并从此时开始处理请求。我可以通过将路由名称与我的插件特定的前缀匹配来测试该路由是否属于我的插件。
public function controller(){
if (is_null(Params::getParam('route'))) return;
//strict type checking
if ( false !== strpos( Params::getParam('route'), 'my-prefix' )){
$controller = new Admin_Controller();
$controller->doModel();
}
}
就 Admin_Controller class 而言,根据我看到的示例,它应该扩展 AdminSecBaseModel
class。它的基本结构是:
class Admin_Controller extends AdminSecBaseModel {
//property to hold my model class
public mUser;
public function __construct(){
parent::__construct();
//instantiate my model class
$this->mUser = User::newInstance();
}
public function doModel(){
/*
I only have one route in my plugin.
If you had multiple you could switch over them
with switch(Params::getParam('route'))
*/
$id = Params::getParam('id');
$user = $this->mUser->findByPrimaryKey( $id );
//do whatever you want with the user object
}
}
如果您想要另一个更完整的示例来了解如何使用 renderplugin_controller
挂钩来处理向自定义路由提交的表单,我建议您查看 this repository(它适用于 osclass 用户自定义字段插件)。我基本上复制了那里所做的事情。特别是,UserCfAdmin class 和 UserCfController_Admin class 向我展示了具体的操作方法。
您可以找到另一个为您的自定义路由制作控制器的指南here。
注意:我在网站上使用 osclass v3.8。
我正在制作一个 osclass 插件。我在网站的管理部分为我的插件添加了一个页面。我还为我的插件创建了一个路由。
我想做的是在管理员的插件页面上创建一个表单。此表单的 action 属性将是我自定义路由的基础 url。然后,当管理员提交时,该表单将在基础 url 中添加一个参数查询字符串。具体来说,查询字符串应包含一个 id 参数,例如 ?id=1
.
这是我的资料:
<form action="<?php echo osc_route_admin_url('my-custom-route'); ?>" method="get">
<h2>User Profile form</h2>
<select name="id">
//...options, each one's value is a registered user
</select>
<input type="submit" value="Submit">
</form>
我测试过这个表格。 osclass 没有让我在我的自定义路线 url 下车,而是将我重定向到管理仪表板的 url(查询字符串中包含正确的 id 以及一个 octoken)。我需要它来触发我的自定义路线。
我已经通过在表单所在的同一页面上打印 link 来测试自定义路由。当通过单击 link 访问时,自定义路由工作正常。
感谢任何能提供帮助的人!
我最终确实弄明白了这一点,或者至少找到了一种方法。您可以使用 renderplugin_controller
挂钩。只要用户请求 url 到管理区域中的自定义路由,就会触发此挂钩。要向其添加名为 controller
的回调,我在插件的 bootstrap class:
function __construct() {
//...
osc_add_hook( 'renderplugin_controller', array($this, 'controller'));`
//...
}
然后,挂钩 controller
方法在 renderplugin_controller
挂钩为 运行 时检查 url 中的路由参数。如果路由参数存在,并且它属于我的插件,我有一个单独的控制器 class,它被实例化并从此时开始处理请求。我可以通过将路由名称与我的插件特定的前缀匹配来测试该路由是否属于我的插件。
public function controller(){
if (is_null(Params::getParam('route'))) return;
//strict type checking
if ( false !== strpos( Params::getParam('route'), 'my-prefix' )){
$controller = new Admin_Controller();
$controller->doModel();
}
}
就 Admin_Controller class 而言,根据我看到的示例,它应该扩展 AdminSecBaseModel
class。它的基本结构是:
class Admin_Controller extends AdminSecBaseModel {
//property to hold my model class
public mUser;
public function __construct(){
parent::__construct();
//instantiate my model class
$this->mUser = User::newInstance();
}
public function doModel(){
/*
I only have one route in my plugin.
If you had multiple you could switch over them
with switch(Params::getParam('route'))
*/
$id = Params::getParam('id');
$user = $this->mUser->findByPrimaryKey( $id );
//do whatever you want with the user object
}
}
如果您想要另一个更完整的示例来了解如何使用 renderplugin_controller
挂钩来处理向自定义路由提交的表单,我建议您查看 this repository(它适用于 osclass 用户自定义字段插件)。我基本上复制了那里所做的事情。特别是,UserCfAdmin class 和 UserCfController_Admin class 向我展示了具体的操作方法。
您可以找到另一个为您的自定义路由制作控制器的指南here。
注意:我在网站上使用 osclass v3.8。