2015-08-13 125 views
0

我正嘗試將我的網站移至Hack和XHP,當然。下面是什麼代碼結構的結構,我想實現:獲取XHPChild的子女

<ui:backstageHeader> 
    <ui:backstageHeader-navItem href="/">stories</ui:backstageHeader-navItem> 
    <ui:backstageHeader-navItem href="/story/send">send a story</ui:backstageHeader-navItem> 
    <ui:backstageHeader-navItem href="/aboutus">support</ui:backstageHeader-navItem> 
</ui:backstageHeader> 

注::ui:backstageHeader-navItem基本上呈現到<a href={$this->:href}>{$this->getCHildren}</a>,所以沒有必要在這裏附上它的類。)

下面是代碼爲:ui:backstageHeader

final class :ui:backstageHeader extends :ui:base { 
    attribute :div; 
    children (:ui:backstageHeader-navItem)*; 

    protected function compose() { 
    $dom = 
    <section class="backstage-header"> 
     <div class="container"> 
     <div class="cell-logo"> 
      <a href="/"> 
      <span class="no23-logo-white"></span> 
      </a> 
     </div> 
     <div class="cell-navigation"> 
     </div> 
     <div class="cell-account"> 
      <div class="cell-login"> 
      <div id="siteNav-login">Autentificare</div> 
      </div> 
     </div> 
     </div> 
    </section>; 
    $mainContainer = $dom->getChildren("div")[0]; 
    $cellNavigation = $mainContainer->getChildren("div")[1]; 
    $navItems = <ul class="main-navigation"></ul>; 
    foreach($this->getChildren() as $child) { 
     $navItems->appendChild(<li>{$child}</li>); 
    } 
    $dom->appendChild($navItems); 

    return $dom; 
    } 
} 

我使用的終端調試使用hhvm -m d <file.php>我的代碼,一切都還好嗎那裏。但是,當我到達我的瀏覽器時,我得到了500錯誤標題。這是日誌說什麼:

Catchable fatal error: Hack type error: Could not find method getChildren in an object of type XHPChild at /var/www/res/ui/backstage-header.php line 25 

這個錯誤來自

$cellNavigation = $mainContainer->getChildren("div")[1]; 

但是,不知何故,我需要從我section.backstage-header追加ul.main-navigationdiv.cell-navigation

我該怎麼辦?

回答

2

不要這樣構造你的代碼。從內而外構建它,這樣你就不必爲了尋找特定的孩子而做很多不可讀的getChildren調用。這些調用非常難以閱讀,並且在更改XHP的結構時非常不靈活。你不會在JS DOM中做類似node.firstChild.lastChild.lastChild.firstChild的事情,對嗎?不,JS中有更好的方法,按類或ID查找事物;在XHP中,您可以首先以正確的方式構建它!

我願意給你這樣的一個例子,但它並不像你居然使用$mainContainer$cellNavigation,所以你可以刪除這兩個問題的定義。

另外,你真的不應該把你的類型錯誤作爲HHVM的可捕獲的致命錯誤;這是最後一種檢查。嘗試直接運行hh_client檢查器,甚至可能在IDE中顯示其結果;它會給你一個更快的迭代週期,以及比HHVM提供的更多信息。

1

從我的經驗來看,appendChild很容易出現人爲錯誤。這很容易做到這樣的事情:

$items = (new Vector($this->getChildren()))->map($child ==> <li>{$child}</li>); 
return <div id="container">{$items}</div>; 

如果你想包裹兒童在<li />

不知道這是否會工作,但它會接近。

0

專業提示:您可以從XHP樹中分配變量。

$root = 
    <div> 
    {$child = <span> 
     Text children 
    </span>} 
    </div>; 

現在$子已經設置爲<span>元素。