View Issue Details

IDProjectCategoryView StatusLast Update
16375Bug reportsTheme editorpublic2020-07-06 13:20
ReporterDenisChenu Assigned ToDenisChenu  
PrioritynoneSeverityminor 
Status closedResolutionfixed 
Product Version3.22.19 
Fixed in Version3.22.24 
Summary16375: Theme with valid config.xml (according to manual) can not be extendable
Description

When extend a valid theme in 3.X : potential issue with last_update

Steps To Reproduce
  1. Import included theme
  2. Don't save anything
  3. Extend
  4. See error
Additional Information

In 4.X : last_update was renamed to lastUpdate …

This make hard for template creator if there are un-documentedAPI update …

TagsNo tags attached.
Complete LimeSurvey version number (& build)3.22.18
I will donate to the project if issue is resolvedNo
Browsernot relevant
Database & DB-Versionnot relevant
Server OS (if known)not relevant
Webserver software & version (if known)not relevant
PHP Versionnot relevant

Activities

DenisChenu

DenisChenu

2020-06-10 12:23

developer  

skelvanillalight.zip (361,630 bytes)
TypeError.html (23,884 bytes)   
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>TypeError</title>

<style type="text/css">
/*<![CDATA[*/
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,font,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td{border:0;outline:0;font-size:100%;vertical-align:baseline;background:transparent;margin:0;padding:0;}
body{line-height:1;}
ol,ul{list-style:none;}
blockquote,q{quotes:none;}
blockquote:before,blockquote:after,q:before,q:after{content:none;}
:focus{outline:0;}
ins{text-decoration:none;}
del{text-decoration:line-through;}
table{border-collapse:collapse;border-spacing:0;}

body {
	font: normal 9pt "Verdana";
	color: #000;
	background: #fff;
}

h1 {
	font: normal 18pt "Verdana";
	color: #f00;
	margin-bottom: .5em;
}

h2 {
	font: normal 14pt "Verdana";
	color: #800000;
	margin-bottom: .5em;
}

h3 {
	font: bold 11pt "Verdana";
}

pre {
	font: normal 11pt Menlo, Consolas, "Lucida Console", Monospace;
}

pre span.error {
	display: block;
	background: #fce3e3;
}

pre span.ln {
	color: #999;
	padding-right: 0.5em;
	border-right: 1px solid #ccc;
}

pre span.error-ln {
	font-weight: bold;
}

.container {
	margin: 1em 4em;
}

.version {
	color: gray;
	font-size: 8pt;
	border-top: 1px solid #aaa;
	padding-top: 1em;
	margin-bottom: 1em;
}

.message {
	color: #000;
	padding: 1em;
	font-size: 11pt;
	background: #f3f3f3;
	-webkit-border-radius: 10px;
	-moz-border-radius: 10px;
	border-radius: 10px;
	margin-bottom: 1em;
	line-height: 160%;
}

.source {
	margin-bottom: 1em;
}

.code pre {
	background-color: #ffe;
	margin: 0.5em 0;
	padding: 0.5em;
	line-height: 125%;
	border: 1px solid #eee;
}

.source .file {
	margin-bottom: 1em;
	font-weight: bold;
}

.traces {
	margin: 2em 0;
}

.trace {
	margin: 0.5em 0;
	padding: 0.5em;
}

.trace.app {
	border: 1px dashed #c00;
}

.trace .number {
	text-align: right;
	width: 2em;
	padding: 0.5em;
}

.trace .content {
	padding: 0.5em;
}

.trace .plus,
.trace .minus {
	display:inline;
	vertical-align:middle;
	text-align:center;
	border:1px solid #000;
	color:#000;
	font-size:10px;
	line-height:10px;
	margin:0;
	padding:0 1px;
	width:10px;
	height:10px;
}

.trace.collapsed .minus,
.trace.expanded .plus,
.trace.collapsed pre {
	display: none;
}

.trace-file {
	cursor: pointer;
	padding: 0.2em;
}

.trace-file:hover {
	background: #f0ffff;
}
/*]]>*/
</style>
</head>

<body>
<div class="container">
	<h1>TypeError</h1>

	<p class="message">
		Argument 2 passed to DOMNode::replaceChild() must be an instance of DOMNode, null given	</p>

	<div class="source">
		<p class="file">/mnt/data/shnoulle/nginx/www/3LTS/application/models/TemplateManifest.php(860)</p>
		<div class="code"><pre><span class="ln">848</span>      * @param string        $sDate         The wanted date, if empty the current date with config time adjustment will be used
<span class="ln">849</span>      */
<span class="ln">850</span>     public static function changeDateInDOM($oNewManifest, $sDate = '')
<span class="ln">851</span>     {
<span class="ln">852</span>         $date           = (empty($date)) ?dateShift(date("Y-m-d H:i:s"), "Y-m-d H:i", Yii::app()-&gt;getConfig("timeadjust")) : $date;
<span class="ln">853</span>         $oConfig        = $oNewManifest-&gt;getElementsByTagName('config')-&gt;item(0);
<span class="ln">854</span>         $ometadata = $oConfig-&gt;getElementsByTagName('metadata')-&gt;item(0);
<span class="ln">855</span>         $oOldDateNode   = $ometadata-&gt;getElementsByTagName('creationDate')-&gt;item(0);
<span class="ln">856</span>         $oNvDateNode    = $oNewManifest-&gt;createElement('creationDate', $sDate);
<span class="ln">857</span>         $ometadata-&gt;replaceChild($oNvDateNode, $oOldDateNode);
<span class="ln">858</span>         $oOldUpdateNode = $ometadata-&gt;getElementsByTagName('last_update')-&gt;item(0);
<span class="ln">859</span>         $oNvDateNode    = $oNewManifest-&gt;createElement('last_update', $sDate);
<span class="error"><span class="ln error-ln">860</span>         $ometadata-&gt;replaceChild($oNvDateNode, $oOldUpdateNode);
</span><span class="ln">861</span>     }
<span class="ln">862</span> 
<span class="ln">863</span>     /**
<span class="ln">864</span>      * Change the template name inside the manifest (called from template editor)
<span class="ln">865</span>      * NOTE: all tests (like template exist, etc) are done from template controller.
<span class="ln">866</span>      *
<span class="ln">867</span>      * @param string $sOldName The old name of the template
<span class="ln">868</span>      * @param string $sNewName The newname of the template
<span class="ln">869</span>      */
<span class="ln">870</span>     public static function rename($sOldName, $sNewName)
<span class="ln">871</span>     {
<span class="ln">872</span>         libxml_disable_entity_loader(false);
</pre></div>	</div>

	<div class="traces">
		<h2>Stack Trace</h2>
				<table style="width:100%;">
						<tbody><tr class="trace app expanded">
			<td class="number">
				#0			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/mnt/data/shnoulle/nginx/www/3LTS/application/models/TemplateManifest.php(860): <strong>DOMNode</strong>-&gt;<strong>replaceChild</strong>(DOMElement, null)				</div>

				<div class="code"><pre><span class="ln">855</span>         $oOldDateNode   = $ometadata-&gt;getElementsByTagName('creationDate')-&gt;item(0);
<span class="ln">856</span>         $oNvDateNode    = $oNewManifest-&gt;createElement('creationDate', $sDate);
<span class="ln">857</span>         $ometadata-&gt;replaceChild($oNvDateNode, $oOldDateNode);
<span class="ln">858</span>         $oOldUpdateNode = $ometadata-&gt;getElementsByTagName('last_update')-&gt;item(0);
<span class="ln">859</span>         $oNvDateNode    = $oNewManifest-&gt;createElement('last_update', $sDate);
<span class="error"><span class="ln error-ln">860</span>         $ometadata-&gt;replaceChild($oNvDateNode, $oOldUpdateNode);
</span><span class="ln">861</span>     }
<span class="ln">862</span> 
<span class="ln">863</span>     /**
<span class="ln">864</span>      * Change the template name inside the manifest (called from template editor)
<span class="ln">865</span>      * NOTE: all tests (like template exist, etc) are done from template controller.
</pre></div>			</td>
		</tr>
						<tr class="trace app expanded">
			<td class="number">
				#1			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/mnt/data/shnoulle/nginx/www/3LTS/application/models/TemplateManifest.php(979): <strong>TemplateManifest</strong>::<strong>changeDateInDOM</strong>(DOMDocument)				</div>

				<div class="code"><pre><span class="ln">974</span>         libxml_disable_entity_loader(false);
<span class="ln">975</span>         $oNewManifest = self::getManifestDOM($sConfigPath);
<span class="ln">976</span> 
<span class="ln">977</span>         self::deleteEngineInDom($oNewManifest);
<span class="ln">978</span>         self::changeNameInDOM($oNewManifest, $sNewName);
<span class="error"><span class="ln error-ln">979</span>         self::changeDateInDOM($oNewManifest);
</span><span class="ln">980</span>         self::changeAuthorInDom($oNewManifest);
<span class="ln">981</span>         self::changeEmailInDom($oNewManifest);
<span class="ln">982</span>         self::changeExtendsInDom($oNewManifest, $sToExtends);
<span class="ln">983</span> 
<span class="ln">984</span>         $oNewManifest-&gt;save($sConfigPath."/config.xml");
</pre></div>			</td>
		</tr>
						<tr class="trace app expanded">
			<td class="number">
				#2			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/mnt/data/shnoulle/nginx/www/3LTS/application/controllers/admin/themes.php(576): <strong>TemplateManifest</strong>::<strong>extendsConfig</strong>("skelvanilla", "extends_skelvanilla")				</div>

				<div class="code"><pre><span class="ln">571</span> 
<span class="ln">572</span>                 if ($mkdirresult == 1) {
<span class="ln">573</span>                     // We just copy the while directory structure, but only the xml file
<span class="ln">574</span>                     $oFileHelper-&gt;copyDirectory($copydirname, $newdirname, array('fileTypes' =&gt; array('xml', 'png', 'jpg'), 'newDirMode' =&gt; 0755));
<span class="ln">575</span>                     //TemplateConfiguration::removeAllNodes($newdirname);
<span class="error"><span class="ln error-ln">576</span>                     TemplateManifest::extendsConfig($copydir, $newname);
</span><span class="ln">577</span>                     TemplateManifest::importManifest($newname, ['extends' =&gt; $copydir]);
<span class="ln">578</span>                     $this-&gt;getController()-&gt;redirect(array("admin/themes/sa/view", 'templatename'=&gt;$newname));
<span class="ln">579</span>                 } elseif ($mkdirresult == 2) {
<span class="ln">580</span>                     Yii::app()-&gt;setFlashMessage(sprintf(gT("Directory with the name `%s` already exists - choose another name"), $newname), 'error');
<span class="ln">581</span>                     $this-&gt;getController()-&gt;redirect(array("admin/themes/sa/view", 'templatename'=&gt;$copydir));
</pre></div>			</td>
		</tr>
						<tr class="trace core collapsed">
			<td class="number">
				#3			</td>
			<td class="content">
				<div class="trace-file">
										&nbsp;unknown(0): <strong>themes</strong>-&gt;<strong>templatecopy</strong>()				</div>

							</td>
		</tr>
						<tr class="trace core collapsed">
			<td class="number">
				#4			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/mnt/data/shnoulle/nginx/www/3LTS/framework/web/actions/CAction.php(109): <strong>ReflectionMethod</strong>-&gt;<strong>invokeArgs</strong>(themes, array())				</div>

				<div class="code"><pre><span class="ln">104</span>             elseif($param-&gt;isDefaultValueAvailable())
<span class="ln">105</span>                 $ps[]=$param-&gt;getDefaultValue();
<span class="ln">106</span>             else
<span class="ln">107</span>                 return false;
<span class="ln">108</span>         }
<span class="error"><span class="ln error-ln">109</span>         $method-&gt;invokeArgs($object,$ps);
</span><span class="ln">110</span>         return true;
<span class="ln">111</span>     }
<span class="ln">112</span> }
</pre></div>			</td>
		</tr>
						<tr class="trace app collapsed">
			<td class="number">
				#5			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/mnt/data/shnoulle/nginx/www/3LTS/application/core/Survey_Common_Action.php(83): <strong>CAction</strong>-&gt;<strong>runWithParamsInternal</strong>(themes,
 ReflectionMethod, array("r" =&gt; "admin/themes/sa/templatecopy", "sa" 
=&gt; "templatecopy", "sAction" =&gt; "templatecopy"))				</div>

				<div class="code"><pre><span class="ln">78</span>             $oMethod = new ReflectionMethod($this, $sDefault);
<span class="ln">79</span>         }
<span class="ln">80</span> 
<span class="ln">81</span>         // We're all good to go, let's execute it
<span class="ln">82</span>         // runWithParamsInternal would automatically get the parameters of the method and populate them as required with the params
<span class="error"><span class="ln error-ln">83</span>         return parent::runWithParamsInternal($this, $oMethod, $params);
</span><span class="ln">84</span>     }
<span class="ln">85</span> 
<span class="ln">86</span>     /**
<span class="ln">87</span>      * Some functions have different parameters, which are just an alias of the
<span class="ln">88</span>      * usual parameters we're getting in the url. This function just populates
</pre></div>			</td>
		</tr>
						<tr class="trace app collapsed">
			<td class="number">
				#6			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/mnt/data/shnoulle/nginx/www/3LTS/application/controllers/admin/themes.php(33): <strong>Survey_Common_Action</strong>-&gt;<strong>runWithParams</strong>(array("r" =&gt; "admin/themes/sa/templatecopy", "sa" =&gt; "templatecopy", "sAction" =&gt; "templatecopy"))				</div>

				<div class="code"><pre><span class="ln">28</span>     public function runWithParams($params)
<span class="ln">29</span>     {
<span class="ln">30</span> 
<span class="ln">31</span>         $sTemplateName = Yii::app()-&gt;request-&gt;getPost('templatename', '');
<span class="ln">32</span>         if (Permission::model()-&gt;hasGlobalPermission('templates', 'read') || Permission::model()-&gt;hasTemplatePermission($sTemplateName)) {
<span class="error"><span class="ln error-ln">33</span>             parent::runWithParams($params);
</span><span class="ln">34</span>         } else {
<span class="ln">35</span>             Yii::app()-&gt;setFlashMessage(gT("We are sorry but you don't have permissions to do this."), 'error');
<span class="ln">36</span>             $this-&gt;getController()-&gt;redirect(array("admin/themeoptions"));
<span class="ln">37</span>         }
<span class="ln">38</span>     }
</pre></div>			</td>
		</tr>
						<tr class="trace core collapsed">
			<td class="number">
				#7			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/mnt/data/shnoulle/nginx/www/3LTS/framework/web/CController.php(308): <strong>themes</strong>-&gt;<strong>runWithParams</strong>(array("r" =&gt; "admin/themes/sa/templatecopy", "sa" =&gt; "templatecopy"))				</div>

				<div class="code"><pre><span class="ln">303</span>     {
<span class="ln">304</span>         $priorAction=$this-&gt;_action;
<span class="ln">305</span>         $this-&gt;_action=$action;
<span class="ln">306</span>         if($this-&gt;beforeAction($action))
<span class="ln">307</span>         {
<span class="error"><span class="ln error-ln">308</span>             if($action-&gt;runWithParams($this-&gt;getActionParams())===false)
</span><span class="ln">309</span>                 $this-&gt;invalidActionParams($action);
<span class="ln">310</span>             else
<span class="ln">311</span>                 $this-&gt;afterAction($action);
<span class="ln">312</span>         }
<span class="ln">313</span>         $this-&gt;_action=$priorAction;
</pre></div>			</td>
		</tr>
						<tr class="trace core collapsed">
			<td class="number">
				#8			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/mnt/data/shnoulle/nginx/www/3LTS/framework/web/CController.php(286): <strong>CController</strong>-&gt;<strong>runAction</strong>(themes)				</div>

				<div class="code"><pre><span class="ln">281</span>      * @see runAction
<span class="ln">282</span>      */
<span class="ln">283</span>     public function runActionWithFilters($action,$filters)
<span class="ln">284</span>     {
<span class="ln">285</span>         if(empty($filters))
<span class="error"><span class="ln error-ln">286</span>             $this-&gt;runAction($action);
</span><span class="ln">287</span>         else
<span class="ln">288</span>         {
<span class="ln">289</span>             $priorAction=$this-&gt;_action;
<span class="ln">290</span>             $this-&gt;_action=$action;
<span class="ln">291</span>             CFilterChain::create($this,$action,$filters)-&gt;run();
</pre></div>			</td>
		</tr>
						<tr class="trace core collapsed">
			<td class="number">
				#9			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/mnt/data/shnoulle/nginx/www/3LTS/framework/web/CController.php(265): <strong>CController</strong>-&gt;<strong>runActionWithFilters</strong>(themes, array())				</div>

				<div class="code"><pre><span class="ln">260</span>         {
<span class="ln">261</span>             if(($parent=$this-&gt;getModule())===null)
<span class="ln">262</span>                 $parent=Yii::app();
<span class="ln">263</span>             if($parent-&gt;beforeControllerAction($this,$action))
<span class="ln">264</span>             {
<span class="error"><span class="ln error-ln">265</span>                 $this-&gt;runActionWithFilters($action,$this-&gt;filters());
</span><span class="ln">266</span>                 $parent-&gt;afterControllerAction($this,$action);
<span class="ln">267</span>             }
<span class="ln">268</span>         }
<span class="ln">269</span>         else
<span class="ln">270</span>             $this-&gt;missingAction($actionID);
</pre></div>			</td>
		</tr>
						<tr class="trace app collapsed">
			<td class="number">
				#10			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/mnt/data/shnoulle/nginx/www/3LTS/application/controllers/AdminController.php(165): <strong>CController</strong>-&gt;<strong>run</strong>("themes")				</div>

				<div class="code"><pre><span class="ln">160</span>                     $this-&gt;redirect(array('/admin/authentication/sa/login'));
<span class="ln">161</span>                 }
<span class="ln">162</span>             }
<span class="ln">163</span>         }
<span class="ln">164</span> 
<span class="error"><span class="ln error-ln">165</span>         return parent::run($action);
</span><span class="ln">166</span>     }
<span class="ln">167</span> 
<span class="ln">168</span>     /**
<span class="ln">169</span>      * Routes all the actions to their respective places
<span class="ln">170</span>      *
</pre></div>			</td>
		</tr>
						<tr class="trace core collapsed">
			<td class="number">
				#11			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/mnt/data/shnoulle/nginx/www/3LTS/framework/web/CWebApplication.php(282): <strong>AdminController</strong>-&gt;<strong>run</strong>("themes")				</div>

				<div class="code"><pre><span class="ln">277</span>         {
<span class="ln">278</span>             list($controller,$actionID)=$ca;
<span class="ln">279</span>             $oldController=$this-&gt;_controller;
<span class="ln">280</span>             $this-&gt;_controller=$controller;
<span class="ln">281</span>             $controller-&gt;init();
<span class="error"><span class="ln error-ln">282</span>             $controller-&gt;run($actionID);
</span><span class="ln">283</span>             $this-&gt;_controller=$oldController;
<span class="ln">284</span>         }
<span class="ln">285</span>         else
<span class="ln">286</span>             throw new CHttpException(404,Yii::t('yii','Unable to resolve the request "{route}".',
<span class="ln">287</span>                 array('{route}'=&gt;$route===''?$this-&gt;defaultController:$route)));
</pre></div>			</td>
		</tr>
						<tr class="trace core collapsed">
			<td class="number">
				#12			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/mnt/data/shnoulle/nginx/www/3LTS/framework/web/CWebApplication.php(141): <strong>CWebApplication</strong>-&gt;<strong>runController</strong>("admin/themes/sa/templatecopy")				</div>

				<div class="code"><pre><span class="ln">136</span>             foreach(array_splice($this-&gt;catchAllRequest,1) as $name=&gt;$value)
<span class="ln">137</span>                 $_GET[$name]=$value;
<span class="ln">138</span>         }
<span class="ln">139</span>         else
<span class="ln">140</span>             $route=$this-&gt;getUrlManager()-&gt;parseUrl($this-&gt;getRequest());
<span class="error"><span class="ln error-ln">141</span>         $this-&gt;runController($route);
</span><span class="ln">142</span>     }
<span class="ln">143</span> 
<span class="ln">144</span>     /**
<span class="ln">145</span>      * Registers the core application components.
<span class="ln">146</span>      * This method overrides the parent implementation by registering additional core components.
</pre></div>			</td>
		</tr>
						<tr class="trace core collapsed">
			<td class="number">
				#13			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/mnt/data/shnoulle/nginx/www/3LTS/framework/base/CApplication.php(185): <strong>CWebApplication</strong>-&gt;<strong>processRequest</strong>()				</div>

				<div class="code"><pre><span class="ln">180</span>     public function run()
<span class="ln">181</span>     {
<span class="ln">182</span>         if($this-&gt;hasEventHandler('onBeginRequest'))
<span class="ln">183</span>             $this-&gt;onBeginRequest(new CEvent($this));
<span class="ln">184</span>         register_shutdown_function(array($this,'end'),0,false);
<span class="error"><span class="ln error-ln">185</span>         $this-&gt;processRequest();
</span><span class="ln">186</span>         if($this-&gt;hasEventHandler('onEndRequest'))
<span class="ln">187</span>             $this-&gt;onEndRequest(new CEvent($this));
<span class="ln">188</span>     }
<span class="ln">189</span> 
<span class="ln">190</span>     /**
</pre></div>			</td>
		</tr>
						<tr class="trace app collapsed">
			<td class="number">
				#14			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/mnt/data/shnoulle/nginx/www/3LTS/index.php(194): <strong>CApplication</strong>-&gt;<strong>run</strong>()				</div>

				<div class="code"><pre><span class="ln">189</span> require_once APPPATH . 'core/LSYii_Application' . EXT;
<span class="ln">190</span> 
<span class="ln">191</span> $config = require_once(APPPATH . 'config/internal' . EXT);
<span class="ln">192</span> 
<span class="ln">193</span> Yii::$enableIncludePath = false;
<span class="error"><span class="ln error-ln">194</span> Yii::createApplication('LSYii_Application', $config)-&gt;run();
</span><span class="ln">195</span> 
<span class="ln">196</span> /* End of file index.php */
<span class="ln">197</span> /* Location: ./index.php */
</pre></div>			</td>
		</tr>
				</tbody></table>
	</div>

	<div class="version">
		2020-06-10 10:16:06 nginx/1.18.0 <a href="http://www.yiiframework.com/">Yii Framework</a>/1.1.22-dev	</div>
</div>

<script type="text/javascript">
/*<![CDATA[*/
var traceReg = new RegExp("(^|\\s)trace-file(\\s|$)");
var collapsedReg = new RegExp("(^|\\s)collapsed(\\s|$)");

var e = document.getElementsByTagName("div");
for(var j=0,len=e.length;j<len;j++){
	if(traceReg.test(e[j].className)){
		e[j].onclick = function(){
			var trace = this.parentNode.parentNode;
			if(collapsedReg.test(trace.className))
				trace.className = trace.className.replace("collapsed", "expanded");
			else
				trace.className = trace.className.replace("expanded", "collapsed");
		}
	}
}
/*]]>*/
</script>



<div id="grammalecte_menu_main_button_shadow_host" style="width: 0px; height: 0px;"></div></body><script src="TypeError_fichiers/api.js"></script></html>
TypeError.html (23,884 bytes)   
DenisChenu

DenisChenu

2020-06-10 12:24

developer   ~58238

Manual about config.xml don't talk about last_update : https://manual.limesurvey.org/New_Template_System_in_LS3.x#The_manifest_config.xml

ollehar

ollehar

2020-06-10 13:54

administrator   ~58239

My fault for not documenting the change, sorry.

DenisChenu

DenisChenu

2020-06-10 14:20

developer   ~58240

My opinion : must treat null/not set in changeDateInDOM , since it's not important and not in API

$oOldDateNode = &quot;&quot;;
if($ometadata->getElementsByTagName('last_update')) {
    $oOldDateNode = $ometadata->getElementsByTagName('last_update')->item(0);
}

I make the pull request

Mazi

Mazi

2020-06-12 00:55

partner   ~58259

So where is the backwards compatibility? Why are such important details renamed? Was there any notice? Where? I may have missed it...

And if we change the naming convention, why don't we add a few lines of code to check for either "old_name" or "new_name" when reading the config details in order to be backwards compatible?

Reminds me of the variable name change at https://bugs.limesurvey.org/view.php?id=12131#c57042 / https://github.com/LimeSurvey/LimeSurvey/commit/367a4ce4ec72d262c70d94bf0fae2017270f6f4f#commitcomment-38318606
-> No reaction to that so far...

ollehar

ollehar

2020-06-12 10:23

administrator   ~58264

Just sloppiness from my part. But missing backwards compatibility is the entire point of bumbing a major version. :) What we can do is throw an exception if last_update is still there.

DenisChenu

DenisChenu

2020-06-12 10:28

developer   ~58265

Since neither last_update or lastUpdate are in current config API manual:
Think we must check if exist when save, create if not.

Mazi

Mazi

2020-06-12 11:28

partner   ~58269

I would even go for "must check if ANY OF THE TWO FORMATS exist when save, create if not.".

@ollehar, I also think that breaking backwards compatibility and arguing it is fine because we adjusted the version number is not user friendly. Instead, let's try to ensure backwards compatiblity by adding some lines of code. It should be simple in this case the check if config setting A OR B exists and then use one if exists or create if not (good point, Denis!).

If a whole bunch of themes (could also affect plugins) are broken and users are told "Didn't you see the different version number?", then this will further damage the Limesurvey reputation which already is at risk.

DenisChenu

DenisChenu

2020-06-12 11:32

developer   ~58270

@Mazi : not necessary.

My opinion :

  1. Have a last update date from "original" version : SkelVanilla version , Blacky version
  2. A local last update
ollehar

ollehar

2020-06-12 13:49

administrator   ~58271

let's try to ensure backwards compatibility by adding some lines of code

Yes, why not.

DenisChenu

DenisChenu

2020-06-22 18:13

developer   ~58379

I do backward on 4.X , not on 3.X :D

The fix for 3.X : https://github.com/LimeSurvey/LimeSurvey/pull/1440

DenisChenu

DenisChenu

2020-06-22 18:13

developer   ~58380

@Mazi : opinion about the fix ?

Mazi

Mazi

2020-06-22 18:22

partner   ~58381

Looks good!

DenisChenu

DenisChenu

2020-07-03 11:43

developer   ~58675

Fix committed to 3.x-LTS branch: http://bugs.limesurvey.org/plugin.php?page=Source/view&amp;id=30248

DenisChenu

DenisChenu

2020-07-03 12:23

developer   ~58678

Fix committed to master branch: http://bugs.limesurvey.org/plugin.php?page=Source/view&amp;id=30249

lime_release_bot

lime_release_bot

2020-07-06 13:20

administrator   ~58704

Fixed in Release 3.22.25+200706

Related Changesets

LimeSurvey: 3.x-LTS 0364239e

2020-07-03 11:43:54

DenisChenu


Committer: GitHub Details Diff
Fixed issue 16375: Theme with valid config.xml (according to manual) can not be extendable

Dev: create if not set
Affected Issues
16375
mod - application/models/TemplateManifest.php Diff File

LimeSurvey: master 28f3e9e6

2020-07-03 12:23:44

DenisChenu

Details Diff
Fixed issue 16375: Theme with valid config.xml (according to manual) can not be extendable Affected Issues
16375
mod - application/models/TemplateManifest.php Diff File

Issue History

Date Modified Username Field Change
2020-06-10 12:23 DenisChenu New Issue
2020-06-10 12:23 DenisChenu File Added: skelvanillalight.zip
2020-06-10 12:23 DenisChenu File Added: TypeError.html
2020-06-10 12:24 DenisChenu Note Added: 58238
2020-06-10 13:54 ollehar Note Added: 58239
2020-06-10 14:20 DenisChenu Note Added: 58240
2020-06-10 14:20 DenisChenu Assigned To => DenisChenu
2020-06-10 14:20 DenisChenu Status new => assigned
2020-06-12 00:55 Mazi Note Added: 58259
2020-06-12 10:23 ollehar Note Added: 58264
2020-06-12 10:28 DenisChenu Note Added: 58265
2020-06-12 11:28 Mazi Note Added: 58269
2020-06-12 11:32 DenisChenu Note Added: 58270
2020-06-12 13:49 ollehar Note Added: 58271
2020-06-22 18:13 DenisChenu Note Added: 58379
2020-06-22 18:13 DenisChenu Status assigned => testing
2020-06-22 18:13 DenisChenu Note Added: 58380
2020-06-22 18:22 Mazi Note Added: 58381
2020-07-03 11:43 DenisChenu Changeset attached => LimeSurvey 3.x-LTS 0364239e
2020-07-03 11:43 DenisChenu Note Added: 58675
2020-07-03 11:43 DenisChenu Resolution open => fixed
2020-07-03 12:23 DenisChenu Changeset attached => LimeSurvey master 28f3e9e6
2020-07-03 12:23 DenisChenu Note Added: 58678
2020-07-03 12:24 DenisChenu Status testing => resolved
2020-07-03 12:24 DenisChenu Fixed in Version => 3.22.24
2020-07-06 13:20 lime_release_bot Note Added: 58704
2020-07-06 13:20 lime_release_bot Status resolved => closed