core =& $core;
$this->default_theme = path::real($this->core->blog->themes_path.'/default');
$this->user_theme = path::real($this->core->blog->themes_path.'/'.$this->core->blog->settings->system->theme);
if (null !== $this->core->themes) {
$parent_theme = $this->core->themes->moduleInfo($this->core->blog->settings->system->theme,'parent');
if ($parent_theme) {
$this->parent_theme = path::real($this->core->blog->themes_path.'/'.$parent_theme);
}
}
$this->findTemplates();
$this->findStyles();
$this->findScripts();
$this->findLocales();
}
public function filesList($type,$item='%1$s')
{
$files = $this->getFilesFromType($type);
if (empty($files)) {
return '
'.__('No file').'
';
}
$list = '';
foreach ($files as $k => $v)
{
if (strpos($v,$this->user_theme) === 0) {
$li = sprintf('%s',$item);
} elseif ($this->parent_theme && strpos($v,$this->parent_theme) === 0) {
$li = sprintf('%s',$item);
} else {
$li = sprintf('%s',$item);
}
$list .= sprintf($li,$k,html::escapeHTML($k));
}
return sprintf('',$list);
}
public function getFileContent($type,$f)
{
$files = $this->getFilesFromType($type);
if (!isset($files[$f])) {
throw new Exception(__('File does not exist.'));
}
$F = $files[$f];
if (!is_readable($F)) {
throw new Exception(sprintf(__('File %s is not readable'),$f));
}
return array(
'c' => file_get_contents($F),
'w' => $this->getDestinationFile($type,$f) !== false,
'type' => $type,
'f' => $f
);
}
public function writeFile($type,$f,$content)
{
$files = $this->getFilesFromType($type);
if (!isset($files[$f])) {
throw new Exception(__('File does not exist.'));
}
try
{
$dest = $this->getDestinationFile($type,$f);
if ($dest == false) {
throw new Exception();
}
if ($type == 'tpl' && !is_dir(dirname($dest))) {
files::makeDir(dirname($dest));
}
if ($type == 'po' && !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);
# Updating inner files list
$this->updateFileInList($type,$f,$dest);
}
catch (Exception $e)
{
throw new Exception(sprintf(__('Unable to write file %s. Please check your theme files and folders permissions.'),$f));
}
}
protected function getDestinationFile($type,$f)
{
if ($type == 'tpl') {
$dest = $this->user_theme.'/tpl/'.$f;
} elseif ($type == 'po') {
$dest = $this->user_theme.'/locales/'.$f;
} else {
$dest = $this->user_theme.'/'.$f;
}
if (file_exists($dest) && is_writable($dest)) {
return $dest;
}
if ($type == 'tpl' && !is_dir(dirname($dest))) {
if (is_writable($this->user_theme)) {
return $dest;
}
}
if ($type == 'po' && !is_dir(dirname($dest))) {
if (is_writable($this->user_theme)) {
return $dest;
}
}
if (is_writable(dirname($dest))) {
return $dest;
}
return false;
}
protected function getFilesFromType($type)
{
switch ($type)
{
case 'tpl':
return $this->tpl;
case 'css':
return $this->css;
case 'js':
return $this->js;
case 'po':
return $this->po;
default:
return array();
}
}
protected function updateFileInList($type,$f,$file)
{
switch ($type)
{
case 'tpl':
$list =& $this->tpl;
break;
case 'css':
$list =& $this->css;
break;
case 'js':
$list =& $this->js;
break;
case 'po':
$list =& $this->po;
break;
default:
return;
}
$list[$f] = $file;
}
protected function findTemplates()
{
# First, we look in template paths
$this->default_tpl = $this->getFilesInDir($this->default_theme.'/tpl');
$this->tpl = array_merge(
$this->default_tpl,
$this->getFilesInDir($this->parent_theme.'/tpl'),
$this->getFilesInDir($this->user_theme.'/tpl')
);
$this->tpl = array_merge($this->getFilesInDir(DC_ROOT.'/inc/public/default-templates'),$this->tpl);
# Then we look in 'default-templates' plugins directory
$plugins = $this->core->plugins->getModules();
foreach ($plugins as $p) {
$this->tpl = array_merge($this->getFilesInDir($p['root'].'/default-templates'),$this->tpl);
}
uksort($this->tpl,array($this,'sortFilesHelper'));
}
protected function findStyles()
{
$this->css = $this->getFilesInDir($this->user_theme,'css');
$this->css= array_merge($this->css,$this->getFilesInDir($this->user_theme.'/style','css','style/'));
}
protected function findScripts()
{
$this->js = $this->getFilesInDir($this->user_theme,'js');
$this->js = array_merge($this->js,$this->getFilesInDir($this->user_theme.'/js','js','js/'));
}
protected function findLocales()
{
$langs = l10n::getISOcodes(1,1);
foreach ($langs as $k => $v) {
if ($this->parent_theme) {
$this->po = array_merge($this->po,$this->getFilesInDir($this->parent_theme.'/locales/'.$v,'po',$v.'/'));
}
$this->po = array_merge($this->po,$this->getFilesInDir($this->user_theme.'/locales/'.$v,'po',$v.'/'));
}
}
protected function getFilesInDir($dir,$ext=null,$prefix='',$model=null)
{
$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) && (!$ext || preg_match('/\.'.preg_quote($ext).'$/i',$f))) {
if (!$model || preg_match('/^'.preg_quote($model).'$/i', $f)) {
$res[$prefix.$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);
}
}
?>