Lithium PHP, MongoDB и помощники форм для массивов

Я пытаюсь создать форму редактирования с помощью 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; ?>

person Chris Bartlett    schedule 30.05.2012    source источник


Ответы (1)


Итак, в конце концов, это было (конечно) довольно просто. в файле edit.html.php мы можем просто написать:

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

Настройки[sub_thing_a][] создают массив, содержащий массив строковых значений из формы.

person Chris Bartlett    schedule 31.05.2012