【问题标题】:Array to string conversion error in checkbox复选框中的数组到字符串转换错误
【发布时间】: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-&gt;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


【解决方案1】:

尝试将 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;                     
    }
} 

【讨论】:

  • 嗨 Derek,这确实有效,无需更改 CheckboxWidget.php 框架代码,我认为这是一个更简洁的解决方案,但所有复选框的切换都不起作用。我已经在我的原始帖子中解释了这一点。如果您或任何人可以在这方面提供帮助,那就太好了,我可以采用您的解决方案。
  • 嗨,德里克,我尝试了您的编辑,但不幸的是,多个复选框选择仍然不起作用。我已经在我的第一篇文章中包含了我正在使用的 js,希望能有所帮助,但即使你建议在 stsckoverflow javascript 部分中发布此问题,我也很乐意这样做。非常感谢。 Z.
  • 为他们设置一个类并为javascript设置一个getElemenstByClass
  • 嗨 Derek,我注意到你的编辑有一个复选框的 id,所以我将我的 js 更改为: checkboxes = document.getElementById('checkbox[]');但我仍然无法让它工作。
  • 嗨 Derek,我将视图中的复选框更改为:= $this->Form->checkbox('checkboxes.' . $k, ['value' => $user->id , 'class' => 'cb' . $k]); ?> 和 js 到: checkboxes = document.getElementByClass('cb');但不幸的是仍然无法正常工作。
【解决方案2】:

它在错误的顶部提供了一个非常明确的答案:

[C:\xampp\htdocs\app\vendor 中的数组到字符串的转换 \cakephp\cakephp\src\View\Widget\CheckboxWidget.php,第 81 行

只需在您的CheckboxWidget 中找到第 81 行,然后修复指定的问题。

如果您不确定如何,只需搜索“php 数组到字符串转换错误”即可提供许多结果,one of which 非常具体地描述了您的问题,涉及名为 checkboxes[] 的输入。

【讨论】:

  • 嗨,戴夫,感谢您的帮助。我从没想过我会不得不在框架中编辑一些东西,但我们生活和学习。我编辑了第 81 行: return (string)$data['val'] === (string)$data['value'];我已编辑为: return $data['val'] === $data['value'];我的错误被消除了。
  • @Zenzs,您可能不应该编辑框架。您应该查看第 81 行,找出导致问题的原因,然后修改您的代码以使其按照框架的预期工作。
  • 嗨戴夫,明白了,我生活和学习更多。如果我诚实地查看 Derek 提供的包含 js 复选框修复的答案,我知道即使查看 CheckboxWidget.php 代码,我也永远无法解决这个问题。我希望你能理解我将不得不勾选 Dereks 作为答案。无论如何感谢您的帮助,至少我学到了更多。 Z.
  • 没问题。检查任何您认为最好的答案!乍一看,我认为您通过重复每个选项来创建复选框会使其变得更加困难。在线 CakePHP 书籍应该向您展示如何自动执行此操作。但很高兴听到您有一个可行的解决方案。
  • 嗨,戴夫,感谢您的提醒,但不幸的是,由于我必须继续努力,所以我不得不再努力学习这一点。
猜你喜欢
  • 2012-04-25
  • 2015-02-26
  • 2012-07-15
  • 2017-12-02
  • 1970-01-01
  • 2014-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多