1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/limesurvey_ynh.git synced 2024-09-03 19:36:32 +02:00
limesurvey_ynh/sources/application/controllers/admin/templates.php

1274 lines
51 KiB
PHP

<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');
/*
* LimeSurvey
* Copyright (C) 2007-2011 The LimeSurvey Project Team / Carsten Schmitz
* All rights reserved.
* License: GNU/GPL License v2 or later, see LICENSE.php
* LimeSurvey is free software. This version may have been modified pursuant
* to the GNU General Public License, and as distributed it includes or
* is derivative of works licensed under the GNU General Public License or
* other free or open source software licenses.
* See COPYRIGHT.php for copyright notices and details.
*/
/**
* templates
*
* @package LimeSurvey
* @author
* @copyright 2011
*/
class templates extends Survey_Common_Action
{
public function runWithParams($params)
{
if (!Permission::model()->hasGlobalPermission('templates','read'))
{
die('No permission');
}
parent::runWithParams($params);
}
/**
* Exports a template
*
* @access public
* @param string $templatename
* @return void
*/
public function templatezip($templatename)
{
if (!Permission::model()->hasGlobalPermission('templates','export'))
{
die('No permission');
}
$templatedir = getTemplatePath($templatename) . DIRECTORY_SEPARATOR;
$tempdir = Yii::app()->getConfig('tempdir');
$zipfile = "$tempdir/$templatename.zip";
Yii::app()->loadLibrary('admin.pclzip');
$zip = new PclZip($zipfile);
$zip->create($templatedir, PCLZIP_OPT_REMOVE_PATH, getTemplatePath($templatename));
if (is_file($zipfile)) {
// Send the file for download!
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/force-download");
header("Content-Disposition: attachment; filename=$templatename.zip");
header("Content-Description: File Transfer");
@readfile($zipfile);
// Delete the temporary file
unlink($zipfile);
}
}
/**
* Retrieves a temporary template file from disk
*
* @param mixed $id ID of the template file
*/
public function tmp($id)
{
$iTime= preg_replace("/[^0-9]$/", '', $id);
$sFile = Yii::app()->getConfig("tempdir").DIRECTORY_SEPARATOR."template_temp_{$iTime}.html";
if(!is_file($sFile) || !file_exists($sFile)) die();
readfile($sFile);
}
/**
* Responsible to import a template archive.
*
* @access public
* @return void
*/
public function upload()
{
if (!Permission::model()->hasGlobalPermission('templates','import'))
{
die('No permission');
}
$clang = $this->getController()->lang;
$aViewUrls = $this->_initialise('default', 'welcome', 'startpage.pstpl', FALSE);
$lid = returnGlobal('lid');
$action = returnGlobal('action');
if ($action == 'templateupload') {
if (Yii::app()->getConfig('demoMode'))
$this->getController()->error($clang->gT("Demo mode: Uploading templates is disabled."));
Yii::app()->loadLibrary('admin.pclzip');
$zip = new PclZip($_FILES['the_file']['tmp_name']);
// Create temporary directory so that if dangerous content is unzipped it would be unaccessible
$sNewDirectoryName=sanitize_dirname($_FILES['the_file']['name']);
$destdir = Yii::app()->getConfig('usertemplaterootdir').DIRECTORY_SEPARATOR.$sNewDirectoryName;
if (!is_writeable(dirname($destdir)))
$this->getController()->error(sprintf($clang->gT("Incorrect permissions in your %s folder."), dirname($destdir)));
if (!is_dir($destdir))
mkdir($destdir);
else
$this->getController()->error(sprintf($clang->gT("Template '%s' does already exist."), $sNewDirectoryName));
$aImportedFilesInfo = array();
$aErrorFilesInfo = array();
if (is_file($_FILES['the_file']['tmp_name'])) {
$aExtractResult=$zip->extract(PCLZIP_OPT_PATH, $destdir, PCLZIP_CB_PRE_EXTRACT, 'templateExtractFilter');
if ($aExtractResult==0)
{
$this->getController()->error($clang->gT("This file is not a valid ZIP file archive. Import failed."));
}
else
{
foreach($aExtractResult as $sFile)
{
$aImportedFilesInfo[] = Array(
"filename" => $sFile['stored_filename'],
"status" => $clang->gT("OK"),
'is_folder' => $sFile['folder']
);
}
}
if (count($aErrorFilesInfo) == 0 && count($aImportedFilesInfo) == 0)
$this->getController()->error($clang->gT("This ZIP archive contains no valid template files. Import failed."));
}
else
$this->getController()->error(sprintf($clang->gT("An error occurred uploading your file. This may be caused by incorrect permissions in your %s folder."), $basedestdir));
if (count($aImportedFilesInfo) > 0)
{
$templateFixes= $this->_templateFixes($sNewDirectoryName);
}
else
{
$templateFixes= array();
}
$aViewUrls = 'importuploaded_view';
$aData = array(
'aImportedFilesInfo' => $aImportedFilesInfo,
'aErrorFilesInfo' => $aErrorFilesInfo,
'lid' => $lid,
'newdir' => $sNewDirectoryName,
'templateFixes' => $templateFixes,
);
}
else
{
$aViewUrls = 'importform_view';
$aData = array('lid' => $lid);
}
$this->_renderWrappedTemplate('templates', $aViewUrls, $aData);
}
/**
* Try to correct a template with new funcyionnality.
*
* @access private
* @param string $templatename
* @return array $correction ($success,$number,array($information))
*/
private function _templateFixes($templatename)
{
$clang = $this->getController()->lang;
$usertemplaterootdir=Yii::app()->getConfig("usertemplaterootdir");
$templateFixes=array();
$templateFixes['success']=true;
$templateFixes['details']=array();
// TEMPLATEJS control
$fname="$usertemplaterootdir/$templatename/startpage.pstpl";
if(is_file($fname))
{
$fhandle = fopen($fname,"r");
$content = fread($fhandle,filesize($fname));
if(strpos($content, "{TEMPLATEJS}")===false)
{
$content = str_replace("<script type=\"text/javascript\" src=\"{TEMPLATEURL}template.js\"></script>", "{TEMPLATEJS}", $content);
$fhandle = fopen($fname,"w");
fwrite($fhandle,$content);
fclose($fhandle);
if(strpos($content, "{TEMPLATEJS}")===false)
{
$templateFixes['success']=false;
$templateFixes['details']['templatejs']=$clang->gT("Unable to add {TEMPLATEJS} placeholder, please check your startpage.pstpl.");
}
else
{
$templateFixes['details']['templatejs']=$clang->gT("Placeholder {TEMPLATEJS} added to your startpage.pstpl.");
}
}
}
else
{
$templateFixes['success']=false;
$templateFixes['details']['templatejs']=$clang->gT("Unable to find startpage.pstpl to add {TEMPLATEJS} placeholder, please check your template.");
}
return $templateFixes;
}
/**
* Responsible to import a template file.
*
* @access public
* @return void
*/
public function uploadfile()
{
if (!Permission::model()->hasGlobalPermission('templates','import'))
{
die('No permission');
}
$clang = $this->getController()->lang;
$action = returnGlobal('action');
$editfile = returnGlobal('editfile');
$templatename = returnGlobal('templatename');
$screenname = returnGlobal('screenname');
$files = $this->_initfiles($templatename);
$cssfiles = $this->_initcssfiles();
$basedestdir = Yii::app()->getConfig('usertemplaterootdir');
$tempdir = Yii::app()->getConfig('tempdir');
$allowedtemplateuploads=Yii::app()->getConfig('allowedtemplateuploads');
$filename=sanitize_filename($_FILES['upload_file']['name'],false,false);// Don't force lowercase or alphanumeric
$fullfilepath=$basedestdir."/".$templatename . "/" . $filename;
if($action=="templateuploadfile")
{
if(Yii::app()->getConfig('demoMode'))
{
$uploadresult = $clang->gT("Demo mode: Uploading template files is disabled.");
}
elseif($filename!=$_FILES['upload_file']['name'])
{
$uploadresult = $clang->gT("This filename is not allowed to be uploaded.");
}
elseif(!in_array(strtolower(substr(strrchr($filename, '.'),1)),explode ( "," , $allowedtemplateuploads )))
{
$uploadresult = $clang->gT("This file type is not allowed to be uploaded.");
}
else
{
//Uploads the file into the appropriate directory
if (!@move_uploaded_file($_FILES['upload_file']['tmp_name'], $fullfilepath)) {
$uploadresult = sprintf($clang->gT("An error occurred uploading your file. This may be caused by incorrect permissions in your %s folder."),$tempdir);
}
else
{
$uploadresult = sprintf($clang->gT("File %s uploaded"),$filename);
}
}
Yii::app()->session['flashmessage'] = $uploadresult;
}
$this->getController()->redirect(array("admin/templates/view/editfile/" . $editfile . "/screenname/" . $screenname . "/templatename/" . $templatename));
}
/**
* Generates a random temp directory
*
* @access protected
* @param string $dir
* @param string $prefix
* @param string $mode
* @return string
*/
protected function _tempdir($dir, $prefix = '', $mode = 0700)
{
if (substr($dir, -1) != '/')
$dir .= '/';
do
{
$path = $dir . $prefix . mt_rand(0, 9999999);
}
while (!mkdir($path, $mode));
return $path;
}
/**
* Strips file extension
*
* @access protected
* @param string $name
* @return string
*/
protected function _strip_ext($name)
{
$ext = strrchr($name, '.');
if ($ext !== false) {
$name = substr($name, 0, -strlen($ext));
}
return $name;
}
/**
* Load default view screen of template controller.
*
* @access public
* @param string $editfile
* @param string $screenname
* @param string $templatename
* @return void
*/
public function index($editfile = 'startpage.pstpl', $screenname = 'welcome', $templatename = '')
{
if(!$templatename)
{
$templatename = Yii::app()->getConfig("defaulttemplate");
}
$aViewUrls = $this->_initialise($templatename, $screenname, $editfile);
App()->getClientScript()->reset();
App()->getComponent('bootstrap')->init();
// After reseting, we need register again the script : maybe move it to endScripts_view for allways needed scripts ?
App()->getClientScript()->registerScriptFile(Yii::app()->getConfig('adminscripts') . "admin_core.js");
App()->getClientScript()->registerScriptFile(Yii::app()->getConfig('adminscripts') . "admin_core.js");
App()->getClientScript()->registerScriptFile(Yii::app()->getConfig('adminscripts') . 'templates.js');
App()->getClientScript()->registerPackage('ace');
App()->getClientScript()->registerPackage('jquery-superfish');
$this->_renderWrappedTemplate('templates', $aViewUrls);
if ($screenname != 'welcome')
Yii::app()->session['step'] = 1;
// This helps handle the load/save buttons)
else
unset(Yii::app()->session['step']);
}
/**
* templates::screenredirect()
* Function that modify order of arguments and pass to main viewing function i.e. view()
*
* @access public
* @param string $editfile
* @param string $templatename
* @param string $screenname
* @return void
*/
public function screenredirect($editfile = 'startpage.pstpl', $templatename = '', $screenname = 'welcome')
{
if(!$templatename)
{
$templatename = Yii::app()->getConfig("defaulttemplate");
}
$this->getController()->redirect(array("admin/templates/sa/view/editfile/" . $editfile . "/screenname/" . $screenname . "/templatename/" . $templatename));
}
/**
* Function that modify order of arguments and pass to main viewing function i.e. view()
*
* @access public
* @param string $templatename
* @param string $screenname
* @param string $editfile
* @return void
*/
public function fileredirect($templatename = '', $screenname = 'welcome', $editfile = 'startpage.pstpl')
{
if(!$templatename)
{
$templatename = Yii::app()->getConfig("defaulttemplate");
}
$this->getController()->redirect(array("admin/templates/sa/view/editfile/" . $editfile . "/screenname/" . $screenname . "/templatename/" . $templatename));
}
/**
* Function responsible to delete a template file.
*
* @access public
* @return void
*/
public function templatefiledelete()
{
if (!Permission::model()->hasGlobalPermission('templates','update'))
{
die('No permission');
}
$clang = $this->getController()->lang;
if (returnGlobal('action') == "templatefiledelete") {
// This is where the temp file is
$sFileToDelete=preg_replace("[^\w\s\d\.\-_~,;:\[\]\(\]]", '', returnGlobal('otherfile'));
$the_full_file_path = Yii::app()->getConfig('usertemplaterootdir') . "/" . $_POST['templatename'] . "/" . $sFileToDelete;
if (@unlink($the_full_file_path))
{
Yii::app()->session['flashmessage'] = sprintf($clang->gT("The file %s was deleted."), htmlspecialchars($sFileToDelete));
}
else
{
Yii::app()->session['flashmessage'] = sprintf($clang->gT("File %s couldn't be deleted. Please check the permissions on the /upload/template folder"), htmlspecialchars($sFileToDelete));
}
$this->getController()->redirect(array("admin/templates/sa/view/editfile/" . returnGlobal('editfile') . "/screenname/" . returnGlobal('screenname') . "/templatename/" . returnGlobal('templatename')));
}
}
/**
* Function responsible to rename a template(folder).
*
* @access public
* @return void
*/
public function templaterename()
{
if (!Permission::model()->hasGlobalPermission('templates','update'))
{
die('No permission');
}
if (returnGlobal('action') == "templaterename" && returnGlobal('newname') && returnGlobal('copydir')) {
$clang = Yii::app()->lang;
$sOldName = sanitize_dirname(returnGlobal('copydir'));
$sNewName = sanitize_dirname(returnGlobal('newname'));
$sNewDirectoryPath = Yii::app()->getConfig('usertemplaterootdir') . "/" . $sNewName;
$sOldDirectoryPath = Yii::app()->getConfig('usertemplaterootdir') . "/" . returnGlobal('copydir');
if (isStandardTemplate(returnGlobal('newname')))
$this->getController()->error(sprintf($clang->gT("Template could not be renamed to `%s`.", "js"), $sNewName) . " " . $clang->gT("This name is reserved for standard template.", "js"));
elseif (file_exists($sNewDirectoryPath))
$this->getController()->error(sprintf($clang->gT("Template could not be renamed to `%s`.", "js"), $sNewName) . " " . $clang->gT("A template with that name already exists.", "js"));
elseif (rename($sOldDirectoryPath, $sNewDirectoryPath) == false)
$this->getController()->error(sprintf($clang->gT("Template could not be renamed to `%s`.", "js"), $sNewName) . " " . $clang->gT("Maybe you don't have permission.", "js"));
else
{
Survey::model()->updateAll(array( 'template' => $sNewName ), "template = :oldname", array(':oldname'=>$sOldName));
if ( getGlobalSetting('defaulttemplate')==$sOldName)
{
setGlobalSetting('defaulttemplate',$sNewName);
}
$this->index("startpage.pstpl", "welcome", $sNewName);
}
}
}
/**
* Function responsible to copy a template.
*
* @access public
* @return void
*/
public function templatecopy()
{
if (!Permission::model()->hasGlobalPermission('templates','create'))
{
die('No permission');
}
$clang = $this->getController()->lang;
$newname=sanitize_dirname(Yii::app()->request->getPost("newname"));
$copydir=sanitize_dirname(Yii::app()->request->getPost("copydir"));
$action=Yii::app()->request->getPost("action");
if ($newname && $copydir) {
// Copies all the files from one template directory to a new one
Yii::app()->loadHelper('admin/template');
$newdirname = Yii::app()->getConfig('usertemplaterootdir') . "/" . $newname;
$copydirname = getTemplatePath($copydir);
$oFileHelper=new CFileHelper;
$mkdirresult = mkdir_p($newdirname);
if ($mkdirresult == 1) {
$oFileHelper->copyDirectory($copydirname,$newdirname);
$templatename = $newname;
$this->getController()->redirect(array("admin/templates/sa/view",'templatename'=>$newname));
}
elseif ($mkdirresult == 2)
{
Yii::app()->setFlashMessage(sprintf($clang->gT("Directory with the name `%s` already exists - choose another name"), $newname),'error');
$this->getController()->redirect(array("admin/templates/sa/view",'templatename'=>$copydir));
}
else
{
Yii::app()->setFlashMessage(sprintf($clang->gT("Unable to create directory `%s`."), $newname),'error');
Yii::app()->setFlashMessage($clang->gT("Please check the directory permissions."));
$this->getController()->redirect(array("admin/templates/sa/view"));
}
}
else
{
$this->getController()->redirect(array("admin/templates/sa/view"));
}
}
/**
* Function responsible to delete a template.
*
* @access public
* @param string $templatename
* @return void
*/
public function delete($templatename)
{
if (!Permission::model()->hasGlobalPermission('templates','delete'))
{
die('No permission');
}
Yii::app()->loadHelper("admin/template");
if (is_template_editable($templatename) == true) {
$clang = $this->getController()->lang;
if (rmdirr(Yii::app()->getConfig('usertemplaterootdir') . "/" . $templatename) == true) {
$surveys = Survey::model()->findAllByAttributes(array('template' => $templatename));
foreach ($surveys as $s)
{
$s->template = Yii::app()->getConfig('defaulttemplate');
$s->save();
}
Template::model()->deleteAllByAttributes(array('folder' => $templatename));
Permission::model()->deleteAllByAttributes(array('permission' => $templatename,'entity' => 'template'));
Yii::app()->setFlashMessage(sprintf($clang->gT("Template '%s' was successfully deleted."), $templatename));
}
else
Yii::app()->setFlashMessage(sprintf($clang->gT("There was a problem deleting the template '%s'. Please check your directory/file permissions."), $templatename),'error');
}
// Redirect with default templatename, editfile and screenname
$this->getController()->redirect(array("admin/templates/sa/view"));
}
/**
* Function responsible to save the changes made in CodemMirror editor.
*
* @access public
* @return void
*/
public function templatesavechanges()
{
if (!Permission::model()->hasGlobalPermission('templates','update'))
{
die('No permission');
}
if (returnGlobal('changes')) {
$changedtext = returnGlobal('changes');
$changedtext = str_replace('<?', '', $changedtext);
if (get_magic_quotes_gpc())
$changedtext = stripslashes($changedtext);
}
if (returnGlobal('changes_cp')) {
$changedtext = returnGlobal('changes_cp');
$changedtext = str_replace('<?', '', $changedtext);
if (get_magic_quotes_gpc())
$changedtext = stripslashes($changedtext);
}
$action = returnGlobal('action');
$editfile = returnGlobal('editfile');
$templatename = returnGlobal('templatename');
$screenname = returnGlobal('screenname');
$files = $this->_initfiles($templatename);
$cssfiles = $this->_initcssfiles();
if ($action == "templatesavechanges" && $changedtext) {
Yii::app()->loadHelper('admin/template');
$changedtext = str_replace("\r\n", "\n", $changedtext);
if ($editfile) {
// Check if someone tries to submit a file other than one of the allowed filenames
if (multiarray_search($files, 'name', $editfile) === false &&
multiarray_search($cssfiles, 'name', $editfile) === false
)
$this->getController()->error('Invalid template name');
$savefilename = Yii::app()->getConfig('usertemplaterootdir') . "/" . $templatename . "/" . $editfile;
if (is_writable($savefilename)) {
if (!$handle = fopen($savefilename, 'w'))
$this->getController()->error('Could not open file ' . $savefilename);
if (!fwrite($handle, $changedtext))
$this->getController()->error('Could not write file ' . $savefilename);
fclose($handle);
}
else
$this->getController()->error("The file $savefilename is not writable");
}
}
$this->getController()->redirect(array("admin/templates/sa/view/editfile/" . $editfile . "/screenname/" . $screenname . "/templatename/" . $templatename));
}
/**
* Load menu bar related to a template.
*
* @access protected
* @param string $screenname
* @param string $editfile
* @param string $screens
* @param string $tempdir
* @param string $templatename
* @return void
*/
protected function _templatebar($screenname, $editfile, $screens, $tempdir, $templatename)
{
$aData['clang'] = $this->getController()->lang;
$aData['screenname'] = $screenname;
$aData['editfile'] = $editfile;
$aData['screens'] = $screens;
$aData['tempdir'] = $tempdir;
$aData['templatename'] = $templatename;
$aData['usertemplaterootdir'] = Yii::app()->getConfig('usertemplaterootdir');
$this->getController()->render("/admin/templates/templatebar_view", $aData);
}
/**
* Load CodeMirror editor and various files information.
*
* @access protected
* @param string $templatename
* @param string $screenname
* @param string $editfile
* @param string $templates
* @param string $files
* @param string $cssfiles
* @param array $otherfiles
* @param array $myoutput
* @return void
*/
protected function _templatesummary($templatename, $screenname, $editfile, $templates, $files, $cssfiles, $otherfiles, $myoutput)
{
$tempdir = Yii::app()->getConfig("tempdir");
$tempurl = Yii::app()->getConfig("tempurl");
Yii::app()->loadHelper("admin/template");
$aData = array();
$time = date("ymdHis");
// Prepare textarea class for optional javascript
$templateclasseditormode = getGlobalSetting('defaulttemplateeditormode'); // default
if (Yii::app()->session['templateeditormode'] == 'none')
$templateclasseditormode = 'none';
$aData['templateclasseditormode'] = $templateclasseditormode;
// The following lines are forcing the browser to refresh the templates on each save
@$fnew = fopen("$tempdir/template_temp_$time.html", "w+");
$aData['time'] = $time;
if (!$fnew) {
$aData['filenotwritten'] = true;
}
else
{
@fwrite($fnew, getHeader());
foreach ($cssfiles as $cssfile)
{
$myoutput = str_replace($cssfile['name'], $cssfile['name'] . "?t=$time", $myoutput);
}
$myoutput = implode("\n", $myoutput);
App()->getClientScript()->registerPackage('jqueryui');
App()->getClientScript()->registerPackage('jquery-touch-punch');
App()->getClientScript()->registerScriptFile(Yii::app()->getConfig('generalscripts')."survey_runtime.js");
App()->getClientScript()->render($myoutput);
@fwrite($fnew, $myoutput);
@fclose($fnew);
}
if (Yii::app()->session['templateeditormode'] !== 'default') {
$sTemplateEditorMode = Yii::app()->session['templateeditormode'];
} else {
$sTemplateEditorMode = getGlobalSetting('templateeditormode', 'full');
}
$sExtension=substr(strrchr($editfile, '.'), 1);
switch ($sExtension)
{
case 'css':$sEditorFileType='css';
break;
case 'pstpl':$sEditorFileType='html';
break;
case 'js':$sEditorFileType='javascript';
break;
default: $sEditorFileType='html';
break;
}
$aData['clang'] = $this->getController()->lang;
$aData['screenname'] = $screenname;
$aData['editfile'] = $editfile;
$aData['tempdir'] = $tempdir;
$aData['templatename'] = $templatename;
$aData['templates'] = $templates;
$aData['files'] = $files;
$aData['cssfiles'] = $cssfiles;
$aData['otherfiles'] = $otherfiles;
$aData['tempurl'] = $tempurl;
$aData['time'] = $time;
$aData['sEditorFileType'] = $sEditorFileType;
$aData['sTemplateEditorMode'] = $sTemplateEditorMode;
$aViewUrls['templatesummary_view'][] = $aData;
return $aViewUrls;
}
/**
* Function that initialises file data.
*
* @access protected
* @param mixed $templatename
* @return void
*/
protected function _initfiles($templatename)
{
$files[] = array('name' => 'assessment.pstpl');
$files[] = array('name' => 'clearall.pstpl');
$files[] = array('name' => 'completed.pstpl');
$files[] = array('name' => 'endgroup.pstpl');
$files[] = array('name' => 'endpage.pstpl');
$files[] = array('name' => 'groupdescription.pstpl');
$files[] = array('name' => 'load.pstpl');
$files[] = array('name' => 'navigator.pstpl');
$files[] = array('name' => 'printanswers.pstpl');
$files[] = array('name' => 'privacy.pstpl');
$files[] = array('name' => 'question.pstpl');
$files[] = array('name' => 'register.pstpl');
$files[] = array('name' => 'save.pstpl');
$files[] = array('name' => 'surveylist.pstpl');
$files[] = array('name' => 'startgroup.pstpl');
$files[] = array('name' => 'startpage.pstpl');
$files[] = array('name' => 'survey.pstpl');
$files[] = array('name' => 'welcome.pstpl');
$files[] = array('name' => 'print_survey.pstpl');
$files[] = array('name' => 'print_group.pstpl');
$files[] = array('name' => 'print_question.pstpl');
if (is_file(Yii::app()->getConfig('usertemplaterootdir') . '/' . $templatename . '/question_start.pstpl'))
$files[] = array('name' => 'question_start.pstpl');
return $files;
}
/**
* Function that initialises cssfile data.
*
* @access protected
* @return void
*/
protected function _initcssfiles()
{
$cssfiles[] = array('name' => 'template.css');
$cssfiles[] = array('name' => 'template-rtl.css');
$cssfiles[] = array('name' => 'ie_fix_6.css');
$cssfiles[] = array('name' => 'ie_fix_7.css');
$cssfiles[] = array('name' => 'ie_fix_8.css');
$cssfiles[] = array('name' => 'jquery-ui-custom.css');
$cssfiles[] = array('name' => 'print_template.css');
$cssfiles[] = array('name' => 'template.js');
return $cssfiles;
}
/**
* Function that initialises all data and call other functions to load default view.
*
* @access protected
* @param string $templatename
* @param string $screenname
* @param string $editfile
* @param bool $showsummary
* @return
*/
protected function _initialise($templatename, $screenname, $editfile, $showsummary = true)
{
App()->getClientScript()->reset();
$clang = $this->getController()->lang;
Yii::app()->loadHelper('surveytranslator');
Yii::app()->loadHelper('admin/template');
$files = $this->_initfiles($templatename);
$cssfiles = $this->_initcssfiles();
// Standard Support Files
// These files may be edited or saved
$supportfiles[] = array('name' => 'print_img_radio.png');
$supportfiles[] = array('name' => 'print_img_checkbox.png');
// Standard screens
// Only these may be viewed
$screens[] = array('name' => $clang->gT('Survey List Page'), 'id' => 'surveylist');
$screens[] = array('name' => $clang->gT('Welcome Page'), 'id' => 'welcome');
$screens[] = array('name' => $clang->gT('Question Page'), 'id' => 'question');
$screens[] = array('name' => $clang->gT('Completed Page'), 'id' => 'completed');
$screens[] = array('name' => $clang->gT('Clear All Page'), 'id' => 'clearall');
$screens[] = array('name' => $clang->gT('Register Page'), 'id' => 'register');
$screens[] = array('name' => $clang->gT('Load Page'), 'id' => 'load');
$screens[] = array('name' => $clang->gT('Save Page'), 'id' => 'save');
$screens[] = array('name' => $clang->gT('Print answers page'), 'id' => 'printanswers');
$screens[] = array('name' => $clang->gT('Printable survey page'), 'id' => 'printablesurvey');
// Page display blocks
$SurveyList = array('startpage.pstpl',
'surveylist.pstpl',
'endpage.pstpl'
);
$Welcome = array('startpage.pstpl',
'welcome.pstpl',
'privacy.pstpl',
'navigator.pstpl',
'endpage.pstpl'
);
$Question = array('startpage.pstpl',
'survey.pstpl',
'startgroup.pstpl',
'groupdescription.pstpl',
'question.pstpl',
'endgroup.pstpl',
'navigator.pstpl',
'endpage.pstpl'
);
$CompletedTemplate = array(
'startpage.pstpl',
'assessment.pstpl',
'completed.pstpl',
'endpage.pstpl'
);
$Clearall = array('startpage.pstpl',
'clearall.pstpl',
'endpage.pstpl'
);
$Register = array('startpage.pstpl',
'survey.pstpl',
'register.pstpl',
'endpage.pstpl'
);
$Save = array('startpage.pstpl',
'save.pstpl',
'endpage.pstpl'
);
$Load = array('startpage.pstpl',
'load.pstpl',
'endpage.pstpl'
);
$printtemplate = array('startpage.pstpl',
'printanswers.pstpl',
'endpage.pstpl'
);
$printablesurveytemplate = array('print_survey.pstpl',
'print_group.pstpl',
'print_question.pstpl'
);
$file_version = "LimeSurvey template editor " . Yii::app()->getConfig('versionnumber');
Yii::app()->session['s_lang'] = Yii::app()->session['adminlang'];
$templatename = sanitize_dirname($templatename);
$screenname = autoUnescape($screenname);
// Checks if screen name is in the list of allowed screen names
if (multiarray_search($screens, 'id', $screenname) === false)
$this->getController()->error('Invalid screen name');
if (!isset($action))
$action = sanitize_paranoid_string(returnGlobal('action'));
if (!isset($subaction))
$subaction = sanitize_paranoid_string(returnGlobal('subaction'));
if (!isset($newname))
$newname = sanitize_dirname(returnGlobal('newname'));
if (!isset($copydir))
$copydir = sanitize_dirname(returnGlobal('copydir'));
if (is_file(Yii::app()->getConfig('usertemplaterootdir') . '/' . $templatename . '/question_start.pstpl')) {
$files[] = array('name' => 'question_start.pstpl');
$Question[] = 'question_start.pstpl';
}
$availableeditorlanguages = array('bg', 'cs', 'de', 'dk', 'en', 'eo', 'es', 'fi', 'fr', 'hr', 'it', 'ja', 'mk', 'nl', 'pl', 'pt', 'ru', 'sk', 'zh');
$extension = substr(strrchr($editfile, "."), 1);
if ($extension == 'css' || $extension == 'js')
$highlighter = $extension;
else
$highlighter = 'html';
if (in_array(Yii::app()->session['adminlang'], $availableeditorlanguages))
$codelanguage = Yii::app()->session['adminlang'];
else
$codelanguage = 'en';
$templates = getTemplateList();
if (!isset($templates[$templatename]))
$templatename = Yii::app()->getConfig('defaulttemplate');
$normalfiles = array("DUMMYENTRY", ".", "..", "preview.png");
foreach ($files as $fl)
$normalfiles[] = $fl["name"];
foreach ($cssfiles as $fl)
$normalfiles[] = $fl["name"];
// Some global data
$aData['sitename'] = Yii::app()->getConfig('sitename');
$siteadminname = Yii::app()->getConfig('siteadminname');
$siteadminemail = Yii::app()->getConfig('siteadminemail');
// Set this so common.php doesn't throw notices about undefined variables
$thissurvey['active'] = 'N';
// FAKE DATA FOR TEMPLATES
$thissurvey['name'] = $clang->gT("Template Sample");
$thissurvey['description'] =
"<p>".$clang->gT('This is a sample survey description. It could be quite long.')."</p>".
"<p>".$clang->gT("But this one isn't.")."<p>";
$thissurvey['welcome'] =
"<p>".$clang->gT('Welcome to this sample survey')."<p>" .
"<p>".$clang->gT('You should have a great time doing this')."<p>";
$thissurvey['allowsave'] = "Y";
$thissurvey['active'] = "Y";
$thissurvey['tokenanswerspersistence'] = "Y";
$thissurvey['templatedir'] = $templatename;
$thissurvey['format'] = "G";
$thissurvey['surveyls_url'] = "http://www.limesurvey.org/";
$thissurvey['surveyls_urldescription'] = $clang->gT("Some URL description");
$thissurvey['usecaptcha'] = "A";
$percentcomplete = makegraph(6, 10);
$groupname = $clang->gT("Group 1: The first lot of questions");
$groupdescription = $clang->gT("This group description is fairly vacuous, but quite important.");
$navigator = $this->getController()->render('/admin/templates/templateeditor_navigator_view', array(
'screenname' => $screenname,
'clang' => $clang,
), true);
$completed = $this->getController()->render('/admin/templates/templateeditor_completed_view', array(
'clang' => $clang,
), true);
$assessments = $this->getController()->render('/admin/templates/templateeditor_assessments_view', array(
'clang' => $clang,
), true);
$printoutput = $this->getController()->render('/admin/templates/templateeditor_printoutput_view', array(
'clang' => $clang
), true);
$totalquestions = '10';
$surveyformat = 'Format';
$notanswered = '5';
$privacy = '';
$surveyid = '1295';
$token = 1234567;
$templatedir = getTemplatePath($templatename);
$templateurl = getTemplateURL($templatename);
// Save these variables in an array
$aData['thissurvey'] = $thissurvey;
$aData['percentcomplete'] = $percentcomplete;
$aData['groupname'] = $groupname;
$aData['groupdescription'] = $groupdescription;
$aData['navigator'] = $navigator;
$aData['help'] = $clang->gT("This is some help text.");
$aData['surveyformat'] = $surveyformat;
$aData['totalquestions'] = $totalquestions;
$aData['completed'] = $completed;
$aData['notanswered'] = $notanswered;
$aData['privacy'] = $privacy;
$aData['surveyid'] = $surveyid;
$aData['sid'] = $surveyid;
$aData['token'] = $token;
$aData['assessments'] = $assessments;
$aData['printoutput'] = $printoutput;
$aData['templatedir'] = $templatedir;
$aData['templateurl'] = $templateurl;
$aData['templatename'] = $templatename;
$aData['screenname'] = $screenname;
$aData['editfile'] = $editfile;
$myoutput[] = "";
switch ($screenname)
{
case 'surveylist':
unset($files);
$surveylist = array(
"nosid" => $clang->gT("You have not provided a survey identification number"),
"contact" => sprintf($clang->gT("Please contact %s ( %s ) for further assistance."), Yii::app()->getConfig("siteadminname"), Yii::app()->getConfig("siteadminemail")),
"listheading" => $clang->gT("The following surveys are available:"),
"list" => $this->getController()->render('/admin/templates/templateeditor_surveylist_view', array(), true),
);
$aData['surveylist'] = $surveylist;
$myoutput[] = "";
foreach ($SurveyList as $qs)
{
$files[] = array("name" => $qs);
$myoutput = array_merge($myoutput, doreplacement(getTemplatePath($templatename) . "/$qs", $aData));
}
break;
case 'question':
unset($files);
foreach ($Question as $qs)
$files[] = array("name" => $qs);
$myoutput[] = $this->getController()->render('/admin/templates/templateeditor_question_meta_view', array('clang' => $clang), true);
$myoutput = array_merge($myoutput, doreplacement(getTemplatePath($templatename) . "/startpage.pstpl", $aData));
$myoutput = array_merge($myoutput, doreplacement(getTemplatePath($templatename) . "/survey.pstpl", $aData));
$myoutput = array_merge($myoutput, doreplacement(getTemplatePath($templatename) . "/startgroup.pstpl", $aData));
$myoutput = array_merge($myoutput, doreplacement(getTemplatePath($templatename) . "/groupdescription.pstpl", $aData));
$question = array(
'all' => $clang->gT("How many roads must a man walk down?"),// Still in use ?
'text' => $clang->gT("How many roads must a man walk down?"),
'code' => '1a',
'help' => 'helpful text',
'mandatory' => $clang->gT("*"),
'man_class' => ' mandatory',
'man_message' => '',
'valid_message' => '',
'file_valid_message' => '',
'essentials' => 'id="question1"',
'class' => 'list-radio',
'input_error_class' => '',
'number' => '1',
'type' => 'L'
);
$aData['question'] = $question;
$answer = $this->getController()->render('/admin/templates/templateeditor_question_answer_view', array('clang' => $clang), true);
$aData['answer'] = $answer;
$myoutput = array_merge($myoutput, doreplacement(getTemplatePath($templatename) . "/question.pstpl", $aData));
$answer = $this->getController()->render('/admin/templates/templateeditor_question_answer_view', array('alt' => true,'clang' => $clang), true);
$aData['answer'] = $answer;
$question = array(
'all' => $clang->gT("Please explain something in detail:"),// Still in use ?
'text' => $clang->gT('Please explain something in detail:'),
'code' => '2a',
'help' => '',
'mandatory' => '',
'man_message' => '',
'valid_message' => '',
'file_valid_message' => '',
'essentials' => 'id="question2"',
'class' => 'text-long',
'man_class' => 'mandatory',
'input_error_class' => '',
'number' => '2',
'type' => 'T'
);
$aData['question'] = $question;
$myoutput = array_merge($myoutput, doreplacement(getTemplatePath($templatename) . "/question.pstpl", $aData));
$myoutput = array_merge($myoutput, doreplacement(getTemplatePath($templatename) . "/endgroup.pstpl", $aData));
$myoutput = array_merge($myoutput, doreplacement(getTemplatePath($templatename) . "/navigator.pstpl", $aData));
$myoutput = array_merge($myoutput, doreplacement(getTemplatePath($templatename) . "/endpage.pstpl", $aData));
break;
case 'welcome':
unset($files);
$myoutput[] = "";
foreach ($Welcome as $qs)
{
$files[] = array("name" => $qs);
$myoutput = array_merge($myoutput, doreplacement(getTemplatePath($templatename) . "/$qs", $aData));
}
break;
case 'register':
unset($files);
foreach ($Register as $qs)
$files[] = array("name" => $qs);
$myoutput[] = templatereplace(file_get_contents("$templatedir/startpage.pstpl"), array(), $aData);
$myoutput[] = templatereplace(file_get_contents("$templatedir/survey.pstpl"), array(), $aData);
$myoutput[] = templatereplace(file_get_contents("$templatedir/register.pstpl"), array(), $aData);
$myoutput[] = templatereplace(file_get_contents("$templatedir/endpage.pstpl"), array(), $aData);
$myoutput[] = "\n";
break;
case 'save':
unset($files);
foreach ($Save as $qs)
$files[] = array("name" => $qs);
$myoutput[] = templatereplace(file_get_contents("$templatedir/startpage.pstpl"), array(), $aData);
$myoutput[] = templatereplace(file_get_contents("$templatedir/save.pstpl"), array(), $aData);
$myoutput[] = templatereplace(file_get_contents("$templatedir/endpage.pstpl"), array(), $aData);
$myoutput[] = "\n";
break;
case 'load':
unset($files);
foreach ($Load as $qs)
$files[] = array("name" => $qs);
$myoutput[] = templatereplace(file_get_contents("$templatedir/startpage.pstpl"), array(), $aData);
$myoutput[] = templatereplace(file_get_contents("$templatedir/load.pstpl"), array(), $aData);
$myoutput[] = templatereplace(file_get_contents("$templatedir/endpage.pstpl"), array(), $aData);
$myoutput[] = "\n";
break;
case 'clearall':
unset($files);
foreach ($Clearall as $qs)
$files[] = array("name" => $qs);
$myoutput[] = templatereplace(file_get_contents("$templatedir/startpage.pstpl"), array(), $aData);
$myoutput[] = templatereplace(file_get_contents("$templatedir/clearall.pstpl"), array(), $aData);
$myoutput[] = templatereplace(file_get_contents("$templatedir/endpage.pstpl"), array(), $aData);
$myoutput[] = "\n";
break;
case 'completed':
unset($files);
$myoutput[] = "";
foreach ($CompletedTemplate as $qs)
{
$files[] = array("name" => $qs);
$myoutput = array_merge($myoutput, doreplacement(getTemplatePath($templatename) . "/$qs", $aData));
}
break;
case 'printablesurvey':
unset($files);
foreach ($printablesurveytemplate as $qs)
{
$files[] = array("name" => $qs);
}
$questionoutput = array();
foreach (file("$templatedir/print_question.pstpl") as $op)
{
$questionoutput[] = templatereplace($op, array(
'QUESTION_NUMBER' => '1',
'QUESTION_CODE' => 'Q1',
'QUESTION_MANDATORY' => $clang->gT('*'),
// If there are conditions on a question, list the conditions.
'QUESTION_SCENARIO' => 'Only answer this if certain conditions are met.',
'QUESTION_CLASS' => ' mandatory list-radio',
'QUESTION_TYPE_HELP' => $clang->gT('Please choose *only one* of the following:'),
// (not sure if this is used) mandatory error
'QUESTION_MAN_MESSAGE' => '',
// (not sure if this is used) validation error
'QUESTION_VALID_MESSAGE' => '',
// (not sure if this is used) file validation error
'QUESTION_FILE_VALID_MESSAGE' => '',
'QUESTION_TEXT' => $clang->gT('This is a sample question text. The user was asked to pick an entry.'),
'QUESTIONHELP' => $clang->gT('This is some help text for this question.'),
'ANSWER' =>
$this->getController()->render('/admin/templates/templateeditor_printablesurvey_quesanswer_view', array(
'templateurl' => $templateurl,
'clang' => $clang
), true),
), $aData);
}
$groupoutput = array();
$groupoutput[] = templatereplace(file_get_contents("$templatedir/print_group.pstpl"), array('QUESTIONS' => implode(' ', $questionoutput)), $aData);
$myoutput[] = templatereplace(file_get_contents("$templatedir/print_survey.pstpl"), array('GROUPS' => implode(' ', $groupoutput),
'FAX_TO' => $clang->gT("Please fax your completed survey to:") . " 000-000-000",
'SUBMIT_TEXT' => $clang->gT("Submit your survey."),
'HEADELEMENTS' => getPrintableHeader(),
'SUBMIT_BY' => sprintf($clang->gT("Please submit by %s"), date('d.m.y')),
'THANKS' => $clang->gT('Thank you for completing this survey.'),
'END' => $clang->gT('This is the survey end message.')
), $aData);
break;
case 'printanswers':
unset($files);
foreach ($printtemplate as $qs)
{
$files[] = array("name" => $qs);
}
$myoutput[] = templatereplace(file_get_contents("$templatedir/startpage.pstpl"), array(), $aData);
$myoutput[] = templatereplace(file_get_contents("$templatedir/printanswers.pstpl"), array('ANSWERTABLE' => $printoutput), $aData);
$myoutput[] = templatereplace(file_get_contents("$templatedir/endpage.pstpl"), array(), $aData);
$myoutput[] = "\n";
break;
}
$myoutput[] = "</html>";
if (is_array($files)) {
$match = 0;
foreach ($files as $f)
if ($editfile == $f["name"])
$match = 1;
foreach ($cssfiles as $f)
if ($editfile == $f["name"])
$match = 1;
if ($match == 0)
if (count($files) > 0)
$editfile = $files[0]["name"];
else
$editfile = "";
}
// Get list of 'otherfiles'
$otherfiles = array();
if ($handle = opendir($templatedir)) {
while (false !== ($file = readdir($handle)))
{
if (!array_search($file, $normalfiles)) {
if (!is_dir($templatedir . DIRECTORY_SEPARATOR . $file)) {
$otherfiles[] = array("name" => $file);
}
}
}
closedir($handle);
}
$aData['clang'] = $this->getController()->lang;
$aData['codelanguage'] = $codelanguage;
$aData['highlighter'] = $highlighter;
$aData['screens'] = $screens;
$aData['templatename'] = $templatename;
$aData['templates'] = $templates;
$aData['editfile'] = $editfile;
$aData['screenname'] = $screenname;
$aData['tempdir'] = Yii::app()->getConfig('tempdir');
$aData['usertemplaterootdir'] = Yii::app()->getConfig('usertemplaterootdir');
$aViewUrls['templateeditorbar_view'][] = $aData;
if ($showsummary)
$aViewUrls = array_merge($aViewUrls, $this->_templatesummary($templatename, $screenname, $editfile, $templates, $files, $cssfiles, $otherfiles, $myoutput));
App()->getClientScript()->registerScriptFile(Yii::app()->getConfig('adminscripts') . 'admin_core.js');
return $aViewUrls;
}
/**
* Renders template(s) wrapped in header and footer
*
* @param string $sAction Current action, the folder to fetch views from
* @param string|array $aViewUrls View url(s)
* @param array $aData Data to be passed on. Optional.
*/
protected function _renderWrappedTemplate($sAction = 'templates', $aViewUrls = array(), $aData = array())
{
$aData['display']['menu_bars'] = false;
parent::_renderWrappedTemplate($sAction, $aViewUrls, $aData);
}
}