View Issue Details

This bug affects 1 person(s).
 4
IDProjectCategoryView StatusLast Update
17677Bug reportsImport/Exportpublic2022-01-12 15:00
ReporterDenisChenu Assigned Togalads  
PrioritynoneSeverityfeature 
Status testingResolutionopen 
Summary17677: Valid TSV file can not be used in VV import
DescriptionVV import didn't work with line feed in header or in value

This can be great to have
- Subquestion in header , or some detail in header (1st line) : better shown in multiline
- Use copy/paste in value : need line feed

This can be fixed using \n replace by {newline} , but more easy is usage more easy is …
Additional InformationCan be fixed but use iconv on each element.
I think we already have iconv used ?

(see https://github.com/wilgucki/php-csv/blob/06721264c4fdfa55c9b18bb1e5f2c0419487e8c1/src/Reader.php#L126 for a sample of usage).

TagsNo tags attached.
Bug heat4
Complete LimeSurvey version number (& build) 3.27.25
I will donate to the project if issue is resolved
Browsernot relevant
Database type & versionnot relevant
Server OS (if known)not relevant
Webserver software & version (if known)nginx
PHP Version7.4

Relationships

parent of 17678 confirmed Feature requests VV export didn't shown sub question 
Not all the children of this issue are yet resolved or closed.

Users monitoring this issue

User List There are no users monitoring this issue.

Activities

DenisChenu

DenisChenu

2021-10-25 12:32

developer   ~66924

vvexport_629533_headerLineFeed.csv (426 bytes)   
"ID de la réponse"	"token"	"Date de soumission"	"Dernière page"	"Langue de départ"	"Tête de série"	"Une première question comme exemple. Veuillez répondre à cette question :
Rang 1"	"Une première question comme exemple. Veuillez répondre à cette question :
Rang 2"
"id"	"token"	"submitdate"	"lastpage"	"startlanguage"	"seed"	"Q00_1"	"Q00_2"
1	"{question_not_shown}"	"1980-01-01 00:00:00"	1	"fr"	723848058	"A3"	"A2"
vvexport_629533_valueLineFeed.csv (417 bytes)   
"ID de la réponse"	"Dernière page"	"Langue de départ"	"Une première question comme exemple. Veuillez répondre à cette question"	"Une première question comme exemple. Veuillez répondre à cette question "	"MultiLine"
"id"	"lastpage"	"startlanguage"	"Q00_1"	"Q00_2"	"MultiLine"
1	1	"fr"	"A3"	"A2"	"MultiLigne 1 1
MultiLigne  1 2
MultiLigne 1 3"
1	1	"fr"	"A3"	"A2"	"MultiLigne 2 1
MultiLigne 2 2
MultiLigne 2 3"
PHP notice -Value.html (23,285 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 notice</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 notice</h1>

	<p class="message">
		Undefined offset: 1	</p>

	<div class="source">
		<p class="file">/data/webdev/3LTS/application/helpers/admin/import_helper.php(1977)</p>
		<div class="code"><pre><span class="ln">1965</span>             if ($aOptions['bNotFinalized']) {
<span class="ln">1966</span>                 $oSurvey-&gt;submitdate = new CDbExpression('NULL');
<span class="ln">1967</span>             } elseif (is_int($iSubmitdateKey)) {
<span class="ln">1968</span>                 if ($aResponses[$iSubmitdateKey] == '{question_not_shown}' || trim($aResponses[$iSubmitdateKey] == '')) {
<span class="ln">1969</span>                     $oSurvey-&gt;submitdate = new CDbExpression('NULL');
<span class="ln">1970</span>                 } else {
<span class="ln">1971</span>                     // Maybe control valid date : see http://php.net/manual/en/function.checkdate.php#78362 for example
<span class="ln">1972</span>                     $oSurvey-&gt;submitdate = $aResponses[$iSubmitdateKey];
<span class="ln">1973</span>                 }
<span class="ln">1974</span>             }
<span class="ln">1975</span> 
<span class="ln">1976</span>             foreach ($aKeyForFieldNames as $sFieldName=&gt;$iFieldKey) {
<span class="error"><span class="ln error-ln">1977</span>                 if ($aResponses[$iFieldKey] == '{question_not_shown}') {
</span><span class="ln">1978</span>                     $oSurvey-&gt;$sFieldName = new CDbExpression('NULL');
<span class="ln">1979</span>                 } else {
<span class="ln">1980</span>                     $sResponse = str_replace(array("{quote}", "{tab}", "{cr}", "{newline}", "{lbrace}"), array("\"", "\t", "\r", "\n", "{"), $aResponses[$iFieldKey]);
<span class="ln">1981</span>                     $oSurvey-&gt;$sFieldName = $sResponse;
<span class="ln">1982</span>                 }
<span class="ln">1983</span>             }
<span class="ln">1984</span> 
<span class="ln">1985</span>             //Check if datestamp is set =&gt; throws no default error on importing
<span class="ln">1986</span>             if($oSurvey-&gt;hasAttribute('datestamp') &amp;&amp; !isset($oSurvey-&gt;datestamp)){
<span class="ln">1987</span>                 $oSurvey-&gt;datestamp = '1980-01-01 00:00:01';
<span class="ln">1988</span>             } 
<span class="ln">1989</span>             //Check if startdate is set =&gt; throws no default error on importing
</pre></div>	</div>

	<div class="traces">
		<h2>Stack Trace</h2>
				<table style="width:100%;">
						<tbody><tr class="trace app expanded">
			<td class="number">
				#0			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/data/webdev/3LTS/application/controllers/admin/dataentry.php(146): <strong>CSVImportResponses</strong>("/data/webdev/3LTS/tmp/wsk4tn5fcf4mngcpxwv7",
 "629533", array("bDeleteFistLine" =&gt; true, "sExistingId" =&gt; 
"ignore", "bNotFinalized" =&gt; false, "bForceImport" =&gt; false, ...))
				</div>

				<div class="code"><pre><span class="ln">141</span>         }
<span class="ln">142</span>         $aOptions['bNotFinalized'] = (bool) Yii::app()-&gt;request-&gt;getPost('notfinalized');
<span class="ln">143</span>         $aOptions['bForceImport'] = (bool) Yii::app()-&gt;request-&gt;getPost('forceimport');
<span class="ln">144</span>         $aOptions['sCharset'] = Yii::app()-&gt;request-&gt;getPost('vvcharset');
<span class="ln">145</span>         $aOptions['sSeparator'] = "\t";
<span class="error"><span class="ln error-ln">146</span>         $aResult = CSVImportResponses($filePath, $iSurveyId, $aOptions);
</span><span class="ln">147</span>         unlink($filePath); //delete the uploaded file
<span class="ln">148</span>         $aData['class'] = "";
<span class="ln">149</span>         $aData['title'] = gT("Import a VV response data file");
<span class="ln">150</span>         $aData['aResult']['success'][] = gT("File upload succeeded.");
<span class="ln">151</span>         if (isset($aResult['success'])) {
</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;/data/webdev/3LTS/application/controllers/admin/dataentry.php(96): <strong>dataentry</strong>-&gt;<strong>_handleFileUpload</strong>("629533",
 array("display" =&gt; array("menu_bars" =&gt; array("browse" =&gt; 
"Saisie de données")), "title_bar" =&gt; array("title" =&gt; "Saisie de 
données"), "sidemenu" =&gt; array("state" =&gt; false), "menu" =&gt; 
array("edition" =&gt; true, "import" =&gt; true, "close" =&gt; true), 
...))				</div>

				<div class="code"><pre><span class="ln">091</span> 
<span class="ln">092</span>                 $subAction = Yii::app()-&gt;request-&gt;getPost('subaction');
<span class="ln">093</span>                 if ($subAction != "upload") {
<span class="ln">094</span>                     $this-&gt;_showUploadForm($this-&gt;_getEncodingsArray(), $iSurveyId, $aData);
<span class="ln">095</span>                 } else {
<span class="error"><span class="ln error-ln">096</span>                     $this-&gt;_handleFileUpload($iSurveyId, $aData);
</span><span class="ln">097</span>                 }
<span class="ln">098</span>             } else {
<span class="ln">099</span>                 Yii::app()-&gt;session['flashmessage'] = gT("This survey is not active. You must activate the survey before attempting to import a VVexport file.");
<span class="ln">100</span>                 $this-&gt;getController()-&gt;redirect($this-&gt;getController()-&gt;createUrl("/admin/survey/sa/view/surveyid/{$iSurveyId}"));
<span class="ln">101</span>             }
</pre></div>			</td>
		</tr>
						<tr class="trace core collapsed">
			<td class="number">
				#2			</td>
			<td class="content">
				<div class="trace-file">
										&nbsp;unknown(0): <strong>dataentry</strong>-&gt;<strong>vvimport</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>
										&nbsp;/data/webdev/3LTS/framework/web/actions/CAction.php(115): <strong>ReflectionMethod</strong>-&gt;<strong>invokeArgs</strong>(dataentry, array())				</div>

				<div class="code"><pre><span class="ln">110</span>             elseif($param-&gt;isDefaultValueAvailable())
<span class="ln">111</span>                 $ps[]=$param-&gt;getDefaultValue();
<span class="ln">112</span>             else
<span class="ln">113</span>                 return false;
<span class="ln">114</span>         }
<span class="error"><span class="ln error-ln">115</span>         $method-&gt;invokeArgs($object,$ps);
</span><span class="ln">116</span>         return true;
<span class="ln">117</span>     }
<span class="ln">118</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>
										&nbsp;/data/webdev/3LTS/application/core/Survey_Common_Action.php(83): <strong>CAction</strong>-&gt;<strong>runWithParamsInternal</strong>(dataentry,
 ReflectionMethod, array("r" =&gt; 
"admin/dataentry/sa/vvimport/surveyid/629533", "sa" =&gt; "vvimport", 
"surveyid" =&gt; "629533", "iSurveyId" =&gt; "629533", ...))				</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">
				#5			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/data/webdev/3LTS/framework/web/CController.php(308): <strong>Survey_Common_Action</strong>-&gt;<strong>runWithParams</strong>(array("r"
 =&gt; "admin/dataentry/sa/vvimport/surveyid/629533", "sa" =&gt; 
"vvimport", "surveyid" =&gt; "629533", "iSurveyId" =&gt; "629533", ...))
				</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">
				#6			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/data/webdev/3LTS/framework/web/CController.php(286): <strong>CController</strong>-&gt;<strong>runAction</strong>(dataentry)				</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">
				#7			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/data/webdev/3LTS/framework/web/CController.php(265): <strong>CController</strong>-&gt;<strong>runActionWithFilters</strong>(dataentry, 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">
				#8			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/data/webdev/3LTS/application/controllers/AdminController.php(165): <strong>CController</strong>-&gt;<strong>run</strong>("dataentry")				</div>

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

				<div class="code"><pre><span class="ln">277</span>         {
<span class="ln">278</span>             list($controller,$actionID)=$ca;
<span class="ln">279</span>             $oldController=$this-&gt;_controller;
<span class="ln">280</span>             $this-&gt;_controller=$controller;
<span class="ln">281</span>             $controller-&gt;init();
<span class="error"><span class="ln error-ln">282</span>             $controller-&gt;run($actionID);
</span><span class="ln">283</span>             $this-&gt;_controller=$oldController;
<span class="ln">284</span>         }
<span class="ln">285</span>         else
<span class="ln">286</span>             throw new CHttpException(404,Yii::t('yii','Unable to resolve the request "{route}".',
<span class="ln">287</span>                 array('{route}'=&gt;$route===''?$this-&gt;defaultController:$route)));
</pre></div>			</td>
		</tr>
						<tr class="trace core collapsed">
			<td class="number">
				#10			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/data/webdev/3LTS/framework/web/CWebApplication.php(141): <strong>CWebApplication</strong>-&gt;<strong>runController</strong>("admin/dataentry/sa/vvimport/surveyid/629533")				</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">
				#11			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/data/webdev/3LTS/framework/base/CApplication.php(185): <strong>CWebApplication</strong>-&gt;<strong>processRequest</strong>()				</div>

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

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

	<div class="version">
		2021-10-25 12:27:22 nginx/1.18.0 <a href="http://www.yiiframework.com/">Yii Framework</a>/1.1.24-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>




<table class="yiiLog" style="border-spacing:1px;font:11px Verdana, Arial, Helvetica, sans-serif;background:#EEEEEE;color:#666666;" width="100%" cellpadding="2">
	<tbody><tr>
		<th style="background:black;color:white;" colspan="5">
			Journal d'application
		</th>
	</tr>
	<tr style="background-color: #ccc;">
	    <th style="width:120px">Heure</th>
		<th>Niveau</th>
		<th>Categorie</th>
		<th>Message</th>
	</tr>
	<tr style="background:#FFC0CB">
		<td align="center">12:27:22.394759</td>
		<td>error</td>
		<td>application.LimeExpressionManager</td>
		<td><pre>setVariableAndTokenMappingsForExpressionManager with an empty
surveyOptions.</pre></td>
	</tr>	<tr style="background:#FFC0CB">
		<td align="center">12:27:22.455497</td>
		<td>error</td>
		<td>php</td>
		<td><pre>Undefined offset: 1
(/data/webdev/3LTS/application/helpers/admin/import_helper.php:1977)
Stack trace:
#0 unknown(0): dataentry-&gt;vvimport()
#1 /data/webdev/3LTS/framework/web/actions/CAction.php(115):
ReflectionMethod-&gt;invokeArgs()
#2 /data/webdev/3LTS/application/core/Survey_Common_Action.php(83):
dataentry-&gt;runWithParamsInternal()
#3 /data/webdev/3LTS/framework/web/CController.php(308):
dataentry-&gt;runWithParams()
#4 /data/webdev/3LTS/framework/web/CController.php(286):
AdminController-&gt;runAction()
#5 /data/webdev/3LTS/framework/web/CController.php(265):
AdminController-&gt;runActionWithFilters()
#6 /data/webdev/3LTS/application/controllers/AdminController.php(165):
AdminController-&gt;run()
#7 /data/webdev/3LTS/framework/web/CWebApplication.php(282):
AdminController-&gt;run()
#8 /data/webdev/3LTS/framework/web/CWebApplication.php(141):
LSYii_Application-&gt;runController()
#9 /data/webdev/3LTS/framework/base/CApplication.php(185):
LSYii_Application-&gt;processRequest()
#10 /data/webdev/3LTS/index.php(193): LSYii_Application-&gt;run()
REQUEST_URI=/3LTS/index.php?r=admin/dataentry/sa/vvimport/surveyid/629533</pre></td>
	</tr></tbody></table>
<!-- end of log messages --><div id="grammalecte_menu_main_button_shadow_host" style="width: 0px; height: 0px;"></div></body><script src="PHP%20notice%20-Value_fichiers/api.js"></script></html>
<!-- start log messages -->
PHP notice -Value.html (23,285 bytes)   
DenisChenu

DenisChenu

2021-10-25 12:42

developer   ~66926

Last edited: 2021-12-13 18:38

result of vvexport_629533_valueLineFeed.csv without dbug
DenisChenu

DenisChenu

2021-10-26 17:02

developer   ~66938

Last edited: 2021-12-13 18:38

@c_schmitz : if this feature can be OK in dev/master or 3.X : i take it and fix it.

iconv is already needed for TSV and excel export
https://github.com/LimeSurvey/LimeSurvey/blob/3f4149116d4409055f4085b78680e43ce5d841e2/application/helpers/admin/import_helper.php#L2683

Just need to know :)
c_schmitz

c_schmitz

2021-10-26 17:55

administrator   ~66945

Last edited: 2021-12-13 18:38

Sounds good to me.
DenisChenu

DenisChenu

2021-10-26 18:57

developer   ~66948

Last edited: 2021-12-13 18:38

Thanks :)
DenisChenu

DenisChenu

2021-12-04 11:24

developer   ~67676

Last edited: 2021-12-13 18:38

OK :) Get the contract !
DenisChenu

DenisChenu

2021-12-10 10:48

developer   ~67756

Last edited: 2021-12-13 18:38

https://github.com/LimeSurvey/LimeSurvey/pull/2177
DenisChenu

DenisChenu

2022-01-12 15:00

developer   ~67972

PS : contract broken : Excel don't know how to use CSV with Line feed .
Pull request still valid for LibreOO user :)

Issue History

Date Modified Username Field Change
2021-10-25 12:31 DenisChenu New Issue
2021-10-25 12:32 DenisChenu Note Added: 66924
2021-10-25 12:32 DenisChenu File Added: vvexport_629533_headerLineFeed.csv
2021-10-25 12:32 DenisChenu File Added: vvexport_629533_valueLineFeed.csv
2021-10-25 12:32 DenisChenu File Added: PHP notice -Value.html
2021-10-25 12:32 DenisChenu File Added: survey_archive_629533.lsa
2021-10-25 12:32 DenisChenu Bug heat 0 => 2
2021-10-25 12:42 DenisChenu Note Added: 66926
2021-10-25 12:42 DenisChenu File Added: Capture d’écran du 2021-10-25 12-42-08.png
2021-10-25 12:55 DenisChenu Relationship added parent of 17678
2021-10-26 17:02 DenisChenu Note Added: 66938
2021-10-26 17:55 c_schmitz Note Added: 66945
2021-10-26 17:55 c_schmitz Bug heat 2 => 4
2021-10-26 18:57 DenisChenu Note Added: 66948
2021-10-26 18:57 DenisChenu Assigned To => DenisChenu
2021-10-26 18:57 DenisChenu Status new => assigned
2021-12-04 11:24 DenisChenu Note Added: 67676
2021-12-10 10:01 DenisChenu Project Feature requests => Bug reports
2021-12-10 10:02 DenisChenu Summary Allow line feed in VV import => Valid TSV file can not be used in VV import
2021-12-10 10:02 DenisChenu Complete LimeSurvey version number (& build) => 3.27.25
2021-12-10 10:02 DenisChenu Browser => not relevant
2021-12-10 10:02 DenisChenu Database type & version => not relevant
2021-12-10 10:02 DenisChenu Server OS (if known) => not relevant
2021-12-10 10:02 DenisChenu Webserver software & version (if known) => nginx
2021-12-10 10:02 DenisChenu PHP Version => 7.4
2021-12-10 10:48 DenisChenu Note Added: 67756
2021-12-13 18:38 DenisChenu Assigned To DenisChenu => galads
2021-12-13 18:38 DenisChenu Status assigned => testing
2022-01-12 15:00 DenisChenu Note Added: 67972