View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
20074 | Bug reports | Survey editing | public | 2025-04-26 02:24 | 2025-04-29 00:23 |
Reporter | mfavetti | Assigned To | mfavetti | ||
Priority | none | Severity | partial_block | ||
Status | closed | Resolution | unable to reproduce | ||
Product Version | 6.6.x | ||||
Summary | 20074: Trying to edit survey settings for default survey group causes 500 error | ||||
Description | If you go Configuration -> Settings -> Global survey you get this route: admin/globalsettings/sa/surveysettings If you go Surveys -> Survey groups -> default -> Survey settings you get this route: admin/surveysgroups/sa/surveysettings/id/1 and a 500 error. I would imagine these two actions should result in the same thing. | ||||
Steps To Reproduce | Steps to reproduceClick Surveys in topbar Expected resultEdit default survey group settings Actual result500 error | ||||
Tags | No tags attached. | ||||
Attached Files | Error.html (17,730 bytes)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <!-- saved from url=(0061)http://limesurvey6/admin/surveysgroups/sa/surveysettings/id/1 --> <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>Error</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>Error</h1> <p class="message"> Call to a member function setOptions() on null </p> <div class="source"> <p class="file">/srv/www/limesurvey6/application/controllers/admin/SurveysGroupsController.php(277)</p> <div class="code"><pre><span class="ln">265</span> $model = $this->loadModel($id); <span class="ln">266</span> if (!$model->hasPermission('surveysettings', 'read')) { <span class="ln">267</span> throw new CHttpException(403, gT("You do not have permission to access this page.")); <span class="ln">268</span> } <span class="ln">269</span> $aData = array( <span class="ln">270</span> 'model' => $model <span class="ln">271</span> ); <span class="ln">272</span> <span class="ln">273</span> $sPartial = Yii::app()->request->getParam('partial', '_generaloptions_panel'); <span class="ln">274</span> <span class="ln">275</span> /** @var SurveysGroupsettings $oSurvey */ <span class="ln">276</span> $oSurvey = SurveysGroupsettings::model()->findByPk($model->gsid); <span class="error"><span class="ln error-ln">277</span> $oSurvey->setOptions(); //this gets the "values" from the group that inherits to this group ... </span><span class="ln">278</span> $oSurvey->owner_id = $model->owner_id; <span class="ln">279</span> <span class="ln">280</span> if (App()->getRequest()->isPostRequest && !$model->hasPermission('surveysettings', 'update')) { <span class="ln">281</span> throw new CHttpException(403, gT("You do not have permission to update survey settings.")); <span class="ln">282</span> } <span class="ln">283</span> //every $_POST checked here is one of the switchers(On|Off|Inherit) names <span class="ln">284</span> // Name of sidemenulink => name of input field <span class="ln">285</span> // "General settings" => 'template' <span class="ln">286</span> // "Presentation" => 'showxquestions' <span class="ln">287</span> // "Pariticipant setting" => 'anonymized' <span class="ln">288</span> // "Notification & data" => 'datestamp' <span class="ln">289</span> // "Publication & access" => 'listpublic' </pre></div> </div> <div class="traces"> <h2>Stack Trace</h2> <table style="width:100%;"> <tbody><tr class="trace core collapsed"> <td class="number"> #0 </td> <td class="content"> <div class="trace-file"> unknown(0): <strong>SurveysGroupsController</strong>-><strong>surveySettings</strong>() </div> </td> </tr> <tr class="trace core collapsed"> <td class="number"> #1 </td> <td class="content"> <div class="trace-file"> <div class="plus">+</div> <div class="minus">–</div> /srv/www/limesurvey6/vendor/yiisoft/yii/framework/web/actions/CAction.php(114): <strong>ReflectionMethod</strong>-><strong>invokeArgs</strong>() </div> <div class="code"><pre><span class="ln">109</span> elseif($param->isDefaultValueAvailable()) <span class="ln">110</span> $ps[]=$param->getDefaultValue(); <span class="ln">111</span> else <span class="ln">112</span> return false; <span class="ln">113</span> } <span class="error"><span class="ln error-ln">114</span> $method->invokeArgs($object,$ps); </span><span class="ln">115</span> return true; <span class="ln">116</span> } <span class="ln">117</span> } </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> /srv/www/limesurvey6/application/core/SurveyCommonAction.php(83): <strong>CAction</strong>-><strong>runWithParamsInternal</strong>() </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 core collapsed"> <td class="number"> #3 </td> <td class="content"> <div class="trace-file"> <div class="plus">+</div> <div class="minus">–</div> /srv/www/limesurvey6/vendor/yiisoft/yii/framework/web/CController.php(308): <strong>SurveyCommonAction</strong>-><strong>runWithParams</strong>() </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"> #4 </td> <td class="content"> <div class="trace-file"> <div class="plus">+</div> <div class="minus">–</div> /srv/www/limesurvey6/vendor/yiisoft/yii/framework/web/CController.php(286): <strong>CController</strong>-><strong>runAction</strong>() </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"> #5 </td> <td class="content"> <div class="trace-file"> <div class="plus">+</div> <div class="minus">–</div> /srv/www/limesurvey6/vendor/yiisoft/yii/framework/web/CController.php(265): <strong>CController</strong>-><strong>runActionWithFilters</strong>() </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 expanded"> <td class="number"> #6 </td> <td class="content"> <div class="trace-file"> <div class="plus">+</div> <div class="minus">–</div> /srv/www/limesurvey6/application/controllers/AdminController.php(204): <strong>CController</strong>-><strong>run</strong>() </div> <div class="code"><pre><span class="ln">199</span> $this->runModuleController($action); <span class="ln">200</span> // this will redirect the default action to the new controller previously "admin/index" or "admin" to "dashboard/view" <span class="ln">201</span> if (empty($action) || $action === 'index') { <span class="ln">202</span> $this->redirect($this->createUrl('dashboard/view')); <span class="ln">203</span> } <span class="error"><span class="ln error-ln">204</span> return parent::run($action); </span><span class="ln">205</span> } <span class="ln">206</span> <span class="ln">207</span> /** <span class="ln">208</span> * Starting with LS4, 3rd party developer can extends any of the LimeSurve controllers. <span class="ln">209</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> /srv/www/limesurvey6/vendor/yiisoft/yii/framework/web/CWebApplication.php(282): <strong>AdminController</strong>-><strong>run</strong>() </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"> #8 </td> <td class="content"> <div class="trace-file"> <div class="plus">+</div> <div class="minus">–</div> /srv/www/limesurvey6/vendor/yiisoft/yii/framework/web/CWebApplication.php(141): <strong>CWebApplication</strong>-><strong>runController</strong>() </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"> #9 </td> <td class="content"> <div class="trace-file"> <div class="plus">+</div> <div class="minus">–</div> /srv/www/limesurvey6/vendor/yiisoft/yii/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 expanded"> <td class="number"> #10 </td> <td class="content"> <div class="trace-file"> <div class="plus">+</div> <div class="minus">–</div> /srv/www/limesurvey6/index.php(161): <strong>CApplication</strong>-><strong>run</strong>() </div> <div class="code"><pre><span class="ln">156</span> require_once APPPATH . 'core/LSYii_Application' . EXT; <span class="ln">157</span> <span class="ln">158</span> $config = require_once(APPPATH . 'config/internal' . EXT); <span class="ln">159</span> <span class="ln">160</span> Yii::$enableIncludePath = false; <span class="error"><span class="ln error-ln">161</span> Yii::createApplication('LSYii_Application', $config)->run(); </span><span class="ln">162</span> <span class="ln">163</span> /* End of file index.php */ <span class="ln">164</span> /* Location: ./index.php */ </pre></div> </td> </tr> </tbody></table> </div> <div class="version"> 2025-04-25 17:18:53 nginx/1.24.0 <a href="https://www.yiiframework.com/">Yii Framework</a>/1.1.30 </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> | ||||
Bug heat | 6 | ||||
Complete LimeSurvey version number (& build) | 6.13.0+250415 | ||||
I will donate to the project if issue is resolved | No | ||||
Browser | Version 135.0.7049.114 (Official Build) (64-bit) | ||||
Database type & version | 10.11.11-MariaDB | ||||
Server OS (if known) | Mint 22.1 | ||||
Webserver software & version (if known) | 1.24.0 | ||||
PHP Version | 8.3.19 | ||||
Looking at the stack trace, the application merges settings for the parent survey group, but there must be no check if the survey group has no parent (is the default one) |
|
The last parent are the 0 one if i don't make error. |
|
I can not reproduce this on postgres database and latest version. Is this maybe database related? |
|
@tibor.pacalat I tracked down thhe problem. I'm missing the row in lime_surveys_groupsettings for the default survey group (id=1) in the installation that has the error, but I do have it in lime_surveys_groups. I'm not sure how this would have happened as the code in the installer to add it is 7 years old and the installation in question was created like 1 year ago. I don't remember manually messing with any of the survey groups or survey group settings. I guess this should be closed as it's not reproducible. But I'm thinking this has occurred somehow through using the software. I guess I'll nuke this installation and init the db from scratch. I'll reopen this issue if it happens again. |
|
Date Modified | Username | Field | Change |
---|---|---|---|
2025-04-26 02:24 | mfavetti | New Issue | |
2025-04-26 02:24 | mfavetti | File Added: Error.html | |
2025-04-26 02:27 | mfavetti | Note Added: 82491 | |
2025-04-26 02:27 | mfavetti | Bug heat | 0 => 2 |
2025-04-27 20:40 | DenisChenu | Note Added: 82493 | |
2025-04-27 20:40 | DenisChenu | Bug heat | 2 => 4 |
2025-04-28 17:10 | tibor.pacalat | Note Added: 82503 | |
2025-04-28 17:10 | tibor.pacalat | Bug heat | 4 => 6 |
2025-04-29 00:23 | mfavetti | Assigned To | => mfavetti |
2025-04-29 00:23 | mfavetti | Status | new => closed |
2025-04-29 00:23 | mfavetti | Resolution | open => unable to reproduce |
2025-04-29 00:23 | mfavetti | Note Added: 82511 |