Merge remote-tracking branch 'origin/3.5' into develop

Conflicts:
	htdocs/core/modules/modExpedition.class.php
	htdocs/projet/class/project.class.php
This commit is contained in:
Laurent Destailleur 2014-05-07 19:30:19 +02:00
commit 7bfbc4cbf3
8 changed files with 162 additions and 46 deletions

View File

@ -116,7 +116,7 @@ Fix: Pb of records not correctly cleaned when module marge is
Fix: [ bug #1341 ] Lastname not added by file or direct input in mass e-mailing. Fix: [ bug #1341 ] Lastname not added by file or direct input in mass e-mailing.
Fix: [ bug #1357 ] Invoice creator state not printed in generated invoice documents. Fix: [ bug #1357 ] Invoice creator state not printed in generated invoice documents.
Fix: Suppliers invoice mask fails using {tttt} in numbering. Fix: Suppliers invoice mask fails using {tttt} in numbering.
Fix: pdf template name for typhon was not correctly et when enabling module. Fix: [ bug #1350 ] pdf template name for typhon was not correctly set when enabling module.
Fix: Navigation on notes for shipments was not working. Fix: Navigation on notes for shipments was not working.
Fix: [ bug #1353 ] Email notifications, wrong URL. Fix: [ bug #1353 ] Email notifications, wrong URL.
Fix: [ bug #1362 ] Note is not saved. Fix: [ bug #1362 ] Note is not saved.

View File

@ -69,8 +69,6 @@ function doc_getlinedesc($line,$outputlangs,$hideref=0,$hidedesc=0,$issupplierli
// Description long of product line // Description long of product line
if ($desc && ($desc != $label)) if ($desc && ($desc != $label))
{ {
if ( $libelleproduitservice && empty($hidedesc) ) $libelleproduitservice.="\n";
if ($desc == '(CREDIT_NOTE)' && $line->fk_remise_except) if ($desc == '(CREDIT_NOTE)' && $line->fk_remise_except)
{ {
$discount=new DiscountAbsolute($db); $discount=new DiscountAbsolute($db);
@ -83,18 +81,17 @@ function doc_getlinedesc($line,$outputlangs,$hideref=0,$hidedesc=0,$issupplierli
$discount->fetch($line->fk_remise_except); $discount->fetch($line->fk_remise_except);
$libelleproduitservice=$outputlangs->transnoentitiesnoconv("DiscountFromDeposit",$discount->ref_facture_source); $libelleproduitservice=$outputlangs->transnoentitiesnoconv("DiscountFromDeposit",$discount->ref_facture_source);
// Add date of deposit // Add date of deposit
if (! empty($conf->global->INVOICE_ADD_DEPOSIT_DATE)) echo ' ('.dol_print_date($discount->datec,'day','',$outputlangs).')'; if (! empty($conf->global->INVOICE_ADD_DEPOSIT_DATE)) $libelleproduitservice.=' ('.dol_print_date($discount->datec,'day','',$outputlangs).')';
} }
else else
{ {
if ($idprod) if ($idprod)
{ {
if (empty($hidedesc)) if (empty($hidedesc)) $libelleproduitservice=dol_concatdesc($libelleproduitservice, $desc);
$libelleproduitservice.=$desc;
} }
else else
{ {
$libelleproduitservice.=$desc; $libelleproduitservice=dol_concatdesc($libelleproduitservice, $desc);
} }
} }
} }
@ -148,7 +145,7 @@ function doc_getlinedesc($line,$outputlangs,$hideref=0,$hidedesc=0,$issupplierli
$period='('.$outputlangs->transnoentitiesnoconv('DateUntil',dol_print_date($line->date_end, $format, false, $outputlangs)).')'; $period='('.$outputlangs->transnoentitiesnoconv('DateUntil',dol_print_date($line->date_end, $format, false, $outputlangs)).')';
} }
//print '>'.$outputlangs->charset_output.','.$period; //print '>'.$outputlangs->charset_output.','.$period;
$libelleproduitservice.="\n".$period; $libelleproduitservice=dol_concatdesc($libelleproduitservice, $period);
//print $libelleproduitservice; //print $libelleproduitservice;
} }

View File

@ -3433,13 +3433,13 @@ function picto_required()
* Clean a string from all HTML tags and entities * Clean a string from all HTML tags and entities
* *
* @param string $StringHtml String to clean * @param string $StringHtml String to clean
* @param string $removelinefeed Replace also all lines feeds by a space * @param string $removelinefeed Replace also all lines feeds by a space, otherwise only last one are removed
* @param string $pagecodeto Encoding of input/output string * @param string $pagecodeto Encoding of input/output string
* @return string String cleaned * @return string String cleaned
*/ */
function dol_string_nohtmltag($StringHtml,$removelinefeed=1,$pagecodeto='UTF-8') function dol_string_nohtmltag($StringHtml,$removelinefeed=1,$pagecodeto='UTF-8')
{ {
$pattern = "/<[^>]+>/"; $pattern = "/<[^<>]+>/";
$temp = dol_html_entity_decode($StringHtml,ENT_COMPAT,$pagecodeto); $temp = dol_html_entity_decode($StringHtml,ENT_COMPAT,$pagecodeto);
$temp = preg_replace($pattern,"",$temp); $temp = preg_replace($pattern,"",$temp);
@ -3506,7 +3506,6 @@ function dol_htmlentitiesbr($stringtoencode,$nl2brmode=0,$pagecodefrom='UTF-8',$
$newstring=strtr($newstring,array('&'=>'__and__','<'=>'__lt__','>'=>'__gt__','"'=>'__dquot__')); $newstring=strtr($newstring,array('&'=>'__and__','<'=>'__lt__','>'=>'__gt__','"'=>'__dquot__'));
$newstring=dol_htmlentities($newstring,ENT_COMPAT,$pagecodefrom); // Make entity encoding $newstring=dol_htmlentities($newstring,ENT_COMPAT,$pagecodefrom); // Make entity encoding
$newstring=strtr($newstring,array('__and__'=>'&','__lt__'=>'<','__gt__'=>'>','__dquot__'=>'"')); $newstring=strtr($newstring,array('__and__'=>'&','__lt__'=>'<','__gt__'=>'>','__dquot__'=>'"'));
//$newstring=strtr($newstring,array('__li__'=>"<li>\n")); // Restore <li>\n
} }
else else
{ {
@ -3551,7 +3550,7 @@ function dol_htmlcleanlastbr($stringtodecode)
* Replace html_entity_decode functions to manage errors * Replace html_entity_decode functions to manage errors
* *
* @param string $a Operand a * @param string $a Operand a
* @param string $b Operand b * @param string $b Operand b (ENT_QUOTES=convert simple and double quotes)
* @param string $c Operand c * @param string $c Operand c
* @return string String decoded * @return string String decoded
*/ */
@ -3691,17 +3690,10 @@ function dol_textishtml($msg,$option=0)
{ {
if (preg_match('/<html/i',$msg)) return true; if (preg_match('/<html/i',$msg)) return true;
elseif (preg_match('/<body/i',$msg)) return true; elseif (preg_match('/<body/i',$msg)) return true;
elseif (preg_match('/<b>/i',$msg)) return true; elseif (preg_match('/<(b|em|i)>/i',$msg)) return true;
elseif (preg_match('/<br/i',$msg)) return true; elseif (preg_match('/<(br|div|font|img|li|span|strong|table)>/i',$msg)) return true;
elseif (preg_match('/<div/i',$msg)) return true; elseif (preg_match('/<(br|div|font|img|li|span|strong|table)\s+[^<>\/]*>/i',$msg)) return true;
elseif (preg_match('/<em>/i',$msg)) return true; elseif (preg_match('/<(br|div|font|img|li|span|strong|table)\s+[^<>\/]*\/>/i',$msg)) return true;
elseif (preg_match('/<font/i',$msg)) return true;
elseif (preg_match('/<img/i',$msg)) return true;
elseif (preg_match('/<i>/i',$msg)) return true;
elseif (preg_match('/<li/i',$msg)) return true;
elseif (preg_match('/<span/i',$msg)) return true;
elseif (preg_match('/<strong/i',$msg)) return true;
elseif (preg_match('/<table/i',$msg)) return true;
elseif (preg_match('/&[A-Z0-9]{1,6};/i',$msg)) return true; // Html entities names (http://www.w3schools.com/tags/ref_entities.asp) elseif (preg_match('/&[A-Z0-9]{1,6};/i',$msg)) return true; // Html entities names (http://www.w3schools.com/tags/ref_entities.asp)
elseif (preg_match('/&#[0-9]{2,3};/i',$msg)) return true; // Html entities numbers (http://www.w3schools.com/tags/ref_entities.asp) elseif (preg_match('/&#[0-9]{2,3};/i',$msg)) return true; // Html entities numbers (http://www.w3schools.com/tags/ref_entities.asp)
return false; return false;
@ -3709,7 +3701,7 @@ function dol_textishtml($msg,$option=0)
} }
/** /**
* Concat 2 descriptions (second one after first one) * Concat 2 descriptions (second one after first one with a new line separator if required)
* text1 html + text2 html => text1 + '<br>' + text2 * text1 html + text2 html => text1 + '<br>' + text2
* text1 html + text2 txt => text1 + '<br>' + dol_nl2br(text2) * text1 html + text2 txt => text1 + '<br>' + dol_nl2br(text2)
* text1 txt + text2 html => dol_nl2br(text1) + '<br>' + text2 * text1 txt + text2 html => dol_nl2br(text1) + '<br>' + text2

View File

@ -136,9 +136,15 @@ class Segment implements IteratorAggregate, Countable
if (strpos($this->xml, $this->odf->getConfig('DELIMITER_LEFT') . $key . $this->odf->getConfig('DELIMITER_RIGHT')) === false) { if (strpos($this->xml, $this->odf->getConfig('DELIMITER_LEFT') . $key . $this->odf->getConfig('DELIMITER_RIGHT')) === false) {
throw new SegmentException("var $key not found in {$this->getName()}"); throw new SegmentException("var $key not found in {$this->getName()}");
} }
$value=$this->odf->htmlToUTFAndPreOdf($value);
$value = $encode ? htmlspecialchars($value) : $value; $value = $encode ? htmlspecialchars($value) : $value;
$value = ($charset == 'ISO-8859') ? utf8_encode($value) : $value; $value = ($charset == 'ISO-8859') ? utf8_encode($value) : $value;
$this->vars[$this->odf->getConfig('DELIMITER_LEFT') . $key . $this->odf->getConfig('DELIMITER_RIGHT')] = str_replace("\n", "<text:line-break/>", $value);
$value=$this->odf->preOdfToOdf($value);
$this->vars[$this->odf->getConfig('DELIMITER_LEFT') . $key . $this->odf->getConfig('DELIMITER_RIGHT')] = $value;
return $this; return $this;
} }
/** /**

View File

@ -122,12 +122,68 @@ class Odf
throw new OdfException("var $key not found in the document"); throw new OdfException("var $key not found in the document");
//} //}
} }
$value=$this->htmlToUTFAndPreOdf($value);
$value = $encode ? htmlspecialchars($value) : $value; $value = $encode ? htmlspecialchars($value) : $value;
$value = ($charset == 'ISO-8859') ? utf8_encode($value) : $value; $value = ($charset == 'ISO-8859') ? utf8_encode($value) : $value;
$this->vars[$tag] = str_replace("\n", "<text:line-break/>", $value);
$value=$this->preOdfToOdf($value);
$this->vars[$tag] = $value;
return $this; return $this;
} }
/**
* Function to convert a HTML string into an ODT string
*
* @param string $value String to convert
*/
public function htmlToUTFAndPreOdf($value)
{
// We decode into utf8, entities
$value=dol_html_entity_decode($value, ENT_QUOTES);
// We convert html tags
$ishtml=dol_textishtml($value);
if ($ishtml)
{
// If string is "MYPODUCT - Desc <strong>bold</strong> with &eacute; accent<br />\n<br />\nUn texto en espa&ntilde;ol ?"
// Result after clean must be "MYPODUCT - Desc bold with é accent\n\nUn texto en espa&ntilde;ol ?"
// We want to ignore \n and we want all <br> to be \n
$value=preg_replace('/(\r\n|\r|\n)/i','',$value);
$value=preg_replace('/<br>/i',"\n",$value);
$value=preg_replace('/<br\s+[^<>\/]*>/i',"\n",$value);
$value=preg_replace('/<br\s+[^<>\/]*\/>/i',"\n",$value);
//$value=preg_replace('/<strong>/','__lt__text:p text:style-name=__quot__bold__quot____gt__',$value);
//$value=preg_replace('/<\/strong>/','__lt__/text:p__gt__',$value);
$value=dol_string_nohtmltag($value, 0);
}
return $value;
}
/**
* Function to convert a HTML string into an ODT string
*
* @param string $value String to convert
*/
public function preOdfToOdf($value)
{
$value = str_replace("\n", "<text:line-break/>", $value);
//$value = str_replace("__lt__", "<", $value);
//$value = str_replace("__gt__", ">", $value);
//$value = str_replace("__quot__", '"', $value);
return $value;
}
/** /**
* Evaluating php codes inside the ODT and output the buffer (print, echo) inplace of the code * Evaluating php codes inside the ODT and output the buffer (print, echo) inplace of the code
* *

View File

@ -496,6 +496,7 @@ class Project extends CommonObject
$sql = "DELETE FROM " . MAIN_DB_PREFIX . "projet_extrafields"; $sql = "DELETE FROM " . MAIN_DB_PREFIX . "projet_extrafields";
$sql.= " WHERE fk_object=" . $this->id; $sql.= " WHERE fk_object=" . $this->id;
dol_syslog(get_class($this) . "::delete sql=" . $sql, LOG_DEBUG); dol_syslog(get_class($this) . "::delete sql=" . $sql, LOG_DEBUG);
$resql = $this->db->query($sql); $resql = $this->db->query($sql);
if (!$resql) if (!$resql)
@ -540,13 +541,15 @@ class Project extends CommonObject
} }
} }
if (empty($error)) { if (empty($error))
{
$this->db->commit(); $this->db->commit();
return 1; return 1;
} }
else else
{ {
foreach ( $this->errors as $errmsg ) { foreach ( $this->errors as $errmsg )
{
dol_syslog(get_class($this) . "::delete " . $errmsg, LOG_ERR); dol_syslog(get_class($this) . "::delete " . $errmsg, LOG_ERR);
$this->error .= ($this->error ? ', ' . $errmsg : $errmsg); $this->error .= ($this->error ? ', ' . $errmsg : $errmsg);
} }

View File

@ -168,20 +168,35 @@ class FunctionsLibTest extends PHPUnit_Framework_TestCase
$input='xxx <b>yyy</b> zzz'; $input='xxx <b>yyy</b> zzz';
$after=dol_textishtml($input); $after=dol_textishtml($input);
$this->assertTrue($after); $this->assertTrue($after);
$input='xxx<br>';
$after=dol_textishtml($input);
$this->assertTrue($after);
$input='text with <div>some div</div>'; $input='text with <div>some div</div>';
$after=dol_textishtml($input); $after=dol_textishtml($input);
$this->assertTrue($after); $this->assertTrue($after);
$input='text with HTML &nbsp; entities'; $input='text with HTML &nbsp; entities';
$after=dol_textishtml($input); $after=dol_textishtml($input);
$this->assertTrue($after); $this->assertTrue($after);
$input='xxx<br>';
$after=dol_textishtml($input);
$this->assertTrue($after);
$input='xxx<br >';
$after=dol_textishtml($input);
$this->assertTrue($after);
$input='xxx<br style="eee">';
$after=dol_textishtml($input);
$this->assertTrue($after);
$input='xxx<br style="eee" >';
$after=dol_textishtml($input);
$this->assertTrue($after);
// False // False
$input='xxx < br>'; $input='xxx < br>';
$after=dol_textishtml($input); $after=dol_textishtml($input);
$this->assertFalse($after); $this->assertFalse($after);
$input='xxx <email@email.com>'; // <em> is html, <em... is not
$after=dol_textishtml($input);
$this->assertFalse($after);
$input='xxx <brstyle="ee">';
$after=dol_textishtml($input);
$this->assertFalse($after);
} }
@ -223,6 +238,53 @@ class FunctionsLibTest extends PHPUnit_Framework_TestCase
return true; return true;
} }
/**
* testDolConcat
*
* @return boolean
*/
public function testDolConcat()
{
$text1="A string 1"; $text2="A string 2"; // text 1 and 2 are text, concat need only \n
$after=dol_concatdesc($text1, $text2);
$this->assertEquals("A string 1\nA string 2",$after);
$text1="A<br>string 1"; $text2="A string 2"; // text 1 is html, concat need <br>\n
$after=dol_concatdesc($text1, $text2);
$this->assertEquals("A<br>string 1<br>\nA string 2",$after);
$text1="A string 1"; $text2="A <b>string</b> 2"; // text 2 is html, concat need <br>\n
$after=dol_concatdesc($text1, $text2);
$this->assertEquals("A string 1<br>\nA <b>string</b> 2",$after);
return true;
}
/**
* testDolStringNohtmltag
*
* @return boolean
*/
public function testDolStringNohtmltag()
{
$text="A\nstring\n";
$after=dol_string_nohtmltag($text,0);
$this->assertEquals("A\nstring",$after,"test1");
$text="A <b>string<b>\n\nwith html tag and '<' chars<br>\n";
$after=dol_string_nohtmltag($text, 0);
$this->assertEquals("A string\n\nwith html tag and '<' chars",$after,"test2");
$text="A <b>string<b>\n\nwith tag with < chars<br>\n";
$after=dol_string_nohtmltag($text, 1);
$this->assertEquals("A string with tag with < chars",$after,"test3");
return true;
}
/** /**
* testDolHtmlEntitiesBr * testDolHtmlEntitiesBr
* *