Budujemy obiektowo cz 4

Data: 2015-11-11, autor: Michał Misztal

Dzisiaj skupimy się na tym co prezentuje poniższy obrazek

Skupimy się na konkretnym programie. Otóż, wszelkie informacje o programie są pobierane z bazy danych. Opracowałem również prosty system CMS dla edycji kategorii i programów. Jeden program na stronie to obiekt klasy Program. Lista programów jest tworzona na podstawie funkcji zwracającej tablicę identyfikatorów. Na podstawie tej tablicy w pętli tworzymy konkretny obiekt. Ale po kolei. Klasa i cechy prezentują się następująco



class Program{
    private $iId="new";
    private $sKlasa;
    private $iKategoria;
    private $sNazwa;
    private $sIkona;
    private $sLink;
    private $sOpis;
    private $sFolder=ROOT;
    private $sNazwaTabeli='programy';
}

Tutaj kilka słów wyjaśnienia. Po pierwsze uno iId - forma zapisu CamelCase, jest to zwykły (int)id. Zdefiniowałem mu wartość "new". To na razie nie jest istotne. To dla późniejszej edycji rekordu. Cecha sFolder to moja zmienna pomocnicza by strona identycznie wyglądała na dysku i na serwerze. Niestety jestem zmuszony używać ścieżek bezwzględnych. sNazwaTabeli to nazwa tabeli w bazie MySql.



    public function utworz(){
                echo "<tr class=\"programy $this->sKlasa\">";
                echo "<td>"
                . "<a href=\"$this->sLink\" target=_blank>"
                        . "<div>"
                        . "<img src=\"$this->sFolder$this->sIkona\" alt=\"$this->sNazwa\" />"
                        . "</div>"
                        . "</a>"
                        . "</td>";
                echo "<td>"
                . "<div>"
                        . "<a href=\"$this->sLink\" target=_blank>$this->sNazwa</a>"
                        . "<div>"
                        . "<p>$this->sOpis</p>"
                        . "</div>"
                        . "</div>"
                        . "</td>";
                //new DivClear;
                echo "</tr>";
    }


    public function odczytajZBazyGdyId($biezace){
        $this->iId=$biezace;
        $sql = "SELECT * FROM programy WHERE id=".$this->iId;

        $polaczenie = @new mysqli(HOST, DB_GUEST, DB_PASSWORD_GUEST, DB_NAME);
        if ($polaczenie->connect_errno!=0){
            echo "Error: ".$polaczenie->connect_errno;
        } else {
            $result = $polaczenie->query($sql);
            while ($row = $result->fetch_assoc()){
                $this->iId = $row['id'];
                $this->iKategoria=$row['kategoria'];
                $this->sNazwa = $row['nazwa'];
                $this->sOpis = $row['opis'];
                $this->sLink = $row['link'];
                $this->sIkona = $row['ikona'];
                $this->sFolder.="grafika/kategorie/$this->iKategoria/";
            }
            $polaczenie->close();
        }
    }

Metoda odczytajZBazyGdyId() przyjmuje jeden argument - id programu, następnie pobiera jego cechy z bazy i je uaktualnia (nowy obiekt jest pusty). Następnie zostaje wykonana metoda utworz(), która po prostu wypisuje obiekt w postaci danych tabelarycznych (wiersz tabeli). Wywołania dla utworzenia obiektu wyglądają nastepująco



$idsProg=  odczytajIdsZBazy('programy','kategoria=\''.$kategoria.'\'','ORDER BY `nazwa`');

Tutaj mamy wywołanie funkcji która tworzy tabelę identyfikatorów. Przyjmuje ona klika argumentów. Pierwszy oznacza tabelę z której czytamy, drugi określa warunki (co po WHERE) a trzeci to dodatkowe opcje filtrowania (tutaj jest nim sortowanie alfabetyczne wg kolumny "nazwa"). Reszta kodu wygląda tak



echo '<div class="lista_programow">';
echo '<table><thead></thead><tbody>';
foreach ($idsProg as $id){
    $prog=new Program;
    $prog->odczytajZBazyGdyId($id);
    $prog->utworz();
}
echo '</tbody></table>';
echo '</div>';

Tworzymy pojemnik (div) a w nim tabelę z programami. Następnie wywoływana jest pętla foreach która uzupełnia dane, czyli po naszemu wypisuje programy. Tutaj widać potęgę programowania obiektowego nad zwykłym html'em. Wystarczy utworzyć klasę i trzaskać kolejne obiekty. Serwer według tej instrukcji sam utworzy szkielet. Poprawnie napisane klasy zmniejszą niemal do zera ryzyko pomyłek. Do tego takim kodem łatwiej jest zarządzać. Mamy literówkę? No problem wystarczy zmiana w definicji klasy. Chcemy dodać klasę do komórki tabeli czy zmieniamy folder na ikony? Również no problem. Wystarczy modyfikacja cechy. W sumie - jeden wpis. Pomyślmy gdybyśmy mieli to robić w klasycznym html'u? Gdy programów jest niewiele to nie ma problemu. Ale gdy programów będzie np 200?

Zobaczmy co utworzyliśmy dzięki temu fragmentowi kodu



<div class="lista_programow">
<table>
<thead></thead>
<tbody>
<!-- tutaj zaczyna się przetwarzanie pętli -->

  <tr class="programy ">
    <td>
      <a href="http://link-do-programu/" target=_blank>
        <div>
          <img src="/obrazek.png" alt="nazwa programu" />
        </div>
      </a>
    </td>
    <td>
      <div>
        <a href="http://link-do-programu/" target=_blank>
          nazwa programu
        </a>
        <div>
          <p>
            Opis programu
          </p>
        </div>
      </div>
    </td>
  </tr>


<!-- tutaj kończy się przetwarzanie pętli -->
</tbody>
</table>
</div>

Ale monstrum. I to tylko jeden program. Przypuśćmy, że trzeba to napisać ręcznie w html'u. Impossibru. Co my tutaj mamy? Mamy link do strony producenta - jest nim zarówno obrazek jak i nazwa programu. Link posiada parametr "target=_blank" co sprawia, że po kliknięciu strona otwiera się w nowej zakladce. Do tego ikona jest tworzona niemal automatycznie i to wraz z indywidualną wartością "alt". Do tego cała struktura div'ów i pól tekstowych dla odpowiedniego formatowania.

Skomentuj lub zgłoś błąd

© Michał Misztal 2023