View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
13679 | Bug reports | Theme editor | public | 2018-05-16 21:05 | 2018-06-15 14:27 |
Reporter | duvemyster | Assigned To | |||
Priority | immediate | Severity | partial_block | ||
Status | closed | Resolution | not fixable | ||
Product Version | 3.7.x | ||||
Summary | 13679: 'Copy to local theme and save' sometimes saves without copying | ||||
Description | While a few of the file do copy to local theme, most of them don't. Following are at least some of the ones where use results in saving changes to vanilla instead of changes to the extended theme:
| ||||
Steps To Reproduce |
| ||||
Tags | No tags attached. | ||||
Attached Files | |||||
Bug heat | 8 | ||||
Complete LimeSurvey version number (& build) | Version 3.7.3+180516 | ||||
I will donate to the project if issue is resolved | No | ||||
Browser | Firefox Qantum 60.0 (64-bit) | ||||
Database type & version | Maridb with Mysql client api 5.5.58 | ||||
Server OS (if known) | Linux | ||||
Webserver software & version (if known) | Apache 2.0 | ||||
PHP Version | PHP Version 5.6.30-0+deb8u1 | ||||
Following are some additional screen part files that are saving to vanilla instead of copying to a local theme: Assessments: assessments.twig Registration:
Print Answers:
Navigation:
|
|
Please : don't read this : i made an error when try to understand the issue …When copying a survey : twig must NOT be copied : The principle are :
For survey (and Template edition) When you get a twig file : system (code) MUST find it :
Because : if you update again ajax_indicator.twig in Bootwatch_extend : this must be applied to Bootwatch_final Here: (there are a lack of "core" part) |
|
Oups … maybe i didn't understand the issue : the update was done on Vanilla file 8| big issue ! |
|
Trying to reproduce exactly the issue : debug set to 2 : i have a php warning PHP warning.html (22,032 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>PHP warning</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>PHP warning</h1> <p class="message"> copy(/home/sondages.pro/htdocs/limesurvey_GIT/LimeSurvey_master/upload/themes/survey/extends_bootswatch/views/subviews/header/head.twig): failed to open stream: No such file or directory </p> <div class="source"> <p class="file">/home/sondages.pro/htdocs/limesurvey_GIT/LimeSurvey_master/application/models/TemplateManifest.php(167)</p> <div class="code"><pre><span class="ln">155</span> /** <span class="ln">156</span> * Copy a file from mother template to local directory and edit manifest if needed <span class="ln">157</span> * <span class="ln">158</span> * @return string template url <span class="ln">159</span> */ <span class="ln">160</span> public function extendsFile($sFile) <span class="ln">161</span> { <span class="ln">162</span> if (!file_exists($this->path.$sFile) && !file_exists($this->viewPath.$sFile)) { <span class="ln">163</span> <span class="ln">164</span> // Copy file from mother template to local directory <span class="ln">165</span> $sRfilePath = $this->getFilePath($sFile, $this); <span class="ln">166</span> $sLfilePath = (pathinfo($sFile, PATHINFO_EXTENSION) == 'twig') ? $this->viewPath.$sFile : $this->path.$sFile; <span class="error"><span class="ln error-ln">167</span> copy($sRfilePath, $sLfilePath); </span><span class="ln">168</span> <span class="ln">169</span> // If it's a css or js file from config... must update DB and XML too.... <span class="ln">170</span> $sExt = pathinfo($sLfilePath, PATHINFO_EXTENSION); <span class="ln">171</span> if ($sExt == "css" || $sExt == "js") { <span class="ln">172</span> <span class="ln">173</span> // Check if that CSS/JS file is in DB/XML <span class="ln">174</span> $aFiles = $this->getFilesForPackages($sExt, $this); <span class="ln">175</span> $sFile = str_replace('./', '', $sFile); <span class="ln">176</span> <span class="ln">177</span> // The CSS/JS file is a configuration one.... <span class="ln">178</span> if (in_array($sFile, $aFiles)) { <span class="ln">179</span> $this->addFileReplacement($sFile, $sExt); </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> /home/sondages.pro/htdocs/limesurvey_GIT/LimeSurvey_master/application/models/TemplateManifest.php(167): <strong>copy</strong>("/home/sondages.pro/htdocs/limesurvey_GIT/LimeSurvey_master/theme...", "/home/sondages.pro/htdocs/limesurvey_GIT/LimeSurvey_master/uploa...") </div> <div class="code"><pre><span class="ln">162</span> if (!file_exists($this->path.$sFile) && !file_exists($this->viewPath.$sFile)) { <span class="ln">163</span> <span class="ln">164</span> // Copy file from mother template to local directory <span class="ln">165</span> $sRfilePath = $this->getFilePath($sFile, $this); <span class="ln">166</span> $sLfilePath = (pathinfo($sFile, PATHINFO_EXTENSION) == 'twig') ? $this->viewPath.$sFile : $this->path.$sFile; <span class="error"><span class="ln error-ln">167</span> copy($sRfilePath, $sLfilePath); </span><span class="ln">168</span> <span class="ln">169</span> // If it's a css or js file from config... must update DB and XML too.... <span class="ln">170</span> $sExt = pathinfo($sLfilePath, PATHINFO_EXTENSION); <span class="ln">171</span> if ($sExt == "css" || $sExt == "js") { <span class="ln">172</span> </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> /home/sondages.pro/htdocs/limesurvey_GIT/LimeSurvey_master/application/controllers/admin/themes.php(639): <strong>TemplateManifest</strong>-><strong>extendsFile</strong>("subviews/header/head.twig") </div> <div class="code"><pre><span class="ln">634</span> $this->getController()->redirect(array("admin/themes/sa/upload")); <span class="ln">635</span> } <span class="ln">636</span> <span class="ln">637</span> //$savefilename = $oEditedTemplate <span class="ln">638</span> if (!file_exists($oEditedTemplate->path.$relativePathEditfile) && !file_exists($oEditedTemplate->viewPath.$relativePathEditfile)) { <span class="error"><span class="ln error-ln">639</span> $oEditedTemplate->extendsFile($relativePathEditfile); </span><span class="ln">640</span> } <span class="ln">641</span> <span class="ln">642</span> $savefilename = $oEditedTemplate->extendsFile($relativePathEditfile); <span class="ln">643</span> <span class="ln">644</span> if (is_writable($savefilename)) { </pre></div> </td> </tr> <tr class="trace core collapsed"> <td class="number"> #2 </td> <td class="content"> <div class="trace-file"> unknown(0): <strong>themes</strong>-><strong>templatesavechanges</strong>() </div> </td> </tr> <tr class="trace core collapsed"> <td class="number"> #3 </td> <td class="content"> <div class="trace-file"> <div class="plus">+</div> <div class="minus">–</div> /home/sondages.pro/htdocs/limesurvey_GIT/LimeSurvey_master/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 expanded"> <td class="number"> #4 </td> <td class="content"> <div class="trace-file"> <div class="plus">+</div> <div class="minus">–</div> /home/sondages.pro/htdocs/limesurvey_GIT/LimeSurvey_master/application/core/Survey_Common_Action.php(83): <strong>CAction</strong>-><strong>runWithParamsInternal</strong>(themes, ReflectionMethod, array("sa" => "templatesavechanges")) </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"> #5 </td> <td class="content"> <div class="trace-file"> <div class="plus">+</div> <div class="minus">–</div> /home/sondages.pro/htdocs/limesurvey_GIT/LimeSurvey_master/application/controllers/admin/themes.php(31): <strong>Survey_Common_Action</strong>-><strong>runWithParams</strong>(array("sa" => "templatesavechanges")) </div> <div class="code"><pre><span class="ln">26</span> { <span class="ln">27</span> <span class="ln">28</span> public function runWithParams($params) <span class="ln">29</span> { <span class="ln">30</span> if (Permission::model()->hasGlobalPermission('templates', 'read')) { <span class="error"><span class="ln error-ln">31</span> parent::runWithParams($params); </span><span class="ln">32</span> } else { <span class="ln">33</span> Yii::app()->setFlashMessage(gT("We are sorry but you don't have permissions to do this."), 'error'); <span class="ln">34</span> $this->getController()->redirect(array("admin/themeoptions")); <span class="ln">35</span> } <span class="ln">36</span> } </pre></div> </td> </tr> <tr class="trace core collapsed"> <td class="number"> #6 </td> <td class="content"> <div class="trace-file"> <div class="plus">+</div> <div class="minus">–</div> /home/sondages.pro/htdocs/limesurvey_GIT/LimeSurvey_master/framework/web/CController.php(308): <strong>themes</strong>-><strong>runWithParams</strong>(array("sa" => "templatesavechanges")) </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"> #7 </td> <td class="content"> <div class="trace-file"> <div class="plus">+</div> <div class="minus">–</div> /home/sondages.pro/htdocs/limesurvey_GIT/LimeSurvey_master/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"> #8 </td> <td class="content"> <div class="trace-file"> <div class="plus">+</div> <div class="minus">–</div> /home/sondages.pro/htdocs/limesurvey_GIT/LimeSurvey_master/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"> #9 </td> <td class="content"> <div class="trace-file"> <div class="plus">+</div> <div class="minus">–</div> /home/sondages.pro/htdocs/limesurvey_GIT/LimeSurvey_master/application/controllers/AdminController.php(158): <strong>CController</strong>-><strong>run</strong>("themes") </div> <div class="code"><pre><span class="ln">153</span> $this->redirect(array('/admin/authentication/sa/login')); <span class="ln">154</span> } <span class="ln">155</span> } <span class="ln">156</span> } <span class="ln">157</span> <span class="error"><span class="ln error-ln">158</span> return parent::run($action); </span><span class="ln">159</span> } <span class="ln">160</span> <span class="ln">161</span> /** <span class="ln">162</span> * Routes all the actions to their respective places <span class="ln">163</span> * </pre></div> </td> </tr> <tr class="trace core collapsed"> <td class="number"> #10 </td> <td class="content"> <div class="trace-file"> <div class="plus">+</div> <div class="minus">–</div> /home/sondages.pro/htdocs/limesurvey_GIT/LimeSurvey_master/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"> #11 </td> <td class="content"> <div class="trace-file"> <div class="plus">+</div> <div class="minus">–</div> /home/sondages.pro/htdocs/limesurvey_GIT/LimeSurvey_master/framework/web/CWebApplication.php(141): <strong>CWebApplication</strong>-><strong>runController</strong>("admin/themes/sa/templatesavechanges") </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"> #12 </td> <td class="content"> <div class="trace-file"> <div class="plus">+</div> <div class="minus">–</div> /home/sondages.pro/htdocs/limesurvey_GIT/LimeSurvey_master/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"> #13 </td> <td class="content"> <div class="trace-file"> <div class="plus">+</div> <div class="minus">–</div> /home/sondages.pro/htdocs/limesurvey_GIT/LimeSurvey_master/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"> 2018-05-18 09:56:10 Apache/2.2.22 (Debian) <a href="http://www.yiiframework.com/">Yii Framework</a>/1.1.18 </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> </body></html> |
|
Seems to be fixed on mast git version. @duvemyster : can you confirm ? |
|
Probably fixed with another commit. |
|
New version released. |
|
Date Modified | Username | Field | Change |
---|---|---|---|
2018-05-16 21:05 | duvemyster | New Issue | |
2018-05-16 22:00 | duvemyster | Note Added: 47657 | |
2018-05-18 09:41 | DenisChenu | Note Added: 47670 | |
2018-05-18 09:43 | DenisChenu | Note Added: 47671 | |
2018-05-18 10:00 | DenisChenu | File Added: PHP warning.html | |
2018-05-18 10:00 | DenisChenu | File Added: Capture du 2018-05-18 10-00-31.png | |
2018-05-18 10:00 | DenisChenu | Note Added: 47673 | |
2018-05-18 10:01 | DenisChenu | Assigned To | => LouisGac |
2018-05-18 10:01 | DenisChenu | Status | new => assigned |
2018-05-18 10:02 | DenisChenu | Note Edited: 47670 | |
2018-05-23 12:56 |
|
Priority | none => immediate |
2018-05-23 12:56 |
|
Sticky Issue | No => Yes |
2018-05-28 17:42 | DenisChenu | Note Added: 47880 | |
2018-05-28 17:46 |
|
Status | assigned => resolved |
2018-05-28 17:46 |
|
Resolution | open => not fixable |
2018-05-28 17:46 |
|
Note Added: 47881 | |
2018-05-28 17:46 |
|
Sticky Issue | Yes => No |
2018-06-15 14:27 | c_schmitz | Note Added: 48157 | |
2018-06-15 14:27 | c_schmitz | Status | resolved => closed |