简体   繁体   中英

Lithium PHP, MongoDB and form helpers for arrays

I'm trying to create an edit form using Lithium to edit some MongoDB data. My data (produced by another tool) looks like this:

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

The problem I'm having is with the array 'sub_thing_a' in 'settings'. I need to display a text box for each value so I can edit them and save them back. The ultimate aim here is to use some jQuery to add/delete text boxes to/from the form and then values from the array - but for now I'm trying to just get a simple version working that will let me edit the values and save them away.

My model is really simple:

<?php
namespace app\models;

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

and the controller likewise:

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

Problems start with the edit form - As I have it now, it will display the values of my array, but the data does not get written correctly. Any clues as to how I should approach this? (Note: As I mentioned earlier, I will need to produce a dynamic version of this that allows me to add/delete text boxes to/from the form, so I do need to be able to take some sort of control of the helper - in case there is some really easy 'convention' way of doing this.)

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(); ?>

and index.html.php (for completeness)

<?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; ?>

Ok, so in the end, it was (of course) quite simple. in the edit.html.php file we can simply write:

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

The settings[sub_thing_a][] creates the array containing an array of the string values from the form.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM