[英]Using DomDocument with SilverStripe
我正在使用SilverStripe 2.4.7和DomDocument。 我整理了以下代码,在独立的PHP文件中使用时,它们可以按预期工作。 请注意,该网址不是我要拨打的实际网址,但我无法公开发布
$url = "http://www.somesite.com/";
$dom = new DOMDocument();
$dom->validate(); **I took this line out to fix the first error**
$dom->loadHTMLFile($url);
foreach ($dom->getElementsByTagName('img') as $item) {
$value = $item->getAttribute('src');
$item->setAttribute('src', 'http://www.somesite.com/' . $value);
}
foreach ($dom->getElementsByTagName('script') as $item) {
$value2 = $item->getAttribute('src');
$item->setAttribute('src', 'http://www.somesite.com/' . $value2);
}
foreach ($dom->getElementsByTagName('a') as $item) {
$value4 = $item->getAttribute('href');
$item->setAttribute('href', 'http://www.somesite.com/' . $value4);
}
$s = $dom->getElementById('searchbox_button');
$value5 = $s->getAttribute('src');
$s->setAttribute('src', 'http://www.somesite.com/' . $value5);
$cr = $dom->getElementById('content_right');
$cl = $dom->getElementById('content_left');
$fb = $dom->getElementById('siteclock');
$fb->parentNode->removeChild($fb);
$content = $dom->getElementById('content');
$dom->appendChild($content);
$content->removeChild($cr);
$content->removeChild($cl);
foreach ($dom->getElementsByTagName('link') as $item) {
$value3 = $item->getAttribute('href');
$item->setAttribute('href', 'http://www.somesite.com/' . $value3);
}
$offers = DataObject::get('AdminOffer');
$div = $dom->createElement('div');
$div->setAttribute("class", "offerBox");
$div->setAttribute("style", "width: 33.33333%; overflow: hidden; border: 2px solid #80bd01");
$content->appendChild($div);
$img = $dom->createElement('img');
$img->setAttribute("src", "http://www.somesite.com/$offers->Photo");
$img->setAttribute("alt", "$offers->Title");
$img->setAttribute("width", "120px");
$img->setAttribute("style", "float: left; margin: 5px;");
$div->appendChild($img);
$p = $dom->createElement('p');
$p->setAttribute("style", "float: left; word-wrap:normal; width: auto");
$div->appendChild($p);
$bTitle = $dom->createElement('b', "Offers->Title");
$p->appendChild($bTitle);
$break1 = $dom->createElement('br/');
$p->appendChild($break1);
$bPrice = $dom->createElement('b', "Offers->Price");
$p->appendChild($bPrice);
$break2 = $dom->createElement('br/');
$p->appendChild($break2);
$bExpires = $dom->createElement('b', "Offers->Expires");
$p->appendChild($bExpires);
$dom->formatOutput = true;
return $dom->saveHTML();
但是,当我将其添加到页面控制器时,它告诉我No DTD given in XML-Document
。
我曾尝试通过以下方式添加DTD,但这样做时会出现服务器错误。
$dom = DOMImplementation::createDocumentType('html',
'-//W3C//DTD XHTML 1.1//EN',
'http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd');
我猜测SilverStripe指定了XML DTD,当我调用validate方法时,这会导致HTML接收错误。 但是,当我注释掉validate调用时,我收到一个错误,指出正在接收的HTML中未定义名称空间。 我发现了一篇较旧的文章,指出SilverStripe模板使用XML DTD,所以我想知道如何覆盖它?
我将不胜感激任何建议,如果不清楚,请告诉我,我将进行编辑。
原来问题出在SilverStripe的错误报告中。 由于我在开发人员模式下使用它,因此抛出的错误实际上并不重要。 由于暂时需要继续以开发人员模式工作,因此必须添加@
来抑制导致问题的行上的错误。
例
@$dom->loadHTMLFile($url);
我还必须删除验证行,此行我所知道的仍然完全在错误的地方。
我希望这可以帮助别人。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.