Search code examples
phpcontent-management-systemevalmodxmodx-evolution

Modx Evo with PHP 5.4 and eval


Got a bit of an issue with Modx and latest version of PHP.

It's a very old version of Modx (don't ask - I have exactly the same thoughts, wasn't in my control). The site is working fine on PHP 5.2.

The problem is the web host is upgrading to PHP 5.4 - as a result the site breaks completely. The one issue I can't get a solution for is the use of eval within manager/includes/document.parser.class.inc.php under "evalSnippet()" function where it calls depreciated eval() function.

I've looked at possibliity of upgrading Modx to latest which is 1.0.9, however this still uses eval() -> even though it explicity states this version supports PHP 5.4. Below is the code:

function evalSnippet($snippet, $params) {
    $etomite= $modx= & $this;

    $modx->event->params= & $params; // store params inside event object
    if (is_array($params)) {
        extract($params, EXTR_SKIP);
    }
    ob_start();
    $snip= eval ($snippet);
    $msg= ob_get_contents();
    ob_end_clean();
    if ((0<$this->config['error_reporting']) && isset($php_errormsg))
    {
        $error_info = error_get_last();
        if($error_info['type']===2048 || $error_info['type']===8192) $error_type = 2;
        else                                                         $error_type = 3;
        if(1<$this->config['error_reporting'] || 2<$error_type)
        {
            extract($error_info);
            if($msg===false) $msg = 'ob_get_contents() error';
            $result = $this->messageQuit('PHP Parse Error', '', true, $type, $file, 'Snippet', $text, $line, $msg);
            if ($this->isBackend())
            {
                $this->event->alert("An error occurred while loading. Please see the event log for more information<p>{$msg}{$snip}</p>");
            }
        }
    }
    unset ($modx->event->params);
    return $msg . $snip;
}

Is there away around this? Has anyone managed to get Modx Evo working with PHP 5.4?


Solution

  • Continued from comments on original post...

    session_is_registered() is deprecated as of PHP 5.3. You'll need to check through your snippets and find out which one is using this function, then replace it with isset($_SESSION['name_of_variable']).

    Quickest way to find it would be to run a %LIKE% search in phpMyAdmin for session_is_registered on the modx_site_snippets table