Diskuze: Konzultace - pole a OOP
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 3 zpráv z 3.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Ahoj,
určitě by bylo hodně možných návrhu k řešení, nicméně když bych to řešil puntíčkářsky:
Ta třída TiskKodu je spíš jen taková šablona pro tu stránku, podle toho názvu bych spíš očekával, že ta třída reálně něco tiskne. Tedy bych ji trochu přejmenoval, třeba PdfSablona.
Samotné HTML bych pak generoval až v jedné metodě, která by to generování měla na starost. Takhle tam máš dvě metody, které dělají vlastně to samé (přidávají nějaký HTML kód). Tedy bych upravil metody pridejStitek() a tisk() tak, aby:
private $stitky = array();
public function pridejStitek($kod, $pocetSloupcu, $opakovani)
{
$this->stitky[] = array("kod" => $kod, "pocetSloupcu" => $pocetSloupcu, "opakovani" => $opakovani);
}
a v podstatě to, co generuješ v té metodě, vygeneruješ až v té metodě tisk().
public function tisk()
{
$html = "nějaký začátek"; // to samé, co je aktuálně v té metodě jako $this->tisk = "..."
foreach ($this->stitky as $stitek) {
// zde bude to generování, co aktuálně máš v metodě pridejStitek()
}
$html .= "nějaký konec";
return $html;
}
Metodu __toString() pak upravíš jednoduše tak, že si v ní vygeneruješ to HTML a vypíšeš
public function __toString()
{
$html = $this->tisk();
return $html;
}
Ten konstruktor se mi takto zdá zbytečný, jelikož dle kódu bys tam leda
tak dával rovnou nějaké HTML, což nechceš. Do třídy si předávej data a
HTML si nech generovat. Tedy když bys chtěl, můžeš si tam pro příklad
zadat třeba nějaké nastavení pro tu šablonu (třeba barvu textu atd.,).
Když už jsme u toho nastavení, mohlo by tam být i třeba nastavení
kódování, které ručně nastavuješ mimo tu třídu řádkem
$tisk = mb_convert_encoding($tiskkodu, 'UTF-8', 'UTF-8');
To bys klidně mohl mít řešené už v té třídě, které předáš "UTF-8" jako parametr.
Pokud bych chtěl jít ještě do větších detailů, tak by sis mohl pro ty štítky udělat vlastní objekt, protože dle mého návrhu vidíš, že do pole $stitky přidávám další pole, které má nějaké konkrétní prvky, což pomalu zavání nějakou strukturou. Tedy bys klidně mohl zjednodušeně mít
class Stitek
{
private $kod;
private $opakovani;
private $pocetSloupcu;
public function __construct($kod, $opakovani, $pocetSloupcu)
{
// přirazení do atributů
}
}
a v PdfSablona (TiskKodu) bys jednoduše měl
public function pridejStitek($kod, $opakovani, $pocetSloupcu)
{
$this->stitky[] = new Stitek($kod, $opakovani, $pocetSloupcu);
}
ve třídě Stitek by sis pak přidal nějaké gettery, abys mohl ty atributy $kod, $opakovani a $pocetSloupcu nějak použít.
Když budu ještě víc důsledný, tak coding standards v PHP říkají, že názvy funkcí a proměnných by měly být notací camelCase, tedy např. $pocetSloupcu, ne $pocet_sloupcu.
Tedy pro příklad by ten příklad mohl vypadat třeba takto: https://pastebin.com/nUwhjT4L
Určitě bude řada jiných možných návrhů, jiných možných detailů
atd., třeba někdo napíše svůj názor
Funguje to, děkuji za učesání, určitě si to vezmu k srdci
Jen tne mb_convert_encoding musím dát až do volání metody WriteHTML, jinak to nejede a mpdf hlásí chybu kódování.
Zobrazeno 3 zpráv z 3.