$next_nb = str_pad((string) $next, 2, '0', STR_PAD_LEFT);
Kategoria: cakePHP 5
bin/cake bake – zmiana szablonów
# cd /var/www/my_project
# cp -r vendor/cakephp/bake/templates/bake/ templates/bake/
- od tej pory do generowania modułu (bin/cake bake ..) będzie użyty lokalny szablon
Authentication – podstawowe komendy
W szablonie:
<?php $user_id = $this->getRequest()->getAttribute('identity')->getIdentifier(); ?>
W kontrolerze:
$user_id = $this->Authentication->getIdentity()->getIdentifier();
$role = $this->Authentication->getIdentity()->get('role'); $role == 'admin' || 'user'
Wyłączenie z dostępu po zalogowaniu
use Cake\Event\EventInterface; public function beforeFilter(EventInterface $event): void { parent::beforeFilter($event); if(!$this->is_admin) { $this->Flash->error(__('Nie ma takiej strony')); $event->setResult($this->redirect('/')); return; } $this->Authentication->addUnauthenticatedActions(['edit', 'changePassword' ]); }
csrf token – pole formularza
<!-- CSRF Token jako ukryte pole (fallback) --> <input type="hidden" name="_csrfToken" id="csrf-token-field" value="<?= $this->request->getAttribute('csrfToken') ?>">
Aktualizacja URL
let url = new URL(location.href); $("#proj-tabs").find(".nav-link").on('click', function() { var tab_name = $(this).attr('data-bs-target').replace("#", ""); url.searchParams.set("s_tab", tab_name); history.replaceState(null, null, url.href); });
CakePHP Input Group z Bootstrap’em – pole input za wąskie
Problem polega na tym, że CakePHP owija pole w <div class="input"> który nie ma width: 100% w kontekście Bootstrap input-group. Rozwiązanie — użyj opcji 'templates' żeby usunąć ten wrapper:
Czytaj dalej CakePHP Input Group z Bootstrap’em – pole input za wąskie
Formularz – błędy
Usuwa żółte tła:
GUS API – cakePHP 5
https://github.com/johnzuk/GusApi
https://api.stat.gov.pl/Home/RegonApi
NipTrait
validateNip($nip) - Sprawdza poprawność - Invoice::validateNip('1234567890') → true normalizeNip($nip) - Usuwa myślniki, spacje - Invoice::normalizeNip('123-456-78-90') → '1234567890' formatNip($nip) - Formatuje XXX-XXX-XX-XX - Invoice::formatNip('1234567890') → '123-456-78-90' generateRandomNip() - Generuje losowy - NIP - Invoice::generateRandomNip() → '857-234-19-23' getTestNip() - Stały NIP testowy - Invoice::getTestNip() → '123-456-78-16' isForeignNip($nip) - Czy NIP zagraniczny - Invoice::isForeignNip('9912345678') → true getNipInfo($nip) - Debug info Zwraca tablicę z detailami seller_nip_formatted - Virtual field - $invoice->seller_nip_formatted → '123-456-78-90' buyer_nip_formatted - Virtual field - $invoice->buyer_nip_formatted → '123-456-78-90'
PaymentStatusTrait
Uruchomienie gita
cd /var/www/biznes
Dodawanie assetów
Assety zainstalowane za pomocą npm i skopiowane do webroot/
# cd /var/www/biznes # mkdir webroot/css/vendor # mkdir webroot/js/vendor
Walidacja NIP-u
Poprawne NIPy
5261040828 ✓ (poprawna suma kontrolna)
1234563218 ✓ (poprawna suma kontrolna)
7010416109 ✓ (poprawna suma kontrolna)
5261040567 ✓ (poprawna suma kontrolna)
Ministerstwo Finansów: 5260250274
CakePHP 5 – app.php
'App' => [
'defaultTimezone' => 'UTC',
// ...
],
// wyświetlanie
$date->i18nFormat('yyyy-MM-dd HH:mm', 'Europe/Warsaw');
Ksef wysyłanie faktur
https://claude.ai/chat/4cc1d3ee-fca7-47c3-ae8e-069e207e025c
Dostęp do innej tabeli z Modelu
W modelu Table nie można użyć metody $this->fetchTable(„Projects”) – ta metoda dostępna jest tylko dla Controllers.
src/Model/Table/InvoicesTable.php
use Cake\ORM\TableRegistry; class InvoicesTable extends Table { public function getProjects() { $projects = TableRegistry::getTableLocator()->get('Projects') ->find() ->where(['is_active' => 1]) ->all(); .... } // getProjects() ... } // class
CakePHP 5 – Formularz – Powiązania modeli
$this->Form->create($article); // Article controls. echo $this->Form->control('title'); // Author controls (belongsTo) echo $this->Form->control('author.id'); echo $this->Form->control('author.first_name'); echo $this->Form->control('author.last_name'); // Author profile (belongsTo + hasOne) echo $this->Form->control('author.profile.id'); echo $this->Form->control('author.profile.username'); // Tags controls (belongsToMany) // as separate inputs echo $this->Form->control('tags.0.id'); echo $this->Form->control('tags.0.name'); echo $this->Form->control('tags.1.id'); echo $this->Form->control('tags.1.name'); // Inputs for the joint table (articles_tags) echo $this->Form->control('tags.0._joinData.starred'); echo $this->Form->control('tags.1._joinData.starred'); // Comments controls (hasMany) echo $this->Form->control('comments.0.id'); echo $this->Form->control('comments.0.comment'); echo $this->Form->control('comments.1.id'); echo $this->Form->control('comments.1.comment'); $this->Form->end();
CakePHP 5 plugin JSON
JSON – brak RequestHandlera zamiast tego JsonView
CakePHP 5 plugin PDF
Plugin PDF – WkHtmlToPdf rekomendowany silnik
# composer require friendsofcake/cakepdf
CakePHP 5 plugin CSV
Plugin CSV – instalacja w katalogu aplikacji
# composer require friendsofcake/cakephp-csvview
CakePHP 5 migracja – różnice z v.4
Zmieniło się: typowanie, json, fetchTable
Przenoszenie CRM na nowy serwer
Kopiowanie plików przez sieć, przenoszenie bazy, certyfikaty,
https://claude.ai/chat/b62ab800-58cd-4c56-96ea-c9d9937b03f4
updateAll – przypisanie wartości innego pola
use Cake\Database\Expression\QueryExpression; $this->Table->updateAll(['amount_remain' => new QueryExpression('amount') ], $conditions);
Plugin PDF
Silnik WKHTMLTOPDF: https://wkhtmltopdf.org/downloads.html
Plugin CakePDF: https://github.com/FriendsOfCake/CakePdf
ładowanie tabeli niepowiązanej
$products_table = $this->fetchTable("Products");
Przeglądanie załączników
Mechanizm przeglądania w aplikacji plików graficznych i pdf
Export CSV
Exportuje dane z tabeli do pliku csv
total calculated – wyliczanie podrzędnych wartości
Wyliczanie wartości całkowitej ze wszystkich podrzędnych modeli.
Czytaj dalej total calculated – wyliczanie podrzędnych wartości
Label – display field
Utworzenie etykiety do złożonych list
get, find, list – parameters
get
$article = $articles->get($id, contain: ['Comments']);