使用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%确定这是否是执行此操作的最佳或正确方法,但除了每次调用{{1}时用户索引视图中的复选框上发生的以下错误外,它都能正常工作来自日志的堆栈跟踪如下:
注意(8):[C:\ xampp \ htdocs \ app \ vendor中的数组到字符串转换 \ cakephp \ cakephp \ src \ View \ Widget \ CheckboxWidget.php,第81行]请求 URL:/ users / actions Referer URL:https://localhost/app/users Trace: Cake \ Error \ BaseErrorHandler :: handleError() - CORE \ src \ Error \ BaseErrorHandler.php,第153行 Cake \ View \ Widget \ CheckboxWidget :: _ isChecked() - 第81行,CORE \ src \ View \ Widget \ CheckboxWidget.php 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() - CORE \ 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 \供应商\ CakePHP的\ debug_kit的\ src \中间件\ DebugKitMiddleware.php, 第52行Cake \ Http \ Runner :: __ invoke() - CORE \ src \ Http \ Runner.php,line 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行
//解决方案
如果我将复选框声明如下,我已设法消除此错误:
$this->setAction('index');
//我的问题
但这意味着我要用用户ID替换数组中的键,我不知道这是否被认为是好的,或者是否有更好的更专业的方法。
非常感谢任何帮助。 ž。
@SamHecquet - 感谢您的编辑,我将在下次知道如何格式化堆栈跟踪。
@Derek - 根据要求见下文 - 我不会将整个页面包含在内,因为我认为这是不必要的,但如果你想要的比我发布的更多,请告诉我。
//从元素
中选择列表// FROM
<?= $this->Form->checkbox("checkboxes[]", ['value' => $user->id]); ?>
// TO
<?= $this->Form->checkbox("checkboxes[$user->id]", ['value' => user->id]); ?>
// INDEX USERS
<!-- 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'
]);
?>
@Derek - 请参阅多重复选框问题。
当我使用Dave的解决方案时,多个复选框选择适用于页面加载,但在我调用以下内容后没有:
<!-- 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() ?>
我通过重定向而不是使用setAction来修复此问题,如下所示:
// Send to index action for page load
$this->setAction('index');
但是使用您的解决方案时,多个复选框选择功能在页面加载或任何重定向后都不起作用。我使用以下代码来实现此目的。
// Redirect to index page
return $this->redirect(['action' => 'index']);
如果您对javascript很有帮助,但如果您没有建议可以找到解决方案,我很高兴在stackoverflow javascript部分发布解决方案,这意味着我可以使用您的解决方案而不是编辑框架代码。
提前感谢您的任何帮助或建议。 ž
答案 0 :(得分:0)
它在错误的顶部提供了一个非常明确的答案:
[C:\ xampp \ htdocs \ app \ vendor中的数组到字符串转换 \ cakephp \ cakephp \ src \ View \ Widget \ CheckboxWidget.php,第81行
只需找到CheckboxWidget
中的第81行,然后修复指定的问题。
如果你不确定如何,只是搜索&#34; php数组到字符串转换错误&#34;,提供了很多结果,one of which非常具体地描述了你的问题,关于名为{{1}的输入}。
答案 1 :(得分:0)
尝试将foreach更改为:
<?php foreach ($users as $k => $user): ?>
<div class="grid-ix-1">
<!-- Checkbox -->
<div class="ix-usr-checkbox">
<div class="ix-c-cb">
<?= $this->Form->checkbox('checkboxes.' . $k, ['value' => $user->id, 'id' => 'checkbox' . $k, 'class' => 'userCheckbox']); ?>
</div>
</div>
<!-- Role -->
<div class="ix-usr-role">
<div class="ix-usr-role-text"><?= h($user->role) ?></div>
</div>
</div>
<?php endforeach; ?>
Javascript功能
function toggle(source) {
checkboxes = document.getElementsByClassName('userCheckbox');
for(var i=0, n=checkboxes.length;i<n;i++) {
checkboxes[i].checked = source.checked;
}
}