View Issue Details

This bug affects 1 person(s).
 6
IDProjectCategoryView StatusLast Update
19946Bug reportsTheme editorpublic2025-01-29 16:06
Reporterumrosa Assigned To 
PrioritynoneSeveritypartial_block 
Status newResolutionopen 
Product Version6.6.x 
Summary19946: PHP error when extending a theme
Description

I'm using a self-hosted instance of LS 6.10.1+250120

When I try extending the Fruity TwentyThree theme using the theme editor, I get an error page with a PHP warning. After chosing the extension's name (mosa) and submitting, I get a page that's titled "PHP Warning" with the message "DOMDocument::load(): I/O warning : failed to load external entity "/home/projects/qss/test_ls6.10/themes/survey/fruity_twentythree/config.xml"".
However, I can see on the server that a directory "mosa" (including subdirectories) was created in upload/themes/survey/
From this point on, the error page is displayed every time I try opening the theme editor via the Menu (Configuration > Advanced > Themes). Therefore, I cannot access the Theme editor any more.
I've attached a the error page as a html file.

Steps To Reproduce

Steps to reproduce

  1. Open Theme Editor
  2. Select "Extend" option on theme "Fruity TwentyThree".
  3. In the prompt, choose name of the extension, e.g. "mosa", and submit.

Expected result

I expected to be redirected to the web page for editing the newly created extension.

Actual result

The attached error page is displayed

TagsNo tags attached.
Attached Files
PHP_warning_extending_Theme.html (29,546 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">
		DOMDocument::load(): I/O warning : failed to load external entity &amp;quot;/home/projects/qss/test_ls6.10/themes/survey/fruity_twentythree/config.xml&amp;quot;	</p>

	<div class="source">
		<p class="file">/home/projects/qss/test_ls6.10/application/helpers/SurveyThemeHelper.php(503)</p>
		<div class="code"><pre><span class="ln">491</span>      * a warning is logged with details about the issue.
<span class="ln">492</span>      *
<span class="ln">493</span>      * @param string $configFile Path to the configuration file to be checked and potentially updated.
<span class="ln">494</span>      *
<span class="ln">495</span>      * @return void This function does not return a value. It may either update the configuration file
<span class="ln">496</span>      *              or log a warning if the file is invalid or cannot be processed.
<span class="ln">497</span>      *
<span class="ln">498</span>      * @throws \Exception Propagates any exceptions thrown by `checkDomDocument`.
<span class="ln">499</span>      */
<span class="ln">500</span>     public static function checkConfigFiles($configFile)
<span class="ln">501</span>     {
<span class="ln">502</span>         $domDocument = new \DOMDocument;
<span class="error"><span class="ln error-ln">503</span>         $domDocument-&gt;load($configFile);
</span><span class="ln">504</span>         if (!$domDocument) {
<span class="ln">505</span>             \Yii::log(&#039;Invalid config file at &#039; . $configFile, \CLogger::LEVEL_WARNING, &#039;application&#039;);
<span class="ln">506</span>             return;
<span class="ln">507</span>         }
<span class="ln">508</span>         try {
<span class="ln">509</span>             $newDomDocument = self::checkDomDocument($domDocument);
<span class="ln">510</span>             if ($newDomDocument) {
<span class="ln">511</span>                 $newDomDocument-&gt;save($configFile);
<span class="ln">512</span>             }
<span class="ln">513</span>         } catch (\Exception $e) {
<span class="ln">514</span>             \Yii::log(&#039;Error: &#039; . $e-&gt;getMessage() . &#039;found in &#039; . $configFile, \CLogger::LEVEL_WARNING, &#039;application&#039;);
<span class="ln">515</span>         }
</pre></div>	</div>

	<div class="traces">
		<h2>Stack Trace</h2>
				<table style="width:100%;">
						<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;/home/projects/qss/test_ls6.10/application/helpers/SurveyThemeHelper.php(503): <strong>DOMDocument</strong>-><strong>load</strong>(&quot;/home/projects/qss/test_ls6.10/themes/survey/fruity_twentythree/...&quot;)				</div>

				<div class="code"><pre><span class="ln">498</span>      * @throws \Exception Propagates any exceptions thrown by `checkDomDocument`.
<span class="ln">499</span>      */
<span class="ln">500</span>     public static function checkConfigFiles($configFile)
<span class="ln">501</span>     {
<span class="ln">502</span>         $domDocument = new \DOMDocument;
<span class="error"><span class="ln error-ln">503</span>         $domDocument-&gt;load($configFile);
</span><span class="ln">504</span>         if (!$domDocument) {
<span class="ln">505</span>             \Yii::log(&#039;Invalid config file at &#039; . $configFile, \CLogger::LEVEL_WARNING, &#039;application&#039;);
<span class="ln">506</span>             return;
<span class="ln">507</span>         }
<span class="ln">508</span>         try {
</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;/home/projects/qss/test_ls6.10/application/models/TemplateManifest.php(1042): <strong>SurveyThemeHelper</strong>::<strong>checkConfigFiles</strong>(&quot;/home/projects/qss/test_ls6.10/themes/survey/fruity_twentythree/...&quot;)				</div>

				<div class="code"><pre><span class="ln">1037</span>             if (\PHP_VERSION_ID &lt; 80000) {
<span class="ln">1038</span>                 $bOldEntityLoaderState = libxml_disable_entity_loader(
<span class="ln">1039</span>                     true
<span class="ln">1040</span>                 ); // @see: http://phpsecurity.readthedocs.io/en/latest/Injection-Attacks.html#xml-external-entity-injection
<span class="ln">1041</span>             }
<span class="error"><span class="ln error-ln">1042</span>             SurveyThemeHelper::checkConfigFiles($this-&gt;xmlFile);
</span><span class="ln">1043</span>             $sXMLConfigFile = file_get_contents(
<span class="ln">1044</span>                 realpath($this-&gt;xmlFile)
<span class="ln">1045</span>             ); // @see: Now that entity loader is disabled, we can&#039;t use simplexml_load_file; so we must read the file with file_get_contents and convert it as a string
<span class="ln">1046</span>             $oDOMConfig = new DOMDocument();
<span class="ln">1047</span>             // the loadXML is error suppressed, so we can check the return value
</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;/home/projects/qss/test_ls6.10/application/models/TemplateManifest.php(1149): <strong>TemplateManifest</strong>-><strong>readManifest</strong>()				</div>

				<div class="code"><pre><span class="ln">1144</span>     {
<span class="ln">1145</span>         // In manifest mode, we always use the default value from manifest, so no inheritance, no $bUseMagicInherit set needed
<span class="ln">1146</span>         $this-&gt;setTemplateName($sTemplateName, $iSurveyId); // Check and set template name
<span class="ln">1147</span>         $this-&gt;setIsStandard(); // Check if  it is a CORE template
<span class="ln">1148</span>         $this-&gt;setPath(); // Check and set path
<span class="error"><span class="ln error-ln">1149</span>         $this-&gt;readManifest(); // Check and read the manifest to set local params
</span><span class="ln">1150</span>     }
<span class="ln">1151</span> 
<span class="ln">1152</span>     /**
<span class="ln">1153</span>      * Get showpopups value from config or template configuration
<span class="ln">1154</span>      */
</pre></div>			</td>
		</tr>
						<tr class="trace app collapsed">
			<td class="number">
				#3			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/home/projects/qss/test_ls6.10/application/models/Template.php(390): <strong>TemplateManifest</strong>-><strong>setBasics</strong>(&quot;fruity_twentythree&quot;, null)				</div>

				<div class="code"><pre><span class="ln">385</span> 
<span class="ln">386</span> 
<span class="ln">387</span>         // If no row found, or if the template folder for this configuration row doesn&#039;t exist we load the XML config (which will load the default XML)
<span class="ln">388</span>         if ($bForceXML || !is_a($oTemplateConfigurationModel, &#039;TemplateConfiguration&#039;) || !$oTemplateConfigurationModel-&gt;checkTemplate()) {
<span class="ln">389</span>             $oTemplateConfigurationModel = new TemplateManifest(null);
<span class="error"><span class="ln error-ln">390</span>             $oTemplateConfigurationModel-&gt;setBasics($sTemplateName, $iSurveyId);
</span><span class="ln">391</span>         }
<span class="ln">392</span> 
<span class="ln">393</span>         //$oTemplateConfigurationModel-&gt;prepareTemplateRendering($sTemplateName, $iSurveyId);
<span class="ln">394</span>         return $oTemplateConfigurationModel;
<span class="ln">395</span>     }
</pre></div>			</td>
		</tr>
						<tr class="trace app collapsed">
			<td class="number">
				#4			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/home/projects/qss/test_ls6.10/application/models/Template.php(579): <strong>Template</strong>::<strong>getTemplateConfiguration</strong>(&quot;fruity_twentythree&quot;, null, null, true, ...)				</div>

				<div class="code"><pre><span class="ln">574</span>             $sTemplateName = App()-&gt;getConfig(&#039;defaulttheme&#039;);
<span class="ln">575</span>         }
<span class="ln">576</span> 
<span class="ln">577</span>         // TODO: this probably not use any more. Check and remove it.
<span class="ln">578</span>         if ($abstractInstance === true) {
<span class="error"><span class="ln error-ln">579</span>             return self::getTemplateConfiguration($sTemplateName, $iSurveyId, $iSurveyGroupId, $bForceXML, true);
</span><span class="ln">580</span>         }
<span class="ln">581</span> 
<span class="ln">582</span>         if (empty(self::$instance) || ! self::isCorrectInstance($sTemplateName)) {
<span class="ln">583</span>             self::$instance = self::getTemplateConfiguration($sTemplateName, $iSurveyId, $iSurveyGroupId, $bForceXML);
<span class="ln">584</span>             self::$instance-&gt;prepareTemplateRendering($sTemplateName, $iSurveyId);
</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;/home/projects/qss/test_ls6.10/application/controllers/admin/Themes.php(1109): <strong>Template</strong>::<strong>getInstance</strong>(&quot;fruity_twentythree&quot;, null, null, true, ...)				</div>

				<div class="code"><pre><span class="ln">1104</span>      * @return void
<span class="ln">1105</span>      */
<span class="ln">1106</span>     protected function initialise($templatename, $screenname, $editfile, $showsummary = true)
<span class="ln">1107</span>     {
<span class="ln">1108</span>         // LimeSurvey style
<span class="error"><span class="ln error-ln">1109</span>         $oEditedTemplate = Template::getInstance($templatename, null, null, true, true)-&gt;prepareTemplateRendering($templatename, null, true);
</span><span class="ln">1110</span> 
<span class="ln">1111</span>         //App()-&gt;getClientScript()-&gt;reset();
<span class="ln">1112</span>         Yii::app()-&gt;loadHelper(&#039;surveytranslator&#039;);
<span class="ln">1113</span>         Yii::app()-&gt;loadHelper(&#039;admin/template&#039;);
<span class="ln">1114</span> 
</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;/home/projects/qss/test_ls6.10/application/controllers/admin/Themes.php(561): <strong>Themes</strong>-><strong>initialise</strong>(&quot;fruity_twentythree&quot;, &quot;welcome&quot;, &quot;&quot;, true, ...)				</div>

				<div class="code"><pre><span class="ln">556</span>             $this-&gt;getController()-&gt;redirect(array(&#039;admin/themes/sa/view/&#039;, &#039;templatename&#039; =&gt; getGlobalSetting(&#039;defaulttheme&#039;)));
<span class="ln">557</span>         }
<span class="ln">558</span> 
<span class="ln">559</span>         /* Keep Bootstrap Package clean after loading template : because template can update boostrap */
<span class="ln">560</span> 
<span class="error"><span class="ln error-ln">561</span>         $aViewUrls = $this-&gt;initialise($templatename, $screenname, $editfile, true, true);
</span><span class="ln">562</span> 
<span class="ln">563</span>         App()-&gt;getClientScript()-&gt;reset();
<span class="ln">564</span> 
<span class="ln">565</span>         $undo    = gT(&quot;Undo (Ctrl-Z)&quot;, &quot;js&quot;);
<span class="ln">566</span>         $redo    = gT(&quot;Redo (Ctrl-Y)&quot;, &quot;js&quot;);
</pre></div>			</td>
		</tr>
						<tr class="trace core collapsed">
			<td class="number">
				#7			</td>
			<td class="content">
				<div class="trace-file">
										&nbsp;unknown(0): <strong>Themes</strong>-><strong>index</strong>(&quot;&quot;, &quot;welcome&quot;, &quot;fruity_twentythree&quot;)				</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;/home/projects/qss/test_ls6.10/vendor/yiisoft/yii/framework/web/actions/CAction.php(114): <strong>ReflectionMethod</strong>-><strong>invokeArgs</strong>(Themes, array(&quot;&quot;, &quot;welcome&quot;, &quot;fruity_twentythree&quot;))				</div>

				<div class="code"><pre><span class="ln">109</span>             elseif($param-&gt;isDefaultValueAvailable())
<span class="ln">110</span>                 $ps[]=$param-&gt;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-&gt;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 collapsed">
			<td class="number">
				#9			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/home/projects/qss/test_ls6.10/application/core/SurveyCommonAction.php(83): <strong>CAction</strong>-><strong>runWithParamsInternal</strong>(Themes, ReflectionMethod, array(&quot;templatename&quot; =&gt; &quot;fruity_twentythree&quot;, &quot;sa&quot; =&gt; &quot;view&quot;))				</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&#039;re all good to go, let&#039;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&#039;re getting in the url. This function just populates
</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;/home/projects/qss/test_ls6.10/application/controllers/admin/Themes.php(31): <strong>SurveyCommonAction</strong>-><strong>runWithParams</strong>(array(&quot;templatename&quot; =&gt; &quot;fruity_twentythree&quot;, &quot;sa&quot; =&gt; &quot;view&quot;))				</div>

				<div class="code"><pre><span class="ln">26</span> {
<span class="ln">27</span>     public function runWithParams($params)
<span class="ln">28</span>     {
<span class="ln">29</span>         $sTemplateName = trim(Yii::app()-&gt;request-&gt;getPost(&#039;templatename&#039;, &#039;&#039;));
<span class="ln">30</span>         if (Permission::model()-&gt;hasGlobalPermission(&#039;templates&#039;, &#039;read&#039;) || Permission::model()-&gt;hasTemplatePermission($sTemplateName)) {
<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()-&gt;setFlashMessage(gT(&quot;We are sorry but you don&#039;t have permissions to do this.&quot;), &#039;error&#039;);
<span class="ln">34</span>             $this-&gt;getController()-&gt;redirect(array(&quot;themeOptions/index&quot;));
<span class="ln">35</span>         }
<span class="ln">36</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;/home/projects/qss/test_ls6.10/vendor/yiisoft/yii/framework/web/CController.php(308): <strong>Themes</strong>-><strong>runWithParams</strong>(array(&quot;templatename&quot; =&gt; &quot;fruity_twentythree&quot;, &quot;sa&quot; =&gt; &quot;view&quot;))				</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">
				#12			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/home/projects/qss/test_ls6.10/vendor/yiisoft/yii/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-&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">
				#13			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/home/projects/qss/test_ls6.10/vendor/yiisoft/yii/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-&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">
				#14			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/home/projects/qss/test_ls6.10/application/controllers/AdminController.php(204): <strong>CController</strong>-><strong>run</strong>(&quot;themes&quot;)				</div>

				<div class="code"><pre><span class="ln">199</span>         $this-&gt;runModuleController($action);
<span class="ln">200</span>         // this will redirect the default action to the new controller previously &quot;admin/index&quot; or &quot;admin&quot; to &quot;dashboard/view&quot;
<span class="ln">201</span>         if (empty($action) || $action === &#039;index&#039;) {
<span class="ln">202</span>             $this-&gt;redirect($this-&gt;createUrl(&#039;dashboard/view&#039;));
<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">
				#15			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/home/projects/qss/test_ls6.10/vendor/yiisoft/yii/framework/web/CWebApplication.php(282): <strong>AdminController</strong>-><strong>run</strong>(&quot;themes&quot;)				</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(&#039;yii&#039;,&#039;Unable to resolve the request &quot;{route}&quot;.&#039;,
<span class="ln">287</span>                 array(&#039;{route}&#039;=&gt;$route===&#039;&#039;?$this-&gt;defaultController:$route)));
</pre></div>			</td>
		</tr>
						<tr class="trace core collapsed">
			<td class="number">
				#16			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/home/projects/qss/test_ls6.10/vendor/yiisoft/yii/framework/web/CWebApplication.php(141): <strong>CWebApplication</strong>-><strong>runController</strong>(&quot;admin/themes/sa/view&quot;)				</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">
				#17			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/home/projects/qss/test_ls6.10/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-&gt;hasEventHandler(&#039;onBeginRequest&#039;))
<span class="ln">183</span>             $this-&gt;onBeginRequest(new CEvent($this));
<span class="ln">184</span>         register_shutdown_function(array($this,&#039;end&#039;),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(&#039;onEndRequest&#039;))
<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">
				#18			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/home/projects/qss/test_ls6.10/index.php(161): <strong>CApplication</strong>-><strong>run</strong>()				</div>

				<div class="code"><pre><span class="ln">156</span> require_once APPPATH . &#039;core/LSYii_Application&#039; . EXT;
<span class="ln">157</span> 
<span class="ln">158</span> $config = require_once(APPPATH . &#039;config/internal&#039; . 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(&#039;LSYii_Application&#039;, $config)-&gt;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>
				</table>
	</div>

	<div class="version">
		2025-01-27 15:12:33 Apache <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 heat6
Complete LimeSurvey version number (& build)6.10.1+250120
I will donate to the project if issue is resolvedNo
BrowserFirefox
Database type & version mysql Ver 15.1 Distrib 10.5.23-MariaDB, for debian-linux-gnu (x86_64) using EditLine wrapper
Server OS (if known)Debian GNU/Linux 11 (bullseye)
Webserver software & version (if known)
PHP VersionPHP 7.4.33

Users monitoring this issue

There are no users monitoring this issue.

Activities

c_schmitz

c_schmitz

2025-01-27 22:15

administrator   ~81914

Can you try moving limesurvey to a different directory and try to extend it again?
/test_ls6.10 seems to be a weird name, so might make problems

umrosa

umrosa

2025-01-28 10:16

reporter   ~81916

I just did - renamed the directory to 'testnew' but still get the same error when trying to extend

tibor.pacalat

tibor.pacalat

2025-01-29 16:06

administrator   ~81921

I can not reproduce this (see screenshot).

Issue History

Date Modified Username Field Change
2025-01-27 15:46 umrosa New Issue
2025-01-27 15:46 umrosa File Added: PHP_warning_extending_Theme.html
2025-01-27 22:15 c_schmitz Note Added: 81914
2025-01-27 22:15 c_schmitz Bug heat 0 => 2
2025-01-28 10:16 umrosa Note Added: 81916
2025-01-28 10:16 umrosa Bug heat 2 => 4
2025-01-29 16:06 tibor.pacalat Note Added: 81921
2025-01-29 16:06 tibor.pacalat File Added: Screenshot 2025-01-29 at 16.04.49.png
2025-01-29 16:06 tibor.pacalat Bug heat 4 => 6