CakePHP Автозаполнение Вопрос - PullRequest
       1

CakePHP Автозаполнение Вопрос

1 голос
/ 13 сентября 2010

Я работаю над приложением рецензирования книг и использую автозаполнение для поиска названий при создании рецензии.Модель рецензирования имеет связанное поле book_id, и связь устанавливается, поскольку рецензия имеет одну книгу, а книга имеет много рецензий.

Я пытаюсь передать Book.id (в поле book_id), но хочуотобразить Book.name для выбора пользователем.При настройке по умолчанию (выполненной с помощью учебника CakePHP) я могу передать только Book.name.Можно ли отобразить имя и передать идентификатор?

Кроме того, я передаю его через следующий код в действии create () контроллера обзора:

$this->data['Review']['book_id'] = $this->data['Book']['id'];

Этоправильный способ сделать это в CakePHP?Я знаю, что в Ruby on Rails это происходит автоматически, но я не могу заставить его работать автоматически в CakePHP.Наконец, я не использую генератор, потому что он недоступен в моей среде общего хостинга ... поэтому, если это неправильный путь, что мне нужно, кроме партнеров в моих моделях, чтобы это произошло автоматически?

Спасибо за помощь, и я обещаю, что это мой вопрос на некоторое время ...

ОБНОВЛЕНИЕ - Я попробовал следующее, но это не работает.Есть идеи, почему?

    function autoComplete() {
    $this->set('books', $this->Book->find('all', array(
        'conditions' => array(
            'Book.name LIKE' => $this->data['Book']['name'].'%'
        ),
        'fields' => array('id','name')
    )));
    $this->layout = 'ajax';
}

Проблема в том, что, когда я использую код выше в контроллере, форма отправляет, но не сохраняет запись ... Не выдается никаких ошибок, чтостранно.

ОБНОВЛЕНИЕ2:

Я определил, что причина, по которой это не работает, заключается в том, что типы массивов разные, и вы не можете изменить тип массива с помощью помощника autoComplete.В качестве обходного пути я попытался выполнить следующее, но оно не работает.Кто-нибудь может предложить руководство почему?

function create() {
    if($this->Review->create($this->data) && $this->Review->validates()) {
        $this->data['Review']['user_id'] = $this->Session->read('Auth.User.id');
        $this->Book->find('first', array('fields' => array('Book.id'), 'conditions' => array('Book.name' => $this->data['Book']['name'])));
        $this->data['Review']['book_id'] = $this->Book->id;
        $this->Review->save($this->data);
        $this->redirect(array('action' => 'index'));
    } else {
        $errors = $this->Review->invalidFields();
    }
}

FINAL UPDATE:

Хорошо, я обнаружил, что помощник принимает только тип или массив find (all) и что поле "id" былоt, потому что он применяется только к генерируемому списку LI автозаполнения.Таким образом, я использовал поле visibleField для получения информации, а затем выполнил поиск в базе данных и попытался создать скрытое поле на лету с идентификатором, но это не сработало.В конце концов ,ааааааааааааааа я, чтобы в поле «Наблюдение» были введены только те символы, которые я вставил, а не те, на которые я нажал, из-за очевидного ограничения Писанием.Итак, я закончил тем, что сейчас выбрал выпадающее окно и, возможно, в конечном итоге займусь чем-то другим.В любом случае, спасибо за помощь!

1 Ответ

0 голосов
/ 13 сентября 2010

Прежде всего, $this->data будет содержать только ['Book']['id'], если поле существует в форме (даже если оно скрыто).

Чтобы выбрать что-либо с помощью name и вернуть id,используйте вариант списка метода find, а именно:

    $selectList = $this->Book->find('list', array(
                                               'fields' => array(
                                                              'id', 
                                                              'name'
                                            )));
    $this->set('selectList', $selectList);

Теперь в представлении вы можете использовать $selectList для параметров в элементе select:

    echo $form->input('Book.id', array('type' => 'hidden'));
    echo $form->input('template_id', array(
                                        'options' => $selectList,
                                        'type' => 'select'
                                     ));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...