Skip to content

Commit 975ef24

Browse files
authored
Merge pull request #8 from elbformat/richtext_field_helper
[ADD] RichTextFieldHelper
2 parents 555f913 + 814ac06 commit 975ef24

File tree

7 files changed

+242
-1
lines changed

7 files changed

+242
-1
lines changed

composer.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@
1212
"name": "Hannes Giesenow",
1313
"email": "[email protected]",
1414
"role": "Lead Developer"
15+
},
16+
{
17+
"name": "Ronny Gericke",
18+
"email": "[email protected]",
19+
"role": "Developer"
1520
}
1621
],
1722
"autoload": {
@@ -26,7 +31,8 @@
2631
},
2732
"require": {
2833
"php": ">=7.4",
29-
"ibexa/oss": "^3.3"
34+
"ibexa/oss": "^3.3",
35+
"ext-dom": "*"
3036
},
3137
"require-dev": {
3238
"friendsofphp/php-cs-fixer": "^3.3",

config/services.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,9 @@ services:
3131
elbformat_field_helper.field_helper.url:
3232
class: Elbformat\FieldHelperBundle\FieldHelper\UrlFieldHelper
3333
tags: ['elbformat_field_helper.field_helper']
34+
35+
elbformat_field_helper.field_helper.richtext:
36+
class: Elbformat\FieldHelperBundle\FieldHelper\RichtextFieldHelper
37+
arguments:
38+
$fieldHelper: '@ezpublish.field_helper'
39+
tags: ['elbformat_field_helper.field_helper']
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Elbformat\FieldHelperBundle\FieldHelper;
6+
7+
use eZ\Publish\API\Repository\Values\Content\Content;
8+
use eZ\Publish\API\Repository\Values\Content\ContentStruct;
9+
use eZ\Publish\API\Repository\Values\Content\Field;
10+
use eZ\Publish\Core\Helper\FieldHelper;
11+
use EzSystems\EzPlatformRichText\eZ\FieldType\RichText\Value;
12+
13+
/**
14+
* Helps reading, updating and comparing richtext field types.
15+
* https://doc.ezplatform.com/en/latest/api/field_type_reference.
16+
*
17+
* @author Ronny Gericke <[email protected]>
18+
*/
19+
class RichtextFieldHelper extends AbstractFieldHelper
20+
{
21+
protected FieldHelper $fieldHelper;
22+
23+
public function __construct(FieldHelper $fieldHelper)
24+
{
25+
$this->fieldHelper = $fieldHelper;
26+
}
27+
28+
public static function getName(): string
29+
{
30+
return self::class;
31+
}
32+
33+
public function getXml(Content $content, string $fieldName): ?\DOMDocument
34+
{
35+
$field = $this->getField($content, $fieldName);
36+
37+
return $this->getXmlFieldValue($field);
38+
}
39+
40+
public function isEmpty(Content $content, string $fieldName): bool
41+
{
42+
return $this->fieldHelper->isFieldEmpty($content, $fieldName);
43+
}
44+
45+
public function updateXml(ContentStruct $struct, string $fieldName, ?\DOMDocument $value, ?Content $content): bool
46+
{
47+
// No changes
48+
if (null !== $content) {
49+
$field = $this->getField($content, $fieldName);
50+
if ($this->isXmlEqual($field, $value)) {
51+
return false;
52+
}
53+
}
54+
$struct->setField($fieldName, $value);
55+
56+
return true;
57+
}
58+
59+
protected function isXmlEqual(Field $field, ?\DOMDocument $value): bool
60+
{
61+
if ($value === null) {
62+
return false;
63+
}
64+
65+
$fieldVal = $this->getXmlFieldValue($field);
66+
return $fieldVal->saveXML() === $value->saveXML();
67+
}
68+
69+
protected function getXmlFieldValue(Field $field): \DOMDocument
70+
{
71+
/** @var Value $fieldValue */
72+
$fieldValue = $field->value;
73+
74+
return $fieldValue->xml;
75+
}
76+
}

src/Registry/Registry.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use Elbformat\FieldHelperBundle\FieldHelper\FieldHelperInterface;
1212
use Elbformat\FieldHelperBundle\FieldHelper\NumberFieldHelper;
1313
use Elbformat\FieldHelperBundle\FieldHelper\RelationFieldHelper;
14+
use Elbformat\FieldHelperBundle\FieldHelper\RichtextFieldHelper;
1415
use Elbformat\FieldHelperBundle\FieldHelper\TextFieldHelper;
1516
use Elbformat\FieldHelperBundle\FieldHelper\UrlFieldHelper;
1617

@@ -100,4 +101,14 @@ public function getUrlFieldHelper(): UrlFieldHelper
100101

101102
return $fh;
102103
}
104+
105+
public function getRichtextFieldHelper(): RichtextFieldHelper
106+
{
107+
$fh = $this->getFieldHelper(RichtextFieldHelper::class);
108+
if (!$fh instanceof RichtextFieldHelper) {
109+
throw InvalidFieldHelperException::fromClassName(get_class($fh), RichtextFieldHelper::class);
110+
}
111+
112+
return $fh;
113+
}
103114
}

src/Registry/RegistryInterface.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Elbformat\FieldHelperBundle\FieldHelper\FieldHelperInterface;
88
use Elbformat\FieldHelperBundle\FieldHelper\NumberFieldHelper;
99
use Elbformat\FieldHelperBundle\FieldHelper\RelationFieldHelper;
10+
use Elbformat\FieldHelperBundle\FieldHelper\RichtextFieldHelper;
1011
use Elbformat\FieldHelperBundle\FieldHelper\TextFieldHelper;
1112
use Elbformat\FieldHelperBundle\FieldHelper\UrlFieldHelper;
1213

@@ -25,4 +26,6 @@ public function getRelationFieldHelper(): RelationFieldHelper;
2526
public function getTextFieldHelper(): TextFieldHelper;
2627

2728
public function getUrlFieldHelper(): UrlFieldHelper;
29+
30+
public function getRichtextFieldHelper(): RichtextFieldHelper;
2831
}
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Elbformat\FieldHelperBundle\Tests\FieldHelper;
6+
7+
use Elbformat\FieldHelperBundle\FieldHelper\RichtextFieldHelper;
8+
use eZ\Publish\API\Repository\Values\Content\Field;
9+
use eZ\Publish\Core\FieldType\Value;
10+
use eZ\Publish\Core\Helper\FieldHelper;
11+
use eZ\Publish\Core\Repository\Values\Content\Content;
12+
use eZ\Publish\Core\Repository\Values\Content\ContentUpdateStruct;
13+
use EzSystems\EzPlatformRichText\eZ\FieldType\RichText\Value as RichTextValue;
14+
use PHPUnit\Framework\TestCase;
15+
16+
/**
17+
* @author Ronny Gericke <[email protected]>
18+
*/
19+
class RichtextFieldHelperTest extends TestCase
20+
{
21+
private const FIELD_NAME = 'richtext_field';
22+
23+
protected RichtextFieldHelper $richtextFieldHelper;
24+
25+
public function setUp(): void
26+
{
27+
$fieldHelper = $this->createMock(FieldHelper::class);
28+
$fieldHelper->method('isFieldEmpty')->willReturnCallback([$this, 'isEmptyField']);
29+
30+
$this->richtextFieldHelper = new RichtextFieldHelper($fieldHelper);
31+
}
32+
33+
public function testGetName(): void
34+
{
35+
$this->assertSame('Elbformat\FieldHelperBundle\FieldHelper\RichtextFieldHelper', RichtextFieldHelper::getName());
36+
}
37+
38+
public function testGetXml(): void
39+
{
40+
$value = $this->getXmlDomFromString('some text');
41+
$content = $this->createContentFromValue(new RichTextValue($value));
42+
43+
$this->assertSame(
44+
$value,
45+
$this->richtextFieldHelper->getXml($content, self::FIELD_NAME)
46+
);
47+
}
48+
49+
public function testIsEmpty(): void
50+
{
51+
$content = $this->createContentFromValue(new RichTextValue(null));
52+
$this->assertTrue($this->richtextFieldHelper->isEmpty($content, self::FIELD_NAME));
53+
}
54+
55+
public function testIsNotEmpty(): void
56+
{
57+
$value = $this->getXmlDomFromString('not empty');
58+
$content = $this->createContentFromValue(new RichTextValue($value));
59+
$this->assertFalse($this->richtextFieldHelper->isEmpty($content, self::FIELD_NAME));
60+
}
61+
62+
public function isEmptyField(Content $content, string $fieldName): bool
63+
{
64+
$value = $content->getField($fieldName)->value;
65+
if (null === $value->xml) {
66+
return false;
67+
}
68+
69+
return !$value->xml->documentElement->hasChildNodes();
70+
}
71+
72+
/**
73+
* @dataProvider getUpdateValues
74+
*/
75+
public function testUpdateXml(?\DOMDocument $newValue, bool $expectedResult): void
76+
{
77+
$struct = new ContentUpdateStruct();
78+
$value = new RichTextValue(
79+
$this->getXmlDomFromString('initial value')
80+
);
81+
$content = $this->createContentFromValue($value);
82+
83+
$this->assertSame(
84+
$expectedResult,
85+
$this->richtextFieldHelper->updateXml($struct, self::FIELD_NAME, $newValue, $content)
86+
);
87+
}
88+
89+
public function getUpdateValues(): array
90+
{
91+
return [
92+
[$this->getXmlDomFromString('initial value'), false],
93+
[$this->getXmlDomFromString('other value'), true],
94+
[null, true],
95+
];
96+
}
97+
98+
protected function getXmlDomFromString(string $str): \DOMDocument
99+
{
100+
$xmlStr = sprintf(
101+
'<?xml version="1.0" encoding="UTF-8"?><section xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ezxhtml="http://ez.no/xmlns/ezpublish/docbook/xhtml" xmlns:ezcustom="http://ez.no/xmlns/ezpublish/docbook/custom" version="5.0-variant ezpublish-1.0"><para>%s</para></section>',
102+
$str
103+
);
104+
$dom = new \DOMDocument();
105+
$dom->loadXML($xmlStr);
106+
107+
return $dom;
108+
}
109+
110+
protected function createContentFromValue(Value $value): Content
111+
{
112+
$field = new Field(['value' => $value]);
113+
114+
$content = $this->createMock(Content::class);
115+
$content->method('getField')->with(self::FIELD_NAME)->willReturn($field);
116+
117+
return $content;
118+
}
119+
}

tests/Registry/RegistryTest.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Elbformat\FieldHelperBundle\FieldHelper\DateTimeFieldHelper;
1111
use Elbformat\FieldHelperBundle\FieldHelper\NumberFieldHelper;
1212
use Elbformat\FieldHelperBundle\FieldHelper\RelationFieldHelper;
13+
use Elbformat\FieldHelperBundle\FieldHelper\RichtextFieldHelper;
1314
use Elbformat\FieldHelperBundle\FieldHelper\TextFieldHelper;
1415
use Elbformat\FieldHelperBundle\FieldHelper\UrlFieldHelper;
1516
use Elbformat\FieldHelperBundle\Registry\Registry;
@@ -143,6 +144,25 @@ public function testGetUrlFieldHelperInvalid()
143144
$reg->getUrlFieldHelper();
144145
}
145146

147+
public function testGetRichTextFieldHelper(): void
148+
{
149+
$helpers = [
150+
RichtextFieldHelper::class => $this->createMock(RichtextFieldHelper::class),
151+
];
152+
$reg = new Registry($helpers);
153+
$this->assertInstanceOf(RichtextFieldHelper::class, $reg->getRichtextFieldHelper());
154+
}
155+
156+
public function testGetRichTextFieldHelperInvalid(): void
157+
{
158+
$this->expectException(InvalidFieldHelperException::class);
159+
$helpers = [
160+
RichtextFieldHelper::class => $this->createMock(TextFieldHelper::class),
161+
];
162+
$reg = new Registry($helpers);
163+
$reg->getRichtextFieldHelper();
164+
}
165+
146166
public function testGetFieldHelperUnknown()
147167
{
148168
$this->expectException(UnknownFieldHelperException::class);

0 commit comments

Comments
 (0)