În cazul în care te blochezi și după 15 minute nu ai făcut nici-un pas (în oricare direcție) și nici nu ai vre-o idee, întrebi pe cineva, suni, dai mail, dai mesaj pe whatsapp, astfel încât să nu rămâi blocat prea mult timp.
Indentarea în cod este tab =4 spații (se modifică în editor astfel încât 1 tab = 4 spații).
Numele de variabile să fie cât mai sugestive (excepție i,j,k pentru contoare sau alte variabile încetățenite);
Pentru variabilele din codul php/javascript se folosește camel case notation exemplu: userId;
Toate constantele din codul php/javascript se scriu cu litere mari exemplu: PI;
Elementele unui vector (array) se scriu cu virgulă la sfârșit;
Pentru câmpurile din baza de date tocmai pentru a diferenția de variabile se folosește snake eyes notation exemplu: user_id;
Modele pe cât posibil sunt întotdeauna la singular User, Book, Company;
Tabela mysql/mariadb în care se salvează modelele este la plural users, books, companies;Controllere pe cât posibil sunt întotdeauna la plural UsersController, BooksController, CompaniesController;
Modele se crează sau actualizează întotdeauna folosind metoda POST în form-uri
Pe cât posibil se folosește switch(true) în lor de construcții cu if-uri - atenție sporită la break;
If-urile au întotdeauna {} atât în zona principală cât și în zona de else – chiar și atunci când avem o singură instrucțiune;
Foreach are întotdeauna {};
Switch are întotdeauna default;
Comentariile la modificările în cod sunt pe 3 linii:
- Prenume Nume Data (YYYY-MM-DD) sau INITIALE de exemplu VAI 2021-06-01 sau Valentin-Adrian Ionescu 2021-06-01;
- descriere sumară a modificările la nivel de logică de business;
- descriere sumară a modificări la nivel de cod (se înlocuiește x cu y sau ce se face acolo);
- se generează o pereche cheie publică/privată cu putty_gen și se salvează într-o locație cunoscută;
- în home-ul vhost-ului se crează directorul .ssh;
- directorul .ssh trebuie să aibe permisiunile 600;
- în directorul .ssh se creeză fișierul authorized_keys;
- fișierul authorized_keys trebuie să aibe permisiunile 700;
- în fișierul authorized_keys se copiază cheia publică – câte una pe linie și la sfârșitul fișierului se lasă o linie goală;- pentru a se edita cronurile se folosește comandă: crontab -e
- un site cu explicații și foarte multe exemple este https://crontab.guru/examples.html
- pentru a dezactiva mailurile care se trimit cu outputul cronurilor se adaugă prima linie: MAILTO=""
- se folosește scheletul de aplicație yiisoft/yii2-app-basic
- în home-ul vhost-ului se crează un director app-v0.01
- se rulează comanda: composer -vv --profile create-project yiisoft/yii2-app-basic app-v0.01
- directorul public_html se șterge și se crează un symlink app-v0.01/web -> public_html
- se rulează comanda: ln -s app-v0.01/web/ public_html
- pretty urls se activează din app-v0.01/config/web.php decomentându-se secțiunea urlManager
- un command de Yii se rulează din directorul public_html folosind comanda: ./yii numeController
- pentru toate aplicațiile create se vor defini imediat după implementarea modelului de User conturile pentru fiecare utilizator de forma prenume.nume
- în cazurile în care avem nevoie să creăm utilizatori fără adresă de email, în loc de email se va completa username@127.0.0.1
- exceptând situații speciale, după acțiunile de CREATE și UPDATE aplicația redirectează către gridview
- în funcție de situație se va limita numărul de inputuri la 7 plus sau minus 2 (Legea lui Miller);
- acolo unde e cazul se va sparge un form cu multe input-uri în 2 sau mai multe formuri;
- ai nevoie de cont de github - este gratis;
- în caz că un proiect are multe dependințe este nevoie de generarea unui token pe github pentru respectivul proiect - este gratis;
- https://github.com/apexcharts/apexcharts.js/releases – folosind /releases poți vedea release-urile publice ale unui pachet;
- se folosește versiunea 2;
- composer.json este fișerul unde se specifică ce pachete se vor instala;
- se folosește zona require;
- ultima linie din require nu are virgulă la sfârșit;
"vendor/package": "*", // orice versiune pentru care se rezolvă dependețele
"vendor/package": "1.3.2", // versiunea 1.3.2
"vendor/package": ">=1.3.2", // orice mai mare sau egal cu versiunea 1.3.2
"vendor/package": "<1.3.2", // orice versiune mai mică de 1.3.2
"vendor/package": "~1.3.2", // orice versiune mai mare de 1.3.2 și mai mic de 1.4.0
"vendor/package": "~1.3", // orice versiune > de 1.3 și mai mică de 2.0
"minimum-stability": "dev", // aici se poate limita la stable
"prefer-stable": true, // se folosește în combinația minimum-stability: dev, prefer-stable: true
- pentru instalare actualizare se folosește comanda: composer -vv –-profile update
- se adaugă index pe toate câmpurile care apar în: where, group by, order by, join;
- operația de adăugare de indexi poate dură mult timp așa că atenție mare în cazul în care sunt multe linii în tabelă;
public function actionCsvdownload()
{
$csvSeparator = Yii::$app->params['csvSeparator'];
$csvData = '';
// build header
$header = array();
$header[] = 'Column1';
$header[] = 'Column2';
$header[] = 'Column3';
$header[] = 'Column4';
// write header
$csvData .= implode($csvSeparator,$header) . "\n";
// loop data
for($i=1;$i<=15;$i++)
{
// build line
$line = array();
$line[] = rand(0,100);
$line[] = rand(0,100);
$line[] = rand(0,100);
$line[] = rand(0,100);
// save line to csv_data
$csvData .= implode($csvSeparator,$line) . "\n";
}
$filename = 'File1.csv';
Yii::$app->response->sendContentAsFile($csvData, $filename)->send();
return true;
}
public function actionXlsxdownload()
{
// Create new Spreadsheet object
$spreadsheet = new Spreadsheet();
$xlsxData = array();
// build header
$header = array();
$header[] = 'Column1';
$header[] = 'Column2';
$header[] = 'Column3';
$header[] = 'Column4';
$xlsxData[] = $header;
// loop data
for($i=1;$i<=15;$i++)
{
// build line
$line = array();
$line[] = rand(0,100);
$line[] = rand(0,100);
$line[] = rand(0,100);
$line[] = rand(0,100);
// save line to xlsx_data
$xlsxData[] = $line;
}
$spreadsheet->getActiveSheet()->fromArray($xlsxData, NULL, 'A1');
$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
ob_start();
$writer->save('php://output');
$content = ob_get_contents();
ob_end_clean();
$filename = 'File1.xlsx';
Yii::$app->response->sendContentAsFile($content, $filename)->send();
return true;
}
$mpdf = new \Mpdf\Mpdf(['mode' => 'utf-8', 'format' => [210, 297]]);
$mpdf->SetCreator('Appointments');
$mpdf->SetAuthor('eUe');
$htmlContent = '<h1 style="text-align:center">'. date("d-m-Y", strtotime('today')) . '</h1>';
$htmlContent .= '<table style="width:100%;border: 1px solid black; border-collapse: collapse;">';
$htmlContent .= '<tr>';
$htmlContent .= '<th style="border: 1px solid black;">Column1</th>';
$htmlContent .= '<th style="border: 1px solid black;">Column2</th>';
$htmlContent .= '<th style="border: 1px solid black;">Column3</th>';
$htmlContent .= '<th style="border: 1px solid black;">Column4</th>';
$htmlContent .= '<th style="border: 1px solid black;">Column5</th>';
$htmlContent .= '<th style="border: 1px solid black;">Column6</th>';
$htmlContent .= '</tr>';
for($i=1;$i<=133;$i++)
{
$htmlContent .= '<tr>';
$htmlContent .= '<td style="border: 1px solid black;">Data' . rand(0,100) . '</td>';
$htmlContent .= '<td style="border: 1px solid black;">Data' . rand(0,100) . '</td>';
$htmlContent .= '<td style="border: 1px solid black;">Data' . rand(0,100) . '</td>';
$htmlContent .= '<td style="border: 1px solid black;">Data' . rand(0,100) . '</td>';
$htmlContent .= '<td style="border: 1px solid black;">Data' . rand(0,100) . '</td>';
$htmlContent .= '<td style="border: 1px solid black;">Data' . rand(0,100) . '</td>';
$htmlContent .= '</tr>';
}
$htmlContent .= '</table>';
$mpdf->SetHTMLFooter('<div style="text-align: center">Page {PAGENO} of {nbpg} Printed by ' . Yii::$app->user->identity->name . ' at ' . date("d-M-Y//H:i:s") . '</div>');
$mpdf->WriteHTML($htmlContent);
$mpdf->Output();
//$mpdf->Output('file.pdf', \Mpdf\Output\Destination::DOWNLOAD);
php -l numeFisier.php
switch(true)
{
case $i>=0 && $i<=10:
$total = 0;
break;
case $i>10 && $i<=100:
$total += 1;
break;
case $>100:
$total = 100;
break;
default:
break;
}
- se va folosi dropdownlist acolo unde avem sub 5 opțiuni și select2 de acolo unde avem 5 sau mai multe;
- meniul este vizibil doar utilizatorilor care sunt logați
- în footer se trece © urmat de anul curent
- se folosește bootstrap 5 - ultima variantă