Итак, я работаю над этой формой, которая содержит данные как формы, так и файлов. Я хочу отправить его через Ajax. Поэтому, когда он не может пройти валидацию формы, использование не потеряет всю запись.
create.php
<script type = "text/javascript">
$("#add-product-form").submit(function(e){
e.preventDefault();
var formData = new FormData(this);
console.info(formData);
var url = "products/ajax_add_single_product";
$.ajax({
type:"post",
url:"<?php echo base_url() ?>"+url,
data:formData,
dataType:'json',
cache: false,
contentType: false,
processData: false,
error: function (jqXHR, textStatus, errorThrown) {
console.info(jqXHR,textStatus,errorThrown);
error = jqXHR.responseJSON.error;
$(".submit-message").html(error);
console.info(error);
$("html, body").animate({ scrollTop: 0 }, 200);
},
success: function (data, textStatus, jqXHR) {
message = jqXHR.responseJSON.success;
$(".submit-message").html(message);
location.href = "/products";
}
})
})
</script>
контролер
public function create(){
$data\['title'\] = "Add Product";
$data\['categories'\] = $this->category_model->get_categories();
$data\['children'\] = $this->category_model->get_child_cats(0);
$data\['vendors'\] = $this->vendor_model->get_vendors();
$data\['attributes'\] = $this->product_model->get_attributes();
$this->load->view('templates/header', $data);
$this->load->view('products/create');
$this->load->view('templates/footer');
}
public function ajax_add_single_product(){
$this->form_validation->set_error_delimiters('<div class = "error">', '</div>');
$this->form_validation->set_rules('productname', 'Product Name', 'required');
$this->form_validation->set_rules('partnumber', 'Part Number', 'required|is_unique\[items.itemSKU\]');
$this->form_validation->set_rules('catID', 'Category', 'required', array('required'=>"You need to pick a %s"));
header('Content-Type: application/json');
if ($this->form_validation->run() === FALSE)
{
$this->output->set_status_header(400);
$errors = validation_errors();
echo json_encode(['error'=>$errors]);
}
else
{
$this->output->set_status_header(200);
$imageData = $this->images_upload();
$this->product_model->create_product($imageData);
echo json_encode(['success'=>'Record added successfully.']);
}
}
С приведенным выше кодом, когда ввод не может пройти проверку формы, он выдаст мне ошибки проверки формы. Когда запись будет успешной, он вставит данные в базу данных, как я и ожидал. но это все равно даст мне ошибку. похоже, что я не получаю данные JSON и получаю html.
Кроме того, почему вы закомментировали скобки в PHP-коде?
responseText - это не JSON ... Похоже, он начинается с <!Doctype.... Вы можете использовать что-то вроде getpostman.com для помощи с запросами веб-сервисов.
Я предполагаю, что вы генерируете ошибку Codeigniter в своем контроллере (или где-то еще), и он отображает ошибку как HTML, что и делает.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Оказывается, в модели была одна строка в функции create_product (). После вставки данных в таблицы я ставлю redirect('/products')after, поэтому получаю html исходный код продуктов страницы.
Что на самом деле возвращает контроллер? Что такое тело ответа?