4

情况如下:

我有stages具有以下结构的表

 | id              |  name                                         | editable|
 -----------------------------------------------------------------------------
 | open            | Open                                          |    1    | 
 | paysheet_review | Paysheet Submitted (Awaiting Office Approval) |    0    | 
 | to_pay          | Paysheet Approved (Awaiting Payment)          |    0    | 
 | paid            | Paid                                          |    1    | 
 | purgatory       | Flip or Refund                                |    0    | 
 | closed          | Deal Closed                                   |    1    |
 -----------------------------------------------------------------------------

我正在创建一个多个复选框块

在控制器中

<?php $_stages = $this->Stage->find("list");?>

在视图中

<?php echo $this->Form->input("stage", array("multiple" => "checkbox", "options" => $_stages));?>

创建以下html

<div class="control-group">
 <label class="control-label" for="DealStage">Stage</label>
   <input type="hidden" value="" id="DealStage_" name="data[Deal][stage]">
 <div class="controls">
    <label class="checkbox"><input type="checkbox" id="DealStageOpen" value="open" name="data[Deal][stage][]">Open</label>
    <label class="checkbox"><input type="checkbox" id="DealStagePaysheetReview" value="paysheet_review" name="data[Deal][stage][]">Paysheet Submitted (Awaiting Office Approval)</label>
    <label class="checkbox"><input type="checkbox" id="DealStageToPay" value="to_pay" name="data[Deal][stage][]">Paysheet Approved (Awaiting Payment)</label>
    <label class="checkbox"><input type="checkbox" id="DealStagesPaid" value="paid" name="data[Deal][stage][]">Paid</label>
    <label class="checkbox"><input type="checkbox" id="DealStagePurgatory" value="purgatory" name="data[Deal][stage][]">Flip or Refund</label>
    <label class="checkbox"><input type="checkbox" id="DealStageClosed" value="closed" name="data[Deal][stage][]">Deal Closed</label>
  </div>
</div>

现在我想将editablefrom Database 列作为每个复选框的标题传递。有什么方法可以multiple checkbox在 CakePHP 中创建一个并title为每个输入类型复选框添加一个 as 属性。这样我就可以只使用jQuerycheck OR uncheck编辑的阶段。

4

3 回答 3

3

生成单个复选框

如果它们是在一次调用中生成的,则无法将单个属性赋予复选框,但是很容易实现单独生成每个复选框。为此,请确保将阶段数据传递给视图:

// in Controller action
$stages = $this->Stage->find("all");
$this->set('stages', $stages);

在视图中简单地迭代$stages变量以生成复选框:

// in view file
foreach ($stages as $stage) {
     $id = $stage['Stage']['id'];
     $name = $stage['Stage']['name'];
     $editable  = $stage['Stage']['editable'];

     echo $this->Form->input(
         'Deal.stage.' . $id,
         ['value' => $id, 'label' => $name, 'type' => 'checkbox', 'data-editable' => $editable]
     );
}

我不太明白你想用这个可编辑属性做什么——但要从 js 访问它,它会是:

// in js file
$('input[type=checkbox]'].each(function() {
    var editable = $(this).data('editable');

    ...
});
于 2013-07-20T21:35:38.793 回答
1

您想要的这种解决方案目前在 CakePHP中不存在。但是您可以创建一个新的表单助手,我的意思是助手中的自定义方法来覆盖此方法并在助手方法中创建一个新属性,例如:

<?php echo $this->MyForm->input("stage", array("multiple" => "checkbox", "options" => $_stages, 'editable' => $editables));?>

您可以使用另一个获得可编辑选项find('list', array('fields' => array('id', 'editable') ));

于 2014-02-12T05:44:16.837 回答
1

不幸的是,我找不到一种方法来添加$options你想要的属性。我通常做的只是“手工”完成那部分,忘记FormHelper并编写旧的html。

如果这不是您的选择,并且您想继续使用 Formhelper,那么我可以建议一种 js 方法。

首先,您需要更改find('list')for afind('all')以获取可编辑属性。

<?php $_stages = $this->Stage->find("all");?>

并将其传递给视图。现在,在视图中,您需要修改数组,使其看起来像旧的

<?php 
   $stageHelper = array();
   foreach($_stages as $stage)
      $stageHelper[$stage['Stage']['id']] = $stage['Stage']['name'];
   echo $this->Form->input("stage", array("multiple" => "checkbox", "options" => stageHelper));
?>

到目前为止,您拥有与现在相同的东西。这就是 js 的用武之地。在视图中,最好在底部添加类似

<script type="text/javascript">
    $(function() {
        var stages = <?=json_encode($_stages);?>;

        $('name="data[Deal][stage][]"').each(function() {
            var currentElement = $(this);
            var value = currentElement.val();

            //compare value of checkbox with json variable
            for(var i in stages)
               if(stages[i].Stage.value == value) {
                  //add title attribute to the element if we have a match
                  currentElement.attr('title', stages[i].Stage.editable);
               }
        });
    });
</script>

沿着这条线应该做的事情。

就我个人而言,我发现仅使用 html 来做这件事并不复杂。但是,如果您需要,还有另一种方法可以做到这一点。

于 2013-07-19T16:30:20.927 回答