ugrás a tartalomhoz

Metódus html tartalma változóba heredoc-kal

bnc1995 · 2018. Aug. 15. (Sze), 12.47
Sziasztok!

A következő problémához szeretném a segítségeteket kérni.

Adott egy osztály, benne egy metódus. (Ez tulajdonképpen lehetne egy egyszerű függvény is.) Ebben a metódusban benne van a weboldalam html tartalmának egy része, melyet megelőz egy kis feldolgozás/számolgatás.
  1. class MyPage {  
  2.     public function printContent(){  
  3.         /* 
  4.           egy kis feldolgozás/számolgatás 
  5.         */  
  6.   
  7.         ?>  
  8.         <div>  
  9.         itt van a html tartalom benne az előbb feldolgozott dinamikus tartalommal  
  10.         ...  
  11.         </div>  
  12.         <?php  
  13.     }  
  14. }  
A printContent() metódus semmi meglepőt nem tartalmaz, szépen le is fut, amikor meghívom. Na most egy olyat szeretnék elérni, hogy a printContent() metódus "tartalmát" ne írjuk ki, mikor lefut, hanem tegyük bele egy változóba. Erre interneten a heredoc syntax-ot ajánlották, de nekem valamiért nem akar működni. Az alábbi kódot használom.
  1. $mypage = new MyPage();  
  2.   
  3. $page = <<<PAG  
  4. {$mypage->printContent()}  
  5. PAG;  
A kód hiba nélkül lefut, de nem teszi bele a változóba, hanem mintha a heredoc ott se volna, kiírja a metódus tartalmát. Valószínűleg a megoldás pofonegyszerű, csak én még nem találtam meg.

Segítségeteket előre is köszönöm.

Bence
 
1

Istenem de utálom ezt a retek

inf · 2018. Aug. 15. (Sze), 13.27
Istenem de utálom ezt a retek nyelvet. :D

Elvileg így kell:
  1. function heredoc($param) {  
  2.     // just return whatever has been passed to us  
  3.     return $param;  
  4. }  
  5.   
  6. $heredoc = 'heredoc';  
  7.   
  8. $mypage = new MyPage();    
  9.         
  10. $page = <<<PAG    
  11. {$heredoc($mypage->printContent())}    
  12. PAG;  
de választhatod a PHP-hoz jobban illő módszert is :D
  1. $mypage = new MyPage();    
  2.         
  3. $page = <<<PAG    
  4. ${!${''} = $mypage->printContent()}    
  5. PAG;    
forrás: https://stackoverflow.com/questions/104516/calling-php-functions-within-heredoc-strings/10713298#10713298

szerk:

Na benéztem, a fenti arra jó, hogy ne kelljen minden használt függvény nevét változóba tenni. Tök másra megoldás. Amit akarsz, azt az osztályod módosítása nélkül max így tudnád megcsinálni:
  1. <?php  
  2.   
  3. function heredoc($cb) {  
  4.     ob_start();    
  5.     $result = $cb();  
  6.     $output = ob_get_clean();   
  7.     return $result . $output;  
  8. }  
  9.   
  10. $heredoc = 'heredoc';  
  11.   
  12. $mypage = new MyPage();  
  13.   
  14. $page = <<<HEREDOC  
  15. aa  
  16. {$heredoc(function (){global $mypage$mypage->printContent();})}  
  17. bb  
  18. HEREDOC;  
  19. echo $page;  
Ha nem akarsz templatezni, akkor én inkább valami ilyesmit javaslok, a heredocot meg jobb ha elfelejted:
  1. class MyPage {    
  2.     public function printContent(){    
  3.         /*  
  4.           egy kis feldolgozás/számolgatás  
  5.         */    
  6.     
  7.         ?>  
  8.         <div>    
  9.         itt van a html tartalom benne az előbb feldolgozott dinamikus tartalommal    
  10.         ...    
  11.         </div>    
  12.         <?php    
  13.     }    
  14.       
  15.     public function getContent(){  
  16.         ob_start();  
  17.         $this->printContent();  
  18.         return ob_get_clean();  
  19.     }  
  20. }  
  21.   
  22.   
  23. $mypage = new MyPage();  
  24. ?>  
  25. xxxx  
  26. <?php   
  27. $mypage->printContent();  
  28. ?>  
  29. vagy  
  30. <?php echo $mypage->getContent(); ?>  
  31. yyyy  
  32. <?php  
Esetleg érdemes lehet ezt a két metódust kitenni interface-be, ha minden oldalon megvannak, a getContent megvalósítását meg trait-be, vagy abstract class-be.
2

Output buffering

Endyl · 2018. Aug. 15. (Sze), 13.30
Nem tűnik túl jó ötletnek a HTML ilyenforma bekavarása egy osztályba. Ha valamiért mindenkép így szeretnéd csinálni, akkor ajánlom figyelmedbe az ob_*() - output buffering - függvényeket, különös tekintettel az ob_start() és ob_get_clean() függvényekre.

Például:
  1. $mypage = new MyPage();    
  2.   
  3. ob_start();  
  4. $mypage->printCotnent();  
  5. $page = ob_get_clean();  
A heredoc és társai azért nem működnek itt, mert azok a függvényed/metódusod visszatérési értékét helyettesítenék be a stringbe, viszont nálad nincs visszatérési érték, csak implicit print a megszakított php tagek által.

De szerintem jobban jársz, ha kiszervezed a html sablonjaidat külön fájlokba, amik jó esetben nem számolgatnak, csak előre meghatározott paramétereket tesznek bele a kimenetbe. Ennek a megsegítésére láttam talán még janoszen valamelyik blogján ezt a kis hasznos függvényt (vagy legalábbis ehhez hasonlót):
  1. function renderTemplate($tplFile$parameters = array()) {  
  2.     ob_start();  
  3.     extract($parameters);  
  4.     include($tplFile);  
  5.     return ob_get_clean();  
  6. }  
Így a $tplFile php fájlodban változókként lesznek elérhetőek a $parameters asszociatív tömb kulcsai a vonatkozó értékekkel.
3

Köszönöm a segítséget!

bnc1995 · 2018. Aug. 15. (Sze), 14.31
Alapvetően én is a templatek híve vagyok, de ebben az esetben egy kicsit eltértem a szokásostól. Ennek oka, hogy ez egy hirtelen felindulásból elkövetett kis adminisztrációs rendszer lesz egy projekt jellegű munkához. Maga az oldal max. negyed évig lesz használva aztán megy a kukába, esetleg valamikor elő lesz szedve, ha hasonló jellegű adminisztrációra lesz szükség.

Köszönöm a gyors segítséget!