Skip to content

Commit eafae0d

Browse files
committed
Issue #55 Make nested values work in XfdfFile
1 parent e0e0f84 commit eafae0d

File tree

7 files changed

+57
-17
lines changed

7 files changed

+57
-17
lines changed

src/Command.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
* and adds pdftk specific features to add options and operations.
1111
*
1212
* @author Michael Härtl <haertl.mike@gmail.com>
13-
* @version 0.2.2
13+
* @version 0.2.3-dev
1414
* @license http://www.opensource.org/licenses/MIT
1515
*/
1616
class Command extends BaseCommand

src/FdfFile.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
* with valid unicode characters.
1111
*
1212
* @author Michael Härtl <haertl.mike@gmail.com>
13-
* @version 0.2.2
13+
* @version 0.2.3-dev
1414
* @license http://www.opensource.org/licenses/MIT
1515
*/
1616
class FdfFile extends File
@@ -52,6 +52,10 @@ public function __construct($data, $suffix = null, $prefix = null, $directory =
5252
rename($this->_fileName, $newName);
5353
$this->_fileName = $newName;
5454

55+
if (!function_exists('mb_convert_encoding')) {
56+
throw new \Exception('MB extension required.');
57+
}
58+
5559
$fields = '';
5660
foreach ($data as $key=>$value) {
5761
// Create UTF-16BE string encode as ASCII hex

src/Pdf.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
* but you may have to use slightly different page rotation options (e.g 'E' instead 'east').
1313
*
1414
* @author Michael Härtl <haertl.mike@gmail.com>
15-
* @version 0.2.2
15+
* @version 0.2.3-dev
1616
* @license http://www.opensource.org/licenses/MIT
1717
*/
1818
class Pdf

src/XfdfFile.php

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
*
1212
* @author Tomas Holy <holy@interconnect.cz>
1313
* @author Michael Härtl <haertl.mike@gmail.com>
14-
* @version 0.2.2
14+
* @version 0.2.3-dev
1515
* @license http://www.opensource.org/licenses/MIT
1616
*/
1717
class XfdfFile extends File
@@ -54,7 +54,7 @@ public function __construct($data, $suffix = null, $prefix = null, $directory =
5454
$fields = array();
5555
foreach ($data as $key=>$value) {
5656
// Always convert to UTF-8
57-
if ($encoding!=='UTF-8') {
57+
if ($encoding!=='UTF-8' && function_exists('mb_convert_encoding')) {
5858
$value = mb_convert_encoding($value,'UTF-8', $encoding);
5959
$key = mb_convert_encoding($key,'UTF-8', $encoding);
6060
}
@@ -63,14 +63,48 @@ public function __construct($data, $suffix = null, $prefix = null, $directory =
6363
$sanitizedKey = defined('ENT_XML1') ? htmlspecialchars($key, ENT_XML1, 'UTF-8') : htmlspecialchars($key);
6464
$sanitizedValue = defined('ENT_XML1') ? htmlspecialchars($value, ENT_XML1, 'UTF-8') : htmlspecialchars($value);
6565

66-
$fields[] = "<field name=\"$sanitizedKey\">\n<value>$sanitizedValue</value>\n</field>\n";
66+
// Key can be in dot notation like 'Address.name'
67+
$keys = explode('.', $sanitizedKey);
68+
$final = array_pop($keys);
69+
if (count($keys)===0) {
70+
$fields[$final] = $sanitizedValue;
71+
} else {
72+
$target =& $fields;
73+
foreach ($keys as $part) {
74+
if (!isset($target[$part])) {
75+
$target[$part] = array();
76+
}
77+
$target =& $target[$part];
78+
}
79+
$target[$final] = $sanitizedValue;
80+
}
6781
}
6882

6983
// Use fwrite, since file_put_contents() messes around with character encoding
7084
$fp = fopen($this->_fileName, 'w');
7185
fwrite($fp, self::XFDF_HEADER);
72-
fwrite($fp, implode("\n", $fields));
86+
$this->writeFields($fp, $fields);
7387
fwrite($fp, self::XFDF_FOOTER);
7488
fclose($fp);
7589
}
90+
91+
/**
92+
* Write the fields to the given filepointer
93+
*
94+
* @param int $fp
95+
* @param mixed[] $fields an array of field values. A value can also be another array
96+
* in which case a nested field is written.
97+
*/
98+
protected function writeFields($fp, $fields)
99+
{
100+
foreach ($fields as $key => $value) {
101+
if (is_array($value)) {
102+
fwrite($fp, "<field name=\"$key\">\n");
103+
$this->writeFields($fp, $value);
104+
fwrite($fp, "</field>\n");
105+
} else {
106+
fwrite($fp, "<field name=\"$key\">\n<value>$value</value>\n</field>\n");
107+
}
108+
}
109+
}
76110
}

tests/FdfFileTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,6 @@ public function testFdfFileCreation() {
2020
$sFdfFilename = $oFdfFile->getFileName();
2121

2222
$this->assertFileExists($sFdfFilename);
23-
$this->assertFileEquals($sFdfFilename, __DIR__."/files/FdfFileTest.fdf");
23+
$this->assertFileEquals(__DIR__."/files/FdfFileTest.fdf", $sFdfFilename);
2424
}
2525
}

tests/XfdfFileTest.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@ public function testXfdfFileCreation() {
88
'name' => 'Jürgen čárka čČćĆđĐ мирано',
99
'email' => 'test@email.com',
1010
'checkbox 1' => 'Yes',
11+
'address.name' => 'some name',
1112
'checkbox 2' => 0,
1213
'radio 1' => 2,
14+
'address.street' => 'some street',
1315
"umlauts-in-value" => "öäüÖÄÜ",
1416
"öäüÖÄÜ" => "umlauts in key",
1517
"special-in-value" => "ۧ&()",
@@ -20,6 +22,6 @@ public function testXfdfFileCreation() {
2022
$sXfdfFilename = $oXfdfFile->getFileName();
2123

2224
$this->assertFileExists($sXfdfFilename);
23-
$this->assertFileEquals($sXfdfFilename, __DIR__."/files/XfdfFileTest.xfdf");
25+
$this->assertFileEquals(__DIR__."/files/XfdfFileTest.xfdf", $sXfdfFilename);
2426
}
2527
}

tests/files/XfdfFileTest.xfdf

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,35 +3,35 @@
33
<fields><field name="name">
44
<value>Jürgen čárka čČćĆđĐ мирано</value>
55
</field>
6-
76
<field name="email">
87
<value>test@email.com</value>
98
</field>
10-
119
<field name="checkbox 1">
1210
<value>Yes</value>
1311
</field>
14-
12+
<field name="address">
13+
<field name="name">
14+
<value>some name</value>
15+
</field>
16+
<field name="street">
17+
<value>some street</value>
18+
</field>
19+
</field>
1520
<field name="checkbox 2">
1621
<value>0</value>
1722
</field>
18-
1923
<field name="radio 1">
2024
<value>2</value>
2125
</field>
22-
2326
<field name="umlauts-in-value">
2427
<value>öäüÖÄÜ</value>
2528
</field>
26-
2729
<field name="öäüÖÄÜ">
2830
<value>umlauts in key</value>
2931
</field>
30-
3132
<field name="special-in-value">
3233
<value>ۧ&amp;()</value>
3334
</field>
34-
3535
<field name="€ key">
3636
<value>special in key</value>
3737
</field>

0 commit comments

Comments
 (0)