buzlee buzlee - 3 months ago 11
PHP Question

PHP how to render function from layout in MVC pattern?

I've a code with im working for.

class View
{
public $model;
public $function;
public $content;

public function __construct( $model )
{
$this->model = $model;
$this->templateLoader( get_class( $this->model ));
}

public function templateLoader( $model )
{
$template = "View/Layout/" . $model . ".tpl";

if ( file_exists( $template ))
{
$this->getContent( $template );
$this->searchForTags();
$this->runFunction();
}
}

public function getContent( $template )
{
$this->content = file_get_contents( $template );
}

public function searchForTags()
{
$start = strpos( $this->content, '<%')+strlen('<%');
$end = strpos( $this->content, '%>');
$part = $end - $start;

if ( $part > 0)
$this->function = substr($this->content, $start, $part);
}

public function runFunction()
{
if ( $this->function )
{
var_dump( $this->model->{$this->function} );
}
}
}


This class load my template regarding classname. In the template if i have function
example:

<td class="right error"> <% getLoginValidatorMsg() %></td>


i want to run it and replace into the value before it shows in my template. Somehow i cant run above function. Error:

Notice: Undefined property: LoginForm::$ getLoginValidatorMsg() in /media/htdocs/ver1/loginmanager/init/View.php on line 54


If i try to run:

$this->model->getLoginValidatorMsg();


will return me the value what i looking for.

Answer

It appears from the error you have a space between $ and getLoginValidatorMsg so you need to remove that space using a correctly placed trim() or just str_replace() on the whole thing. Also, it is saying it's looking for a property so you need to add () on your $this->model->{$this->function} so it turns it to a method:

$this->model->{$this->function}();

Alternatively, you can use call_user_func() / call_user_func_array().

Comments