2012-12-03 30 views
0

我正在使用SilverStripe 2.4.7和DomDocument。我將以下代碼放在一起,這些代碼在獨立PHP文件中使用時可按預期工作。 請注意,網址是不是我打電話的實際URL,但我不能將它張貼公開使用DomDocument與SilverStripe

$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錯誤。但是,當我註釋掉驗證調用時,我得到一個錯誤,即名稱空間沒有在接收到的HTML中定義。我發現了一個較舊的帖子,指明SilverStripe模板使用XML DTD,所以我想知道如何覆蓋它?

我會很感激任何建議,如果我沒有清楚的事情,請讓我知道,我會編輯。

回答

0

原來問題出在SilverStripe的錯誤報告上。由於我在開發模式下使用它,所以拋出的錯誤實際上並不重要。由於我需要繼續在開發模式下工作,所以我必須包含@來抑制導致問題的錯誤。

@$dom->loadHTMLFile($url); 

我也不得不刪除驗證線,我已經學會了,因爲是完全錯誤的地方呢。

我希望這可以幫助別人。

相關問題