jQuery Ajax

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']);
}