繁体   English   中英

将DomDocument与SilverStripe一起使用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM