On March 26, 2019 we launched new MODX Forums. Please join us at the new MODX Community Forums.
Subscribe: RSS
  • Hi there!
    For my current project, I do have a phpBB forum (latest version 3.0.7-PL1) and the content is now driven by MODx (1.0.4). I know that the SMF is working with MODx but because of having more than 8.000 registered users with a large amount of topics etc. I am not sure if converting is the best way. Anyway the phpBB offers a session handler which can be included via PHP so the userdata can be accessed, which works fine on my old site with static php-files. Now I try to integrate the session handling as a snippet named [[phpbbSession]] within MODx:

    <?php
    define('IN_PHPBB', true);
    $phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : 'forum/';
    $phpEx = substr(strrchr(__FILE__, '.'), 1);
    include_once($modx->config['base_path'] . $phpbb_root_path . 'common.' . $phpEx);
    
    // Start session management
    $user->session_begin();
    $auth->acl($user->data);
    $user->setup();
    ?>


    But now comes the problem, I get the following error while calling the snippet:

    « MODx Parse Error »
    MODx encountered the following error while attempting to parse the requested resource:
    « PHP Parse Error »

    PHP error debug
    Error: include_once(/srv/www/vhosts/mydomain.de/subdomains/v5/httpdocs/cms/forum/common.php(770) : eval()’d code): failed to open stream: Datei oder Verzeichnis nicht gefunden
    Error type/ Nr.: Warning - 2
    File: /srv/www/vhosts/mydomain.de/subdomains/v5/httpdocs/cms/manager/includes/document.parser.class.inc.php(770) : eval()’d code
    Line: 5

    MODx is installed in the subfolder /cms/, and phpBB is installed in the subfolder /cms/forum/. Did anyone successfully include the session handling in the past? I’m not sure what the problem is... undecided
      L.net Web Solutions
      Professional webdesign and development with MODX and WordPress.
    • Ok, something with the include path was wrong so I edited the code and replaced /forum/common.php just with a simple output and it works. Now I pasted the old code again into common.php and the include error doesn’t show up but instead I get a blank site ... huh

      My snippet looks like this now:

      <?php
      define('IN_PHPBB', true);
      $phpbb_root_path = './forum/';
      $phpEx = 'php';
      include_once($modx->config['base_path'] . 'forum/common.' . $phpEx);
      ?>
        L.net Web Solutions
        Professional webdesign and development with MODX and WordPress.
      • After hours of several attempts and searching nearly the whole web I found the solution in thread where someone has the same problem integrating the session into Textpattern. The problem is that the phpbb variables are inside the function/snippet but global variables created are out of scope. I just added a line of code and there we go - my phpBB session is now available in my MODx pages! Yeah!

        <?php
        global $phpbb_root_path, $phpEx, $user, $db, $config, $cache, $template;
        
        define('IN_PHPBB', true);
        $phpbb_root_path = './forum/';
        $phpEx = 'php';
        include_once($modx->config['base_path'] . 'forum/common.' . $phpEx);
        
        // Start session management
        $user->session_begin();
        $auth->acl($user->data);
        $user->setup();
        
        // just a quick output test
        $output = $user->data['username'];
        return $output;
        ?>


        I’d like to thank myself for finding the solution! grin
        I hope someone finds this helpful aswell.
          L.net Web Solutions
          Professional webdesign and development with MODX and WordPress.
        • Hi,

          I would also like to thank you for finding the solution.
          I will try to use your Code and build something similar for Revolution.
          Great job.

          Thanks

          LordRayden
          • Hey, there seem to be still some problems. When I change something in the code of the MODx template (doesn’t matter what) and visit the site the first time then I get a blank site again. After reloading the page it works fine until the template or snippet or whatever is changed again. I think there is a problem with the variables in my snippet and in the included common.php although I use global variables in the snippet. Hmmm ... I’ll keep trying but maybe someone has some ideas on that?!

            Edit:
            Maybe there is a conflict with the sessions of MODx and phpBB after including the common.php – but I’m not so deep into php to solve this. embarrassed
              L.net Web Solutions
              Professional webdesign and development with MODX and WordPress.
            • I still can’t get it work without the "blank page on first load" issue as descriped before. Maybe someone has an idea!? I’ll post the common.php file from phpBB which has to be included in order to use the session stuff:

              <?php
              /**
              *
              * @package phpBB3
              * @version $Id$
              * @copyright (c) 2005 phpBB Group
              * @license http://opensource.org/licenses/gpl-license.php GNU Public License
              *
              * Minimum Requirement: PHP 4.3.3
              */
              
              /**
              */
              if (!defined('IN_PHPBB'))
              {
              	exit;
              }
              
              $starttime = explode(' ', microtime());
              $starttime = $starttime[1] + $starttime[0];
              
              // Report all errors, except notices and deprecation messages
              if (!defined('E_DEPRECATED'))
              {
              	define('E_DEPRECATED', 8192);
              }
              error_reporting(E_ALL ^ E_NOTICE ^ E_DEPRECATED);
              
              /*
              * Remove variables created by register_globals from the global scope
              * Thanks to Matt Kavanagh
              */
              function deregister_globals()
              {
              	$not_unset = array(
              		'GLOBALS'	=> true,
              		'_GET'		=> true,
              		'_POST'		=> true,
              		'_COOKIE'	=> true,
              		'_REQUEST'	=> true,
              		'_SERVER'	=> true,
              		'_SESSION'	=> true,
              		'_ENV'		=> true,
              		'_FILES'	=> true,
              		'phpEx'		=> true,
              		'phpbb_root_path'	=> true
              	);
              
              	// Not only will array_merge and array_keys give a warning if
              	// a parameter is not an array, array_merge will actually fail.
              	// So we check if _SESSION has been initialised.
              	if (!isset($_SESSION) || !is_array($_SESSION))
              	{
              		$_SESSION = array();
              	}
              
              	// Merge all into one extremely huge array; unset this later
              	$input = array_merge(
              		array_keys($_GET),
              		array_keys($_POST),
              		array_keys($_COOKIE),
              		array_keys($_SERVER),
              		array_keys($_SESSION),
              		array_keys($_ENV),
              		array_keys($_FILES)
              	);
              
              	foreach ($input as $varname)
              	{
              		if (isset($not_unset[$varname]))
              		{
              			// Hacking attempt. No point in continuing unless it's a COOKIE
              			if ($varname !== 'GLOBALS' || isset($_GET['GLOBALS']) || isset($_POST['GLOBALS']) || isset($_SERVER['GLOBALS']) || isset($_SESSION['GLOBALS']) || isset($_ENV['GLOBALS']) || isset($_FILES['GLOBALS']))
              			{
              				exit;
              			}
              			else
              			{
              				$cookie = &$_COOKIE;
              				while (isset($cookie['GLOBALS']))
              				{
              					foreach ($cookie['GLOBALS'] as $registered_var => $value)
              					{
              						if (!isset($not_unset[$registered_var]))
              						{
              							unset($GLOBALS[$registered_var]);
              						}
              					}
              					$cookie = &$cookie['GLOBALS'];
              				}
              			}
              		}
              
              		unset($GLOBALS[$varname]);
              	}
              
              	unset($input);
              }
              
              // If we are on PHP >= 6.0.0 we do not need some code
              if (version_compare(PHP_VERSION, '6.0.0-dev', '>='))
              {
              	/**
              	* @ignore
              	*/
              	define('STRIP', false);
              }
              else
              {
              	@set_magic_quotes_runtime(0);
              
              	// Be paranoid with passed vars
              	if (@ini_get('register_globals') == '1' || strtolower(@ini_get('register_globals')) == 'on' || !function_exists('ini_get'))
              	{
              		deregister_globals();
              	}
              
              	define('STRIP', (get_magic_quotes_gpc()) ? true : false);
              }
              
              if (defined('IN_CRON'))
              {
              	$phpbb_root_path = dirname(__FILE__) . DIRECTORY_SEPARATOR;
              }
              
              if (!file_exists($phpbb_root_path . 'config.' . $phpEx))
              {
              	die("<p>The config.$phpEx file could not be found.</p><p><a href=\"{$phpbb_root_path}install/index.$phpEx\">Click here to install phpBB</a></p>");
              }
              
              require($phpbb_root_path . 'config.' . $phpEx);
              
              if (!defined('PHPBB_INSTALLED'))
              {
              	// Redirect the user to the installer
              	// We have to generate a full HTTP/1.1 header here since we can't guarantee to have any of the information
              	// available as used by the redirect function
              	$server_name = (!empty($_SERVER['HTTP_HOST'])) ? strtolower($_SERVER['HTTP_HOST']) : ((!empty($_SERVER['SERVER_NAME'])) ? $_SERVER['SERVER_NAME'] : getenv('SERVER_NAME'));
              	$server_port = (!empty($_SERVER['SERVER_PORT'])) ? (int) $_SERVER['SERVER_PORT'] : (int) getenv('SERVER_PORT');
              	$secure = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 1 : 0;
              
              	$script_name = (!empty($_SERVER['PHP_SELF'])) ? $_SERVER['PHP_SELF'] : getenv('PHP_SELF');
              	if (!$script_name)
              	{
              		$script_name = (!empty($_SERVER['REQUEST_URI'])) ? $_SERVER['REQUEST_URI'] : getenv('REQUEST_URI');
              	}
              
              	// Replace any number of consecutive backslashes and/or slashes with a single slash
              	// (could happen on some proxy setups and/or Windows servers)
              	$script_path = trim(dirname($script_name)) . '/install/index.' . $phpEx;
              	$script_path = preg_replace('#[\\\\/]{2,}#', '/', $script_path);
              
              	$url = (($secure) ? 'https://' : 'http://') . $server_name;
              
              	if ($server_port && (($secure && $server_port <> 443) || (!$secure && $server_port <> 80)))
              	{
              		// HTTP HOST can carry a port number...
              		if (strpos($server_name, ':') === false)
              		{
              			$url .= ':' . $server_port;
              		}
              	}
              
              	$url .= $script_path;
              	header('Location: ' . $url);
              	exit;
              }
              
              if (defined('DEBUG_EXTRA'))
              {
              	$base_memory_usage = 0;
              	if (function_exists('memory_get_usage'))
              	{
              		$base_memory_usage = memory_get_usage();
              	}
              }
              
              // Load Extensions
              // dl() is deprecated and disabled by default as of PHP 5.3.
              if (!empty($load_extensions) && function_exists('dl'))
              {
              	$load_extensions = explode(',', $load_extensions);
              
              	foreach ($load_extensions as $extension)
              	{
              		@dl(trim($extension));
              	}
              }
              
              // Include files
              require($phpbb_root_path . 'includes/acm/acm_' . $acm_type . '.' . $phpEx);
              require($phpbb_root_path . 'includes/cache.' . $phpEx);
              require($phpbb_root_path . 'includes/template.' . $phpEx);
              require($phpbb_root_path . 'includes/session.' . $phpEx);
              require($phpbb_root_path . 'includes/auth.' . $phpEx);
              
              require($phpbb_root_path . 'includes/functions.' . $phpEx);
              require($phpbb_root_path . 'includes/functions_content.' . $phpEx);
              
              require($phpbb_root_path . 'includes/constants.' . $phpEx);
              require($phpbb_root_path . 'includes/db/' . $dbms . '.' . $phpEx);
              require($phpbb_root_path . 'includes/utf/utf_tools.' . $phpEx);
              
              // Set PHP error handler to ours
              set_error_handler(defined('PHPBB_MSG_HANDLER') ? PHPBB_MSG_HANDLER : 'msg_handler');
              
              // Instantiate some basic classes
              $user		= new user();
              $auth		= new auth();
              $template	= new template();
              $cache		= new cache();
              $db		= new $sql_db();
              
              // Connect to DB
              $db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false, defined('PHPBB_DB_NEW_LINK') ? PHPBB_DB_NEW_LINK : false);
              
              // We do not need this any longer, unset for safety purposes
              unset($dbpasswd);
              
              // Grab global variables, re-cache if necessary
              $config = $cache->obtain_config();
              
              // Add own hook handler
              require($phpbb_root_path . 'includes/hooks/index.' . $phpEx);
              $phpbb_hook = new phpbb_hook(array('exit_handler', 'phpbb_user_session_handler', 'append_sid', array('template', 'display')));
              
              foreach ($cache->obtain_hooks() as $hook)
              {
              	@include($phpbb_root_path . 'includes/hooks/' . $hook . '.' . $phpEx);
              }
              
              ?>
                L.net Web Solutions
                Professional webdesign and development with MODX and WordPress.
              • Okay, I think I have found a solution. I duplicated common.php and named it common_modx.php and included this file instead. In common_modx.php I commented out the following line (near the end):

                require($phpbb_root_path . 'includes/template.' . $phpEx);


                And in the snippet I also commented out the line:

                $user->setup();


                So it seems to work on uncached sites now ...
                  L.net Web Solutions
                  Professional webdesign and development with MODX and WordPress.