У нас есть две модели, которые связаны с has и принадлежат многим отношениям (HABTM): Jobs, Tests. Мы можем успешно добавлять/редактировать отношения (мы знаем, потому что они отображаются в таблице соединений), но мы не можем получить существующие значения в представлении. Флажки select/check (мы пробовали оба) всегда пусты.CakePHP: FormHelper, не отображающий значения по умолчанию из связанной модели
Вот модель отношений:
//Job.php
public $hasAndBelongsToMany = array (
'Test' => array (
'classname' => 'Test',
'foreignKey'=>'job_id',
'joinTable' => 'jobs_tests',
'associatedForeignKey' => 'test_id'
)
);
//Test.php
public $hasAndBelongsToMany = array(
'Job' => array(
'className'=> 'Job',
'joinTable'=>'jobs_tests',
'foreignKey' => 'test_id',
'associatedForeignKey'=> 'job_id'
)
);
Здесь вы /view/Jobs/edit.ctp
echo $this->Form->select('Test', $test_options, array('class'=>'form-control', 'multiple'=>'checkbox'));
//This is always empty (nothing selected/checked).
Что мы делаем не так?
Update:
Вот JobsController действие:
public function admin_edit($id=NULL) {
$this->layout = 'admin';
if (!$id)
$this->redirect(array('controller'=>'jobs', 'action'=>'index'));
$this->loadModel('Company');
$companies = $this->Company->find('all');
$company_options = array();
foreach ($companies as $company) {
$company_options[ $company['Company']['id'] ] = $company['Company']['name'];
}
$this->set('company_options', $company_options);
$this->loadModel('Test');
$tests = $this->Test->find('all');
$tests_options = array();
foreach ($tests as $test) {
$test_options[ $test['Test']['id'] ] = $test['Test']['name'];
}
$this->set('test_options', $test_options);
$category_options = $this->Job->validCategories;
$this->set('category_options', $category_options);
if ($this->request->isPut()) {
$data = $this->request->data;
//debug($data);exit;
$save = $this->Job->save($data);
if ($save) {
$this->Session->setFlash('Job edited');
//$job = $this->Job->findById($id);
} else {
$this->Session->setFlash('Error editting job');
}
}
$job = $this->Job->findById($id);
$this->request->data = $job;
$this->set('job', $job);
}
Вот форма в представлении admin_edit.ctp:
<?php echo $this->Form->create('Job'); ?>
<fieldset>
<?php
echo $this->Form->input('id', array('type'=>'hidden'));
echo $this->Form->input('name', array('class'=>'form-control'));
echo $this->Form->input('email', array('class'=>'form-control'));
echo $this->Form->input('location', array('class'=>'form-control'));
echo '<label>Type</label>';
echo $this->Form->select('type', array('FT'=>'Full Time', 'PT'=>'Part Time', 'IN'=>'Internship'), array('empty'=>false, 'class'=>'form-control'));
echo '<label>Company</label>';
echo $this->Form->select('company_id', $company_options, array('class'=>'form-control'));
echo $this->Form->input('short_description', array('label' => 'Short Description', 'class'=>'form-control'));
echo $this->Form->input('full_description', array('type'=>'textarea', 'label' => 'Full Description', 'class'=>'form-control'));
echo $this->Form->input('is_private', array('label'=>'Is Private?', 'class'=>'form-control'));
echo '<label>Category</label>';
echo $this->Form->select('category', $category_options, array('class'=>'form-control'));
echo '<label>Tests</label>';
//echo $this->Form->select('Test.id', $test_options, array('class'=>'form-control', 'multiple'=>true));
$selected = array();
foreach ($job['Test'] as $test) {
$selected[]=$test['id'];
//$selected[ $test['id'] ] = $test['name'];
}
debug($selected);
echo $this->Form->input('Test', array('type'=>'select', 'options'=>$test_options, 'class'=>'form-control', 'multiple'=>'checkbox', 'selected'=>$selected));
?>
</fieldset>
<?php echo $this->Form->end(__('Submit')); ?>
На стороне примечание, это 'associationForeignKey', а не' associatedForeignKey', но нет необходимости определять эти значения при выполнении соглашений, так как CakePHP автоматически выбирает правильные имена. – ndm
Помимо того, что вы делаете свой путь жизни более сложным, чем необходимо, и это всегда будет потерять ваш вход, если форма не может быть сохранена, поскольку вы всегда ее перезаписываете (возможно, это ваша проблема?) Потеря выбора после отправки форма?), я не понимаю, почему это не должно работать, предполагая, что '$ test_data' и' $ selected' содержат ожидаемые данные. При этом было бы полезно посмотреть, что именно они содержат. – ndm
@ndm Пример $ test_data: 'массив ( \t (INT) 0 => '5', \t (целое) 1 => '7' ) '. Данные не теряются после подачи. Значения по умолчанию/текущий все отображаются в порядке. Проблемно только ассоциация HABTM. – emersonthis