Yii Async JSONP запрос - PullRequest
       5

Yii Async JSONP запрос

1 голос
/ 28 сентября 2011

Я новичок в Yii PHP Framework, так что терпите меня.

Мне нужно сделать междоменный запрос JSONP (из не-yii приложения), чтобы создать запись в БД приложений Yii.После создания он должен вернуть содержимое Application / json через getVisit

Контроллеры:

public function actionGetVisit($id)
{
  header('Content-type: application/json');

  $visit = Visit::model()->findByPK((int)$id);

  echo CJSON::encode($visit);

  Yii::app()->end();
}
/**
 * Creates a new model.
 * If creation is successful, the browser will be redirected to the 'view' page.
 */
public function actionCreate()
{
    $model=new Visit;

    // Uncomment the following line if AJAX validation is needed
    // $this->performAjaxValidation($model);

    if(isset($_POST['Visit']))
    {
        $model->attributes=$_POST['Visit'];
        if($model->save())
            $this->redirect(array('getVisit','id'=>$model->id));
    }

    $this->render('create',array(
        'model'=>$model,
    ));
}

Форма:

<form id="visit-form" action="http://host/index.php?r=visit/create" method="post">
            <p class="note">Fields with <span class="required">*</span> are required.</p>


            <div class="row">
                <label for="Visit_rvc_id" class="required">Rvc <span class="required">*</span></label>      <input name="Visit[rvc_id]" id="Visit_rvc_id" type="text" value="1">            </div>

            <div class="row">
                <label for="Visit_zone" class="required">Zone <span class="required">*</span></label>       <input name="Visit[zone]" id="Visit_zone" type="text" value="1">            </div>

            <div class="row">
                <label for="Visit_table" class="required">Table <span class="required">*</span></label>     <input name="Visit[table]" id="Visit_table" type="text" value="1">          </div>

            <div class="row">
                <label for="Visit_seat" class="required">Seat <span class="required">*</span></label>       <input name="Visit[seat]" id="Visit_seat" type="text" value="1">            </div>

            <div class="row">
                <label for="Visit_user_id" class="required">User <span class="required">*</span></label>        <input name="Visit[user_id]" id="Visit_user_id" type="text" value="1">          </div>

            <div class="row">
                <label for="Visit_guest_name" class="required">Guest Name <span class="required">*</span></label>       <input size="60" maxlength="256" name="Visit[guest_name]" id="Visit_guest_name" type="text"  value="1">         </div>

            <div class="row">
                <label for="Visit_created" class="required">Created <span class="required">*</span></label>     <input name="Visit[created]" id="Visit_created" type="text" value="1">          </div>

            <div class="row buttons">
                <input type="submit" name="yt0" value="Create"> </div>

        </form>

JS:

$('#visit-form').submit(function(event)
        {
            alert('submit');
            event.preventDefault();
            var $form = $(this);
            $.ajax({
                url: $(this).attr('action'),
                dataType: 'jsonp',
                type: 'POST',
                data : $form.serialize()+'&ajax='+$form.attr('id'),
                success: function(data, textStatus, XMLHttpRequest)
                {
                    alert('success');
                    if (data != null && typeof data == 'object'){
                        $.each(data, function(key, value){
                            $('#error').append(value);
                        });
                    }
                },
                error: function(XMLHttpRequest, textStatus, errorThrown)
                {
                        alert(errorThrown);
                        alert('error');
                }
            });
            return false;
        });

После отправки. Похоже, что он не ошибается и не достигает успеха.В ответе говорится:

GET http://host/index.php?r=visit/create&callback=jQuery15102636089683510363_1317230765087&Visit%5Brvc_id%5D=1&Visit%5Bzone%5D=1&Visit%5Btable%5D=1&Visit%5Bseat%5D=1&Visit%5Buser_id%5D=1&Visit%5Bguest_name%5D=1&Visit%5Bcreated%5D=1&_=1317230785272 The URL can’t be shown

В ответе выводится текст /

Кто-нибудь знает, что означает эта ошибка?Форма отправляется идеально без JS.Но я просто не могу заставить работать запрос ajax.Я установил для него «jsonp», чтобы проблемы между доменами исчезли.Но я не уверен, может ли бэкэнд Yii обрабатывать данные, отправленные как jsonp.Любая помощь приветствуется!

1 Ответ

3 голосов
/ 01 октября 2011

На самом деле это не вопрос Yii, а скорее проблема JSONP;Вот как должна выглядеть ваша функция GetVisit:

public function actionGetVisit($id)
{
  header('Content-type: application/json');

  $visit = Visit::model()->findByPK((int)$id);

  $json = CJSON::encode($visit);
  echo $_GET['callback'] . ' (' . $json . ');';

  Yii::app()->end();
}

jQuery присоединяет глобальную временную функцию к объекту окна, которая вызывается, когда скрипт вставляется во время запроса JSONP.JQuery заменяет?с сгенерированным именем функции (т.е. jsonp1232617941775), которое вызывает встроенную функцию.Вы передаете эту функцию объекту окна.

Надеюсь, что это поможет, извиняюсь, если она не была правильно объяснена, когда я работаю над проектом.

...