MDL-65954 dataformat_pdf: Convert object records to array

* count() doesn't work quite as expected when the record being written
to the PDF is an object. So make sure to convert the record to an array.
* In addition, instead of comparing the total vs the current cell
counter, it would be more reliable to determine whether we're at the
last element of the array by getting the key for the last element and
comparing it with the key for the element that's currently being
processed.
This commit is contained in:
Jun Pataleta 2019-06-19 15:08:43 +08:00
parent f7e108438f
commit b3f4d77e00

View File

@ -89,6 +89,11 @@ class writer extends \core\dataformat\base {
public function write_record($record, $rownum) {
$rowheight = 0;
// If $record is an object convert it to an array.
if (is_object($record)) {
$record = (array)$record;
}
foreach ($record as $cell) {
$rowheight = max($rowheight, $this->pdf->getStringHeight($this->colwidth, $cell, false, true, '', 1));
}
@ -99,12 +104,19 @@ class writer extends \core\dataformat\base {
$this->print_heading();
}
$total = count($record);
$counter = 1;
foreach ($record as $cell) {
$nextposition = ($counter == $total) ? 1 : 0;
// Get the last key for this record.
end($record);
$lastkey = key($record);
// Reset the record pointer.
reset($record);
// Loop through each element.
foreach ($record as $key => $cell) {
// Determine whether we're at the last element of the record.
$nextposition = ($lastkey === $key) ? 1 : 0;
// Write the element.
$this->pdf->Multicell($this->colwidth, $rowheight, $cell, 1, 'L', false, $nextposition);
$counter++;
}
}