Obsługa ajax API
AppController.php – dodać wpisy dla zainstalowanych pakietów
use CakePdf\View\PdfView; use Cake\View\JsonView; class AppController extends Controller { public function viewClasses(): array { return [JsonView::class, PdfView::class]; } ...
Javascript
// Przydzielanie kategorii
let assign_category = function() {
var category_id = $(this).data('c-id');
var category_box = $(this).closest('.category_box');
if(department_id, category_id) {
$.ajax({
url : '/departments/assign-category.json',
type : 'post',
dataType : 'json',
data : {department_id, category_id},
success : function(resp) {
if(resp.response.error) {
console.log(resp.response.error);
$("#feedback").text(resp.response.error).removeClass('hidden');
setTimeout(function(){ $("#feedback").text('').addClass('hidden'); }, 3000);
return;
}
if(category_box) {
$(category_box).detach();
$(category_box).find('.icon')
.removeClass('fas fa-angle-double-right text-primary')
.removeClass('c-id-wrapper');
$("#assigned-categories").append(category_box);
$("#empty-list").remove(); // info o braku przypisań
updateCounter('assign');
}
},
error : function(e){ console.error(e)}
});
}
};
$('.c-id-wrapper').on('click', assign_category);
API Kontrolera
public function assignCategory()
{
$response = ['error' => "Nie AJAX."];
if($this->request->is('ajax'))
{
$department_id = (int) $this->request->getParsedBody()['department_id'];
$category_id = (int) $this->request->getParsedBody()['category_id'];
$cd = $this->Departments->CategoriesDepartments->find()
->where(['department_id' => $department_id])
->where(['category_id' => $category_id])
->first();
if(!$cd){
$cd = $this->Departments->CategoriesDepartments->newEmptyEntity();
$cd->department_id = $department_id;
$cd->category_id = $category_id;
if ($this->Departments->CategoriesDepartments->save($cd)) {
$response = ['success' => $cd->id];
} else {
$response = ['error' => "Nie udało się przydzielić kategorii"];
}
} else {
$response = ['error' => "Takie powiązanie już istnieje"];
}
}
$this->viewBuilder()->setClassName('Json');
$this->set('response', $response);
$this->viewBuilder()->setOption('serialize', ['response']);
}