[ peromalosutra @ 17.03.2011. 19:23 ] @
Imam veoma cudan problem pa me zanima moze li mi iko razjasniti situaciju na koju sam naisao, jer ja nemam logicnog objasnjenja.

Dakle trebam da modifikujem jednu Joomla komponentu, com_rapidrecipies, tacnije samo jedan njen view (viewrecipe). U "kontroleru" funkcije nalazim case koji se odnosi na view koji zelim da mijenjam:

Code:

case 'viewrecipe':
    $recipe_id = trim(intval( JRequest::getVar('recipe_id', "" )) );
    rr_runSQL("UPDATE #__rr_recipes SET hits = hits+1 WHERE  recipe_id=" . mysql_escape_string($recipe_id));
    rr_EchoOneRecipe($recipe_id);    
    break;    


Vidim da se poziva funkcija rr_EchoOneRecipe i super, to je ono sto meni treba. Medjutim sad dolazi zanimljv dio. Ove funkcije nema nigdje na serveru! :)
Tj. negdje naravno mora biti cim se uredno poziva i ispisuje kod, ali grep pretraga cijele joomla instalacije ne nalazi nikakav rezultat:
Code:

$ egrep "function.*rr_EchoOneRecipe" -R .


Da bih bio 100% siguran da se upravo taj gorenavedeni case izvrsava, uradio sam malo printf debugovanja sa:

Code:

case 'viewrecipe':
    $recipe_id = trim(intval( JRequest::getVar('recipe_id', "" )) );
    rr_runSQL("UPDATE #__rr_recipes SET hits = hits+1 WHERE  recipe_id=" . mysql_escape_string($recipe_id));
    echo 'calling function';
    rr_EchoOneRecipe($recipe_id);    
    echo 'function ended';
    break;    


I ovaj tekst se ispise uredno. Takodje, pretragom prema HTML kodu koji funkcija rr_EchoOneRecipe generise sam nasao funkciju pod imenom "showRecipe1" i ispostavilo se da se ova funkcija zapravo poziva umjesto rr_EchoOneRecipe.

Dakle, pozove se rr_EchoOneRecipe, a izvrsi se showRecipe1. Moze li mi neko reci sta propustam i kako je ovo moguce? Vjerovatno propustam nesto veoma ocigledno, ali u ovom trenutku mi nista ne pada na pamet.

Pozdrav,

Ivan
[ VladaSu @ 18.03.2011. 00:37 ] @
Nazivi funkcija u php-u su case insensitive

Mozda za grep treba nesto kao:
Code:

$ egrep "function.rr_EchoOneRecipe" -R -i.


Kako si siguran da se showRecipe1 izvrsava umesto rr_EchoOneRecipe?
Verovatno rr_EchoOneRecipe unutar sebe poziva showRecipe1 a ne umesto. Mislim da to nije moguce.
Ako je tako onda mozes da nadjes gde se sve poziva showRecipe1 koji tebi treba.
A kada to nadjes onda ces znati sta dalje ...

Moguc je ovakav neki kod, mada je glupo:
Code (php):

$prefix = 'rr_';
eval('function '.$prefix.'EchoOneReciPE($id) { echo $id; }');
rr_EchoOneRecipe(1);
 


pa u grep rr_ zamenis sa * ili sta vec ...