https://api.nbp.pl/ – NBP – kursy średnie, sprzedaży, kupna, na dany dzień
https://github.com/codenix-sv/coingecko-api – coingecko.pl API – kryptowaluty
https://api.walutomat.pl/v2.0.0/ – walutomat.pl API
https://api.nbp.pl/ – NBP – kursy średnie, sprzedaży, kupna, na dany dzień
https://github.com/codenix-sv/coingecko-api – coingecko.pl API – kryptowaluty
https://api.walutomat.pl/v2.0.0/ – walutomat.pl API
Zamiast tworzyć odrębną metodę obsługi eksportu można przełączać kontekst za pomocą rozszerzenia .csv
Czytaj dalej CSV – CsvView Plugin – 3.x – przełączanie klasy
Jeśli brak uprawnień wysyła do strony początkowej
Dołącza podzbiór zdarzeń na kliencie i znajduje ostatnie zdarzenie, zaraportowane, starsze niż obecna data (przyszłe zdarzenia nie miały miejsca to tylko plany). Jeśli ostatnie zdarzenie jest starsze niż 3 miesiące ustawia alarm.
public function findLastEvent($query, $options) { $query = $query->contain([ 'Events' => function($q){ return $q->select([ 'id', 'company_id', 'last_visit' => 'MAX(start_date)', 'alarm' => $q->newExpr()->addCase( [ $q->newExpr()->lt('MAX(start_date)', $q->func()->dateAdd('CURRENT_DATE', -3, 'MONTH')) ], [1,0], ['integer', 'integer'] ) // addCase ]) // select ->where(['report <>' => '']) // Zaraportowane ->where(['start_date <=' => new \DateTime('now')]) ->order(['start_date' => 'DESC']) ->group(['Events.id']); }]); return $query; }
W filtrowaniu treści – wybieramy z listy opcję – wybrane ID, nazwy przekazujemy jako parametery query string. Pozwala to na filtrowanie po wielu parametrach niezależnie.
let url = new URL(location.href); let onChangePostion = function(){ url.searchParams.delete('page'); // 1 strona var position_name = $(this).find(':selected').text().trim(); // Nazwa var position_id = $(this).val(); // id if(position_id) { url.searchParams.set('position_id', position_id); } else { url.searchParams.delete('position_id'); } location.href = url.toString(); return false; }; $("#filter-position").on('change', onChangePostion);
Czytaj dalej Przełączanie URL – query string – filtrowanie po wielu parametrach
Wartość dziesiątna w postaci 23 444,54 zł
<td class="text-right"> <span class="text-success"><?= number_format (((float) $object->price), 2, ',', ' ') ?></span> zł </td>
Dostęp do parametrów stronicowania dla modelu Phones
$paging = $this->getRequest()->getParam('paging'); $page = $paging['Phones']['page']; $limit = $paging['Phones']['perPage'];
<td class="text-center"><?= ++$ind + (($page -1) * $limit) ?></td>
Konfiguracja środowiska PDF z silnikiem wkhtmltopdf
Wyczyszczenie pamięci podręcznej frameworku:
# bin/cake cache clear_all
Cleared default cache Cleared _cake_core_ cache Cleared _cake_model_ cache Cleared _cake_routes_ cache
Towary powiązane z produktami i wersjami – zliczamy ilości w każdym sklepie
Przeszukiwanie różnych fragmentów tekstu rozdzielonych spacjami.
$search = preg_replace('/\s+/', '%', $search_str);
Tabele MySQL
CREATE TABLE files ( id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, file_type_id INT UNSIGNED, project_id INT UNSIGNED, orygname VARCHAR(255) NOT NULL, dir VARCHAR(255), filename VARCHAR(255) NOT NULL, ext CHAR(9), description TEXT, module ENUM ('project') is_active TINYINT(1) DEFAULT 1, user_id INT UNSIGNED NOT NULL, created DATETIME, modified DATETIME, );
CREATE TABLE file_types ( id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255) NOT NULL, description TEXT );
Utworzenie funkcji składowanej w MySQL
Utworzenie procedury składowanej w MySQL
DELIMITER $$ CREATE PROCEDURE low_amount() BEGIN SELECT ip.id, ip.product_id, ip.brand_id, ip.amount_alert, ip.is_ordered, SUM(ip.amount) AS suma, p.name AS product, b.initials, b.name AS brand FROM item_packs ip INNER JOIN products p ON p.id=ip.product_id INNER JOIN brands b ON b.id=ip.brand_id GROUP BY ip.product_id, ip.brand_id HAVING suma <= ip.amount_alert; END $$ DELIMITER ;
SHOW PROCEDURE STATUS -- wszystkie procedury SHOW PROCEDURE STATUS [LIKE 'my_procedure' | WHERE search_condition] SHOW CREATE PROCEDURE my_procedure;
DROP PROCEDURE [IF EXISTS] my_procedure; SHOW PROCEDURE STATUS WHERE Db='myDababaseName' \G
DELIMITER $ CREATE PROCEDURE user_projects(p_user_id INT) BEGIN SELECT p.id, p.status_id, COUNT(*) AS count, SUM(p.price) AS total, SUM(p.price * (ch.percent / 100)) AS weighted FROM projects p LEFT JOIN chances ch ON p.chance_id=ch.id WHERE p.manager_id = p_user_id AND p.status_id <> 3 -- bez odrzuconych GROUP BY p.status_id ; END $ DELIMITER ;
Wywołanie procedury w CakePHP 3
$connection = \Cake\Datasource\ConnectionManager::get('default'); $results = $connection->execute('CALL low_amount()')->fetchAll('assoc'); $this->set(compact('results'));
Skrypt php po stronie backendu
Plugin wspierający zmiany w schemacie bazy danych
https://book.cakephp.org/migrations/3/en/index.html
# composer require cakephp/migrations "@stable"
# bin/cake plugin load Migrations
# composer require --update-with-dependencies "cakephp/cakephp:3.8.*"
Plugin do eksportu zasobów w formacie csv
# composer require friendsofcake/cakephp-csvview:~3.0 - dla Cakephp 3.x # composer require friendsofcake/cakephp-csvview - dla v.4.x # bin/cake plugin load CsvView
Lista wbudowanych reguł walidatora
Daje możliwość zmiany ilości rekordów dla użytkownika
Plugin do walidacji danych ekonomicznych wg. krajów: regon, pesel, nip, telefon, kod pocztowy,
CakePHP – domyślny czas sesji 24 min – przedłużenie do 4 godzin
Instalacja pakietów w katalogu projektu
# cd /var/www/html/project # npm init # npm install bootstrap # npm install jquery@>=3.0.0 # npm install popper.js@^1.14.7 # npm install --save-dev @fortawesome/fontawesome-free
Szczegóły pluginu
# composer require 'davidyell/proffer:^1.0'
Wszytkie pola poza 'published’
# $query->selectAllExcept( $articlesTable, ['published']);
Stos wywioań: alias / funkcja – pozostałe pola
# $query ->select(['slug' => $query->func()->concat(['title' => 'identifier', '-', 'id' => 'identifier'])]) ->select($articlesTable); // Select all fields from articles
Plugin CSV
https://packagist.org/packages/friendsofcake/cakephp-csvview
# composer require friendsofcake/cakephp-csvview # bin/cake plugin load CsvView
Dodawanie zmiennych do szablonu
$this->Form->setTemplates([ 'inputContainer' => '<div class="input {{type}}{{required}}"> {{content}} <span class="help">{{help}}</span></div>' ]);
Załadowanie szablonu config/bootstrap_templ.php
// In a View class $this->loadHelper('Form', [ 'templates' => 'bootstrap_temp.' ]);
Definicja szablonu w pliku config/app_form.php
// config/app_form.php return [ 'inputContainer' => '<div class="form-control">{{content}}</div>', ];
UsersController