Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP]Klasa wpisu.
Sagnitor
post
Post #1





Grupa: Zarejestrowani
Postów: 34
Pomógł: 3
Dołączył: 29.05.2011

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


Witam!

Niedawno rozpocząłem pisanie sobie zbioru przydatnych klas i funkcji, które roboczo nazywam moim mini 'frameworkiem'. Trafiła tam już m. in. klasa Uploader'a, którą pomogliście mi dopracować.
Stwierdziłem, że przy wielu projektach przydatna stanie się klasa wpisów inaczej newsów. Nowości występują w większości stron internetowych.
Przechodząc do sedna sprawy:

Myśląc abstrakcyjnie news posiada swoje prywatne pola jakimi są tytuł, treść, data itp. Jednak brakowało mi możliwości zarządzania wpisami tak bardziej 'z góry'.
Wymyśliłem klasę zarządzającą wpisami CNewsManager. Cała konstrukcja wydaje mi się o tyle korzystna (także pod względem wydajności), że do pobrania newsów wystarczy jedno zapytanie do bazy danych. Przejdźmy do kodu.

Klasa CNewsManager:
  1. class CNewsManager
  2. {
  3. private $aNewsBuffer = array(); // Bufor newsów
  4.  
  5. private $sTable; // Nazwa tabelki
  6. private $pdo; // Baza danych
  7.  
  8. public function __construct($pdo, $sTable)
  9. {
  10. $this->sTable = $sTable;
  11. $this->pdo = $pdo;
  12. }
  13.  
  14. /* Funkcja tworzą nowy wpis, zawartość rozszerzona pobierana jest opcjonalnie */
  15. public function createNews($title, $content, $exContent = NULL)
  16. {
  17. if($title !== NULL && $content !== NULL)
  18. {
  19. if($exContent !== NULL)
  20. {
  21. $oNew = new CNews($this->pdo, $this->sTable, NULL, $title, $content, NULL, $exContent);
  22. $oNew->upload();
  23. return $oNew;
  24. } else {
  25. $oNew = new CNews($this->pdo, $this->sTable, NULL, $title, $content, NULL);
  26. $oNew->upload();
  27. return $oNew;
  28. }
  29. } else return false;
  30. }
  31.  
  32. /* Funkcja ładująca wpisy do buffera newsów. Jeżeli nie podano id począštkowego i końcowego,
  33. zapytanie pobiera wszystkie rekordy z tabelki. ZAPYTANIE DO BAZY! */
  34. public function load($idStart = NULL, $idLimit = NULL)
  35. {
  36. if($idStart !== NULL && $idLimit !== NULL)
  37. {
  38. foreach($this->pdo->query('SELECT * FROM `'.$this->sTable.'` ORDER BY id DESC LIMIT '.$idStart.', '.$idLimit) as $row)
  39. {
  40. $this->aNewsBuffer[$row['id']] = $row;
  41. }
  42. return $this;
  43.  
  44. } else {
  45.  
  46. foreach($this->pdo->query('SELECT * FROM `'.$this->sTable.'`') as $row)
  47. {
  48. $this->aNewsBuffer[$row['id']] = $row;
  49. }
  50. return $this;
  51. }
  52. }
  53.  
  54. /* Funkcja opróżniająca buffer newsów */
  55. public function clearNewsBuffer()
  56. {
  57. for($i=0, $j=count($this->aNewsBuffer); $i < $j; ++$i)
  58. {
  59. $this->aNewsBuffer[$i] = NULL;
  60. }
  61. return $this;
  62. }
  63.  
  64. // Funkcja pobierająca obiekt newsa na podstawie podanego ID. Obiekt pobierany jest z bufora newsów.
  65. public function selectNews($nId)
  66. {
  67. if(isset($this->aNewsBuffer[$nId]))
  68. {
  69. $aNews = $this->aNewsBuffer[$nId];
  70. if($aNews['ex_tresc'] !== NULL)
  71. {
  72. $oNews = new CNews($this->pdo, $this->sTable, $aNews['id'] , $aNews['tytul'], $aNews['tresc'], $aNews['data'], $aNews['ex_tresc']);
  73. return $oNews;
  74. } else {
  75. $oNews = new CNews($this->pdo, $this->sTable, $aNews['id'] , $aNews['tytul'], $aNews['tresc'], $aNews['data']);
  76. return $oNews;
  77. }
  78. } else return false;
  79. }
  80.  
  81. /* Wyrenderowanie wszystkich wpisów zawartych w bufferze */
  82. public function showAll()
  83. {
  84. for($i=1, $j=count($this->aNewsBuffer); $i<$j; ++$i)
  85. {
  86. if($this->aNewsBuffer[$i] !== NULL)
  87. {
  88. if($this->aNewsBuffer[$i]['ex_tresc'] !== NULL)
  89. {
  90. $oNews = new CNews($this->pdo, $this->sTable, $this->aNewsBuffer[$i]['id'], $this->aNewsBuffer[$i]['tytul'], $this->aNewsBuffer[$i]['tresc'], $this->aNewsBuffer[$i]['data'], $this->aNewsBuffer[$i]['ex_tresc']);
  91. $oNews->show();
  92. } else {
  93. $oNews = new CNews($this->pdo, $this->sTable, $this->aNewsBuffer[$i]['id'], $this->aNewsBuffer[$i]['tytul'], $this->aNewsBuffer[$i]['tresc'], $this->aNewsBuffer[$i]['data']);
  94. $oNews->show();
  95. }
  96. }
  97. }
  98. return $this;
  99. }
  100.  
  101. }


Klasa CNews:

  1. class CNews
  2. {
  3. private $id; // ID wpisu
  4. private $date; // Data
  5. private $title; // Tytuł
  6. private $content; // Zawartość podstawowa
  7. private $exContent; // Zawartość rozszerzona
  8. private $author; // Autor wpisu
  9.  
  10. private $table;
  11. private $datebase; // Baza danych (PHP Data Objects)
  12.  
  13. /* Konstruktor klasy wpisu. OPTYMALIZACJA! */
  14. public function __construct($datebase, $sTable, $nId, $strTitle, $strContent, $date, $strExContent = NULL)
  15. {
  16. $this->datebase = $datebase;
  17. if ($strTitle !== NULL && $strContent !== NULL && $sTable !== NULL)
  18. {
  19. $nId === NULL ? $this->id = NULL : $this->id = $nId;
  20. $date === NULL ? $this->date = date('d.m.Y, H:i') : $this->date = $date;
  21. $this->title = $strTitle;
  22. $this->content = $strContent;
  23. $this->table = $sTable;
  24. $strExContent === NULL ? $this->exContent = NULL : $this->exContent = $strExContent;
  25. /* Jeszcze autor */
  26. return true;
  27. } else return false;
  28.  
  29. }
  30.  
  31. public function edit($strTitle, $strContent, $strExContent = NULL)
  32. {
  33. if($strTitle !== NULL && $strContent !== NULL)
  34. {
  35. $this->title = $strTitle;
  36. $this->content = $strContent;
  37. if($strExContent !== NULL)
  38. $this->exContent = $strExContent;
  39. } else return false;
  40. }
  41.  
  42. /* Funkcja aktualizująca wpis w bazie danych.
  43. Zależnie od statusu news jest tworzony lub uaktualniany.
  44. ZAPYTANIE DO BAZY! */
  45. public function upload()
  46. {
  47. if($this->title !== NULL && $this->content !== NULL && $this->table !== NULL)
  48. {
  49. if($this->id !== NULL)
  50. {
  51. $this->datebase->exec("UPDATE ".$this->table." SET tytul='".$this->title."', tresc='".$this->content."', ex_tresc='".$this->exContent."' WHERE id='".$this->id."'");
  52. return true;
  53. } else {
  54. $this->datebase->exec("INSERT INTO ".$this->table." VALUES(0,'".$this->title."','".$this->content."', '".$this->exContent."', '".$this->date."', '".$this->author."')");
  55. return true;
  56. }
  57. } else return false;
  58. }
  59.  
  60. public function delete()
  61. {
  62. if($this->id !== NULL)
  63. $this->datebase->exec("DELETE FROM ".$this->table." WHERE id='".$this->id."'");
  64. }
  65.  
  66. /* Funkcja pobierająca tytuł */
  67. public function getTitle()
  68. {
  69. return ($this->title !== NULL ? $this->title : false);
  70. }
  71.  
  72. /* Funkcja pobierająca zawartość podstawowąš */
  73. public function getContent()
  74. {
  75. return ($this->content !== NULL ? $this->content : false);
  76. }
  77.  
  78. public function getExContent()
  79. {
  80. return ($this->exContent !== NULL ? $this->exContent : false);
  81. }
  82.  
  83. public function show()
  84. {
  85. echo '<tr>
  86. <td><h2>'. $this->title .'</h2>
  87. <span>'. $this->date .'</span>
  88. </td>
  89. </tr>';
  90. if($this->exContent === NULL)
  91. echo '
  92. <tr>
  93. <td colspan="2"><div class="wiadomosc">'. $this->content .'</div></td>
  94. </tr>';
  95. else
  96. echo '<tr>
  97. <td colspan="2"><div class="wiadomosc">'. $this->content .'<div style=" float: right; margin-right: 35px; margin-top: 15px;"><a href="?home=home&amp;more='.$this->id.'">Czytaj więcej...</a></div></div></td>
  98. </tr>';
  99. }
  100.  
  101. public function show_ex()
  102. {
  103. echo '<tr>
  104. <td><h2>'. $this->title .'</h2>
  105. <span>'. $this->date .'</span>
  106. </td>
  107. </tr>
  108. <tr>
  109. <td colspan="2"><div class="wiadomosc">'. $this->exContent .'</div></td>
  110. </tr>';
  111. }
  112. }


Tutaj pojawia się moje pytanie: czy koniecznością jest przekazywanie takiej ilości parametrów do konstruktora CNews?
Chciałbym także poznać wasze opinie co do budowy i mojego sposobu myślenia w tym przypadku. Chętnie dowiem się jakie rozwiązania proponujecie oraz jakie porady macie dla mnie co do pisania kodu.

Teraz skrawek kodu przykładowego:

  1. $pdo = new PDO('mysql:host=localhost;dbname=newsy', 'root', '');
  2.  
  3. $NewsManager = new CNewsManager($pdo, 'news');
  4. $NewsManager->load(1,11);
  5. $NewsManager->selectNews(5)->show();


Pozdrawiam

Jakieś propozycje?

PS. Nie wiem czy temat umieściłem w odpowiednim dziale, w razie problemów proszę moderatora o przeniesienie.

Już niedługo dodam także klasę komentarzy.

Pozdrawiam
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
thek
post
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Powiem tak... Niemal większość rzeczy w Twoim managerze powinna być implementowana przez CNews (IMG:style_emoticons/default/wink.gif)
CreateNews - to tylko opakowanie tworzenia newsa, na dodatek extendedContent powinna sama klasa CNews wyłapać, a nie, że różne konstruktory wywołujesz. Konstruktor i tak sprawdza czy tam jest jakaś wartość, więc nawet jeśli wywołasz ją w klasie nadzorczej to i tak konstruktor będzie sprawdzał, czy ona jest. Bo tak konstruktor napisałeś.

Load - za ładowanie całej tabeli w przypadku braku początku i końca, to za jaja by Cię trzeba było powiesić (IMG:style_emoticons/default/wink.gif) W takiej sytuacji powinieneś ładować ostatnich X newsów. To co chcesz robić to tylko na desktopie, gdzie masz taki obiekt cały czas w pamięci, a nie, że tworzony za każdym razem od nowa z każdym żądaniem! To wstęp do paginacji. Inna sprawa, że powinieneś się tam zastanowić nad sensem przeciążenia metody load() lub stworzenie kilku wariantywnych:
loadSingle - ładuje jeden wybrany,
loadRange - ładuje zakres od-do po id lub kolejności w bazie danych - Twój wybór,
loadDefault - ładuje X ostatnich,
loadChosen - ładuje wybrane przez użytkownika.

ClearNewsBuffer - po co pętla? $this->$aNewsBuffer = array(); i pozamiatane

SelectNews - pisałem wyżej o load...

ShowAll - znowu extendedContent rozróżniane jak w CreateNews, grrrrr... Poza tym "dziedziczy" ona błąd klasy CNews... Mieszanie modelu z widokiem. Od kiedy model na pałę wartości wali w kod HTML? A to robi CNews->show()

Poza tym gratuluję pomysłu "chainingu"... SelectNews( nieistniejąceId )-> show();
Jak zrobisz show() na wartości false?

Ja już nawet nie ruszam tematu: "Chłopaki... Nie możemy użyć RDBMS. Musimy przejść na pliki XML jako formę przechowania danych." i jedno wielkie "K..wa mać! Framework tego nie przewiduje!"
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: 16.10.2025 - 03:52