Skip to content

Commit c4564ea

Browse files
committed
Embedded object key change to _embedded_items
1 parent 3cfe74e commit c4564ea

12 files changed

Lines changed: 1059 additions & 103 deletions

src/Model/Metadata.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,9 +88,8 @@ public function getAttribute(string $name): string {
8888

8989
public function getOuterHTML(): string
9090
{
91-
$doc = new \DOMDocument();
92-
$doc->appendChild($doc->importNode($this->element, true));
93-
return $doc->saveHTML();
91+
$doc = $this->element->ownerDocument;
92+
return $doc->saveHTML($this->element);
9493
}
9594

9695
public function getText(): string

src/Model/Option.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,13 @@ function renderOptions(array $embeddedObject, Metadata $metadata): string
3333
$resultString = "<span>".($embeddedObject["title"] ?? $embeddedObject["uid"])."</span>";
3434
break;
3535
case StyleType::get(StyleType::LINK):
36-
$resultString = "<a href=\"".($metadata->getAttribute("href") ?? $embeddedObject["url"] ?? $embeddedObject["title"] ?? $embeddedObject["uid"] )."\">".($metadata->getText() ?? $embeddedObject["title"] ?? $embeddedObject["uid"])."</a>";
36+
$resultString = "<a href=\"".($metadata->getAttribute("href")->value ?? $embeddedObject["url"] ?? $embeddedObject["title"] ?? $embeddedObject["uid"] )."\">".($metadata->getText() ?? $embeddedObject["title"] ?? $embeddedObject["uid"])."</a>";
3737
break;
3838
case StyleType::get(StyleType::DISPLAY):
39-
$resultString = "<img src=\"".($metadata->getAttributes("src")->value ?? $embeddedObject["url"] )."\" alt=\"".($metadata->getAttributes()["alt"]->value ?? $embeddedObject["title"] ?? $embeddedObject["filename"] ?? $embeddedObject["uid"])."\" />";
39+
$resultString = "<img src=\"".($metadata->getAttribute("src")->value ?? $embeddedObject["url"] )."\" alt=\"".($metadata->getAttribute("alt")->value ?? $embeddedObject["title"] ?? $embeddedObject["filename"] ?? $embeddedObject["uid"])."\" />";
4040
break;
4141
case StyleType::get(StyleType::DOWNLOAD):
42-
$resultString = "<a href=\"".($metadata->getAttributes("href")->value ?? $embeddedObject["url"])."\">".($metadata->getText() ?? $embeddedObject["filename"]?? $embeddedObject["title"] ?? $embeddedObject["uid"])."</a>";
42+
$resultString = "<a href=\"".($metadata->getAttribute("href")->value ?? $embeddedObject["url"])."\">".($metadata->getText() ?? $embeddedObject["filename"]?? $embeddedObject["title"] ?? $embeddedObject["uid"])."</a>";
4343
break;
4444
}
4545
return $resultString;

src/Utils.php

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Contentstack\Utils;
66

77
use Contentstack\Utils\Model\Option;
8+
use Contentstack\Utils\Model\Metadata;
89

910
class Utils
1011
{
@@ -18,6 +19,24 @@ class Utils
1819
*/
1920
public static function renderContent(string $content, Option $option): string
2021
{
22+
if ($content) {
23+
$doc = new \DOMDocument();
24+
@$doc->loadHTML($content);
25+
$body = $doc->getElementsByTagName('body');
26+
$resultString = Utils::innerHTML($body->item(0));
27+
$metadataArray = Utils::findEmbeddedObject($doc);
28+
if ($metadataArray) {
29+
foreach ($metadataArray as $metadata) {
30+
$object = Utils::findObject($metadata, $option->entry);
31+
$replaceString = '';
32+
if (count($object) > 0) {
33+
$replaceString = $option->renderOptions($object, $metadata);
34+
}
35+
$resultString = str_replace($metadata->getOuterHTML(), $replaceString, $resultString, $i);
36+
}
37+
return $resultString;
38+
}
39+
}
2140
return $content;
2241
}
2342

@@ -33,9 +52,46 @@ public static function renderContents(array $contents, Option $option): array
3352
{
3453
$result = array();
3554
foreach ($contents as $content) {
36-
$result[] = $content;
55+
$result[] = Utils::renderContent($content, $option);
3756
}
3857
return $result;
3958
}
4059

60+
private static function findEmbeddedObject(\DOMDocument $doc): array {
61+
$xpath = new \DOMXPath($doc);
62+
$elements = $xpath->query('//*[contains(@class, "embedded-asset") or contains(@class, "embedded-entry")]');
63+
$metadataArray = array();
64+
foreach ($elements as $node) {
65+
$metadataArray[] = new Metadata($node);
66+
}
67+
return $metadataArray;
68+
}
69+
70+
private static function findObject(Metadata $metadata, array $entry): array
71+
{
72+
if (array_key_exists('_embedded_items', $entry))
73+
{
74+
foreach ($entry["_embedded_items"] as $key => $value)
75+
{
76+
foreach ($value as $object)
77+
{
78+
if ($object["uid"] && $object["uid"] == $metadata->getItemUid())
79+
{
80+
return $object;
81+
}
82+
}
83+
}
84+
}
85+
return [];
86+
}
87+
88+
static function innerHTML(\DOMElement $element)
89+
{
90+
$doc = $element->ownerDocument;
91+
$html = '';
92+
foreach ($element->childNodes as $node) {
93+
$html .= $doc->saveHTML($node);
94+
}
95+
return $html;
96+
}
4197
}

tests/CustomOptionTest.php

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -42,65 +42,65 @@ public function tearDown(): void{ }
4242
public function testEmbeddedContentTypeEntry(): void
4343
{
4444
$resultString = CustomOptionTest::$customeRender->renderOptions(CustomOptionTest::$embeddedContentType, $this->getMetadata(EmbedItemType::ENTRY, StyleType::BLOCK));
45-
$this->assertEquals($resultString, '<div type="entry" sys-style-type="block" ><p>uid</p><p>Content type: <span>contentTypeUid</span></p></div>');
45+
$this->assertEquals('<div type="entry" sys-style-type="block" ><p>uid</p><p>Content type: <span>contentTypeUid</span></p></div>', $resultString);
4646

4747
$resultString = CustomOptionTest::$customeRender->renderOptions(CustomOptionTest::$embeddedContentType, $this->getMetadata(EmbedItemType::ENTRY, StyleType::INLINE));
48-
$this->assertEquals($resultString, '<span type="entry" sys-style-type="inline" >uid</span>');
48+
$this->assertEquals('<span type="entry" sys-style-type="inline" >uid</span>', $resultString);
4949

5050
$resultString = CustomOptionTest::$customeRender->renderOptions(CustomOptionTest::$embeddedContentType, $this->getMetadata(EmbedItemType::ENTRY, StyleType::LINK));
51-
$this->assertEquals($resultString, '<a type="entry" sys-style-type="link" ></a>');
51+
$this->assertEquals('<a type="entry" sys-style-type="link" ></a>', $resultString);
5252
}
5353

5454
public function testEmbeddedEntry(): void
5555
{
5656
$resultString = CustomOptionTest::$customeRender->renderOptions(CustomOptionTest::$embeddedEntry, $this->getMetadata(EmbedItemType::ENTRY, StyleType::BLOCK));
57-
$this->assertEquals($resultString, '<div type="entry" sys-style-type="block" ><p>title</p><p>Content type: <span>contentTypeUid</span></p></div>');
57+
$this->assertEquals('<div type="entry" sys-style-type="block" ><p>title</p><p>Content type: <span>contentTypeUid</span></p></div>', $resultString);
5858

5959
$resultString = CustomOptionTest::$customeRender->renderOptions(CustomOptionTest::$embeddedEntry, $this->getMetadata(EmbedItemType::ENTRY, StyleType::INLINE));
60-
$this->assertEquals($resultString, '<span type="entry" sys-style-type="inline" >title</span>');
60+
$this->assertEquals('<span type="entry" sys-style-type="inline" >title</span>', $resultString);
6161

6262
$resultString = CustomOptionTest::$customeRender->renderOptions(CustomOptionTest::$embeddedEntry, $this->getMetadata(EmbedItemType::ENTRY, StyleType::LINK));
63-
$this->assertEquals($resultString, '<a type="entry" sys-style-type="link" ></a>');
63+
$this->assertEquals('<a type="entry" sys-style-type="link" ></a>', $resultString);
6464
}
6565

6666
public function testEmbeddedAsset(): void
6767
{
6868
$resultString = CustomOptionTest::$customeRender->renderOptions(CustomOptionTest::$embeddedAsset, $this->getMetadata(EmbedItemType::ASSET, StyleType::DISPLAY));
69-
$this->assertEquals($resultString, '<img type="asset" sys-style-type="display" />');
69+
$this->assertEquals('<img type="asset" sys-style-type="display" />', $resultString);
7070

7171
$resultString = CustomOptionTest::$customeRender->renderOptions(CustomOptionTest::$embeddedAsset, $this->getMetadata(EmbedItemType::ASSET, StyleType::DOWNLOAD));
72-
$this->assertEquals($resultString, '<a type="asset" sys-style-type="download" ></a>');
72+
$this->assertEquals('<a type="asset" sys-style-type="download" ></a>', $resultString);
7373
}
7474
public function testEmbeddedContentTypeEntryWithText(): void
7575
{
7676
$resultString = CustomOptionTest::$customeRender->renderOptions(CustomOptionTest::$embeddedContentType, $this->getMetadata(EmbedItemType::ENTRY, StyleType::BLOCK, CustomOptionTest::$text));
77-
$this->assertEquals($resultString, '<div type="entry" sys-style-type="block" ><p>uid</p><p>Content type: <span>contentTypeUid</span></p></div>');
77+
$this->assertEquals('<div type="entry" sys-style-type="block" ><p>uid</p><p>Content type: <span>contentTypeUid</span></p></div>', $resultString);
7878

7979
$resultString = CustomOptionTest::$customeRender->renderOptions(CustomOptionTest::$embeddedContentType, $this->getMetadata(EmbedItemType::ENTRY, StyleType::INLINE, CustomOptionTest::$text));
80-
$this->assertEquals($resultString, '<span type="entry" sys-style-type="inline" >uid</span>');
80+
$this->assertEquals('<span type="entry" sys-style-type="inline" >uid</span>', $resultString);
8181

8282
$resultString = CustomOptionTest::$customeRender->renderOptions(CustomOptionTest::$embeddedContentType, $this->getMetadata(EmbedItemType::ENTRY, StyleType::LINK, CustomOptionTest::$text));
83-
$this->assertEquals($resultString, '<a type="entry" sys-style-type="link" >Text To set Link</a>');
83+
$this->assertEquals('<a type="entry" sys-style-type="link" >Text To set Link</a>', $resultString);
8484
}
8585

8686
public function testEmbeddedEntryWithText(): void
8787
{
8888
$resultString = CustomOptionTest::$customeRender->renderOptions(CustomOptionTest::$embeddedEntry, $this->getMetadata(EmbedItemType::ENTRY, StyleType::BLOCK, CustomOptionTest::$text));
89-
$this->assertEquals($resultString, '<div type="entry" sys-style-type="block" ><p>title</p><p>Content type: <span>contentTypeUid</span></p></div>');
89+
$this->assertEquals('<div type="entry" sys-style-type="block" ><p>title</p><p>Content type: <span>contentTypeUid</span></p></div>', $resultString);
9090

9191
$resultString = CustomOptionTest::$customeRender->renderOptions(CustomOptionTest::$embeddedEntry, $this->getMetadata(EmbedItemType::ENTRY, StyleType::INLINE, CustomOptionTest::$text));
92-
$this->assertEquals($resultString, '<span type="entry" sys-style-type="inline" >title</span>');
92+
$this->assertEquals('<span type="entry" sys-style-type="inline" >title</span>', $resultString);
9393

9494
$resultString = CustomOptionTest::$customeRender->renderOptions(CustomOptionTest::$embeddedEntry, $this->getMetadata(EmbedItemType::ENTRY, StyleType::LINK, CustomOptionTest::$text));
95-
$this->assertEquals($resultString, '<a type="entry" sys-style-type="link" >Text To set Link</a>');
95+
$this->assertEquals('<a type="entry" sys-style-type="link" >Text To set Link</a>', $resultString);
9696
}
9797

9898
public function testEmbeddedAssetWithText(): void
9999
{
100100
$resultString = CustomOptionTest::$customeRender->renderOptions(CustomOptionTest::$embeddedAsset, $this->getMetadata(EmbedItemType::ASSET, StyleType::DISPLAY, CustomOptionTest::$text));
101-
$this->assertEquals($resultString, '<img type="asset" sys-style-type="display" />');
101+
$this->assertEquals('<img type="asset" sys-style-type="display" />', $resultString);
102102

103103
$resultString = CustomOptionTest::$customeRender->renderOptions(CustomOptionTest::$embeddedAsset, $this->getMetadata(EmbedItemType::ASSET, StyleType::DOWNLOAD, CustomOptionTest::$text));
104-
$this->assertEquals($resultString, '<a type="asset" sys-style-type="download" >Text To set Link</a>');
104+
$this->assertEquals('<a type="asset" sys-style-type="download" >Text To set Link</a>', $resultString);
105105
}
106106
}

tests/DefaultOptionTest.php

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -41,65 +41,65 @@ public function tearDown(): void{ }
4141
public function testEmbeddedContentTypeEntry(): void
4242
{
4343
$resultString = DefaultOptionTest::$defaultRender->renderOptions(DefaultOptionTest::$embeddedContentType, $this->getMetadata(EmbedItemType::ENTRY, StyleType::BLOCK));
44-
$this->assertEquals($resultString, '<div><p>uid</p><p>Content type: <span>contentTypeUid</span></p></div>');
44+
$this->assertEquals('<div><p>uid</p><p>Content type: <span>contentTypeUid</span></p></div>', $resultString);
4545

4646
$resultString = DefaultOptionTest::$defaultRender->renderOptions(DefaultOptionTest::$embeddedContentType, $this->getMetadata(EmbedItemType::ENTRY, StyleType::INLINE));
47-
$this->assertEquals($resultString, '<span>uid</span>');
47+
$this->assertEquals('<span>uid</span>', $resultString);
4848

4949
$resultString = DefaultOptionTest::$defaultRender->renderOptions(DefaultOptionTest::$embeddedContentType, $this->getMetadata(EmbedItemType::ENTRY, StyleType::LINK));
50-
$this->assertEquals($resultString, '<a href=""></a>');
50+
$this->assertEquals('<a href="uid"></a>', $resultString);
5151
}
5252

5353
public function testEmbeddedEntry(): void
5454
{
5555
$resultString = DefaultOptionTest::$defaultRender->renderOptions(DefaultOptionTest::$embeddedEntry, $this->getMetadata(EmbedItemType::ENTRY, StyleType::BLOCK));
56-
$this->assertEquals($resultString, '<div><p>title</p><p>Content type: <span>contentTypeUid</span></p></div>');
56+
$this->assertEquals('<div><p>title</p><p>Content type: <span>contentTypeUid</span></p></div>', $resultString);
5757

5858
$resultString = DefaultOptionTest::$defaultRender->renderOptions(DefaultOptionTest::$embeddedEntry, $this->getMetadata(EmbedItemType::ENTRY, StyleType::INLINE));
59-
$this->assertEquals($resultString, '<span>title</span>');
59+
$this->assertEquals('<span>title</span>', $resultString);
6060

6161
$resultString = DefaultOptionTest::$defaultRender->renderOptions(DefaultOptionTest::$embeddedEntry, $this->getMetadata(EmbedItemType::ENTRY, StyleType::LINK));
62-
$this->assertEquals($resultString, '<a href=""></a>');
62+
$this->assertEquals('<a href="title"></a>', $resultString);
6363
}
6464

6565
public function testEmbeddedAsset(): void
6666
{
6767
$resultString = DefaultOptionTest::$defaultRender->renderOptions(DefaultOptionTest::$embeddedAsset, $this->getMetadata(EmbedItemType::ASSET, StyleType::DISPLAY));
68-
$this->assertEquals($resultString, '<img src="URL" alt="asset" />');
68+
$this->assertEquals('<img src="URL" alt="title" />', $resultString);
6969

7070
$resultString = DefaultOptionTest::$defaultRender->renderOptions(DefaultOptionTest::$embeddedAsset, $this->getMetadata(EmbedItemType::ASSET, StyleType::DOWNLOAD));
71-
$this->assertEquals($resultString, '<a href="URL"></a>');
71+
$this->assertEquals('<a href="URL"></a>', $resultString);
7272
}
7373
public function testEmbeddedContentTypeEntryWithText(): void
7474
{
7575
$resultString = DefaultOptionTest::$defaultRender->renderOptions(DefaultOptionTest::$embeddedContentType, $this->getMetadata(EmbedItemType::ENTRY, StyleType::BLOCK, DefaultOptionTest::$text));
76-
$this->assertEquals($resultString, '<div><p>uid</p><p>Content type: <span>contentTypeUid</span></p></div>');
76+
$this->assertEquals('<div><p>uid</p><p>Content type: <span>contentTypeUid</span></p></div>', $resultString);
7777

7878
$resultString = DefaultOptionTest::$defaultRender->renderOptions(DefaultOptionTest::$embeddedContentType, $this->getMetadata(EmbedItemType::ENTRY, StyleType::INLINE, DefaultOptionTest::$text));
79-
$this->assertEquals($resultString, '<span>uid</span>');
79+
$this->assertEquals('<span>uid</span>', $resultString);
8080

8181
$resultString = DefaultOptionTest::$defaultRender->renderOptions(DefaultOptionTest::$embeddedContentType, $this->getMetadata(EmbedItemType::ENTRY, StyleType::LINK, DefaultOptionTest::$text));
82-
$this->assertEquals($resultString, '<a href="">Text To set Link</a>');
82+
$this->assertEquals('<a href="uid">Text To set Link</a>', $resultString);
8383
}
8484

8585
public function testEmbeddedEntryWithText(): void
8686
{
8787
$resultString = DefaultOptionTest::$defaultRender->renderOptions(DefaultOptionTest::$embeddedEntry, $this->getMetadata(EmbedItemType::ENTRY, StyleType::BLOCK, DefaultOptionTest::$text));
88-
$this->assertEquals($resultString, '<div><p>title</p><p>Content type: <span>contentTypeUid</span></p></div>');
88+
$this->assertEquals('<div><p>title</p><p>Content type: <span>contentTypeUid</span></p></div>', $resultString);
8989

9090
$resultString = DefaultOptionTest::$defaultRender->renderOptions(DefaultOptionTest::$embeddedEntry, $this->getMetadata(EmbedItemType::ENTRY, StyleType::INLINE, DefaultOptionTest::$text));
91-
$this->assertEquals($resultString, '<span>title</span>');
91+
$this->assertEquals('<span>title</span>', $resultString);
9292

9393
$resultString = DefaultOptionTest::$defaultRender->renderOptions(DefaultOptionTest::$embeddedEntry, $this->getMetadata(EmbedItemType::ENTRY, StyleType::LINK, DefaultOptionTest::$text));
94-
$this->assertEquals($resultString, '<a href="">Text To set Link</a>');
94+
$this->assertEquals('<a href="title">Text To set Link</a>', $resultString);
9595
}
9696

9797
public function testEmbeddedAssetWithText(): void
9898
{
9999
$resultString = DefaultOptionTest::$defaultRender->renderOptions(DefaultOptionTest::$embeddedAsset, $this->getMetadata(EmbedItemType::ASSET, StyleType::DISPLAY, DefaultOptionTest::$text));
100-
$this->assertEquals($resultString, '<img src="URL" alt="asset" />');
100+
$this->assertEquals('<img src="URL" alt="title" />', $resultString);
101101

102102
$resultString = DefaultOptionTest::$defaultRender->renderOptions(DefaultOptionTest::$embeddedAsset, $this->getMetadata(EmbedItemType::ASSET, StyleType::DOWNLOAD, DefaultOptionTest::$text));
103-
$this->assertEquals($resultString, '<a href="URL">Text To set Link</a>');
103+
$this->assertEquals('<a href="URL">Text To set Link</a>', $resultString);
104104
}
105105
}

tests/ExampleTest.php

Lines changed: 0 additions & 36 deletions
This file was deleted.

tests/Helpers/Utility.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,7 @@ public static function getElement($xml, $query): \DOMNodeList
3535

3636
public static function getOuterHTML($element): string
3737
{
38-
$doc = new \DOMDocument();
39-
$doc->appendChild($doc->importNode($element, true));
40-
return $doc->saveHTML();
38+
$doc = $element->ownerDocument;
39+
return $doc->saveHTML($element);
4140
}
4241
}

0 commit comments

Comments
 (0)