DiDOM icon indicating copy to clipboard operation
DiDOM copied to clipboard

Couldn't add child.

Open yusufusta opened this issue 3 years ago • 5 comments

Hi, I want create a web-page with DiDOM but I have some problems.

<?php
require './vendor/autoload.php';
use DiDom\Document;

$Doc = new Document();
$Html = $Doc->createElement('html');
$Html->appendChild(
    $Doc->createElement('body')->appendChild(
        $Doc->createElement('h1', 'hi')
    )
);

echo $Html->html();
?>

Error:

PHP Warning:  DOMNode::cloneNode(): Couldn't fetch DOMElement in /Users/yusufusta/Desktop/rasba/vendor/imangazaliev/didom/src/DiDom/Node.php on line 105

Warning: DOMNode::cloneNode(): Couldn't fetch DOMElement in /Users/yusufusta/Desktop/rasba/vendor/imangazaliev/didom/src/DiDom/Node.php on line 105
PHP Fatal error:  Uncaught TypeError: Argument 1 passed to DOMDocument::importNode() must be an instance of DOMNode, null given in /Users/yusufusta/Desktop/rasba/vendor/imangazaliev/didom/src/DiDom/Node.php:106
Stack trace:
#0 /Users/yusufusta/Desktop/rasba/vendor/imangazaliev/didom/src/DiDom/Node.php(106): DOMDocument->importNode(NULL, true)
#1 /Users/yusufusta/Desktop/rasba/test.php(9): DiDom\Node->appendChild(Array)
#2 {main}
  thrown in /Users/yusufusta/Desktop/rasba/vendor/imangazaliev/didom/src/DiDom/Node.php on line 106

Fatal error: Uncaught TypeError: Argument 1 passed to DOMDocument::importNode() must be an instance of DOMNode, null given in /Users/yusufusta/Desktop/rasba/vendor/imangazaliev/didom/src/DiDom/Node.php:106
Stack trace:
#0 /Users/yusufusta/Desktop/rasba/vendor/imangazaliev/didom/src/DiDom/Node.php(106): DOMDocument->importNode(NULL, true)
#1 /Users/yusufusta/Desktop/rasba/test.php(9): DiDom\Node->appendChild(Array)
#2 {main}
  thrown in /Users/yusufusta/Desktop/rasba/vendor/imangazaliev/didom/src/DiDom/Node.php on line 106

yusufusta avatar Nov 14 '20 16:11 yusufusta

You have to store an each element to a variable:

<?php

use DiDom\Document;

require './vendor/autoload.php';

$doc = new Document();

$html = $doc->createElement('html');
$body = $doc->createElement('body');

$h1 = $body->appendChild($doc->createElement('h1', 'hi'));

$html->appendChild($body);

echo $html->html();

Imangazaliev avatar Nov 16 '20 10:11 Imangazaliev

Yes, with this way the problem will be solved but why? is there another way?

yusufusta avatar Nov 16 '20 12:11 yusufusta

I don't know why it exactly happens but when you call

$Html->appendChild(
    $Doc->createElement('body')->appendChild(
        $Doc->createElement('h1', 'hi')
    )
);

it's try to add h1 element, not body because ->createElement('body')->appendChild(...) returns h1.

is there another way?

I don't know. I spent a little time to figure out what's wrong but I couldn't.

Imangazaliev avatar Nov 16 '20 14:11 Imangazaliev

I don't know. I spent a little time to figure out what's wrong but I couldn't.

Okey, thanks. I guess there is no solution.

yusufusta avatar Nov 16 '20 16:11 yusufusta

I think this is an important issue and it should stay open.

yusufusta avatar Feb 10 '21 14:02 yusufusta