CKEditor возвращает пустые данные по первому запросу и работает с каждым другим запросом - PullRequest
0 голосов
/ 07 августа 2020

У меня в приложении установлен CKeditor:

if ($('#disputeTextarea').length) {
        CKEDITOR.replace( 'disputeTextarea' );

        $('#dispute-post-msg').click(function() {
            $.poseidon('#dispute-msg-form', {
                method: 'post',
                data: {
                    'message': $('#realTextarea').val(),
                    'app_csrf_token': $('input[name="app_csrf_token"]').val(),
                    'uri': $('input[name="uri"]').val(),
                },
                onBeforeSend() {
                    for ( instance in CKEDITOR.instances ) {
                        CKEDITOR.instances[instance].on('change', function ()
                        {
                            var editorName = $(this)[0].name;
                            CKEDITOR.instances[editorName].updateElement();
                        });

                        document.getElementById('realTextarea').value = CKEDITOR.instances[instance].getData();
                    }
                    return true;
                },
                onSuccess(data) {
                  //handle success event
                }
            });
        });
    }

Скрипт PHP, обрабатывающий отправку опубликованных данных:

public function send_message($dispute_id, $uid) {
            if ($this->input->is_ajax_request()) {
                $message = $this->db->escape_str($this->input->post('message'));
                $uri = $this->db->escape_str($this->input->post('uri'));
            
                if (empty($message)) {
                    exit(json_encode([
                        'response'  =>  false,
                        'message'   =>  'Message field is empty.'
                    ]));
                } else {
                    // Insert message into db
                    $this->db = $this->load->database('disputes', TRUE);
                    $this->db->set([
                        'id'    =>  $this->_generate_id('messages'),
                        'dispute_id'    =>  $dispute_id,
                        'author'        =>  $uid,
                        'message'       =>  htmlentities($message),
                    ]);

                    $update = $this->db->insert('messages');

                    if ($update) {
                        exit(json_encode([
                            'response'  =>  true,
                            'message'   =>  'Your message was successfully posted.',
                            'url'       =>  '/'. $uri
                        ]));
                    } else {
                        exit(json_encode([
                            'response'  => false,
                            'message'   => 'An error occurred while trying to send your message, please try again later or contact support if the problem persists.'
                        ]));
                    }
                }
            } else {
                show_404();
            }
        }

Представление, содержащее форму с CKeditor:

<div class="row">
                    <div class="col-lg-12 col-md-12">
                        <?= form_open('disputes/{dispute_id}/message/send/{cur_uid}', 'class="form-group" id="dispute-msg-form"'); ?>
                            <input type="hidden" disabled="" name="uri" value="{uri}" />
                            <textarea id="disputeTextarea"></textarea>
                            <input id="realTextarea" type="hidden" name="message" />

                            <button style="margin: 20px 0;" id="dispute-post-msg" class="btn btn-info mr-1"><i class="ft-key-square ticket-options-icon align-middle"></i>
                                Post Message
                            </button>
                        <?= form_close() ?>
                    </div>
                </div>

Результат, который я получаю после отправки формы в первый раз: Форма редактора СК Данные POST формы не включают поле message в первом запросе, но добавляются в другие последующие запросы. Отладка довольно сложна, и хоть убей, я не могу заставить ее работать. Я использую CodeIgniter 3.1.1 и PHP 7.4.8

1 Ответ

0 голосов
/ 07 августа 2020

Я исправил это, просто поместив editor.updateElement() вне кода, который запускает запрос AJAX. Я также переработал код:

if ($('#disputeTextarea').length) {
        let editor = CKEDITOR.replace( 'disputeTextarea' );

        $('#dispute-post-msg').click(function() {
            let message = editor.getData();
            
            // Update text-area
            editor.updateElement();
             
            // Make AJAX call
            $.poseidon('#dispute-msg-form', {
                method: 'post',
                data: {
                    'message': message,
                    'app_csrf_token': $('input[name="app_csrf_token"]').val()
                },
                onSuccess(data) {
                    // handle success event 
                }
            });
        });
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...