复选框

时间:2017-10-23 12:37:59

标签: php cakephp checkbox cakephp-3.0

使用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部分发布解决方案,这意味着我可以使用您的解决方案而不是编辑框架代码。

提前感谢您的任何帮助或建议。 ž

2 个答案:

答案 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;                     
    }
}