0

我正在尝试使用 Lithium 创建一个编辑表单来编辑一些 MongoDB 数据。我的数据(由另一个工具生成)如下所示:

{
  "thing_a" : "value_a",
  "thing_b" : "value_b",
  "settings" : 
  {
    "sub_thing_a" : ["sub_value_a", "sub_value_b"]
  }
}

我遇到的问题是“设置”中的数组“sub_thing_a”。我需要为每个值显示一个文本框,以便我可以编辑它们并将它们保存回来。这里的最终目标是使用一些 jQuery 在表单中添加/删除文本框,然后从数组中添加值 - 但现在我试图获得一个简单的版本,它可以让我编辑值并保存他们离开。

我的模型非常简单:

<?php
namespace app\models;

class Test extends \lithium\data\Model {
    protected $_meta = array('source' => 'test');
}
?> 

和控制器同样:

<?php
namespace app\controllers;

use app\models\Test;

class TestsController extends \lithium\action\Controller {
  public function index() {
    $tests = Test::all();
    return compact('tests');
  }

  public function edit($id=null) {  
    if(isset($id)) {
      $test = Test::find($id);
    } else {
      $test = Test::create();
    }

    if ($this->request->data) {
      if ($test->save($this->request->data)) {
        $this->redirect('/tests/index');
      }
    }

    return compact('test');              
  } 
}
?>

问题从编辑表单开始 - 正如我现在拥有的那样,它将显示我的数组的值,但数据没有正确写入。关于我应该如何处理这个问题的任何线索?(注意:正如我之前提到的,我需要生成一个动态版本,允许我在表单中添加/删除文本框,所以我确实需要能够对助手进行某种控制 -如果有一些非常简单的“约定”方式可以做到这一点。)

编辑.html.php:

<?=$this->form->create($test); ?>
<?=$this->form->field('thing_a'); ?>

<?php foreach ($test->settings->sub_thing_a as $i=>$elem): ?>

<?=$this->form->field('settings.sub_thing_a',array('label'=>'thing', 'value'=>$test->settings->sub_thing_a[$i]));?>

<?php endforeach; ?>

<?=$this->form->submit('save'); ?>
<?=$this->form->end(); ?>

和 index.html.php(为了完整性)

<?php foreach($tests as $test): ?>

<h2><?=$this->html->link($test->thing_a,'/tests/edit/'.$test->_id); ?></h2>

    <?php foreach($test->settings->sub_thing_a as $item): ?>

<h4><?=$item ?></h4>

<?php endforeach; ?>

<?php endforeach; ?>
4

1 回答 1

1

好的,所以最后,它(当然)非常简单。在 edit.html.php 文件中,我们可以简单地写:

<?=$this->form->field('settings[sub_thing_a][]',array('value'=>$test->settings->sub_thing_a[$i]));?>

settings[sub_thing_a][] 创建一个数组,其中包含来自表单的字符串值数组。

于 2012-05-31T14:12:17.197 回答