Не удается заставить formhelper предварительно заполнить несколько записей

У меня есть модель под названием «Категория», которая имеет много расходов. Я пытаюсь создать интерфейс типа аккордеона, в котором пользователь может расширить категорию и отредактировать расходы. Я могу сгенерировать поля ввода, но они, похоже, не находятся в режиме «редактирования», потому что они не заполнены заранее.

Я искал в Интернете и нашел несколько связанных статей, таких как эта CakePHP: Как обновить несколько записей одновременно с помощью помощника формы, а также этот CakePHP: Помощник формы с saveMany() для одновременного редактирования нескольких строк. Я пытался подражать их коду, но безуспешно.

Моя функция индекса CategoriesController выглядит так...

public function index($project_id) {

    $data = $this->Category->find('all', array(
        'conditions'=>array('Category.project_id' => $project_id),
        'order'=>array('Category.category_name')
    ));
    $this->set('categories', $data);
    $this->request->data = $data;
}

Я читал, что cakephp2 требует установки $this->request->data для работы FormHelper. Но в примерах, которые я нашел в Интернете, кажется, что все используют название модели во множественном числе, поэтому я попробовал и это.

Мои категории\index.ctp выглядят так. Я еще не на стадии "аккордеона". Я просто пытаюсь получить поля ввода на экране, которые предварительно заполнены.

$i=0;
foreach ($categories as $category)
{
    echo $this->Form->input("Category.$i.category_id");
    echo $this->Form->input("Category.$i.category_name");
    $j=0;
    foreach($category['Expense'] as $expense)
    {
        echo $this->Form->input('Expense.' . $j . '.expense_id');
        echo $this->Form->input('Expense.' . $j . '.expense_name');
        echo $this->Form->input('Expense.' . $j . '.dollar_amount');
        echo $this->Form->input('Expense.' . $j . '.sqft_amount');
        $j++;
    }
    $i++;
}

Этот код, кажется, работает правильно, потому что он выдает правильные поля ввода. Большой проблемой сейчас является просто предварительное заполнение полей. Похоже, он не находится в режиме «редактирования», и я беспокоюсь, что это может стать проблемой в будущем, когда я попытаюсь сохранить данные.

Кроме того, я пробовал это с $this->form->create('Category') вверху и без него. Кажется, это не имеет значения.

Массив $categories выглядит так...

array(
    (int) 0 => array(
        'Category' => array(
            'category_id' => '1',
            'category_name' => 'Category 1',
            'category_index' => '1',
            'project_id' => '1'
        ),
        'Project' => array(
            'project_id' => '1',
            'project_name' => '131 Anndale Dr',
            'project_sqft' => '1700',
            'project_cost' => '318',
            'project_cost_per_sqft' => '0'
        ),
        'Expense' => array(
            (int) 0 => array(
                'expense_id' => '2',
                'expense_name' => 'Nails',
                'category_id' => '1',
                'dollar_amount' => '50',
                'sqft_amount' => '1',
                'expense_index' => '2'
            ),
            (int) 1 => array(
                'expense_id' => '1',
                'expense_name' => 'Wood',
                'category_id' => '1',
                'dollar_amount' => '99',
                'sqft_amount' => '1',
                'expense_index' => '1'
            )
        )
    ),
    (int) 1 => array(
        'Category' => array(
            'category_id' => '3',
            'category_name' => 'Category 2',
            'category_index' => '2',
            'project_id' => '1'
        ),
        'Project' => array(
            'project_id' => '1',
            'project_name' => '131 Anndale Dr',
            'project_sqft' => '1700',
            'project_cost' => '318',
            'project_cost_per_sqft' => '0'
        ),
        'Expense' => array(
            (int) 0 => array(
                'expense_id' => '3',
                'expense_name' => 'Bed',
                'category_id' => '3',
                'dollar_amount' => '99',
                'sqft_amount' => '2',
                'expense_index' => '1'
            ),
            (int) 1 => array(
                'expense_id' => '4',
                'expense_name' => 'Chair',
                'category_id' => '3',
                'dollar_amount' => '70',
                'sqft_amount' => '1',
                'expense_index' => '2'
            )
        )
    )
)

Любая помощь будет принята с благодарностью. Спасибо!!


person user2887380    schedule 24.10.2013    source источник


Ответы (1)


По стечению обстоятельств, сегодня я делал почти то же самое.

Для автоматического заполнения формы вам необходимо иметь данные в $this->data в представлении. Вы можете сделать это, назначив $this->request->data в вашем контроллере.

Затем вам нужно, чтобы ваши имена полей точно отражали структуру этого массива. Итак, используя ваш пример, у вас может быть:

echo $this->Form->input("$i.Category.category_name");

для полей категорий и

echo $this->Form->input("$i.Expense.$j.expense_id");

для ваших полей расходов.

person eaj    schedule 24.10.2013