0

SilverStripe2.4.7とDomDocumentを使用しています。スタンドアロンのPHPファイル内で使用すると期待どおりに機能する次のコードをまとめました。 URLは私が呼んでいる実際のURLではありませんが、公開することはできませんのでご注意ください

$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がXMLDTDを指定していると推測しています。これにより、validateメソッドを呼び出したときにHTMLを受信するとエラーが発生します。ただし、validate呼び出しをコメントアウトすると、受信しているHTMLに名前空間が定義されていないというエラーが表示されます。SilverStripeテンプレートがXMLDTDを使用することを指定している古い投稿を見つけたので、これをオーバーライドするにはどうすればよいですか?

アドバイスをいただければ幸いです。不明な点がある場合はお知らせください。編集します。

4

1 に答える 1

0

問題はSilverStripeのエラー報告にあったことが判明しました。私はそれを開発モードで使用していたので、実際には問題ではないエラーをスローしていました。とりあえず開発モードで作業を続ける必要があるので@、問題の原因となっている行のエラーを抑制するために含める必要がありました。

@$dom->loadHTMLFile($url);

また、とにかく完全に間違った場所にあることを知ってから、検証行を削除する必要がありました。

これが誰かに役立つことを願っています。

于 2012-12-04T09:58:31.467 に答える