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.

class MyPage {
    public function printContent(){
        /*
          egy kis feldolgozás/számolgatás
        */

        ?>
        <div>
        itt van a html tartalom benne az előbb feldolgozott dinamikus tartalommal
        ...
        </div>
        <?php
    }
}
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.

$mypage = new MyPage();

$page = <<<PAG
{$mypage->printContent()}
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:

function heredoc($param) {
    // just return whatever has been passed to us
    return $param;
}

$heredoc = 'heredoc';

$mypage = new MyPage();  
      
$page = <<<PAG  
{$heredoc($mypage->printContent())}  
PAG;
de választhatod a PHP-hoz jobban illő módszert is :D


$mypage = new MyPage();  
      
$page = <<<PAG  
${!${''} = $mypage->printContent()}  
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:
<?php

function heredoc($cb) {
	ob_start();  
	$result = $cb();
	$output = ob_get_clean(); 
    return $result . $output;
}

$heredoc = 'heredoc';

$mypage = new MyPage();

$page = <<<HEREDOC
aa
{$heredoc(function (){global $mypage; $mypage->printContent();})}
bb
HEREDOC;
echo $page;
Ha nem akarsz templatezni, akkor én inkább valami ilyesmit javaslok, a heredocot meg jobb ha elfelejted:

class MyPage {  
    public function printContent(){  
        /* 
          egy kis feldolgozás/számolgatás 
        */  
  
        ?>
        <div>  
        itt van a html tartalom benne az előbb feldolgozott dinamikus tartalommal  
        ...  
        </div>  
        <?php  
    }  
	
	public function getContent(){
		ob_start();
		$this->printContent();
		return ob_get_clean();
	}
}


$mypage = new MyPage();
?>
xxxx
<?php 
$mypage->printContent();
?>
vagy
<?php echo $mypage->getContent(); ?>
yyyy
<?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:

$mypage = new MyPage();  

ob_start();
$mypage->printCotnent();
$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):

function renderTemplate($tplFile, $parameters = array()) {
	ob_start();
	extract($parameters);
	include($tplFile);
	return ob_get_clean();
}
Í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!