Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Dzielenie kodu na części
Forum PHP.pl > Forum > Przedszkole
Dual Jack
Witam!
Pracuję w PHP od ponad roku i dopiero niedawno ujrzałem potrzebę dzielenia kodu na części, aby był bardziej zrozumiały.

Mój problem polega na tym, że potrzebuję wykorzystywać bardzo duże partie kodu PHP w layoucie strony, wykonanej w HTML.

Moja witryna składa się z ogromnych ilości plików( każdy plik jest osobną aplikacją do czegoś), tak jak blog jest właśnie includowany do istniejącej strony.

Kawałek pliku blog.php:

  1. <table cellspacing="0" class="blog-notepad">
  2. <tr>
  3. <td class="blog-notepad-left">
  4.  
  5. </td>
  6. <td class="blog-notepad-middle">
  7.  
  8. <?php blog_entry();?>
  9.  
  10. </td>
  11. <td class="blog-notepad-right">
  12.  
  13. <?php blog_panel();?>
  14.  
  15. </td>
  16. </tr>
  17. <tr>
  18. <td class="blog-notepad-bottom-1">
  19.  
  20. </td>
  21. <td class="blog-notepad-bottom-2">
  22.  
  23. <?php blog_navi();?>
  24.  
  25. </td>
  26. <td class="blog-notepad-bottom-3">
  27.  
  28. </td>
  29. </tr>
  30.  
  31. .... reszta kodu PHP
  32.  



Jak widać, layout jest zbudowany z tabelki, a w poszczególne komórki wstawiam funkcje, które są napisane poniżej tabelki.

Problem w tym, że funkcje są mało relatywne z sobą... Wykonują tylko jakąś czynność, a nie mogą ze sobą współgrać.




Pytanie:

W jaki sposób mógłbym zawrzeć kod PHP w bloku i wywoływać go w określonym miejscu, tak, aby wszystkie zmienne ze sobą współgrały.

Innymi słowy chodzi mi o coś, w stylu "include", ale nie z pliku, tylko z tej samej partii kodu.



-- kod 1 --
blah blah blach... duuużo kodu
-- / kod 1 --



Jakiś HTML >

-- wstaw kod 1 --

Jakiś HTML >
Rysh
Proponowałbym Ci zaprzyjaźnić się z systemem szablonów lub od razu całym frameworkiem. Na początku troszeczkę topornie ta wiedza wchodzi (przynajmniej tak było w moim przypadku), ale jak już się załapie, to praca staję się o wiele bardziej przyjemna.

Kod php jest oddzielony od kodu html.
7furik7
mvc?

zaczynasz od tego:
http://www.youtube.com/watch?v=Aw28-krO7ZM
i lecisz do part 10 wink.gif
Dual Jack
Dobra, widzę, że chyba się nie zrozumieliśmy wink.gif

Nie mam zamiaru uczyć się na nowo PHP.


Napisałem taki oto system bloga:

  1. <div class="major-container rounded-5px" style="width:590px; float:left;">
  2.  
  3. <?php
  4.  
  5. require_once('elements/functions/month_id_to_name.php'); // Id miesiąca do nazwy
  6.  
  7. if(!isset($_GET['p']) && !isset($_GET['c'])) { // ####################
  8.  
  9. // Znajduje najświeższy rok i id miesiąca w którym dodano jakiś post na blog'u
  10. $query = "SELECT MAX(entry_month_id), entry_year FROM blog WHERE
  11. entry_year IN (SELECT MAX(entry_year) FROM blog) ";
  12. $result = mysql_query($query) or die(mysql_error());
  13. $row = mysql_fetch_array($result);
  14.  
  15. // jeśli nie jest określony miesiąc i rok (w adresie) w których
  16. // dodano najświeższy post na blogu, określ domyślne za pomocą zmiennych
  17. // wynikowych z funkcji powyżej.
  18. if(!isset($_GET['month']) or !isset($_GET['year']))
  19. { $month = $row[0];
  20. $year = $row[entry_year];
  21. // jeśli zmienne są w adresie
  22. ;} else {
  23. $month = $_GET['month']; # zmienna z adresu
  24. $year = $_GET['year']; # zmienna z adresu
  25. }
  26.  
  27. // Pobierz dane z tabeli
  28. $query = "SELECT * FROM blog WHERE entry_month_id = '".$month."' AND entry_year = '".$year."' ORDER BY entry_day DESC, entry_id DESC";
  29. // Wykonaj $query
  30. $results = mysql_query($query) or die(mysql_error());
  31.  
  32.  
  33. // Wykonaj pętlę dla wszystkich znalezionych wierszy
  34. // ( Stwórz jeden obiekt notatki z dnia )
  35. while($row = mysql_fetch_array($results)) {
  36. extract($row); // Wydziubdziaj mi tu zmienne z bazy danych biggrin.gif
  37. $entry_month = m($month); // Nazwa miesiąca
  38.  
  39. // Pobierz info o kategorii
  40. $result = mysql_query("SELECT cat_title , cat_color FROM categories WHERE cat_id = $entry_cat ");
  41.  
  42. // Wykonaj post wpis dla każdego wiersza z tabeli
  43. echo <<<ENTRY
  44. <div style="position:relative;">
  45. <div $admin_yes id="blog_post_edit" class="rounded-5px">
  46. <a href="?id=blog_post_remove&menu=small&ent_id=$entry_id">usuń</a>
  47. /
  48. <a href="?id=blog_post_update&menu=small&ent_id=$entry_id">edytuj</a>
  49. </div>
  50.  
  51. ... i tak dalej ....
  52.  
  53. </div>





A teraz stwierdziłem, że wygodniej pracowałoby mi się, gdybym miał poszczególne partie kodu PHP w osobnych sekcjach, ale już nie w plikach, ponieważ mam ich za dużo.


Staram się przerobić mój kod na coś w stylu:

  1. <table cellspacing="0" class="blog-notepad">
  2. <tr>
  3. <td class="blog-notepad-left">
  4.  
  5. </td>
  6. <td class="blog-notepad-middle">
  7.  
  8. <?php blog_entry();?>
  9.  
  10. </td>
  11. <td class="blog-notepad-right">
  12.  
  13. <?php blog_panel();?>
  14.  
  15. </td>
  16. </tr>
  17. <tr>
  18. <td class="blog-notepad-bottom-1">
  19.  
  20. </td>
  21. <td class="blog-notepad-bottom-2">
  22.  
  23. <?php blog_navi();?>
  24.  
  25. </td>
  26. <td class="blog-notepad-bottom-3">
  27.  
  28. </td>
  29. </tr>
  30. </table>
  31.  
  32.  
  33. <?php
  34.  
  35. function blog_entry(){
  36.  
  37. global $admin_yes, $admin_no, $a_y, $a_n; // bierz zmienne z poza funkcji
  38.  
  39. // Znajduje najświeższy rok i id miesiąca w którym dodano jakiś post na blog'u
  40. $query = "SELECT MAX(entry_month_id), entry_year FROM blog WHERE
  41. entry_year IN (SELECT MAX(entry_year) FROM blog) ";
  42. $result = mysql_query($query) or die(mysql_error());
  43. $row = mysql_fetch_array($result);
  44.  
  45. // jeśli nie jest określony miesiąc i rok (w adresie) w których
  46. // dodano najświeższy post na blogu, określ domyślne za pomocą zmiennych
  47. // wynikowych z funkcji powyżej.
  48. if(!isset($_GET['month']) or !isset($_GET['year']))
  49. {
  50. $month = $row[0];
  51. $year = $row[entry_year];
  52. // jeśli zmienne są w adresie
  53. }
  54. else
  55. {
  56. $month = $_GET['month']; # zmienna z adresu
  57. $year = $_GET['year']; # zmienna z adresu
  58. }
  59.  
  60. if(isset($_GET['p'])) // Rodzaj pobierania danych ( cały miesiąc, czy tylko jeden post )
  61. {
  62. // Pobierz dane z tabeli
  63. $query = "SELECT * FROM blog WHERE entry_id = '".$_GET['p']."' ";
  64. // Wykonuj $query
  65. $results = mysql_query($query) or die(mysql_error());
  66. }
  67. else
  68. {
  69. // Pobierz dane z tabeli
  70. $query = "SELECT * FROM blog WHERE entry_month_id = '".$month."' AND entry_year = '".$year."' ORDER BY entry_day DESC, entry_id DESC";
  71. // Wykonaj $query
  72. $results = mysql_query($query) or die(mysql_error());
  73. }
  74.  
  75.  
  76. // Wykonaj pętlę dla wszystkich znalezionych wierszy
  77. // ( Stwórz jeden obiekt notatki z dnia )
  78. while($row = mysql_fetch_array($results)) {
  79. extract($row); // Wydziubdziaj mi tu zmienne z bazy danych biggrin.gif
  80. $entry_month = m($entry_month_id); // Nazwa miesiąca
  81.  
  82. // Pobierz info o kategorii
  83. $result = mysql_query("SELECT cat_title , cat_color FROM categories WHERE cat_id = $entry_cat ");
  84.  
  85.  
  86. echo <<<EBC
  87. <div class="blog-notepad-entry">
  88. <div class="header">
  89. <div class="day rounded-5px">
  90. <span style="font-size:12px;font-weight:bold">
  91. $entry_day
  92. </span>
  93. <span style="font-size:12px">
  94. $entry_month
  95. </span>
  96. <span style="font-size:12px">
  97. $entry_year
  98. </span>
  99. </div>
  100.  
  101. <div class="category">
  102. kategoria:
  103. <img src="elements/images/cat.png" width="10" height="10" style="background-color:$cat_color;dislay:inline;">
  104. <a href="?c=$entry_cat" style="color:black;">$cat_title</a>
  105. </div>
  106.  
  107. ..... i tak dalej .....
  108.  
  109. ?>
  110.  




Tylko, że tworząc funkcje, tworzone w nich zmienne nie wychodzą an zewnątrz, a nie chcę się bawić w "return" i ładowanie zwróconych argumentów do kolejnych funkcji ( function zjedz_ciastko(jeden,dwa,trzy){} ).

Potrzebuję ładnego rozwiązania do umieszczania kodu w obiektach i ładowanie ich w dane miejsce.
Damonsson
Cytat
Nie mam zamiaru uczyć się na nowo PHP.

Cytat
Potrzebuję ładnego rozwiązania do umieszczania kodu w obiektach i ładowanie ich w dane miejsce.


Te 2 zdania nie mogą ze sobą współżyć, przykro mi wink.gif
Dual Jack
Tak, wiem, brzmi to jak paradoks, ale nie wiem, w jaki sposób wytłumaczyć Wam, że nie widzę potrzeby oglądania całych poradników o tworzeniu aplikacji w PHP, napotykając tylko jeden, nieestetyczny problem.

Nie wierzę, że nie ma możliwości importowania kodu w inne miejsce, jak tylko korzystając z funkcji include, require, etc.

Musi być na to jakiś sposób.
Damonsson
Możesz stworzyć może jakiś autoloader(słowo klucz do google) itp, ale robienie tego w twoim kodzie, to trochę jak rzeźbienie sam wiesz w czym. Z drugiej strony przepisywać to na obiektowo, to też nie lada wyczyn, dla kogoś kto pisze strukturalnie.
Dual Jack
Cóż, chyba pozostaje mi includowanie tych kawałków kodu z zewnętrznych plików.

Najwyżej utonę w dużej ilości plików i folderów.

Chciałem się od tego ustrzec, ponieważ moim zdaniem ciężko pracuje się na kilkunastu otwartych jednocześnie dokumentach, a mówiąc młodzieżowo: nie ogarniam programowania obiektowego w PHP. Jest dla mnie za trudne, jak na moje zapotrzebowania, co do programowania w tym języku.


Dziękuję za wszystkie odpowiedzi i zainteresowanie się tematem.
Pozdrawiam!

7furik7
Cytat
Pracuję w PHP od ponad roku i dopiero niedawno ujrzałem potrzebę dzielenia kodu na części, aby był bardziej zrozumiały.

1. myślałem że sie uczysz php na tym przykladzie. kolejnym krokiem byłoby wg mnie obiektowka i własnie mvc.
2. nie mówi się że coś jest za trudne. Nigdy biggrin.gif

pzdr smile.gif

Dual Jack
Cytat
myślałem że sie uczysz php na tym przykladzie. kolejnym krokiem byłoby wg mnie obiektowka i własnie mvc.


Nie, nie, programować potrafię już od dawna, a aplikacja jest napisana przeze mnie w całości, tylko wstyd jest mi się przyznać, że właśnie odpuściłem naukę obiektowego programowania i myślałem, że jest na to jakieś inne, estetyczne rozwiązanie.

Coś jak kod zamknięty w kapsułce, którą mogę otworzyć w dowolnym miejscu. Coś jak funkcja "include", ale z wykorzystaniem kodu z tego samego pliku, a nie z zewnątrz. Coś jak skrót, który pozwoli mi na utrzymanie większego porządku w kodzie.

Nie chcę mieszać html'a z php w jednej sekcji, jak tutaj:

<div>
<div>tekst tekst tekst</div>
<div>

<?php --- BARDZO obszerny kod PHP ?>
</div>
</div>




Wolałbym tak:

<div>
<div>tekst tekst tekst</div>
<div>

<?php <- wklej tutaj kod nr. 1 ?>
</div>
</div>


<?php

kod nr. 1 {

--- BARDZO obszerny kod PHP

}


?>
CuteOne
Rozdziel kod na wykonywalny (czysty PHP) i statyczny - szablony HTML

np. za pomocą SMARTY
  1. {foreach from=$rows item=item}
  2. <tr>
  3. <td>{$item.title}</td>
  4. <td>{$item.text}</td>
  5. </tr>

  1. $query = mysql_query("SELECT `title`, `text` FROM tabela WHERE x = 1");
  2.  
  3. $array = array();
  4. while($row = mysql_fetch_array($query)) {
  5.  
  6. $array[] = $row;
  7. }
  8.  
  9. $smarty -> assign('rows', $array);


Chociaż i to rozwiązanie ma wiele wad, o których przekonasz się podczas próby edycji czegokolwiek smile.gif
Posio
ja nie wiem, dlaczego nie chcesz ogarnąć jakiegos FW ? myślę, że powinno to rozwiązać wszystkie twoje problemy z kodem.
!*!
Dual Jack - to jest właśnie ta chwila w której musisz podjąć decyzję, czy uczysz się OOP, czy olewasz PHP i zostajesz z tym co masz bez możliwości rozwoju.
Jak wybierzesz wariant pierwszy, to może skorzystaj z http://ellislab.com/codeigniter jest banalny do zrozumienia.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.