View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
16375 | Bug reports | Theme editor | public | 2020-06-10 12:23 | 2020-07-06 13:20 |
Reporter | DenisChenu | Assigned To | DenisChenu | ||
Priority | none | Severity | minor | ||
Status | closed | Resolution | fixed | ||
Product Version | 3.22.19 | ||||
Fixed in Version | 3.22.24 | ||||
Summary | 16375: 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 |
| ||||
Additional Information | In 4.X : last_update was renamed to lastUpdate … This make hard for template creator if there are un-documentedAPI update … | ||||
Tags | No tags attached. | ||||
Attached Files | 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()->getConfig("timeadjust")) : $date; <span class="ln">853</span> $oConfig = $oNewManifest->getElementsByTagName('config')->item(0); <span class="ln">854</span> $ometadata = $oConfig->getElementsByTagName('metadata')->item(0); <span class="ln">855</span> $oOldDateNode = $ometadata->getElementsByTagName('creationDate')->item(0); <span class="ln">856</span> $oNvDateNode = $oNewManifest->createElement('creationDate', $sDate); <span class="ln">857</span> $ometadata->replaceChild($oNvDateNode, $oOldDateNode); <span class="ln">858</span> $oOldUpdateNode = $ometadata->getElementsByTagName('last_update')->item(0); <span class="ln">859</span> $oNvDateNode = $oNewManifest->createElement('last_update', $sDate); <span class="error"><span class="ln error-ln">860</span> $ometadata->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> /mnt/data/shnoulle/nginx/www/3LTS/application/models/TemplateManifest.php(860): <strong>DOMNode</strong>-><strong>replaceChild</strong>(DOMElement, null) </div> <div class="code"><pre><span class="ln">855</span> $oOldDateNode = $ometadata->getElementsByTagName('creationDate')->item(0); <span class="ln">856</span> $oNvDateNode = $oNewManifest->createElement('creationDate', $sDate); <span class="ln">857</span> $ometadata->replaceChild($oNvDateNode, $oOldDateNode); <span class="ln">858</span> $oOldUpdateNode = $ometadata->getElementsByTagName('last_update')->item(0); <span class="ln">859</span> $oNvDateNode = $oNewManifest->createElement('last_update', $sDate); <span class="error"><span class="ln error-ln">860</span> $ometadata->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> /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->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> /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->copyDirectory($copydirname, $newdirname, array('fileTypes' => array('xml', 'png', 'jpg'), 'newDirMode' => 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' => $copydir]); <span class="ln">578</span> $this->getController()->redirect(array("admin/themes/sa/view", 'templatename'=>$newname)); <span class="ln">579</span> } elseif ($mkdirresult == 2) { <span class="ln">580</span> Yii::app()->setFlashMessage(sprintf(gT("Directory with the name `%s` already exists - choose another name"), $newname), 'error'); <span class="ln">581</span> $this->getController()->redirect(array("admin/themes/sa/view", 'templatename'=>$copydir)); </pre></div> </td> </tr> <tr class="trace core collapsed"> <td class="number"> #3 </td> <td class="content"> <div class="trace-file"> unknown(0): <strong>themes</strong>-><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> /mnt/data/shnoulle/nginx/www/3LTS/framework/web/actions/CAction.php(109): <strong>ReflectionMethod</strong>-><strong>invokeArgs</strong>(themes, array()) </div> <div class="code"><pre><span class="ln">104</span> elseif($param->isDefaultValueAvailable()) <span class="ln">105</span> $ps[]=$param->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->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> /mnt/data/shnoulle/nginx/www/3LTS/application/core/Survey_Common_Action.php(83): <strong>CAction</strong>-><strong>runWithParamsInternal</strong>(themes, ReflectionMethod, array("r" => "admin/themes/sa/templatecopy", "sa" => "templatecopy", "sAction" => "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> /mnt/data/shnoulle/nginx/www/3LTS/application/controllers/admin/themes.php(33): <strong>Survey_Common_Action</strong>-><strong>runWithParams</strong>(array("r" => "admin/themes/sa/templatecopy", "sa" => "templatecopy", "sAction" => "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()->request->getPost('templatename', ''); <span class="ln">32</span> if (Permission::model()->hasGlobalPermission('templates', 'read') || Permission::model()->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()->setFlashMessage(gT("We are sorry but you don't have permissions to do this."), 'error'); <span class="ln">36</span> $this->getController()->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> /mnt/data/shnoulle/nginx/www/3LTS/framework/web/CController.php(308): <strong>themes</strong>-><strong>runWithParams</strong>(array("r" => "admin/themes/sa/templatecopy", "sa" => "templatecopy")) </div> <div class="code"><pre><span class="ln">303</span> { <span class="ln">304</span> $priorAction=$this->_action; <span class="ln">305</span> $this->_action=$action; <span class="ln">306</span> if($this->beforeAction($action)) <span class="ln">307</span> { <span class="error"><span class="ln error-ln">308</span> if($action->runWithParams($this->getActionParams())===false) </span><span class="ln">309</span> $this->invalidActionParams($action); <span class="ln">310</span> else <span class="ln">311</span> $this->afterAction($action); <span class="ln">312</span> } <span class="ln">313</span> $this->_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> /mnt/data/shnoulle/nginx/www/3LTS/framework/web/CController.php(286): <strong>CController</strong>-><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->runAction($action); </span><span class="ln">287</span> else <span class="ln">288</span> { <span class="ln">289</span> $priorAction=$this->_action; <span class="ln">290</span> $this->_action=$action; <span class="ln">291</span> CFilterChain::create($this,$action,$filters)->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> /mnt/data/shnoulle/nginx/www/3LTS/framework/web/CController.php(265): <strong>CController</strong>-><strong>runActionWithFilters</strong>(themes, array()) </div> <div class="code"><pre><span class="ln">260</span> { <span class="ln">261</span> if(($parent=$this->getModule())===null) <span class="ln">262</span> $parent=Yii::app(); <span class="ln">263</span> if($parent->beforeControllerAction($this,$action)) <span class="ln">264</span> { <span class="error"><span class="ln error-ln">265</span> $this->runActionWithFilters($action,$this->filters()); </span><span class="ln">266</span> $parent->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->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> /mnt/data/shnoulle/nginx/www/3LTS/application/controllers/AdminController.php(165): <strong>CController</strong>-><strong>run</strong>("themes") </div> <div class="code"><pre><span class="ln">160</span> $this->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> /mnt/data/shnoulle/nginx/www/3LTS/framework/web/CWebApplication.php(282): <strong>AdminController</strong>-><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->_controller; <span class="ln">280</span> $this->_controller=$controller; <span class="ln">281</span> $controller->init(); <span class="error"><span class="ln error-ln">282</span> $controller->run($actionID); </span><span class="ln">283</span> $this->_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}'=>$route===''?$this->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> /mnt/data/shnoulle/nginx/www/3LTS/framework/web/CWebApplication.php(141): <strong>CWebApplication</strong>-><strong>runController</strong>("admin/themes/sa/templatecopy") </div> <div class="code"><pre><span class="ln">136</span> foreach(array_splice($this->catchAllRequest,1) as $name=>$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->getUrlManager()->parseUrl($this->getRequest()); <span class="error"><span class="ln error-ln">141</span> $this->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> /mnt/data/shnoulle/nginx/www/3LTS/framework/base/CApplication.php(185): <strong>CWebApplication</strong>-><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->hasEventHandler('onBeginRequest')) <span class="ln">183</span> $this->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->processRequest(); </span><span class="ln">186</span> if($this->hasEventHandler('onEndRequest')) <span class="ln">187</span> $this->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> /mnt/data/shnoulle/nginx/www/3LTS/index.php(194): <strong>CApplication</strong>-><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)->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> | ||||
Bug heat | 8 | ||||
Complete LimeSurvey version number (& build) | 3.22.18 | ||||
I will donate to the project if issue is resolved | No | ||||
Browser | not relevant | ||||
Database type & version | not relevant | ||||
Server OS (if known) | not relevant | ||||
Webserver software & version (if known) | not relevant | ||||
PHP Version | not relevant | ||||
Manual about config.xml don't talk about last_update : https://manual.limesurvey.org/New_Template_System_in_LS3.x#The_manifest_config.xml |
|
My fault for not documenting the change, sorry. |
|
My opinion : must treat null/not set in changeDateInDOM , since it's not important and not in API
I make the pull request |
|
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 |
|
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. |
|
Since neither last_update or lastUpdate are in current config API manual: |
|
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. |
|
@Mazi : not necessary. My opinion :
|
|
Yes, why not. |
|
I do backward on 4.X , not on 3.X :D The fix for 3.X : https://github.com/LimeSurvey/LimeSurvey/pull/1440 |
|
@Mazi : opinion about the fix ? |
|
Looks good! |
|
Fix committed to 3.x-LTS branch: http://bugs.limesurvey.org/plugin.php?page=Source/view&id=30248 |
|
Fix committed to master branch: http://bugs.limesurvey.org/plugin.php?page=Source/view&id=30249 |
|
Fixed in Release 3.22.25+200706 |
|
LimeSurvey: 3.x-LTS 0364239e 2020-07-03 13:43 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 14:23 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 |
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 => ready for 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 | ready for 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 |