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');              
  } 
}
?>

問題は編集フォームから始まります。現在のように、配列の値が表示されますが、データが正しく書き込まれません。これにどのようにアプローチすべきかについての手がかりはありますか? (注: 前に述べたように、フォームにテキスト ボックスを追加/フォームから削除できる動的バージョンを作成する必要があるため、ヘルパーを何らかの形で制御できるようにする必要があります。これを行うための本当に簡単な「慣例」の方法がある場合に備えて.)

edit.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 に答える