【发布时间】:2018-04-04 00:23:49
【问题描述】:
使用 CakePHP 3.5.3
嗨,
// 我有什么
我有一个显示数据库中所有相关用户的用户索引视图。在页面顶部,我有一个选择列表,允许用户选择停用选项,并且在每个用户行上我都有一个复选框。
// 我要做什么
用户可以选中他们想要的复选框,然后从选择列表中选择停用选项并单击提交。提交发送脚本 到我的用户控制器中的操作方法。在操作方法中,我检查是否选择了停用选项,如果没有,我发送一个 将消息返回给用户以达到该效果。在此之后,我检查是否已选中一个复选框,如果没有,我将向用户发送回消息以达到该效果。 如果至少选中了一个复选框并且选择了停用选项,那么我会确定哪些复选框已被选中并 更新数据库以停用那些选择的用户。
// 在用户索引视图中我声明我的复选框如下
<?= $this->Form->checkbox("checkboxes[]", ['value' => $user->id]); ?>
// 动作方法
public function actions()
{
if (empty($this->request->getData('action'))) {
$this->Flash->sys_error('', [
'key' => 'message',
'params' => [
'p1' => __('Please select an action!')
]
]);
// Send to index action for page load
$this->setAction('index');
}
else {
$checkboxArray = $this->request->getData('checkboxes');
foreach($checkboxArray as $key => $val):
echo 'key is ' . $key . "<br />";
echo 'val is ' . $val . "<br />";
if (empty($val)) {
unset($checkboxArray[$key]);
}
endforeach;
if (empty($checkboxArray)) {
$this->Flash->sys_error('', [
'key' => 'message',
'params' => [
'p1' => __('Please select a user!')
]
]);
// Send to index action for page load
$this->setAction('index');
}
else {
foreach($this->request->getData('checkboxes') as $userID):
if ($userID != 0) {
// UPDATE THE DATABSE
echo 'in update the database ' . '<hr />';
}
endforeach;
// Send to index action for page load
$this->setAction('index');
}
}
}
尽管我不能 100% 确定这是否是最好或正确的方法,但它确实有效,但每次调用 $this->setAction('index'); 时,用户索引视图中的复选框上都会出现以下错误。日志如下:
注意(8):[C:\xampp\htdocs\app\vendor 中的数组到字符串的转换 \cakephp\cakephp\src\View\Widget\CheckboxWidget.php,第 81 行] 请求 URL:/users/actions 引用 URL:https://localhost/app/users 跟踪: Cake\Error\BaseErrorHandler::handleError() - CORE\src\Error\BaseErrorHandler.php,第 153 行 Cake\View\Widget\CheckboxWidget::_isChecked() - CORE\src\View\Widget\CheckboxWidget.php,第 81 行 Cake\View\Widget\CheckboxWidget::render() - CORE\src\View\Widget\CheckboxWidget.php,第 51 行 Cake\View\Helper\FormHelper::widget() - CORE\src\View\Helper\FormHelper.php,第 2775 行 Cake\View\Helper\FormHelper::checkbox() - CORE\src\View\Helper\FormHelper.php,第 1570 行包括 - APP/Template\Users\index.ctp,第 193 行 Cake\View\View::_evaluate() - CORE\src\View\View.php,第 1196 行 Cake\View\View::_render() - CORE\src\View\View.php,第 1157 行 Cake\View\View::render() - CORE\src\View\View.php,第 765 行 Cake\Controller\Controller::render() - CORE\src\Controller\Controller.php,第 623 行 Cake\Http\ActionDispatcher::_invoke() - 核心\src\Http\ActionDispatcher.php,第 125 行 Cake\Http\ActionDispatcher::dispatch() - CORE\src\Http\ActionDispatcher.php,第 93 行 Cake\Http\BaseApplication::__invoke() - CORE\src\Http\BaseApplication.php,第 103 行 Cake\Http\Runner::__invoke() - CORE\src\Http\Runner.php,第 65 行 Cake\Http\Middleware\CsrfProtectionMiddleware::__invoke() - CORE\src\Http\Middleware\CsrfProtectionMiddleware.php,第 106 行 Cake\Http\Runner::__invoke() - CORE\src\Http\Runner.php,第 65 行 Cake\I18n\Middleware\LocaleSelectorMiddleware::__invoke() - CORE\src\I18n\Middleware\LocaleSelectorMiddleware.php,第 62 行 Cake\Http\Runner::__invoke() - CORE\src\Http\Runner.php,第 65 行 Cake\Routing\Middleware\RoutingMiddleware::__invoke() - CORE\src\Routing\Middleware\RoutingMiddleware.php,第 107 行 Cake\Http\Runner::__invoke() - CORE\src\Http\Runner.php,第 65 行 Cake\Routing\Middleware\AssetMiddleware::__invoke() - CORE\src\Routing\Middleware\AssetMiddleware.php,第 88 行 Cake\Http\Runner::__invoke() - CORE\src\Http\Runner.php,第 65 行 Cake\Error\Middleware\ErrorHandlerMiddleware::__invoke() - CORE\src\Error\Middleware\ErrorHandlerMiddleware.php,第 95 行 Cake\Http\Runner::__invoke() - CORE\src\Http\Runner.php,第 65 行 DebugKit\Middleware\DebugKitMiddleware::__invoke() - ROOT\vendor\cakephp\debug_kit\src\Middleware\DebugKitMiddleware.php, 第 52 行 Cake\Http\Runner::__invoke() - CORE\src\Http\Runner.php,行 65 Cake\Http\Runner::run() - CORE\src\Http\Runner.php,第 51 行 Cake\Http\Server::run() - CORE\src\Http\Server.php,第 81 行 [main] - ROOT\webroot\index.php,第 40 行
// 解决方案
如果我如下声明我的复选框,我已设法消除此错误:
// FROM
<?= $this->Form->checkbox("checkboxes[]", ['value' => $user->id]); ?>
// TO
<?= $this->Form->checkbox("checkboxes[$user->id]", ['value' => user->id]); ?>
// 我的问题
但这意味着我正在用用户 ID 替换数组中的键,我不知道这是否被认为是可以的,或者是否有更好更专业的方法。
任何帮助将不胜感激。 Z.
@SamHecquet - 感谢您的编辑,下次我会知道如何格式化堆栈跟踪。
@Derek - 根据要求,请参见下文 - 我不会包含整个页面,因为我认为其中很多内容是不必要的,但如果您想要的比我发布的更多,请告诉我。
// 从元素中选择列表
<!-- Start form -->
<?php
// Declare individual page forms
if ($page === 'usersPage') {
// Users form
echo $this->Form->create(null, [
'url' => ['controller' => 'Users', 'action' => 'actions'],
'novalidate' => true
]);
}
<?php
// Declare individual page select lists
if ($page === 'usersPage') {
// Users form
$options = [
'' => '--Select Action--',
'a' => 'Deactivate User/s'
];
}
else{
header ("Location: ".$this->Url->build(["controller" => "Pages", "action" => "display", 'blank']));
exit(0);
}
$this->Form->label('action', '');
echo $this->Form->input('action', [
'type' => 'select',
'options' => $options,
'class' => 'ns-typ-2 ix-fa',
'label' => false
]);
?>
<?= $this->Form->submit(__('Go'), [
'class' => 'submit-ix-go'
]);
?>
// 索引用户
<!-- Headings -->
<div class="grid-ix-1 ix-r-top">
<!-- Checkbox -->
<div class="ix-usr-checkbox">
<div class="ix-h">
<div class="ix-h-cb">
<input type="checkbox" onClick="toggle(this)" >
</div>
</div>
</div>
<!-- Role -->
<div class="ix-usr-role">
<div class="ix-h">
<h2 class="ix-h2"><?= $this->Paginator->sort('Users.role', __('Role')) ?></h2>
</div>
</div>
</div>
<!-- Cells-->
foreach ($users as $user): ?>
<div class="grid-ix-1">
<!-- Checkbox -->
<div class="ix-usr-checkbox">
<div class="ix-c-cb">
<?= $this->Form->checkbox('checkboxes[]', ['value' => $user->id]); ?>
</div>
</div>
<!-- Role -->
<div class="ix-usr-role">
<div class="ix-usr-role-text"><?= h($user->role) ?></div>
</div>
</div>
<?php endforeach; ?>
<!-- Form ends -->
<?= $this->Form->end() ?>
@Derek - 请查看多个复选框问题。
当我使用 Dave 的解决方案时,多个复选框选择在页面加载时有效,但在我调用以下内容后无效:
// Send to index action for page load
$this->setAction('index');
我通过重定向而不是使用 setAction 来解决此问题,如下所示:
// Redirect to index page
return $this->redirect(['action' => 'index']);
但是在您的解决方案中,多个复选框选择功能在页面加载或任何重定向之后都不起作用。我使用以下代码来实现这一点。
// Javascript
// Check and uncheck all check boxes on index pages
function toggle(source) {
checkboxes = document.getElementsByName('checkboxes[]');
for(var i=0, n=checkboxes.length;i<n;i++) {
checkboxes[i].checked = source.checked;
}
}
// And then the heading checkbox is:
<input type="checkbox" onClick="toggle(this)" >
// And of course the cells checkbox
<?= $this->Form->checkbox('checkboxes.' . $k, ['value' => $user->id]); ?>
如果您对 javascript 有帮助,但如果您建议可以找到解决方案,我很乐意在 stackoverflow javascript 部分发布解决方案,这意味着我可以使用您的解决方案而不是编辑框架代码。
提前感谢您的任何帮助或建议。 Z
【问题讨论】:
-
发布索引页面或您生成复选框的任何页面
标签: php cakephp checkbox cakephp-3.0