Reguli

Regulă generală

Î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.

Reguli scriere cod

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);

Autentificare SSH

- 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ă;

Cron-uri

- 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=""

YII2

- 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

Conturi utilizatori

- pentru toate aplicațiile create se vor defini imediat după implementarea modelului de User conturile pentru fiecare utilizator de forma prenume.nume

Utilizatori fără email

- î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

CRUD

- exceptând situații speciale, după acțiunile de CREATE și UPDATE aplicația redirectează către gridview

Form-uri

- î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;

GITHUB

- 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;

composer

- 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

mysql/mariadb index

- 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ă;

Export csv

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;
}

Export xlsx

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;
}

Export pdf

$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);

Validare cod php

php -l numeFisier.php

Exemplu Switch(true)

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;
}

select2 vs dropdownlist

- se va folosi dropdownlist acolo unde avem sub 5 opțiuni și select2 de acolo unde avem 5 sau mai multe;

Meniul principal

- meniul este vizibil doar utilizatorilor care sunt logați

Footer

- în footer se trece © urmat de anul curent

Bootstrap

- se folosește bootstrap 5 - ultima variantă