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

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: 4.10.2025 - 17:13