Add extrafields on PDF object lines

This commit is contained in:
ATM john 2020-02-22 16:27:44 +01:00
parent aa77d96f23
commit e209fd2973
2 changed files with 211 additions and 2 deletions

View File

@ -1074,7 +1074,7 @@ abstract class CommonDocGenerator
* @param float $curY curent Y position
* @param string $colKey the column key
* @param string $columnText column text
* @return int new rank on success and -1 on error
* @return null
*/
public function printStdColumnContent($pdf, &$curY, $colKey, $columnText = '')
{
@ -1096,6 +1096,111 @@ abstract class CommonDocGenerator
}
}
/**
* get extrafield content for pdf writeHtmlCell compatibility
* usage for PDF line columns and object note block
*
* @param object $object common object
* @param string $extrafieldKey the extrafield key
* @return null
*/
public function getExtrafieldContent($object, $extrafieldKey)
{
global $hookmanager;
if(empty($object->table_element)){ return; }
$extrafieldsKeyPrefix = "options_";
// Cleanup extrafield key to remove prefix if present
$pos = strpos($extrafieldKey, $extrafieldsKeyPrefix);
if($pos===0){
$extrafieldKey = substr($extrafieldKey, strlen ( $extrafieldsKeyPrefix));
}
$extrafieldOptionsKey = $extrafieldsKeyPrefix.$extrafieldKey;
// Load extrafiels if not allready does
if(!isset($this->extrafieldsCache)){ $this->extrafieldsCache = array(); }
if(!isset($this->extrafieldsCache[$object->table_element])){
$extrafields = new ExtraFields($this->db);
$extrafields->fetch_name_optionals_label($object->table_element);
}
else{
$extrafields = $this->extrafieldsCache[$object->table_element];
}
$extrafieldOutputContent = $extrafields->showOutputField($extrafieldKey, $object->array_options[$extrafieldOptionsKey], '', $object->table_element);
// TODO : allow showOutputField to be pdf public friendly, ex: in a link to object, clean getNomUrl to remove link and images... like a getName methode ...
if($extrafields->attributes[$object->table_element]['type'][$extrafieldKey] == 'link'){
// for lack of anything better we cleanup all html tags
$extrafieldOutputContent = dol_string_nohtmltag($extrafieldOutputContent);
}
$parameters = array(
'object' => $object,
'extrafields' => $extrafields,
'extrafieldKey' => $extrafieldKey,
'extrafieldOutputContent' =>& $extrafieldOutputContent
);
$reshook = $hookmanager->executeHooks('getPDFExtrafieldContent', $parameters, $this); // Note that $action and $object may have been modified by hook
if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
if ($reshook)
{
$extrafieldOutputContent = $hookmanager->resPrint;
}
return $extrafieldOutputContent;
}
/**
* print extrafields columns content
*
* @param Tcpdf $pdf pdf object
* @param float $curY curent Y position
* @param object $object line of common object
* @return double max y value
*/
public function printLineExtrafieldsColumnsContent($pdf, &$curY, $object)
{
global $hookmanager;
if(empty($object->table_element) || !isset($this->extrafieldsCache[$object->table_element])){
return;
}
$nextY = $curY;
// get extrafield config from cache
$extrafields =& $this->extrafieldsCache[$object->table_element];
/**
* @var $extrafields ExtraFields
*/
if (is_array($extrafields->attributes[$object->table_element]['label'])) {
foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $label)
{
$extrafieldColKey = "options_".$key;
if ($this->getColumnStatus($extrafieldColKey) && isset($object->array_options[$extrafieldColKey]))
{
// TODO : allow showOutputField to be pdf public friendly, ex: in a link to object, clean getNomUrl to remove link and images...
$columnText = $extrafields->showOutputField($key, $object->array_options[$extrafieldColKey], '', $object->table_element);
$this->printStdColumnContent($pdf, $curY, $extrafieldColKey, $columnText);
$nextY = max($pdf->GetY(), $nextY);
}
}
}
return $nextY;
}
/**
* get column status from column key
@ -1167,4 +1272,91 @@ abstract class CommonDocGenerator
}
return $this->tabTitleHeight;
}
/**
* Define Array Column Field for extrafields
*
* @param object $object common object det
* @param Translate $outputlangs langs
* @param int $hidedetails Do not show line details
* @return null
*/
public function defineColumnExtrafield($object, $outputlangs, $hidedetails = 0)
{
global $conf;
if(!empty($hidedetails)){
return;
}
if(empty($object->table_element)){
return;
}
$extrafields = new ExtraFields($this->db);
$extralabels = $extrafields->fetch_name_optionals_label($object->table_element);
if (is_array($extrafields->attributes[$object->table_element]['label'])) {
// For cache on lines loop
if(!isset($this->extrafieldsCache)){ $this->extrafieldsCache = array(); }
$this->extrafieldsCache[$object->table_element] = $extrafields;
foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $label)
{
// Dont display separator yet even is set to be displayed (not compatible yet)
if ($extrafields->attributes[$object->table_element]['type'][$key] == 'separate')
{
continue;
}
// Enable extrafield ?
$enabled = 1;
if ($enabled && isset($extrafields->attributes[$object->table_element]['enabled'][$key]))
{
$enabled = dol_eval($extrafields->attributes[$object->table_element]['enabled'][$key], 1);
}
if ($enabled && isset($extrafields->attributes[$object->table_element]['list'][$key]))
{
$enabled = dol_eval($extrafields->attributes[$object->table_element]['list'][$key], 1);
}
// Load language if required
if (!empty($extrafields->attributes[$object->table_element]['langfile'][$key])) $outputlangs->load($extrafields->attributes[$object->table_element]['langfile'][$key]);
// TODO : add more extrafield customisation capacities for PDF like width, rank...
// set column definition
$def = array(
'rank' => intval($extrafields->attributes[$object->table_element]['pos'][$key]),
'width' => 25, // in mm
'status' => boolval($enabled),
'title' => array(
'label' => $outputlangs->transnoentities($label)
),
'content' => array(
'align' => 'C'
),
'border-left' => true, // add left line separator
);
$alignTypeRight = array('double', 'int', 'price');
if(in_array($extrafields->attributes[$object->table_element]['type'][$key], $alignTypeRight)){
$def['content']['align'] = 'R';
}
$alignTypeLeft = array('text', 'html');
if(in_array($extrafields->attributes[$object->table_element]['type'][$key], $alignTypeLeft)){
$def['content']['align'] = 'L';
}
// for extrafields we use rank of extrafield to place it on PDF
$this->insertNewColumnDef("options_".$key, $def);
}
}
}
}

View File

@ -736,6 +736,18 @@ class pdf_sponge extends ModelePDFFactures
$nexY = max($pdf->GetY(), $nexY);
}
// Extrafields
if(!empty($object->lines[$i]->array_options)){
foreach ($object->lines[$i]->array_options as $extrafieldColKey => $extrafieldValue){
if ($this->getColumnStatus($extrafieldColKey))
{
$extrafieldValue = $this->getExtrafieldContent($object->lines[$i], $extrafieldColKey);
$this->printStdColumnContent($pdf, $curY, $extrafieldColKey, $extrafieldValue);
$nexY = max($pdf->GetY(), $nexY);
}
}
}
$parameters = array(
'object' => $object,
@ -2346,7 +2358,7 @@ class pdf_sponge extends ModelePDFFactures
$this->cols['discount']['status'] = true;
}
$rank = $rank + 10;
$rank = $rank + 1000; // add a big offset to be sure is the last col because default extrafield rank is 100
$this->cols['totalexcltax'] = array(
'rank' => $rank,
'width' => 26, // in mm
@ -2357,6 +2369,11 @@ class pdf_sponge extends ModelePDFFactures
'border-left' => true, // add left line separator
);
// Add extrafields cols
if(!empty($object->lines)) {
$line = reset($object->lines);
$this->defineColumnExtrafield($line, $outputlangs, $hidedetails);
}
$parameters = array(
'object' => $object,