diff --git a/build/exe/doliwamp/doliwamp.iss b/build/exe/doliwamp/doliwamp.iss
index 34757a5123a..2ef8ab32f22 100644
--- a/build/exe/doliwamp/doliwamp.iss
+++ b/build/exe/doliwamp/doliwamp.iss
@@ -353,10 +353,12 @@ begin
begin
// TODO Copy file or ask to install package ?
//CustomMessage('YouWillInstallDoliWamp')+#13#13
- MsgBox('The package vcredist_x86.exe must have been installed first. It seems it is not. Please install it first from http://www.microsoft.com/en-us/download/details.aspx?id=30679 then restart DoliWamp installation/upgrade.',mbInformation,MB_OK);
+ MsgBox('The package vcredist_x86.exe must have been installed first. It seems it is not. Please install it first from http://www.microsoft.com/en-us/download/details.aspx?id=30679 then restart DoliWamp installation/upgrade.',mbInformation,MB_OK);
end;
-
-
+ // Pb seems similar with msvcp110.dll
+ //vcredist_x64.exe
+
+
// If we have a new database version, we should only copy old my.ini file into new directory
// and change only all basedir= strings to use new version. Like this, data dir is still correct.
// Install of service and stop/start scripts are already rebuild by installer.
diff --git a/htdocs/contrat/list.php b/htdocs/contrat/list.php
index 48a9afaaa56..d53bc0a3ee1 100644
--- a/htdocs/contrat/list.php
+++ b/htdocs/contrat/list.php
@@ -305,7 +305,7 @@ if ($resql)
$i = 0;
$arrayofselected=is_array($toselect)?$toselect:array();
-
+
if ($socid > 0)
{
$soc = new Societe($db);
@@ -313,7 +313,7 @@ if ($resql)
if (empty($search_name)) $search_name = $soc->name;
}
- $param='';
+ $param='';
if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.$contextpage;
if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.$limit;
if ($sall != '') $param.='&sall='.$sall;
diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php
index 6711ed2825f..0b8282ad5b6 100644
--- a/htdocs/core/lib/files.lib.php
+++ b/htdocs/core/lib/files.lib.php
@@ -393,6 +393,7 @@ function dol_dir_is_emtpy($folder)
*
* @param string $file Filename
* @return int <0 if KO, Number of lines in files if OK
+ * @see dol_nboflines
*/
function dol_count_nb_of_line($file)
{
diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php
index fae3c4eae5e..de07281696a 100644
--- a/htdocs/core/lib/functions.lib.php
+++ b/htdocs/core/lib/functions.lib.php
@@ -624,18 +624,26 @@ function dol_buildpath($path, $type=0)
/**
* Create a clone of instance of object (new instance with same value for properties)
- * Property that are reference are also new object (true clone)
+ * With native = 0: Property that are reference are also new object (true clone). This means $this->db is not valid.
+ * With native = 1: Use PHP clone. Property that are reference are same pointer. This means $this->db is still valid.
*
* @param object $object Object to clone
+ * @param int $native Native method or true method
* @return object Object clone
* @see https://php.net/manual/language.oop5.cloning.php
*/
-function dol_clone($object)
+function dol_clone($object, $native=0)
{
//dol_syslog(__FUNCTION__ . " is deprecated", LOG_WARNING);
- //$myclone = clone $object; // PHP clone is a shallow copy only, not a real clone, so properties of references will keep references (refer to the same target/variable
- $myclone=unserialize(serialize($object));
+ if (empty($native))
+ {
+ $myclone=unserialize(serialize($object));
+ }
+ else
+ {
+ $myclone = clone $object; // PHP clone is a shallow copy only, not a real clone, so properties of references will keep references (refer to the same target/variable)
+ }
return $myclone;
}
@@ -4766,22 +4774,57 @@ function dol_string_nohtmltag($StringHtml,$removelinefeed=1,$pagecodeto='UTF-8')
* Return first line of text. Cut will depends if content is HTML or not.
*
* @param string $text Input text
+ * @param int $nboflines Nb of lines to get (default is 1 = first line only)
* @return string Output text
* @see dol_nboflines_bis, dol_string_nohtmltag, dol_escape_htmltag
*/
-function dolGetFirstLineOfText($text)
+function dolGetFirstLineOfText($text, $nboflines=1)
{
- if (dol_textishtml($text))
+ if ($nboflines == 1)
{
- $firstline=preg_replace('/
]*>.*$/s','',$text); // The s pattern modifier means the . can match newline characters
- $firstline=preg_replace('/
]*>.*$/s','',$firstline); // The s pattern modifier means the . can match newline characters
+ if (dol_textishtml($text))
+ {
+ $firstline=preg_replace('/
]*>.*$/s','',$text); // The s pattern modifier means the . can match newline characters
+ $firstline=preg_replace('/
]*>.*$/s','',$firstline); // The s pattern modifier means the . can match newline characters
+ }
+ else
+ {
+ $firstline=preg_replace('/[\n\r].*/','',$text);
+ }
+ return $firstline.((strlen($firstline) != strlen($text))?'...':'');
}
else
{
- $firstline=preg_replace('/[\n\r].*/','',$text);
+ $ishtml=0;
+ if (dol_textishtml($text))
+ {
+ $text=preg_replace('/\n/','',$text);
+ $ishtml=1;
+ $repTable = array("\t" => " ", "\n" => " ", "\r" => " ", "\0" => " ", "\x0B" => " ");
+ }
+ else
+ {
+ $repTable = array("\t" => " ", "\n" => "
", "\r" => " ", "\0" => " ", "\x0B" => " ");
+ }
+
+ $text = strtr($text, $repTable);
+ if ($charset == 'UTF-8') { $pattern = '/(
]*>)/Uu'; } // /U is to have UNGREEDY regex to limit to one html tag. /u is for UTF8 support
+ else $pattern = '/(
]*>)/U'; // /U is to have UNGREEDY regex to limit to one html tag.
+ $a = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
+
+ $firstline='';
+ $i=0;
+ $nba = count($a); // 2x nb of lines in $a because $a contains also a line for each new line separator
+ while (($i < $nba) && ($i < ($nboflines * 2)))
+ {
+ if ($i % 2 == 0) $firstline .= $a[$i];
+ elseif (($i < (($nboflines * 2) - 1)) && ($i < ($nba - 1))) $firstline .= ($ishtml?"
\n":"\n");
+ $i++;
+ }
+ unset($a);
+ return $firstline.(($i < $nba)?'...':'');
}
- return $firstline.((strlen($firstline) != strlen($text))?'...':'');
}
@@ -4943,7 +4986,7 @@ function dol_nboflines($s,$maxchar=0)
/**
- * Return nb of lines of a formated text with \n and
(we can't have both \n and br)
+ * Return nb of lines of a formated text with \n and
(WARNING: string must not have mixed \n and br separators)
*
* @param string $text Text
* @param int $maxlinesize Largeur de ligne en caracteres (ou 0 si pas de limite - defaut)
@@ -4979,6 +5022,8 @@ function dol_nboflines_bis($text,$maxlinesize=0,$charset='UTF-8')
}
}
}
+
+ unset($a);
return $nblines;
}
diff --git a/htdocs/fichinter/list.php b/htdocs/fichinter/list.php
index 853506920b3..75f151d0850 100644
--- a/htdocs/fichinter/list.php
+++ b/htdocs/fichinter/list.php
@@ -249,16 +249,16 @@ $sql.= $db->plimit($limit+1, $offset);
$resql=$db->query($sql);
if ($resql)
{
- $num = $db->num_rows($result);
-
+ $num = $db->num_rows($resql);
+
+ $arrayofselected=is_array($toselect)?$toselect:array();
+
if ($socid > 0)
{
$soc = new Societe($db);
$soc->fetch($socid);
if (empty($search_company)) $search_company = $soc->name;
}
-
- $arrayofselected=is_array($toselect)?$toselect:array();
$param='';
if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.$contextpage;
diff --git a/test/phpunit/FunctionsLibTest.php b/test/phpunit/FunctionsLibTest.php
index 873a17758c8..0821e6c7a6c 100644
--- a/test/phpunit/FunctionsLibTest.php
+++ b/test/phpunit/FunctionsLibTest.php
@@ -122,10 +122,75 @@ class FunctionsLibTest extends PHPUnit_Framework_TestCase
+ /**
+ * testDolGetFirstLineOfText
+ *
+ * @return void
+ */
+ public function testDolGetFirstLineOfText()
+ {
+ // Nb of line is same than entry text
+
+ $input="aaaa";
+ $result=dolGetFirstLineOfText($input);
+ print __METHOD__." result=".$result."\n";
+ $this->assertEquals("aaaa", $result);
+
+ $input="aaaa\nbbbbbbbbbbbb\n";
+ $result=dolGetFirstLineOfText($input, 2);
+ print __METHOD__." result=".$result."\n";
+ $this->assertEquals("aaaa\nbbbbbbbbbbbb", $result);
+
+ $input="aaaa
bbbbbbbbbbbb
";
+ $result=dolGetFirstLineOfText($input, 2);
+ print __METHOD__." result=".$result."\n";
+ $this->assertEquals("aaaa
\nbbbbbbbbbbbb", $result);
+
+ // Nb of line is lower
+
+ $input="aaaa\nbbbbbbbbbbbb\ncccccc\n";
+ $result=dolGetFirstLineOfText($input);
+ print __METHOD__." result=".$result."\n";
+ $this->assertEquals("aaaa...", $result);
+
+ $input="aaaa
bbbbbbbbbbbb
cccccc
";
+ $result=dolGetFirstLineOfText($input);
+ print __METHOD__." result=".$result."\n";
+ $this->assertEquals("aaaa...", $result);
+
+ $input="aaaa\nbbbbbbbbbbbb\ncccccc\n";
+ $result=dolGetFirstLineOfText($input, 2);
+ print __METHOD__." result=".$result."\n";
+ $this->assertEquals("aaaa\nbbbbbbbbbbbb...", $result);
+
+ $input="aaaa
bbbbbbbbbbbb
cccccc
";
+ $result=dolGetFirstLineOfText($input, 2);
+ print __METHOD__." result=".$result."\n";
+ $this->assertEquals("aaaa
\nbbbbbbbbbbbb...", $result);
+
+ // Nb of line is higher
+
+ $input="aaaa
bbbbbbbbbbbb
cccccc";
+ $result=dolGetFirstLineOfText($input, 100);
+ print __METHOD__." result=".$result."\n";
+ $this->assertEquals("aaaa
\nbbbbbbbbbbbb
\ncccccc", $result, 'dolGetFirstLineOfText with nb 100 a');
+
+ $input="aaaa
bbbbbbbbbbbb
cccccc
";
+ $result=dolGetFirstLineOfText($input, 100);
+ print __METHOD__." result=".$result."\n";
+ $this->assertEquals("aaaa
\nbbbbbbbbbbbb
\ncccccc", $result, 'dolGetFirstLineOfText with nb 100 b');
+
+ $input="aaaa
bbbbbbbbbbbb
cccccc
\n";
+ $result=dolGetFirstLineOfText($input, 100);
+ print __METHOD__." result=".$result."\n";
+ $this->assertEquals("aaaa
\nbbbbbbbbbbbb
\ncccccc", $result, 'dolGetFirstLineOfText with nb 100 c');
+ }
+
+
/**
* testDolBuildPath
*
- * @return boolean
+ * @return void
*/
public function testDolBuildPath()
{