CakePHP обновляет несколько полей формы при изменении поля выбора

Я использую CakePHP 2.2. Я адаптирую метод динамического обновления поля выбора, которое я получил из: http://www.willis-owen.co.uk/2011/11/dynamic-select-box-with-cakephp-2-0/#comment-10773 который работает без проблем. Он обновляет содержимое поля выбора «отели», когда пользователи выбирают «регион» из другого поля выбора.

В той же форме я хочу автоматически заполнять несколько полей «команда» адресными данными из модели «гостиницы», когда пользователь выбирает «гостиницу» в поле выбора.

Затем пользователь может изменить адрес ... все это до того, как пользователь нажмет «Отправить» в представлении добавления «команды».

В представлении Team\add.ctp у меня есть следующий код:

    echo "<div id='address'>";
    echo $this->Form->input('address_1');
    echo $this->Form->input('address_2');
    echo $this->Form->input('address_3');
    echo $this->Form->input('city');
    echo $this->Form->input('postcode');
    echo $this->Form->input('country');
    echo "</div>";

...

    $this->Js->get('#TeamHotelId')->event('change',
        $this->Js->request(array(
            'controller'=>'hotels',
            'action'=>'getAddress'
            ), array(
            'update'=> '#address',
            'async' => true,
            'method' => 'post',
            'dataExpression' => true,
            'data'=> $this->Js->serializeForm(array(
                'isForm' => true,
                'inline' => true))
                        )
        )
    );

В моем HotelsController.php у меня есть:

public function getAddress() {
    $hotel_id = $this->request->data['Team']['hotel_id'];
    CakeLog::write('debug', print_r($hotel_id, true));
    $address = $this->Hotel->find('first', array(
            'recursive' => -1,
            'fields' => array('hotel.address_1', 'hotel.address_2', 'hotel.address_3', 'hotel.city', 'hotel.postcode', 'hotel.country'),
            'conditions' => array('Hotel.id' => $hotel_id)
            ));
    CakeLog::write('debug', print_r($address, true));
    $this->set('hotels', $address);
    $this->set(compact('address'));
    $this->layout = 'ajax';
}   

отели\get_address.ctp:

    <?php 
        echo $this->Form->input('Team.address_1', array('value'=> $address['Hotel']['address_1']));
        echo $this->Form->input('Team.address_2', array('value'=> $address['Hotel']['address_2']));
        echo $this->Form->input('Team.address_3', array('value'=> $address['Hotel']['address_3']));
        echo $this->Form->input('Team.city', array('value'=> $address['Hotel']['city']));
        echo $this->Form->input('Team.postcode', array('value'=> $address['Hotel']['postcode']));
        echo $this->Form->input('Team.country', array('value'=> $address['Hotel']['country'])); ?>

Теперь это работает, и код был обновлен.


person Community    schedule 17.01.2013    source источник


Ответы (1)


Вы не можете сделать таким образом, как вы пытаетесь достичь. Однако есть способ, с помощью которого вы можете обновлять по своему усмотрению, передавая идентификатор из раскрывающегося списка с помощью ajax и заполняя все остальные поля на основе этого идентификатора. Пожалуйста, убедитесь, что в 'update'=>#id вы должны поместить идентификатор div div, содержащего все поля, которые вы хотите показать на странице, где вы хотите, чтобы ваше содержимое отображалось по запросу ajax.

Примечание. Пожалуйста, перейдите по ссылке Ричарда, которую вы дали, например www.willis-owen.co.uk, это определенно поможет вам в том, что вы пытаетесь сделать.

person Amit Kumar    schedule 18.01.2013
comment
Я приближаюсь. Я изменил свой getAddress(), чтобы он возвращал только 6 необходимых мне полей. В моем add.ctp я поместил ‹div id=address›‹/div› вокруг 6 полей. Я изменил 'update'=›'#address'. Теперь, когда я выбираю отель, 6 полей исчезают. - person mpe; 18.01.2013
comment
Ok. Это означает, что ajax работает, и вы просто рядом. Пожалуйста, убедитесь, что ваше действие getAddress() должно выводить результат, для которого оно используется. Также убедитесь, что в консоли firebug (в firefox) возвращается ajax. - person Amit Kumar; 19.01.2013
comment
В firebug я вижу, что ‹div id=address›‹/div› getAddress() не должен выводить правильный формат для содержимого. - person mpe; 19.01.2013
comment
IMO, вы должны использовать свой самый первый фрагмент кода, то есть echo ‹div id='address'›;...echo ‹/div›; в get_Address.ctp, а не в add.ctp. Дайте мне знать, что будет в результате - person Amit Kumar; 19.01.2013
comment
добавлен $this-›set(compact('address')); getAddrsss(), но данные в div не отправляются - person mpe; 19.01.2013
comment
hotels\get_address.ctp: Изменено echo $this->Form-›input('team.address_1' на echo $this->Form-›input('Team.address_1', ... и все заработало - person mpe; 20.01.2013