Wywołanie findera
public function tags(...$tags) { $articles = $this->Articles->find('tagged', tags: $tags)->all(); }
Wywołanie findera
public function tags(...$tags) { $articles = $this->Articles->find('tagged', tags: $tags)->all(); }
Pobranie największej/najwcześniejszej lub namniejszej/najpóźniejszej wartości
protected $_accessible = [ ...... 'schedule_first_date' => true, // Pierwsza data w harmonogramie 'schedule_last_date' => true, // Ostatnia data w harmonogramie ]; // Dla projektu pobiera ostatnią datę z harmonogramu (schedules - tablica powiązanych rekordów) protected function _getScheduleLastDate() { if (isset($this->_fields['schedule_last_date'])) { return $this->_fields['schedule_last_date']; } if (empty($this->schedules)) { return ; } $last_day = (new Collection($this->schedules))->max('date_to')->date_to; return $last_day; } // Dla projektu pobiera ostatnią datę z harmonogramu (schedules) protected function _getScheduleFirstDate() { if (isset($this->_fields['schedule_first_date'])) { return $this->_fields['schedule_first_date']; } if (empty($this->schedules)) { return ; } $first_fday = (new Collection($this->schedules))->min('date_from')->date_from; return $first_fday; }
Tabela powinna posiadać parent_id
Controller / index
$query = $this->EventTypes->find()->find('threaded')->all();
$eventTypes = $this->paginate($query);
$this->set(compact('eventTypes'));
Czytaj dalej Tabele z elementami podrzędnymi – pogrupowanymi
Table – def. Parents
$this->belongsTo('Parent', [
'className' => 'EventTypes',
'foreignKey' => 'parent_id'
]);
Controller – sortowanie po powiązanych modelach
$this->paginate = [ 'sortableFields' => [ 'Posts.title', 'Authors.name', ], ];
Jeden z kontrolerów używa bazy danych na zdalnym serwerze
Model obsługi Ajax
Aktualizacja zwraca błąd:
# apt update Err:6 https://packages.sury.org/php buster InRelease The following signatures were invalid: EXPKEYSIG B188E2B695BD4743 DEB.SURY.ORG Automatic Signing Key <deb@sury.org>
Repozytorium pakietów Debiana sury.org zmieniło swój klucz podpisywania pakietów. Aby naprawić błąd, po prostu pobierz nowy klucz:
# apt-key adv --fetch-keys https://packages.sury.org/php/apt.gpg
# apt update && apt upgrade
Gamma App – generowanie prezentacji – gamma.app
Wizard IO – aplikacje na telefon – app.wizard.io/prototypes
Hey Gen Labs – tłumacz
Grog – X (twiter)
Claude 2 – Anthropic
Gemini – Google
Ctrl + Shift + WIN + Alt – Office
Win + Shift + R – Capture
Win + Shift + S – Capture
Win + Alt + R – Nagrywanie ekranu
Win + G – dostęp do nagrania – Widget / Galeria
Win + D – min/max
Dodaje wszystkie nienadzorowane pliki
# git add . // dodaje wszystko w katalogu # git add -A // dodaje wszystko
Wycofuje ze stage’a wszystko – odwrotne działanie do powyższego
# git reset HEAD -- .
Wycofuje z nadzorowania pojedynczy plik / katalog
# git reset HEAD -- path/to/file
CMD
# copy /b obrazek.jpg + piosenka.txt plik_wynikowy.jpg
Wgranie pliku na serwer
$project= $this->fetchTable("Projects")->get($id); // zamiast loadModel
Kopia bazy danych z procedurami (mysqldump)
Kopia plików wraz z ukrytymi (tar)
Czytaj dalej Kopia projektu – tar
Trigger powiązany jest z tabelą, pozwala na automatyzację i sprawdzanie danych:
Pobiera kurs NBP i wypełnia pole w aplikacji
Entity – usuwanie spacji, zamiana przecinków na kropki
protected function _setNetto($netto) { $netto = str_replace(',', '.', $netto); return trim($netto); } protected function _setBrutto($brutto) { $brutto = str_replace(',', '.', $brutto); return trim($brutto); }
Kontroler – pobieranie sumy pozycji
$query = $this->Invoices->find(); $query->enableAutoFields() ->select([ 'total_netto' => $query->func()->sum('Positions.netto'), 'total_brutto' => $query->func()->sum('Positions.brutto'), 'total_pos' => $query->func()->count('Positions.id') ]); $query->leftJoinWith('Positions'); $query->group(['Invoices.id']); $query->order(['Invoices.id' => 'DESC']) ->all();
View /
<?= number_format($brutto, 2, ".", " ") ?>
Korzystanie z Modułu OCR
Jeśli jest zainstalowany npm
# npm install --global yarn # yarn --version Errors brak dostępu z powodu niepodpisanego skryptu
Powiązanie belongsToMany w postaci checkbox-ów. Tabele users – recommendations_users – recommendations
Konfiguracja redis, redis-connect w node
const {createClient} = require("redis")
let redisClient = createClient({
url: 'rediss://alice:alicePassword@redis.server:6379',
logErrors: true
})
redisClient.connect().catch(console.error)
const RedisStore = require("connect-redis").default let redisStore = new RedisStore({ client: redisClient, prefix: "myapp:", })
Jeśli klawisze funkcyjne F1, F2, … działają dopiero po wciśnięci przycisku Fn – a bez wciśnięcia działają klawisze multimedialne można to przełączyć sekwencją:
Fn + Esc
Listy – tablice (indeksowane) ciągów znaków: help @list
# LPUSH users 'ala' - wstawia na początku tablicy users osobę ala # RPUSH users 'ola' - wstawia na końcu tablicy osobę ola # LRANGE users 0 -1 - pobiera wszystkie elementy od indeksu 0 do końca tablicy (-1) 1) "ala" 2) "ola"
return $this->redirect(['action' => 'rcp', '?' => $this->request->getQueryParams()]);
Javascript – parseFloat nie akceptuje przecinka ’,’
netto = parseFloat( ($(this).val()).replace(',', '.') ); $("#netto").val( netto.toFixed(2) )
Wartości finansowe typu decimal(10, 2):
class InvoicePosition extends Entity
{
protected function _setNetto($netto)
{
return str_replace(',', '.', $netto); // zamienia przecinki na kropki w Invoices.netto
}
}
Javascript – parseFloat nie akceptuje przecinka ’,’
netto = parseFloat( ($(this).val()).replace(',', '.') ); $("#netto").val( netto.toFixed(2) )
Czytaj dalej cakephp 4 – zamiana przecinków na kropki -automat
Pobraliśmy wyniki Model->find() w postaci ResultSet. Jak dodać kolejny ResultSet?
Filtrowanie wierszy tabeli – dopasowanie do 2 kolumn
Wyszukiwanie projektów po numerze (ciąg znaków) Ajax Czytaj dalej Ajax – cakephp4 – onKeyUp – wyszukiwanie projektów po nazwie
Konfiguracja i przykład użycia w CakePHP 4 – pakiet gusapi/gusapi v.6.1.1 Czytaj dalej GUS API