Привет, я довольно новичок в jquery -ajax, и я хотел бы помочь вам присоединиться к CI.
Я следил за этим руководством по отправке формы с помощью AJAX, и я хотел бы добавить эту функцию на сайт CodeIgniter. То, что я хотел бы сделать, – это когда пользователь отправляет форму, если есть какие-либо ошибки проверки, чтобы показывать индивидуально в каждом поле ввода (как в собственном процессе ci), или если это невозможно с помощью функции validation_errors (). Если ошибок не было, чтобы отобразить сообщение об успешном завершении над формой.
Вот мой код:
мой взгляд
// If validation succeeds then show a message like this, else show errors individually or in validation_errors() in a list <div class="alert alert-success">Success!</div> <?php echo validation_errors(); //show all errors that ajax returns here if not individualy ?> <?php echo form_open('admin/product/add, array('class' => 'ajax-form')); ?> <p> <label for="product_name">Product *</label> <input type="text" name="product_name" value="<?php echo set_value('product_name', $prod->product_name); ?>" /> <?php echo form_error('product_name'); ?> </p> <p> <label for="brand">Brand</label> <input type="text" name="brand" value="<?php echo set_value('brand', $prod->brand); ?>" /> <?php echo form_error('brand'); ?> </p> ...
мой контроллер
public function add($id){ // set validation rules in CI native $rules = $this->product_model->rules; $this->form_validation->set_rules($rules); if ($this->form_validation->run() === true) { // get post data and store them in db $data = $this->input_posts(array('product_name', 'brand', 'category_id', 'description')); $this->product_model->save($data, $id); // no errors - data stored - inform the user with display success-div } else { // validation failed - inform the user by showing the errors } //load the view $this->load->view('admin/products/add', $data); }
и вот сценарий js
$(document).ready(function () { $('form.ajax-form').on('submit', function() { var obj = $(this), // (*) references the current object/form each time url = obj.attr('action'), method = obj.attr('method'), data = {}; obj.find('[name]').each(function(index, value) { // console.log(value); var obj = $(this), name = obj.attr('name'), value = obj.val(); data[name] = value; }); $.ajax({ // see the (*) url: url, type: method, data: data, success: function(response) { console.log(response); // how to output success or the errors instead?? } }); return false; //disable refresh }); });
Как мне передать результаты проверки (либо успешные, либо сообщения об ошибках) через запрос ajax и отобразить их в моем представлении? Из небольшого исследования, которое я сделал, я обнаружил, что вы можете использовать один контроллер, который содержит как собственный процесс, так и запрос ajax (вместо использования 2 контроллеров), но моя основная трудность заключается в том, что я не понимаю, как результаты проверки будет проходить через js-скрипт и отображать их на моем представлении ?? Обратите внимание, что я не хочу отображать что-либо в окне предупреждения, вместо этого показывать результаты на div или индивидуальные ошибки (если это возможно).
EDIT Я внес некоторые изменения в свое приложение, вот код:
контроллер
public function manage($id = NULL){ $this->load->library('form_validation'); $data['categ'] = $this->category_model->with_parents(); //fetch a single product or create(initialize inputs empty) a new one if (isset($id) === true) { $data['prod'] = $this->product_model->get($id); $data['attr'] = $this->attribute_model->get_by('product_id', $id, null, true); } else { $data['prod'] = $this->product_model->make_new(); $data['attr'] = $this->attribute_model_model->make_new(); } if (isset($_POST['general_settings'])) { if ($this->form_validation->run('product_rules') === true) { // get post inputs and store them in database $data = $this->product_model->input_posts(array('product_name', 'brand', 'category_id', 'general_description')); $this->product_model->save($data, $id); $status = true; } else { // validation failed $status = validation_errors(); } if ( $this->input->is_ajax_request() ) { echo json_encode($status); exit; } redirect('admin/product'); } //if (isset($_POST['attributes_settings'])) { the same thing here } // load the view $this->load->view('admin/products/manage', $data); }
и js
success: function(response) { //console.log(response); if (data.status === true) { $('#ajaxResults').addClass('alert alert-success').html(response); } else { $('#ajaxResults').addClass('alert alert-error').html(response); }; }
Но у меня есть некоторые проблемы
2. Как я должен вернуть сообщение об успешном завершении? например. сообщение «Сохранение было сделано!».
HTML:
<div id="ajaxResults"></div>
Javascript ajax:
success: function(response) { $('#ajaxResults').text(response); }
этот скрипт, который вы написали, только в том случае, если проверка прошла успешно, не так ли?
Неправильно. Код в «успехе» выполняется в любое время, когда вы получаете ответ с сервера (при условии, что HTTP-заголовок равен 200). Ваш javascript знает, есть ли у сервера какая-либо ошибка для вас? Нет.
Вам нужен ваш JavaScript, чтобы узнать, не прошла или не прошла валидация. У вас есть много способов сделать это. Одной из них может быть отправка сообщения для отображения, за которым следует 0 или 1.
Таким образом, ваш PHP будет выглядеть так:
return "0 " . $errorMessage;
а также
return "1 " . $successMessage;
и ваш javascript должен затем распознать с помощью оператора if и substring
, если сообщение начинается с 0 или с 1.
Используйте этот способ, я надеюсь, что это сработает для вас
<script type='text/javascript'> var base_url = '<?=base_url()?>'; function ajax_call() { var ids = $("#all_users").val(); $.ajax({ type:"POST", url: base_url+"expense/home/get_expense", data: "userid=" + ids, success: function(result){ $("#your_div_id").html(result); } }); } </script>