тортPHP имеет одно отношение, не заполняющее автоматически выпадающее поле - PullRequest
1 голос
/ 23 июня 2011

Я пытаюсь реализовать отношение hasone между двумя моделями, но у меня не может быть автозаполнения формы 'add' с возможными опциями во второй модели (той, которая принадлежит первой ). Это мой код:

- модель 1: item.php

<?php
class Item extends AppModel{ 

    var $name = 'Item';
    var $primaryKey = 'id';
    var $hasOne = 'CoverImage';
    }
?>

- модель 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'
                        )); 
}
?>

- добавить вид модели 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));?>

Для того, что я вижу в документации Cake, с этим отношением в представлении add я должен увидеть выпадающий список в поле item_id , чтобы иметь возможность выбрать, какой элемент выполняет это CoverImage принадлежит, но выпадающий список пуст (и да, у меня уже есть items в таблице предметов).

Может быть, я что-то упустил или я сделал что-то не так, но я не могу понять это. Большое спасибо заранее за любые подсказки!

EDIT

Одна мысль, которую я только что понял, заключается в том, что если я сделаю это:

echo $this->Form->input('item_id', array('type'=>'text'));

вместо этого:

echo $this->Form->input('item_id');

Я могу добавить / отредактировать поле * item_id *, я вижу его значение в текстовом поле. Тем не менее, если я оставляю другой, я просто вижу пустое окно и при попытке добавить / редактировать CoverImage , он не работает, он просто показывает пустую белую страницу, даже с ошибками ...

Может быть, это ведет к чему-то ...

Ответы [ 2 ]

2 голосов
/ 23 июня 2011

Для того, чтобы это работало, вы должны создать список возможных опций в контроллере.Это не происходит автоматически.

public function add() {
    $items = $this->CoverImage->Item->find('list');
    $this->set(compact('items'));
}

FormHelper автоматически делает вывод, что поле item_id должно быть заполнено параметрами переменной $items (множественное число, не _id).

Будьте осторожны, чтобы Предметы, которые уже haveOne CoverImage, не были частью этого списка.find('list', array('conditions' => array('CoverItem.id' => null))) будет , вероятно, * позаботится об этом, но вам придется перепроверить и перед сохранением, или вам нужно переосмыслить свои ассоциации.

* Не уверен, что сверхумоей головы, будет ли это работать для 'list' поисков.

0 голосов
/ 23 июня 2011

ОТЛИЧНЫЙ ВОПРОС. Вы столкнулись с неискренней особенностью ассоциаций Cake:

Учитывая, что вы определили отношение как hasOne ?Гадание на трассировке, но Cake, вероятно, даже правильно предположил ваше предпочтение функциональности списка.Вы получили свой автоматический список ...

... из One.

$ hasOne довольно эксклюзивен.Он «использует» эти «имеет» отношения (это делает отношения де-факто Singleton - таким образом, у пользователей только 1 профиль <-> в профиле только 1 пользователь).Учтите: база данных может иметь много конфигураций, но Dbo будет иметь только одно Соединение за раз, а Соединение будет иметь только одно Dbo.Таким образом -> hasOne предназначен для того, чтобы жениться на двух Моделях, пока они не умрут (), когда они разойдутся.

- Таким образом, он не так часто используется, как hasMany и принадлежит To.ваша цель, вы, вероятно, захотите перейти на другую ассоциацию.

Добавление дополнительного $ this-> Item-> find на самом деле не решает, что не так (и я бы не советовал, если толькоВы в основном покончили с обеими моделями / контроллерами, или вы активно хотите, чтобы все стало странно быстрым.)

Кроме того, измените способ вызова методов Form Helper - если вы возвращаете выборку типа «список» изнаходка, Cake автоматически создаст список опций.То, что происходит на самом деле, заключается в том, что вы крадетесь вокруг своей Модели с очень небольшим запасом функциональности View.Вот почему указание типа ввода «сломать магию», как правило, не рекомендуется (что, если хотите, вы вполне можете. Просто поймите, что на самом деле происходит, или: видите, странно, быстро.)

Но вы можетехотите переосмыслить то, как вы связали свои модели - было бы неправильно сказать, что каждый элемент принадлежит CoverImage (так же, как каждый CoverImage принадлежит элементу) - потому что у вас есть форма, явно разрешающая CoverImage выбиратьЭлемент, любой элемент, который будет отображаться с?Вы, вероятно, получите лучшие результаты.

HTH.:)

...