торт с extjs через вставку данных в базу данных - PullRequest
0 голосов
/ 02 сентября 2011

Я создаю файл js и добавляю кнопку tbar add, когда нажимаю одну строку blnak, добавляемую в сетку.

в файле контроллера фильмов я пишу

function ext_item($id = null) { 
        if(!empty($this->data)) {

            if($this->Movie->save($this->data)) 
            {
                $this->set('success','true'); 
                $this->data = array();
                return;
            }
            else {
                $this->set('success',"false"); 
                return;
            }
        }
}

как передать эти данные js?

как вставить данные в базу данных?


в файле контроллера

function create() {
    $newData = json_decode($this->params['form'], true); // turn the incomin json into an array
    $this->data = array(
            'Movie' => array(
            'date_' => $newData['date_'],
            'notes' => $newData['notes'],
            'asset_id' => $newData['asset_id'],
            'maint_picture' => $newData['maint_picture'],
            'maint_condition1' => $newData['maint_condition1'],
            'maint_condition2' => $newData['maint_condition2'],
            'maint_condition3' => $newData['maint_condition3'],
            'maint_condition4' => $newData['maint_condition4'],

        )
    );

    if ($this->Movie->save($this->data)) 
    {
        $data['success'] = true;
    } else {
        $data['success'] = false;
    }
     $this->set('data', $data);
    //$this->layout = 'ajax';
    return $this->render(null, null, '/movies/ext_item');
}

, затем в файле js

var proxy = new Ext.data.HttpProxy({
    api: {
        // these will map to cakephp controller actions
        create:  { url: 'movies_controller/create',  method: 'POST' },
       // read:    { url: '/movies_controller/index',    method: 'POST'  },
        //update:  { url: '/movies_controller/update',  method: 'POST' },
       destroy: { url: 'movies_controller/destroy', method: 'POST' }
    }
});

и добавить строку всетка

tbar: [{
                text: 'Add Movie',
                icon: 'images/table_add.png',
                cls: 'x-btn-text-icon',
                handler: function() {
                    grid.getStore().insert(0, new Movie({
                        id: 0,
                        notes: 'New Movie',
                        asset: ''

                    }));
                    rowEditor.startEditing(0, true);
                }

            }]

Что не так с этим.это не вставить данные в базу данных.

Ответы [ 2 ]

2 голосов
/ 02 сентября 2011

Что вы хотите сделать, это добавить в сетку, используя ExtJS. Магазин, подключенный к вашей сетке (если вы следите за моим ответом на последний вопрос), будет обрабатывать разговор с сервером.

В ExtJS кнопка на панели инструментов для добавления строки в сетку должна иметь обработчик.

var toolbar = Ext.Toolbar({
    // config options
    handler: function() {
        // in your handler you need to create a new record and insert it into your store
        // if you followed my answer to your last question, you'll have setup a store with proxy, jsonreader, and jsonwriter.

        // get the store component from Ext
        var store = Ext.getCmp('idOfYourStore'),
            NewRecord = Ext.data.Record.create(['name', 'genre', 'length']); // this array of column names should match the fields you specified for your JsonReader's fields

        // now that you have your store component, and your new blank record. you can fill it in and add it to the store
        var record = new NewRecord({
            name: 'Name of Movie',
            genre: 'Genre of Movie',
            length: '1:25:22'
        });

        store.add(record);
        store.commitChanges();             
    }
});

После вызова add (если для автосохранения установлено значение true в вашем магазине), он автоматически вызовет URL-адрес вашего приложения cakephp, которое вы настроили в api вашего прокси в разделе «create». Он отправит данные этой новой записи этому действию.

Итак, если вы настроите прокси-сервер для указания на /movies/create, то внутри вашего MoviesController вы захотите настроить действие create().

Внутри действия create вы захотите проверить $this->params['form'] на входящие данные из ExtJS.

function create() {
    $newData = json_decode($this->params['form'], true); // turn the incomin json into an array

    $this->data = array(
        'Movie' => array(
            'name' => $newData['name'],
            'genre' => $newData['genre'],
            'length' => $newData['length']
        )
    );

    if ($this->Movie->save($this->data)) {
        $data['success'] = true;
    } else {
        $data['success'] = false;
    }

    return json_encode($data);
}

После того, как ExtJs отправит сообщение в PHP, он ожидает, что объект json вернется с ключом «success» в корне объекта со значением true или false. Вам нужно это в json, поэтому вы не можете просто использовать $this->set и отправить его на ваше усмотрение. В этом случае я возвращаю строку json_encoding.

В действительности то, что вы должны сделать, это включить помощника Js в ваш app_controller Затем создайте элемент с именем ajaxreturn. /views/elements/ajaxreturn.ctp будет содержать одну строку.

<?php echo $this->Js->object($data) ?>

Объект отвечает за превращение $data в объект json. Он используется вместо json_encode, потому что в PHP4 не было поддержки json_encode.

теперь, когда у вас есть этот элемент, в вашем контроллере вы можете переписать его так ...

function create() {
    $newData = json_decode($this->params['form'], true); // turn the incomin json into an array

    $this->data = array(
        'Movie' => array(
            'name' => $newData['name'],
            'genre' => $newData['genre'],
            'length' => $newData['length']
        )
    );

    if ($this->Movie->save($this->data)) {
        $data['success'] = true;
    } else {
        $data['success'] = false;
    }

    $this->set('data', $data);
    $this->layout = 'ajax';
    return $this->render(null, null, '/elements/ajaxreturn');
}

Вы хотите вернуть строку json и ТОЛЬКО строку json. Нет макета, нет HTML, ничего, кроме строки, она выдаст ошибку.

Как только вы сделаете это, ваш магазин узнает, был ли вызов успешным, и если это так, он вставит строку в вашу сетку. Если нет, то он будет удалять темп. строка это положить в вашей сетке.

0 голосов
/ 02 сентября 2011

Я не уверен, что понимаю, о чем вы просите.

RequestHandler - это то, как торт позволяет обрабатывать запросы javascript / ajax: http://book.cakephp.org/view/1291/Request-Handling

...