I’m trying to implement a hasone relationship between 2 models, but I can’t have the ‘add’ form autocomplete with the possible options in the second model (the one that belongsTo the first one). This is my code:
– model 1: item.php
<?php
class Item extends AppModel{
var $name = 'Item';
var $primaryKey = 'id';
var $hasOne = 'CoverImage';
}
?>
– model 2: cover_image.php
<?php
class CoverImage extends AppModel{
var $name = 'CoverImage';
var $primaryKey = 'id';
var $belongsTo = array(
'Item' => array(
'className' => 'Item',
'foreignKey' => 'item_id'
));
}
?>
– add view of model 2: add.ctp
<?php echo $this->Form->create('CoverImage',array('url' => array('controller' => 'admins', 'action' => 'add')));?>
<fieldset>
<legend><?php __('Info'); ?></legend>
<?php
echo $this->Form->input('item_id');
echo $this->Form->input('description');
?>
</fieldset>
<?php echo $this->Form->end(__('Create', true));?>
For what I see in Cake’s documentation, with this relationship, in the add view I should see a dropdown list in the item_id field to be able to select to which item does this CoverImage belongs to, but the dropdown is empty (and yes, I have some items in the items table already).
Maybe I’m missing something or I’ve done something wrong, but I can’t figure it out. Thanks so much in advance for any clues!
EDIT
One think I’ve just realized is that if I do this:
echo $this->Form->input('item_id', array('type'=>'text'));
instead of this:
echo $this->Form->input('item_id');
I can add/edit the *item_id* field, I can see its value in the text box. However, if I leave the other one, I just see an empty dropbox and when I try to add/edit a CoverImage, it doesn’t work, it just shows an empty white page, not even with errors…
Maybe this is a lead to something…
In order for that to work you have to create a list of possible options in the controller. That does not happen automatically.
The FormHelper only automatically infers that the field
item_idshould be populated by the options in the variable$items(plural, no_id).Do be careful that Items that already haveOne CoverImage should not be part of that list.
find('list', array('conditions' => array('CoverItem.id' => null)))will probably* take care of that, but you’ll need to recheck just before saving as well, or you need to rethink your associations.* Not sure off the top of my head whether that’ll work for
'list'searches.