2012-05-30 85 views
0

我想創建一個使用鋰編輯一些MongoDB數據的編輯表單。我的數據(由其他工具生成的)看起來是這樣的:鋰PHP,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; ?> 

回答

1

好的,所以最終它(當然)很簡單。在edit.html.php文件,我們可以簡單地寫:

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

的設置[sub_thing_a] []創建包含從形式字符串值的數組的數組。