Wzorzec DEBOUNCE Czytaj dalej Filtrowanie po nazwie – inna opcja
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']);
}
UUID
CREATE TABLE `transactions` ( ... `uuid` BIGINT UNSIGNED DEFAULT(uuid_short()), `uuid` UUID DEFAULT(uuid()),
MariaDB – RexExp example
Tworzy kolumnę i wypełnia ją wg. wzorca regexp
robots.txt
webroot/robots.txt
User-agent: * Disallow: /
CakePHP 5 – Instalacja
# cd /var/www/project # composer create-project --prefer-dist cakephp/app:~5.3 .
MCP postgresql
Dodaje serwer mcp postgresql
MCP mySQL
Dodaje serwer mcp mysql
Generacja hasła PowerShell
> [guid]::NewGuid().ToString() 872779d0-a0a1-4c91-b8b8-d580d78af8d7 - przykładowe hasło
Windows – generowanie UUID
PowerShell
[guid]::NewGuid().ToString()
9604d3a8-e390-41fa-8863-01fca67adb3c
PHP – 32 bajty
# php -r "echo base64_encode(random_bytes(32));" O5PPyu3QZtfZD5f6Oj2WaxZdux2k4OJ1vcy0Y4jomJk= .... gdzieś w kodzie ... $str = base64_decode($var);
Nodejs on Debian
# curl -fsSL https://deb.nodesource.com/setup_22.x | bash - # apt install -y nodejs
Serwery MCP – 1
Model Context Protocol
- mcp.so — katalog serwerów
- smithery.ai — kolejny katalog z łatwą instalacją
- github.com/modelcontextprotocol/servers — oficjalne serwery referencyjne
Wymagane narzędzia: npx, uv, uvx
# curl -LsSf https://astral.sh/uv/install.sh | sh
Max upload file:
Pliki które trzeba sprawdzić
/etc/php/8.4/fpm/php.ini /etc/php/8.4/cli/php.ini
Wartości które trzeb ustawić:
upload_max_filesize: 50M post_max_size: 50M
Sprawdzenie tylko CLI (nie fpm który faktycznie przesyła pliki przez Apache2)
# php -r "echo 'upload_max_filesize: ' . ini_get('upload_max_filesize') . PHP_EOL; echo 'post_max_size: ' . ini_get('post_max_size').PHP_EOL;"
Komendy: postgres
Sposób wyświetlania
SELECT * FROM tabela \gx - Odpowiednik \G (dla zapytania) \x - włączenie trybu pionowego na stałe \x auto - przełączenie na pionowy widok tylko wtedy, gdy wiersze są za szerokie dla ekranu
SELECT * FROM tabela \x\g\x - włącza tryb pionowy, wysła zapytanie i wyłącza tryb w jednej linii
Operacje na bazach danych
\l - lista baz danych \c moja_baza - połączenie z bazą
Tabele
\d - lista relacji \dt - lista tabel \d moja_tabela - struktura tabeli \d+ moja_tabela - szczegóły tabeli: komentarze, rozmiar na dysku,
RAG – vector – opis
1. Typ danych vector(1536) — co to znaczy?
Wyobraź sobie że każde słowo, zdanie lub dokument możesz opisać jako punkt w przestrzeni. Nie w przestrzeni 2D (x, y) ani 3D (x, y, z) — ale w przestrzeni 1536-wymiarowej.
Upgrade Debian 11 -> Debian 12
Kroki
- Zrób snapshot VPS
- Rób upgrade w oknie serwisowym
- Nie rób tego przez zwykłe SSH – użyj
screenlubtmux, żeby zerwanie połączenia nie przerwało procesu
Uprawnienia do logs/ tmp/
chown -R john:www-data tmp/ chmod -R 775 tmp/ chown -R john:www-data logs/ chmod -R 775 logs/
Postgres: baza i tabela dla pgvektor – powiązanie z cakePHP 5
# Dodaj repozytorium PGDG (oficjalne repo PostgreSQL)
Czytaj dalej Postgres: baza i tabela dla pgvektor – powiązanie z cakePHP 5
Pulsar edytor + ftp-remote-edit
- Zainstalować Pulsar
- Zainstalować nodejs (npm)
- Pobrać ftp-remote-edit-master :
https://github.com/h3imdall/ftp-remote-edit/archive/refs/heads/master.zip
MariaDB uuid
ALTER TABLE brands ADD `uuid` UUID DEFAULT UUID();
total_netto, total_brutto – virtual fields
Faktura (Invoices) nie ma pól netto, brutto, total_netto, total_brutto. Dane o kosztach znajduą się w InvoicePositions.netto i InvoicePositions.brutto
Claude Console – instalacja cakePHP
PHP nie ma klienta AI – zapytania poprzez curl
Dodawanie kluczy dla tabeli pośredniej
Struktura tabeli
VS Code – ssh remote
Rsync – kopiowanie plików i synchronizacja
Kopiujemy strukturę katalogów i plików ze zdalnego serwera na lokalny
Cloude Console – informacje
Cloude Code – używanie
Cloude Code logowanie
Logowanie do konta Claude Pro https://claude.ai/
Debian instalacja Cloude Code
Instalacja globalna dla użytkownika (nie root)
cakePHP obsługa plików
Pliki poza aplikacją:
# mkdir -p /var/uploads/my_app # chown www-data:www-data /var/uploads/my_app # chmod 750 /var/uploads/my_app
2. Szablony – Bootstrap UI
https://github.com/FriendsOfCake/bootstrap-ui
- Instalacja i uruchomienie pluginu
- Skopiowanie assetów
- AppView – uruchomienie treat’u initializeUI
- Wygenerowanie szablonów typu BootstrapUI