通知设置 新通知
addFilter 中使用了cache方法,缓存名称有问题
回复BUG反馈 • devilmengcry 发起了问题 • 1 人关注 • 0 个回复 • 1616 次浏览 • 2020-04-22 17:35
$this->error()无法跳转的坑!
BUG反馈 • delgo 发表了文章 • 0 个评论 • 1628 次浏览 • 2020-03-26 21:02
因为想做一个表单提交后发现某错误后跳转出去后台的功能,所以用到了$this->error($msg,$url),结果发现跳转完全不起作用。但是$this->success($msg,$url)跳转却可以。
看了看thinkphp官方的代码,没有发现自己传递参数时有啥错误。
代码在thinkphp/traits/controller/jump.php中。
/**
* 操作错误跳转的快捷方法
* @access protected
* @param mixed $msg 提示信息
* @param string $url 跳转的URL地址
* @param mixed $data 返回的数据
* @param integer $wait 跳转等待时间
* @param array $header 发送的Header信息
* @return void
*/
protected function error($msg = '', $url = null, $data = '', $wait = 3, array $header = [])
{
$type = $this->getResponseType();
if (is_null($url)) {
$url = $this->app['request']->isAjax() ? '' : 'javascript:history.back(-1);';
} elseif ('' !== $url) {
$url = (strpos($url, '://') || 0 === strpos($url, '/')) ? $url : $this->app['url']->build($url);
}
$result = [
'code' => 0,
'msg' => $msg,
'data' => $data,
'url' => $url,
'wait' => $wait,
];
if ('html' == strtolower($type)) {
$type = 'jump';
}
$response = Response::create($result, $type)->header($header)->options(['jump_template' => $this->app['config']->get('dispatch_error_tmpl')]);
throw new HttpResponseException($response);
}
然后再看thinkphp文档,发现有一句error方法会自动判断当前请求是否属于Ajax请求,如果属于Ajax请求则会自动转换为default_ajax_return配置的格式返回信息。 success在Ajax请求下不返回信息,需要开发者自行处理。围绕这个找了半天,发现能力有限,确实翻找不到,最终在dolphin.js260行左右找到了代码。
tips(msg, 'danger');对表单提交时候的$this->error();有效,于是在下面加了一句。
if(res.url){
setTimeout(function(){
parent.location.href = res.url;
},res.wait*1000)
}这下可以实现了,但是其实根本的问题没能解决,也算是个BUG吧,请官方看看是哪里的问题。 查看全部
看了看thinkphp官方的代码,没有发现自己传递参数时有啥错误。
代码在thinkphp/traits/controller/jump.php中。
/**
* 操作错误跳转的快捷方法
* @access protected
* @param mixed $msg 提示信息
* @param string $url 跳转的URL地址
* @param mixed $data 返回的数据
* @param integer $wait 跳转等待时间
* @param array $header 发送的Header信息
* @return void
*/
protected function error($msg = '', $url = null, $data = '', $wait = 3, array $header = [])
{
$type = $this->getResponseType();
if (is_null($url)) {
$url = $this->app['request']->isAjax() ? '' : 'javascript:history.back(-1);';
} elseif ('' !== $url) {
$url = (strpos($url, '://') || 0 === strpos($url, '/')) ? $url : $this->app['url']->build($url);
}
$result = [
'code' => 0,
'msg' => $msg,
'data' => $data,
'url' => $url,
'wait' => $wait,
];
if ('html' == strtolower($type)) {
$type = 'jump';
}
$response = Response::create($result, $type)->header($header)->options(['jump_template' => $this->app['config']->get('dispatch_error_tmpl')]);
throw new HttpResponseException($response);
}
然后再看thinkphp文档,发现有一句error方法会自动判断当前请求是否属于Ajax请求,如果属于Ajax请求则会自动转换为default_ajax_return配置的格式返回信息。 success在Ajax请求下不返回信息,需要开发者自行处理。围绕这个找了半天,发现能力有限,确实翻找不到,最终在dolphin.js260行左右找到了代码。
tips(msg, 'danger');对表单提交时候的$this->error();有效,于是在下面加了一句。
if(res.url){
setTimeout(function(){
parent.location.href = res.url;
},res.wait*1000)
}这下可以实现了,但是其实根本的问题没能解决,也算是个BUG吧,请官方看看是哪里的问题。 查看全部
因为想做一个表单提交后发现某错误后跳转出去后台的功能,所以用到了$this->error($msg,$url),结果发现跳转完全不起作用。但是$this->success($msg,$url)跳转却可以。
看了看thinkphp官方的代码,没有发现自己传递参数时有啥错误。
代码在thinkphp/traits/controller/jump.php中。
然后再看thinkphp文档,发现有一句
看了看thinkphp官方的代码,没有发现自己传递参数时有啥错误。
代码在thinkphp/traits/controller/jump.php中。
/**
* 操作错误跳转的快捷方法
* @access protected
* @param mixed $msg 提示信息
* @param string $url 跳转的URL地址
* @param mixed $data 返回的数据
* @param integer $wait 跳转等待时间
* @param array $header 发送的Header信息
* @return void
*/
protected function error($msg = '', $url = null, $data = '', $wait = 3, array $header = [])
{
$type = $this->getResponseType();
if (is_null($url)) {
$url = $this->app['request']->isAjax() ? '' : 'javascript:history.back(-1);';
} elseif ('' !== $url) {
$url = (strpos($url, '://') || 0 === strpos($url, '/')) ? $url : $this->app['url']->build($url);
}
$result = [
'code' => 0,
'msg' => $msg,
'data' => $data,
'url' => $url,
'wait' => $wait,
];
if ('html' == strtolower($type)) {
$type = 'jump';
}
$response = Response::create($result, $type)->header($header)->options(['jump_template' => $this->app['config']->get('dispatch_error_tmpl')]);
throw new HttpResponseException($response);
}
然后再看thinkphp文档,发现有一句
error方法会自动判断当前请求是否属于Ajax请求,如果属于Ajax请求则会自动转换为default_ajax_return配置的格式返回信息。 success在Ajax请求下不返回信息,需要开发者自行处理。围绕这个找了半天,发现能力有限,确实翻找不到,最终在dolphin.js260行左右找到了代码。
tips(msg, 'danger');对表单提交时候的$this->error();有效,于是在下面加了一句。
if(res.url){这下可以实现了,但是其实根本的问题没能解决,也算是个BUG吧,请官方看看是哪里的问题。
setTimeout(function(){
parent.location.href = res.url;
},res.wait*1000)
}
->setTableName无效
提问交流 • delgo 发表了文章 • 0 个评论 • 1217 次浏览 • 2019-11-27 20:27
return ZBuilder::make('table')
->setTableName('cms_document_article',true)
->setSearch(['title' => '标题', 'cms_column.name' => '栏目名称']) // 设置搜索框
->addColumns([ // 批量添加数据列
['id', 'ID'],
['title', '标题'],
['column_name', '栏目名称'],
['view', '点击量'],
['username', '发布人'],
['update_time', '更新时间', 'datetime'],
['sort', '排序', 'text.edit'],
['status', '状态', 'switch'],
['right_button', '操作', 'btn']
])
->addTopButtons('add,enable,disable,delete') // 批量添加顶部按钮
->addRightButtons(['edit', 'delete']) // 批量添加右侧按钮
->addOrder(['column_name' => 'cms_document.cid'])
->addOrder('id,title,view,username,update_time')
->addFilter(['column_name' => 'cms_column.name', 'username' => 'admin_user'])
->setRowList($data_list) // 设置表格数据
->fetch(); // 渲染模板提示[size=14]SQLSTATE[42S02]: Base table or view not found: 1146 Table '****.dp_' doesn't exist[/size]
放addcolumn前,放addcolumn后都没用,就一直是dp_。
prefix设置成0,1,2 true false也都没用。删了->settablename,quickedit依然是获取不到表的值。但是buildor的方法里是能获取到值并返回的。补充一下:模块名CMS 控制器名字document,方法是document_list。cms_document_article是我自定义模型的表,想要在文档列表这个控制器里加个该栏目下文档的页面。另外给个建议,我是觉得目前的CMS比较鸡肋,框架发展离不开好的应用支撑啊。尤其是官方都写了cms了,为啥不好好的弄弄呢。只是建议啊,可能说的比较直接,抱歉。
为啥说比较鸡肋呢,最典型的就是我个人感觉啊,这个内容模型的设置很反人类。开放人员肯定知道内容模型是干啥的。可用户大部分人肯定不知道这个是什么东西啊。用户习惯的操作是需要很便捷很易懂的,我都需要进去看看代码才能懂的设置,他们怎么可能会懂啊。有几个地方觉得很理解不能。一是内容模型分是系统模型和独立模型,可在常用操作的文档列表里竟然是独立模型的文章看不到的。不应该是全部文章吗?
二、发布文章需要先选择栏目,一个下拉框,那如果我有100个栏目300个栏目呢?直接劝退。
三、栏目管理每个栏目下加个这个栏目的文章列表的页面啊,大部分CMS都这么做,用户早就这么操作习惯了。
四、栏目管理里也直接加个发布文档啊,同样大部分CMS也是这么做的,用户操作习惯了。
只是建议,可能官方考虑的是引领操作潮流啥的。总之希望dolphinphp越来越好。再更新一下,找到原因了,首先在JS里找到了var $data = {
value: $switch.prop('checked'),
_t: $switch.data('table') || '',
name: $switch.data('field') || '',
type: 'switch',
pk: $switch.data('id') || ''
};发现本身就没提交表的数据。
然后官方本身就在该控制器下写了个quickedit,没继续去查证,但是猜测应该是这个方法覆盖了默认的quickedit方法。该方法下获取不到表的数据,但是该quickedit里有input(table),我最初是以为传递之前出了问题,漏掉了table的值,现在看根本不是了。是压根就没传递这个值。_t: $switch.data('table') 里虽然有个table,但是是一串字符,不知道是什么用意。public function quickEdit($record = )
{
$id = input('post.pk', '');
$field = input('post.name', '');
$value = input('post.value', '');
$table = input('post.table', '');
halt(input());
$document = Db::name($table)->where('id', $id)->value($field);
$details = '表名('.$table.'),字段(' . $field . '),原值(' . $document . '),新值:(' . $value . ')';
return parent::quickEdit(['document_edit', 'cms_document', $id, UID, $details]);
}如果自己写quickedit方法,表格里switch怎么操作其他的表。再继续更新,原来是我用的是老板的cms,新版的这个问题早解决了。
public function quickEdit($record = [])
{
$table_token = input('param._t', '');
$table_token == '' && $this->error('缺少参数');
!session('?'.$table_token) && $this->error('参数错误');
$table_data = session($table_token);
$table = $table_data['table'];
$id = input('post.pk', '');
$field = input('post.name', '');
$value = input('post.value', '');
$document = Db::name($table)->where('id', $id)->value($field);
$details = '表名(' . $table . '),字段(' . $field . '),原值(' . $document . '),新值:(' . $value . ')';
return parent::quickEdit(['document_edit', 'cms_document', $id, UID, $details]);
} 查看全部
->setTableName('cms_document_article',true)
->setSearch(['title' => '标题', 'cms_column.name' => '栏目名称']) // 设置搜索框
->addColumns([ // 批量添加数据列
['id', 'ID'],
['title', '标题'],
['column_name', '栏目名称'],
['view', '点击量'],
['username', '发布人'],
['update_time', '更新时间', 'datetime'],
['sort', '排序', 'text.edit'],
['status', '状态', 'switch'],
['right_button', '操作', 'btn']
])
->addTopButtons('add,enable,disable,delete') // 批量添加顶部按钮
->addRightButtons(['edit', 'delete']) // 批量添加右侧按钮
->addOrder(['column_name' => 'cms_document.cid'])
->addOrder('id,title,view,username,update_time')
->addFilter(['column_name' => 'cms_column.name', 'username' => 'admin_user'])
->setRowList($data_list) // 设置表格数据
->fetch(); // 渲染模板提示[size=14]SQLSTATE[42S02]: Base table or view not found: 1146 Table '****.dp_' doesn't exist[/size]
放addcolumn前,放addcolumn后都没用,就一直是dp_。
prefix设置成0,1,2 true false也都没用。删了->settablename,quickedit依然是获取不到表的值。但是buildor的方法里是能获取到值并返回的。补充一下:模块名CMS 控制器名字document,方法是document_list。cms_document_article是我自定义模型的表,想要在文档列表这个控制器里加个该栏目下文档的页面。另外给个建议,我是觉得目前的CMS比较鸡肋,框架发展离不开好的应用支撑啊。尤其是官方都写了cms了,为啥不好好的弄弄呢。只是建议啊,可能说的比较直接,抱歉。
为啥说比较鸡肋呢,最典型的就是我个人感觉啊,这个内容模型的设置很反人类。开放人员肯定知道内容模型是干啥的。可用户大部分人肯定不知道这个是什么东西啊。用户习惯的操作是需要很便捷很易懂的,我都需要进去看看代码才能懂的设置,他们怎么可能会懂啊。有几个地方觉得很理解不能。一是内容模型分是系统模型和独立模型,可在常用操作的文档列表里竟然是独立模型的文章看不到的。不应该是全部文章吗?
二、发布文章需要先选择栏目,一个下拉框,那如果我有100个栏目300个栏目呢?直接劝退。
三、栏目管理每个栏目下加个这个栏目的文章列表的页面啊,大部分CMS都这么做,用户早就这么操作习惯了。
四、栏目管理里也直接加个发布文档啊,同样大部分CMS也是这么做的,用户操作习惯了。
只是建议,可能官方考虑的是引领操作潮流啥的。总之希望dolphinphp越来越好。再更新一下,找到原因了,首先在JS里找到了var $data = {
value: $switch.prop('checked'),
_t: $switch.data('table') || '',
name: $switch.data('field') || '',
type: 'switch',
pk: $switch.data('id') || ''
};发现本身就没提交表的数据。
然后官方本身就在该控制器下写了个quickedit,没继续去查证,但是猜测应该是这个方法覆盖了默认的quickedit方法。该方法下获取不到表的数据,但是该quickedit里有input(table),我最初是以为传递之前出了问题,漏掉了table的值,现在看根本不是了。是压根就没传递这个值。_t: $switch.data('table') 里虽然有个table,但是是一串字符,不知道是什么用意。public function quickEdit($record = )
{
$id = input('post.pk', '');
$field = input('post.name', '');
$value = input('post.value', '');
$table = input('post.table', '');
halt(input());
$document = Db::name($table)->where('id', $id)->value($field);
$details = '表名('.$table.'),字段(' . $field . '),原值(' . $document . '),新值:(' . $value . ')';
return parent::quickEdit(['document_edit', 'cms_document', $id, UID, $details]);
}如果自己写quickedit方法,表格里switch怎么操作其他的表。再继续更新,原来是我用的是老板的cms,新版的这个问题早解决了。
public function quickEdit($record = [])
{
$table_token = input('param._t', '');
$table_token == '' && $this->error('缺少参数');
!session('?'.$table_token) && $this->error('参数错误');
$table_data = session($table_token);
$table = $table_data['table'];
$id = input('post.pk', '');
$field = input('post.name', '');
$value = input('post.value', '');
$document = Db::name($table)->where('id', $id)->value($field);
$details = '表名(' . $table . '),字段(' . $field . '),原值(' . $document . '),新值:(' . $value . ')';
return parent::quickEdit(['document_edit', 'cms_document', $id, UID, $details]);
} 查看全部
return ZBuilder::make('table')
->setTableName('cms_document_article',true)
->setSearch(['title' => '标题', 'cms_column.name' => '栏目名称']) // 设置搜索框
->addColumns([ // 批量添加数据列
['id', 'ID'],
['title', '标题'],
['column_name', '栏目名称'],
['view', '点击量'],
['username', '发布人'],
['update_time', '更新时间', 'datetime'],
['sort', '排序', 'text.edit'],
['status', '状态', 'switch'],
['right_button', '操作', 'btn']
])
->addTopButtons('add,enable,disable,delete') // 批量添加顶部按钮
->addRightButtons(['edit', 'delete']) // 批量添加右侧按钮
->addOrder(['column_name' => 'cms_document.cid'])
->addOrder('id,title,view,username,update_time')
->addFilter(['column_name' => 'cms_column.name', 'username' => 'admin_user'])
->setRowList($data_list) // 设置表格数据
->fetch(); // 渲染模板
提示[size=14]SQLSTATE[42S02]: Base table or view not found: 1146 Table '****.dp_' doesn't exist[/size]
放addcolumn前,放addcolumn后都没用,就一直是dp_。
prefix设置成0,1,2 true false也都没用。删了->settablename,quickedit依然是获取不到表的值。但是buildor的方法里是能获取到值并返回的。
补充一下:模块名CMS 控制器名字document,方法是document_list。cms_document_article是我自定义模型的表,想要在文档列表这个控制器里加个该栏目下文档的页面。另外给个建议,我是觉得目前的CMS比较鸡肋,框架发展离不开好的应用支撑啊。尤其是官方都写了cms了,为啥不好好的弄弄呢。只是建议啊,可能说的比较直接,抱歉。
为啥说比较鸡肋呢,最典型的就是我个人感觉啊,这个内容模型的设置很反人类。开放人员肯定知道内容模型是干啥的。可用户大部分人肯定不知道这个是什么东西啊。用户习惯的操作是需要很便捷很易懂的,我都需要进去看看代码才能懂的设置,他们怎么可能会懂啊。有几个地方觉得很理解不能。
一是内容模型分是系统模型和独立模型,可在常用操作的文档列表里竟然是独立模型的文章看不到的。不应该是全部文章吗?
二、发布文章需要先选择栏目,一个下拉框,那如果我有100个栏目300个栏目呢?直接劝退。
三、栏目管理每个栏目下加个这个栏目的文章列表的页面啊,大部分CMS都这么做,用户早就这么操作习惯了。
四、栏目管理里也直接加个发布文档啊,同样大部分CMS也是这么做的,用户操作习惯了。
只是建议,可能官方考虑的是引领操作潮流啥的。总之希望dolphinphp越来越好。
再更新一下,找到原因了,首先在JS里找到了
var $data = {
value: $switch.prop('checked'),
_t: $switch.data('table') || '',
name: $switch.data('field') || '',
type: 'switch',
pk: $switch.data('id') || ''
};
发现本身就没提交表的数据。
然后官方本身就在该控制器下写了个quickedit,没继续去查证,但是猜测应该是这个方法覆盖了默认的quickedit方法。该方法下获取不到表的数据,但是该quickedit里有input(table),我最初是以为传递之前出了问题,漏掉了table的值,现在看根本不是了。是压根就没传递这个值。
_t: $switch.data('table') 里虽然有个table,但是是一串字符,不知道是什么用意。
public function quickEdit($record = )
{
$id = input('post.pk', '');
$field = input('post.name', '');
$value = input('post.value', '');
$table = input('post.table', '');
halt(input());
$document = Db::name($table)->where('id', $id)->value($field);
$details = '表名('.$table.'),字段(' . $field . '),原值(' . $document . '),新值:(' . $value . ')';
return parent::quickEdit(['document_edit', 'cms_document', $id, UID, $details]);
}
如果自己写quickedit方法,表格里switch怎么操作其他的表。
再继续更新,原来是我用的是老板的cms,新版的这个问题早解决了。
public function quickEdit($record = [])
{
$table_token = input('param._t', '');
$table_token == '' && $this->error('缺少参数');
!session('?'.$table_token) && $this->error('参数错误');
$table_data = session($table_token);
$table = $table_data['table'];
$id = input('post.pk', '');
$field = input('post.name', '');
$value = input('post.value', '');
$document = Db::name($table)->where('id', $id)->value($field);
$details = '表名(' . $table . '),字段(' . $field . '),原值(' . $document . '),新值:(' . $value . ')';
return parent::quickEdit(['document_edit', 'cms_document', $id, UID, $details]);
}
在用cms模板改写自己的功能时,quickedit总是在我的表前面加上cms_前缀,如何解决?
回复提问交流 • telecomer 发起了问题 • 1 人关注 • 0 个回复 • 1570 次浏览 • 2019-10-21 16:35