core =& $core;
$this->path = $this->core->blog->public_path.'/'.$this->template_dir_name;
// Initial templates
$this->post_tpl = DC_ROOT.'/inc/public/default-templates/'.$this->post_default_name;
$this->category_tpl = DC_ROOT.'/inc/public/default-templates/'.$this->category_default_name;
if ($this->core->plugins->moduleExists('pages')) {
$plugin_page = $this->core->plugins->getModules('pages');
$this->page_tpl = path::real($plugin_page['root'].'/default-templates/'.$this->page_default_name);
}
$this->user_theme = $this->core->blog->themes_path.'/'.$this->core->blog->settings->system->theme;
$this->user_post_tpl = path::real($this->user_theme.'/tpl/'.$this->post_default_name);
$this->user_category_tpl = path::real($this->user_theme.'/tpl/'.$this->category_default_name);
$this->user_page_tpl = path::real($this->user_theme.'/tpl/'.$this->page_default_name);
$this->findTemplates();
}
/**
*
*/
public function canUseRessources($create=false)
{
if (!is_dir($this->path)) {
if ($create) {
files::makeDir($this->path);
}
return true;
}
if (!is_writable($this->path)) {
return false;
}
if (!is_file($this->path.'/.htaccess')) {
try {
file_put_contents($this->path.'/.htaccess',"Deny from all\n");
}
catch (Exception $e) {return false;}
}
return true;
}
/**
*
*/
public function getSourceContent($f)
{
$source = $this->tpl;
if (!isset($source[$f])) {
throw new Exception(__('File does not exist.'));
}
$F = $source[$f];
if (!is_readable($F)) {
throw new Exception(sprintf(__('File %s is not readable'),$f));
}
return array(
'c' => file_get_contents($source[$f]),
'w' => $this->getDestinationFile($f) !== false,
'f' => $f
);
}
/**
*
*/
public function filesList($item='%1$s')
{
$files = $this->tpl;
if (empty($files)) {
return '
'.__('No file').'
';
}
$list = '';
foreach ($files as $k => $v)
{
$li = sprintf('%s',$item);
$list .= sprintf($li,$k,html::escapeHTML($k));
}
return sprintf('',$list);
}
/**
*
*/
public function initializeTpl($name,$type)
{
if ($type == 'category')
{
if ($this->user_category_tpl) {
$base = $this->user_category_tpl;
} else {
$base = $this->category_tpl;
}
}
elseif ($type == 'page')
{
if ($this->user_page_tpl) {
$base = $this->user_page_tpl;
} else {
$base = $this->page_tpl;
}
}
else {
if ($this->user_post_tpl) {
$base = $this->user_post_tpl;
} else {
$base = $this->post_tpl;
}
}
$source = array(
'c' => file_get_contents($base),
'w' => $this->getDestinationFile($name) !== false,
'f' => $f);
if (!$source['w'])
{
throw new Exception(sprintf(__('File %s is not readable'),$source));
}
if ($type == 'empty')
{
$source['c'] = '';
}
try
{
$dest = $this->getDestinationFile($name);
if ($dest == false) {
throw new Exception();
}
$content = $source['c'];
if (!is_dir(dirname($dest))) {
files::makeDir(dirname($dest));
}
$fp = @fopen($dest,'wb');
if (!$fp) {
throw new Exception('tocatch');
}
$content = preg_replace('/(\r?\n)/m',"\n",$content);
$content = preg_replace('/\r/m',"\n",$content);
fwrite($fp,$content);
fclose($fp);
}
catch (Exception $e)
{
throw $e;
}
}
/**
*
*/
public function copypasteTpl($name,$source)
{
if ($name == $source) {throw new Exception(__('Why copy file content in the same file?'));}
$file = $this->getSourceContent($source);
$source = array(
'c' => $file['c'],
'w' => $this->getDestinationFile($name) !== false,
'f' => $f);
if (!$source['w'])
{
throw new Exception(sprintf(__('File %s is not readable'),$source));
}
if ($type == 'empty')
{
$source['c'] = '';
}
try
{
$dest = $this->getDestinationFile($name);
if ($dest == false) {
throw new Exception();
}
$content = $source['c'];
if (!is_dir(dirname($dest))) {
files::makeDir(dirname($dest));
}
$fp = @fopen($dest,'wb');
if (!$fp) {
throw new Exception('tocatch');
}
$content = preg_replace('/(\r?\n)/m',"\n",$content);
$content = preg_replace('/\r/m',"\n",$content);
fwrite($fp,$content);
fclose($fp);
}
catch (Exception $e)
{
throw $e;
}
}
/**
*
*/
public function writeTpl($name,$content)
{
try
{
$dest = $this->getDestinationFile($name);
if ($dest == false) {
throw new Exception();
}
if (!is_dir(dirname($dest))) {
files::makeDir(dirname($dest));
}
$fp = @fopen($dest,'wb');
if (!$fp) {
//throw new Exception('tocatch');
}
$content = preg_replace('/(\r?\n)/m',"\n",$content);
$content = preg_replace('/\r/m',"\n",$content);
fwrite($fp,$content);
fclose($fp);
}
catch (Exception $e)
{
throw $e;
}
}
/**
*
*/
public function copyTpl($name)
{
try
{
$file = $this->getSourceContent($name);
$dest = $this->getDestinationFile($name,true);
if ($dest == false) {
throw new Exception();
}
if (!is_dir(dirname($dest))) {
files::makeDir(dirname($dest));
}
$fp = @fopen($dest,'wb');
if (!$fp) {
throw new Exception('tocatch');
}
$content = preg_replace('/(\r?\n)/m',"\n",$file['c']);
$content = preg_replace('/\r/m',"\n",$file['c']);
fwrite($fp,$file['c']);
fclose($fp);
}
catch (Exception $e)
{
throw $e;
}
}
protected function getDestinationFile($f,$totheme=false)
{
$dest = $this->path.'/'.$f;
if ($totheme) {
$dest = $this->user_theme.'/tpl/'.$f;
}
if (file_exists($dest) && is_writable($dest)) {
return $dest;
}
if (is_writable(dirname($dest))) {
return $dest;
}
return false;
}
protected function findTemplates()
{
$this->tpl = $this->getFilesInDir($this->path);
//$this->theme_tpl = $this->getFilesInDir(path::real($this->user_theme).'/tpl');
uksort($this->tpl,array($this,'sortFilesHelper'));
//uksort($this->theme_tpl,array($this,'sortFilesHelper'));
}
protected function getFilesInDir($dir)
{
$dir = path::real($dir);
if (!$dir || !is_dir($dir) || !is_readable($dir)) {
return array();
}
$d = dir($dir);
$res = array();
while (($f = $d->read()) !== false)
{
if (is_file($dir.'/'.$f) && !preg_match('/^\./',$f)) {
$res[$f] = $dir.'/'.$f;
}
}
return $res;
}
protected function sortFilesHelper($a,$b)
{
if ($a == $b) {
return 0;
}
$ext_a = files::getExtension($a);
$ext_b = files::getExtension($b);
return strcmp($ext_a.'.'.$a,$ext_b.'.'.$b);
}
}
?>