tags:

views:

298

answers:

3

Hello,

I am using PHP's DOM object to create HTML pages for my website. This works great for my head, however since I will be entering a lot of HTML into the body (not via DOM). I would think I would need to use DOM->createElement($bodyHTML) to add my HTML from my site to the DOM object, However DON->createElement seems to parse all HTML entities so my end result ended up displaying the HTML on the page and not the actual renders HTML.

I am currently using a hack to get this to work, $body = $this->DOM->createComment('DOM Glitch--><body>'.$bodyHTML."</body><!--Woot"); Which puts all my site code in a comment, Which I bypass and and the comment and manually add the tags.

Currently this method works, but I believe there should be a more proper way of doing this, Ideally something like DOM->createElement() that will not parse any of the string.

I also tried using DOM->createDocumentFragment() However it does not like some of the string so it would error and not work (Along with take up extra CPU power to re-parse the body's HTML).

So, my question is, is there a better way of doing this other than using DOM->createComment()?

Thanks!

+1  A: 

loadHTML works just fine.

<?php
$dom = new DOMDocument();
$dom->loadHTML("<font color='red'>Hey there mrlanrat!</font>");
echo $dom->saveHTML();
?>

which outputs Hey there mrlanrat! in red.

or

<?php
$dom = new DOMDocument();
$bodyHTML = "here is the body, a nice body I might add";
$dom->loadHTML("<body> " . $bodyHTML . " </body>");
// this would even work as well.
// $bodyHTML = "<body>here is the body, a nice body I might add</body>";
// $dom->loadHTML($bodyHTML);
echo $dom->saveHTML();
?>

Which outputs:

here is the body, a nice body I might add and inside of your HTML source code, its wrapped inside body tags.

Anthony Forloney
Will this allow me to append $DOM to a larger DOM Document?
mrlanrat
If you are asking if you have two DOMDocument's, `$dom1` and `$dom2` could you add one into the other? The answer is no, at least not to my knowledge.
Anthony Forloney
Well, I need the ability to add my body code to my head and html DOM object.
mrlanrat
You can, as long as your body code is a string, ie. `$body = "<body><strong>this is a message for the content of my body</strong></body>"` if thats what you were referring to. If I am misunderstanding something, just correct me so I can help you further.
Anthony Forloney
You can use `createElement` among other DOMDocument functions and load it into your DOMDocument.
Anthony Forloney
`createElement` converts the data into entities.
Chacha102
If I had a better idea on what you'd like to achieve, I could try to demo it for you.
Anthony Forloney
+1  A: 

You use the DOMDocumentFragment objec to insert arbitrary HTML chunks into another document.

$dom = new DOMDocument();
@$dom->loadHTML($some_html_document); // @ to suppress a bajillion parse errors

$frag = $dom->createDocumentFragment(); // create fragment
$frag->appendXML($some_other_html_snippet); // insert arbitary html into the fragment

$node = // some operations to find whatever node you want to insert the fragment into

$node->appendChild($frag); // stuff the fragment into the original tree
Marc B
+1  A: 

I spent a lot of time working on Anthony Forloney's answer, But I cannot seem to get the html to append to the body without it erroring.

@Mark B: I have tried doing that, but as I said in the comments, it errored on my html.

I forgot to add the below, my solution:

I decided to make my html object much simpler and to allow me to do this by not using DOM and just use strings.

mrlanrat