Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Kiedy używać dziedziczenia ?
Damiankossek
post
Post #1





Grupa: Zarejestrowani
Postów: 118
Pomógł: 8
Dołączył: 10.12.2009

Ostrzeżenie: (0%)
-----


Witam, tak jak w temacie ... Wszedłem w świat OOP jakiś czas temu, teraz robię strony na Kohanie (IMG:style_emoticons/default/smile.gif) Bardzo przypadła mi do gustu ... Możecie powiedzieć mi kiedy używać dziedziczenia ? Wiem że jest to `jakby` rozdrabnianie klas ... Lecz nigdy nie mogłem znależć praktycznego zastosowania dziedziczenia w swoich skryptach (IMG:style_emoticons/default/smile.gif) Prosiłbym kogoś o takie szybkie i łopatologiczne rozpisanie jakiegoś skryptu np. newsów, artykułów czy czego kolwiek (byle nie zwierząt (IMG:style_emoticons/default/tongue.gif) ) ... Nie mówię że ma być kod tylko jak to ma wyglądać w praktyce, w formie jakiegoś drzewka lub czego kolwiek (IMG:style_emoticons/default/smile.gif)

No i jeszcze jedno .. Jak dziedziczyć w Kohanie ? Bo widzę że moje wszystkie modele i kontrolery już dziedziczą klasy wyznaczone przez Kohane (IMG:style_emoticons/default/smile.gif) _Models i _Controllers ... Da się jeszcze podpiąć coś czy nie bardzo (IMG:style_emoticons/default/smile.gif) ?

Przepraszam jeżeli są to jakieś durne pytania, ale niepotrafie zastosować tego w praktyce (IMG:style_emoticons/default/smile.gif)

Pozdrawiam

Ten post edytował Damiankossek 24.03.2010, 14:50:44
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
vegelus
post
Post #2





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 31.05.2005

Ostrzeżenie: (0%)
-----


Ja ostatnio zbudowałem sobie zestaw do tworzenia słowników z bazy danych w oparciu o własną warstwę abstrakcyjną do łączenia się z bazą.
Problem już wcześniej miałem rozwiązany funkcjami (funkcja do selecta, do multiselect, do checkboxa) ale jakoś mi się to nie podobało i teraz mam jeden mały zestaw:

abstract.menuList.php
  1. abstract class menuList {
  2. protected $sortBy;
  3. protected $sql;
  4. protected $tableName;
  5. protected $fieldName;
  6. protected $idName;
  7. protected $checkBy;
  8.  
  9. private $whereAnd = array();
  10. private $whereOr = array();
  11. private $db;
  12.  
  13. abstract public function PrintList();
  14. abstract protected function prepear();
  15.  
  16. public function __construct($tableName, $fieldName, $idName) {
  17. ...}
  18. protected function getItemDB() {
  19. ...}
  20. protected function addWhereAnd($item) {
  21. ...}
  22. protected function addWhereOr($item) {
  23. ...}
  24. public function sortByName($rodzaj = 'ASC') {
  25. ...}
  26. public function sortById($rodzaj = 'ASC') {
  27. ...}
  28. public function checkById(){
  29. ...}
  30. public function checkByName(){
  31. ...}
  32. }


(na potrzeby pytania wykasowałem środek bo trochę tego jest)
czyli klasa robi prawie wszystko poza odpowiednim wyglądem. A teraz dziedziczenie:

  1. include_once 'abstract.menuList.php';
  2.  
  3. /**
  4.  * Klasa odpowiedzialna za wyświetlenie listy Radio na podstawie słowników
  5.  * z bazy danych
  6.  *
  7.  * @author Paweł Wołkowski
  8.  *
  9.  * @param uchwyt $con połaczenie z bazą danych
  10.  * @param string $tableName nazwa tabeli z której będzie tworzona rozwijalna lista
  11.  * @param string $fieldName wyświetlane pole w liście
  12.  * @param string $idName pole odpowiedzialne za identyfikator zrwacany z listy (id tabeli)
  13.  * @param variant $checkVal wartość domyślnego zaznaczenia (default = 0)
  14.  * @param boolean $aktywny wyświetlaj tylko aktywne wiersze (default = true)
  15.  */
  16. class radioList extends menuList {
  17. private $checkVal;
  18. private $aktywny;
  19. private $obrazki = False;
  20. private $scierzka;
  21. private $sortName;
  22.  
  23. public function __construct($tableName, $fieldName, $idName, $checkVal = 0, $aktywny = True) {
  24. parent::__construct($tableName, $fieldName, $idName);
  25. }
  26.  
  27. protected function prepear() {
  28. if($this->aktywny == TRUE) {
  29. $this->addWhereAnd("aktywny = 't'");
  30. }
  31. if($this->checkVal != 0) $this->addWhereOr($this->idName = $this->checkVal);
  32. $this->sortById();
  33. }
  34.  
  35. /**
  36.   * Funckaja ustawia parametr obrazki na true/false jeżeli w liście radio zamiast tekstu
  37.   * mają być wyświetlane obrazki
  38.   * @param boolean
  39.   */
  40. public function setObrazki($obrazki) {
  41. $this->obrazki = $obrazki;
  42. }
  43. /**
  44.   * Funckaja ustawia parametr ścierzka na string jeżeli w liście radio zamiast tekstu
  45.   * mają być wyświetlane obrazki wg podanej ścierzki
  46.   * @param string $scierzka
  47.   */
  48. public function setScierzka($scierzka = 'pic/') {
  49. $this->scierzka = $scierzka;
  50. }
  51.  
  52. public function PrintList() {
  53. $ar = $this->getItemDB();
  54. foreach ($ar as $pole) {
  55. if($this->checkVal == $pole[$this->fieldName]) {
  56. $selected = ' checked="checked" ';
  57. }else {
  58. $selected = '';
  59. }
  60. if($this->obrazki){
  61. $label = '<img src="pic/'.$pole[$this->fieldName].'.png" width="16" height="16" alt="'.$pole[$this->fieldName].'" title="'.$pole[$this->fieldName].'"/>';
  62. }else{
  63. $label = $pole[$this->fieldName];
  64. }
  65. $tekst .= '<input type="radio" '.$selected.' name="'.$this->tableName.'" value="'.$pole['id'].'" /><label for="imie">'.$label.'</label>';
  66. }
  67. return $tekst;
  68. }
  69. }
  70.  


Druga klasa

  1. include_once 'abstract.menuList.php';
  2.  
  3. /**
  4.  *
  5.  *
  6.  * @author Paweł Wołkowski
  7.  *
  8.  */
  9. final class selectMenu extends menuList {
  10.  
  11. private $aktywny;
  12. private $checkVal;
  13. private $wolne;
  14. private $firstField = '___BRAK___';
  15.  
  16. public function __construct($tableName, $fieldName, $idName, $checkVal = '', $aktywny = False, $wolne = False) {
  17. parent::__construct($tableName, $fieldName, $idName);
  18.  
  19. $this->aktywny = $aktywny;
  20. $this->checkVal = $checkVal;
  21. $this->wolne = $wolne;
  22.  
  23. $this->prepear();
  24. }
  25.  
  26. protected function prepear() {
  27.  
  28. if($this->aktywny == TRUE) {
  29. $this->addWhereAnd("aktywny = 't'");
  30. if($this->checkVal != '') {
  31. $this->addWhereOr("$this->idName = $this->checkVal");
  32. }
  33. }
  34.  
  35. if($this->wolne == TRUE) {
  36. $this->addWhereAnd("stan = 'W'");
  37. if($this->checkVal != '') {
  38. $this->addWhereOr("$this->idName = $this->checkVal");
  39. }
  40. }
  41.  
  42. $this->checkByName();
  43. $this->sortByName();
  44.  
  45. }
  46.  
  47.  
  48. public function PrintList() {
  49.  
  50. $ar = $this->getItemDB();
  51. $tekst = '<SELECT NAME="'.$this->idName.'" SIZE="1" style="width:111">'. "\n";
  52. $tekst .= '<OPTION VALUE="">'.$this->firstField.'</OPTION>'. "\n";
  53. foreach ($ar as $pole) {
  54. if($this->checkVal == $pole[$this->checkBy]) {
  55. $selected = ' SELECTED = "SELECTED" ';
  56. }else {
  57. $selected = '';
  58. }
  59. $tekst .= '<OPTION VALUE="'.$pole[$this->idName].'"'.$selected.'>'.$pole[$this->fieldName].'</OPTION>'. "\n";
  60. }
  61. $tekst .= '</SELECT>'. "\n";
  62. return $tekst;
  63. }
  64. }
  65.  
  66. $test = new selectMenu('nawigacja', 'numer_ewidencyjny', 'id_naw','30');//nawigacja nazwa tabeli, numer_ewidencyjny - wyświetlana wartość, id_naw zwracany identyfikator, 30 - zaznaczona pozycja
  67. $test->checkById();
  68. $test->sortByName('DESC');//standardowo malejąco ale jak trzeba to można rosnąco
  69. echo $test->PrintList();


Dziedziczenie jest w tym przypadku bardzo fajne bo teraz wpadłem na pomysł i chcę rozbudować te klasy o możliwość podawania tablicy z której wygenerowane zostaną słowniki a nie jak teraz tylko z bazy. Tak musiałbym przerabiać funkcje pod nowe wymagania a tak tylko przeciążenie konstruktora i pozamiatane (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 5.10.2025 - 20:14