Files
IPB/system/Email/Theme/Theme.php
T
2025-12-19 04:57:54 -08:00

220 lines
6.8 KiB
PHP

<?php
/**
* @brief IN_DEV Skin Set
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
* @license http://www.invisionpower.com/legal/standards/
* @package IPS Social Suite
* @since 12 May 2014
* @version SVN_VERSION_NUMBER
*/
namespace IPS\Email\Theme;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* IN_DEV Skin set
*/
class _Theme extends \IPS\Theme
{
/**
* @brief Template Classes
*/
protected $templates;
/**
* @brief [SkinSets] Templates already loaded and evald via getTemplate()
*/
public static $calledTemplates = array();
/**
* Get currently logged in member's theme
*
* @return static
*/
public static function i()
{
return new self;
}
/**
* Write IN_DEV files
*
* @param boolean $force TRUE to rewrite templates, FALSE to check if exists first
* @return void
*/
public static function writeInDev( $force=FALSE )
{
$path = \IPS\ROOT_PATH . '/applications/content/dev/html';
if ( ! \IPS\IN_DEV OR ! is_writeable( $path ) )
{
throw new \DomainException();
}
foreach( \IPS\Db::i()->select( '*', 'content_templates', array( 'template_master=?', 1 ) ) as $template )
{
if ( ! is_dir( $path . '/' . $template['template_location'] ) )
{
mkdir( $path . '/' . $template['template_location'] );
@chmod( $path . '/' . $template['template_location'], \IPS\IPS_FOLDER_PERMISSION );
}
if ( ! is_dir( $path . '/' . $template['template_location'] . '/' . $template['template_group'] ) )
{
mkdir( $path . '/' . $template['template_location'] . '/' . $template['template_group'] );
@chmod( $path . '/' . $template['template_location'] . '/' . $template['template_group'], \IPS\IPS_FOLDER_PERMISSION );
}
$container = NULL;
if ( ! file_exists( $path . '/' . $template['template_location'] . '/' . $template['template_group'] . '/' . $template['template_key'] . '.phtml' ) OR $force === TRUE )
{
try
{
if ( $template['template_container'] )
{
$item = \IPS\content\Templates\Container::load( $template['template_container'] );
$container = array(
'name' => $item->name,
'type' => $item->type,
'parent_id' => $item->parent_id,
'key' => $item->key
);
}
}
catch( \OutofRangeException $ex ) { }
$data = json_encode( array(
'title' => $template['template_title'],
'desc' => $template['template_desc'],
'rel_id' => $template['template_rel_id'],
'container' => $container
) );
$write = '<ips:template parameters="' . $template['template_params'] . '" data="' . $data . '" />' . "\n";
$write .= $template['template_content'];
if ( ! @\file_put_contents( $path . '/' . $template['template_location'] . '/' . $template['template_group'] . '/' . $template['template_key'] . '.phtml', $write ) )
{
throw new \RuntimeException( \IPS\Member::loggedIn()->language()->addToStack( 'content_theme_dev_cannot_write_template', FALSE, array( 'sprintf' => array( $path . '/' . $template['template_location'] . '/' . $template['template_group'] . '/' . $template['template_key'] ) ) ) );
}
else
{
@chmod( $path . '/' . $template['template_location'] . '/' . $template['template_group'] . '/' . $template['template_key'] . '.phtml', 0777 );
}
}
}
}
/**
* Get a template
*
* @param string $group Template Group
* @param string $app Application key (NULL for current application)
* @param string $location Template Location (NULL for current template location)
* @return \IPS\Theme\Template
*/
public function getTemplate( $group, $app=NULL, $location=NULL )
{
/* Do we have an application? */
if( $app === NULL )
{
$app = \IPS\Dispatcher::i()->application->directory;
}
/* How about a template location? */
if( $location === NULL )
{
$location = \IPS\Dispatcher::i()->controllerLocation;
}
/* Get template */
if ( \IPS\IN_DEV )
{
if ( ! isset( $this->templates[ $app ][ $location ][ $group ] ) )
{
$this->templates[ $app ][ $location ][ $group ] = new \IPS\Email\Theme\Template( $app, $location, $group );
}
return $this->templates[ $app ][ $location ][ $group ];
}
else
{
$key = \strtolower( 'template_email_' . static::makeBuiltTemplateLookupHash( $app, $location, $group ) . '_' . $group );
/* Still here */
if ( !in_array( $key, array_keys( self::$calledTemplates ) ) )
{
/* If we don't have a compiled template, do that now */
if ( !isset( \IPS\Data\Store::i()->$key ) )
{
$functions = array( 'html' => array(), 'plain' => array() );
/* Get it from the database */
foreach( \IPS\Db::i()->select( '*', 'core_email_templates', array( "template_app=? AND template_name LIKE '" . \IPS\Db::i()->real_escape_string( $group ) . "__%'", $app ) ) as $data )
{
$funcName = mb_substr( $data['template_name'], ( mb_strlen( $group ) + 2 ) );
$functions['html'][ $funcName ] = static::compileTemplate( $data['template_content_html'], $funcName, $data['template_data'], true );
$functions['plain'][ $funcName ] = static::compileTemplate( $data['template_content_plaintext'], $funcName, $data['template_data'], true );
}
/* Put them in a class */
foreach( array( 'html', 'plain' ) as $type )
{
$var = 'template_' . $type;
${$var} = <<<EOF
namespace IPS\Theme;
class class_email_{$app}_{$type}_{$group}
{
EOF;
${$var} .= implode( "\n\n", $functions[ $type ] );
${$var} .= <<<EOF
}
EOF;
$storeKey = \strtolower( 'template_email_' . static::makeBuiltTemplateLookupHash( $app, $type, $group ) . '_' . $group );
\IPS\Data\Store::i()->$storeKey = ${$var};
}
}
/* Load compiled template */
$compiledGroup = \IPS\Data\Store::i()->$key;
if ( @eval( $compiledGroup ) === FALSE )
{
throw new \UnexpectedValueException;
}
/* Hooks */
$class = 'class_email_' . $app . '_' . $location . '_' . $group;
$class = "\IPS\Theme\\{$class}";
/* Init */
self::$calledTemplates[ $key ] = new $class();
}
return self::$calledTemplates[ $key ];
}
}
/**
* Returns the path for the IN_DEV .phtml files
* @param string $app Application Key
* @param string|null $location Location
* @param string|null $path Path or Filename
* @return string
*/
protected static function _getHtmlPath( $app, $location=null, $path=null )
{
return rtrim( \IPS\ROOT_PATH . "/applications/{$app}/dev/html/{$location}/{$path}", '/' ) . '/';
}
}