<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 組件 組件是可重用代碼的基礎。 他們使你的工作更容易,并允許你從社區工作中獲利。 組件是美好的。 這章會學到以下幾點 1、如何寫組件 2、什么是信號 3、如何發送彈出消息 4、如何使用AJAX 組件是可呈現對象。 它可以是一個形式,菜單,民意調查等。在一個頁面內可以有你想要的任何組件。 在https://addons.nette.org/cs, 你可以找到來自Nette Framework社區志愿者的開源組件。 你可以找到一個組件的例子,它在示例Fifteen中的一個頁面中使用。 組件是Nette \ Application \ UI \ Control類的后代 ~~~ use Nette\Application\UI\Control; class PollControl extends Control { } ~~~ 當談論組件時,我們通常指的是Control類的后代。 組件基本上是框架術語中的控制。 ## 模板 組件的模板有工廠。 它創建一個模板,傳遞幾個變量(如下所示)并注冊默認過濾器。 渲染是我們的工作,它是在方法render()中完成的。 這是我們選擇將從中加載模板的文件的位置。 render()方法也是注冊模板中使用的變量的正確位置。 模板可以放在與組件相同的文件夾中,并具有相同的文件名。 ~~~ public function render() { $template = $this->template; $template->setFile(dirname(__FILE__) . '/PollControl.latte'); //插入一些參數到模板 $template->param = 'some value'; // 渲染它 $template->render(); } ~~~ 可以將參數從模板傳遞到render()。 ~~~ {control poll $poll} ~~~ ~~~ // PollControl.php public function render($poll) { ... } ~~~ ~~~ // PollPresenter.php protected function createComponentPoll() { ... } ~~~ ## 鏈接 方法link()用于鏈接到信號。 如果我們在組件的模板中,并且目標是控制器,則使用模板中的宏{link}或宏{plink}渲染鏈接。 在組件中使用: ~~~ $url = $this->link('click!', $x, $y); ~~~ 在模板中使用: ~~~ <a n:href="click! $x, $y"> ... </a> ~~~ ## 彈出信息 組件具有自己的閃存消息存儲,而與呈現者無關。 這些消息通知操作的結果,然后是重定向。 發送由flashMessage方法完成。 第一個參數是消息的文本,第二個(可選)參數是其類型(錯誤,警告,信息等)。 方法flashMessage()返回一個可以傳遞信息的彈出消息的實例。 例如: ~~~ public function deleteFormSubmitted(Form $form) { ... 使用模型刪除記錄... // 傳遞彈出消息 $this->flashMessage('Item was deleted.'); $this->redirect(...); // 跳轉 } ~~~ 模板在變量$flashes中自動接收此消息。 此變量包含一個對象數組(stdClass),它包含屬性消息,類型,并且可以包含上面提到的額外信息。 例如: ~~~ {foreach $flashes as $flash} <div class="flash {$flash->type}">{$flash->message}</div> {/foreach} ~~~ 如果保存了flashMessage()并發生重定向,則模板中將存在相同的參數$ flashes。 然后,郵件在接下來的三秒內保持活動狀態 - 以防止在頁面未成功加載并且用戶刷新請求的情況下丟失。 如果某人連續兩次刷新頁面(F5),則彈出信息仍然存在,如果他/她單擊其他位置,它就會消失。 ## 信號(子請求) 信號(子請求)是與服務器在正常視圖級別下的通信。信號是沒有改變視圖的動作。只有控制器可以更改視圖,因此組件僅與信號一起工作。 $ component-> link()鏈接到一個信號,$ presenter-> link()通常鏈接到一個視圖(除非使用感嘆號 - $ presenter-> link('signal!'))。但是一個組件可以調用$ component-> presenter-> link('view')。 一個信號導致像原始請求(除了AJAX)的頁面重新加載,并調用方法signalReceived($ signal),它的類Nette \ Application \ UI \ Component中的默認實現嘗試調用一個由句柄{Signal }。進一步的處理依賴于給定的對象。作為組件(即控制和呈現器)的后代的對象試圖用相關參數調用句柄{Signal}。 換句話說:采用方法句柄{Signal}的定義,并且在請求中接收的所有參數都與方法的參數相匹配。這意味著來自URL的參數id與方法的參數$ id匹配,某事到$ something等。如果方法不存在,則signalReceived方法拋出異常。 示例信號處理程序: ~~~ public function handleClick($x, $y) { if (!$this->isClickable($x, $y)) { throw new Nette\Application\UI\BadSignalException('Action not allowed.'); } // ... 處理信號 ... } ~~~ 信號可以由任何組件接收,如果它連接到組件樹,實現接口ISignalReceiver對象的控制器。 信號的主要接收器是呈現器和可視化組件擴展控制。 信號是對象的標志,它必須做某事 - 在來自用戶的投票中的輪詢計數,具有新聞的框必須展開,形式被發送并且必須處理數據等等。 信號總是在當前控制器和視圖上調用,因此不可能將其指向其他地方。 信號的URL使用方法Component :: link()創建。作為參數$ destination我們傳遞string {signal}!和$ args我們想傳遞給信號處理程序的參數數組。信號參數附加到當前控制器/視圖的URL。 URL中的參數?do確定調用的信號。 其格式為{signal}或{signalReceiver} - {signal}。 {signalReceiver}是控制器中組件的名稱。這就是為什么連字符(不準確的破折號)不能出現在組件名稱中 - 它用于劃分組件名稱和信號,但是可以組成幾個組件。 方法isSignalReceiver()驗證組件(第一個參數)是否是信號(第二個參數)的接收器。第二個參數可以省略 - 然后它找出組件是否是任何信號的接收器。如果第二個參數為TRUE,它將驗證組件或其后代是否是信號的接收器。 在任何階段前面的句柄{Signal}可以通過調用processSignal()方法手動執行信號,processSignal()負責信號執行。接收器組件(如果沒有設置它是演示者本身)并發送它的信號。 例如: ~~~ if ($this->isSignalReceiver($this, 'paging') || $this->isSignalReceiver($this, 'sorting')) { $this->processSignal(); } ~~~ 信號過早執行,不會再次調用。 ### 子請求與請求 信號和請求之間的差異: * 子請求保留所有組件 * 一個請求只保留持久性組件 ## 無效和摘要 在信號的處理期間,可能發生需要重新呈現組件的改變。 這些方法:redrawControl()和isControlInvalid()。 他們是使用AJAX與Nette的基本元素。 Nette還提供了更高的有效性粒度,只有在組件級別,使用片段。 代碼段可以逐個失效(任何組件可以根據需要擁有盡可能多的代碼段)。 如果整個組件無效,那么它的每個片段也會失效。 如果某個組件的任何子組件(組件)無效,則該組件被視為無效。 ## 持久參數 通常需要在組件中保留某個參數,以便對組件進行全部處理。 它可以是例如分頁中的頁的編號。 此參數應使用注釋@persistent標記為persistent。 ~~~ class PollControl extends Control { /** @persistent */ public $page = 1; ... } ~~~ 此參數將作為GET參數在每個鏈接中自動傳遞,直到用戶離開具有此組件的頁面。 永遠不要盲目地相信永久性參數,因為它們可以容易地偽造(通過覆蓋URL)。 例如,驗證頁碼是否在正確的時間間隔內。 ## 高級使用組件 組件大多是可渲染的。 但也存在不可描述的組件。 一些組件可能有一些不是后代。 Nette Framework為所有這些類型的組件引入了幾個類和接口。 對象繼承允許我們像現實世界中一樣具有類的層次結構。 我們可以通過擴展創建新類。 這些擴展類是原始類的后代,并繼承其參數和方法。 擴展類可以向繼承的類添加自己的參數和方法。 需要知識類層次結構才能正確理解事物的工作原理。 ~~~ Nette\ComponentModel\Component { IComponent } | +- Nette\ComponentModel\Container { IContainer } | +- Nette\Application\UI\Component { ISignalReceiver, IStatePersistent } | +- Nette\Application\UI\Control { IPartiallyRenderable } | +- Nette\Application\UI\Presenter { IPresenter } ~~~ ### Nette\ComponentModel\IComponent 接口Nette \ ComponentModel \ IComponent必須由每個組件實現。 它需要方法getName(),它返回它的名稱,getParent()返回它的父級。 可以使用方法setParent()設置名稱和父項 - 第一個參數是父項,第二個參數是名稱。 ### Nette\ComponentModel\Component Nette \ ComponentModel \ Component是IComponent的標準實現。 它是所有組件的共同祖先,包括表單元素。 它有幾種方法來遍歷: lookup($ type)在層次結構中查找給定類或接口的對象。 例如$ component-> lookup('Nette \ Application \ UI \ Presenter')返回presenter,如果組件綁定到它(甚至在層次結構中)。 lookupPath($ type)返回path - 通過連接$ type的當前和組件之間的所有組件的名稱而創建的字符串。 例如$ component-> lookupPath('Nette \ Application \ UI \ Presenter')返回組件向演示者的唯一標識符。 ### Nette\ComponentModel\IContainer 父組件不僅實現了IComponent,還實現了Nette \ ComponentModel \ IContainer。 包含用于在組件上添加,刪除,獲取和迭代的方法的接口。 這樣的組件可以創建層次結構 - 控制器可以包含表單,這些表單可以包含表單輸入。 組件的整個樹層次由IContainer對象和IComponent樹葉的分支創建。 ### Nette\ComponentModel\Container Nette \ ComponentModel \ Container是IContainer接口的標準實現。 它是例如一個或多個控件和控制器的祖先。 它提供了正確添加,獲取和刪除對象的方法,當然還有對其內容的迭代。 嘗試調用未定義的子進程調用factory createComponent($ name)。 方法createComponent($ name)調用當前組件中的方法createComponent <component name>,它將組件的名稱作為參數傳遞。 創建的組件然后作為其子進程傳遞到當前組件。 我們稱之為theese組件工廠,它們可以在繼承自Container的類中實現。 ### Nette\Application\UI\Component 類Nette \ Application \ UI \ Component是演示者中使用的所有組件的祖先。 演示者中的組件是由演示者在其生命周期期間保持的對象。 它們具有彼此影響的能力,將它們的狀態保存到URL中并響應用戶命令(信號),并且不必是可呈現的。 ### Nette\Application\UI\Control 控件是一個可渲染組件。 它是一個可重用的Web應用程序的一部分,這是整個章節。 當談論組件這是我們通常想到的類。 它記住它的一部分應該在AJAX請求中呈現,我們已經談到了。 控件不是表示網頁的可視部分,而是邏輯部分。 可以重復地,有條件地并且每次使用不同的模板來呈現它。 ### 組件樹 如果給定不同的名稱,可以在頁面上多次呈現相同的組件(這可以動態地完成)。 父代可以是控制器,組件或實現IContainer的其他對象。 層次結構可以如下所示: ~~~ Nette\Application\UI\Presenter { root of tree of components is always a presenter } | --Nette\Application\UI\Control { implements IContainer => can be parent } | --Nette\ComponentModel\Component | --Nette\ComponentModel\Component { does not implement IContainer => cannot be parent } | --Nette\Application\UI\Control | --Nette\ComponentModel\Component ~~~ ## 延遲組成 Nette中的組件模型提供了非常動態的樹工作流(組件可以刪除,添加,移動)。 在創建組件時,依賴于knowing parent(在構造函數中)將是一個錯誤。 在大多數情況下,父組件在創建組件時并不知道。 ~~~ $control = new NewsControl; // ... $parent->addComponent($control, 'shortNews'); ~~~ ## 監控更改 如何找出組件何時添加到控制器的樹? 觀看父級的更改是不夠的,因為父級的父級可能已添加到控制器。 方法監視器($ type)是在這里幫助。 每個組件都可以監視任意數量的類和接口。 通過調用附加的方法($ obj)(detached($ obj)個別)報告添加或刪除,其中$ obj是受監視類的對象。 示例:類UploadControl,表示在Nette \ Forms中上傳文件的表單元素,必須將表單的屬性類型設置為值multipart / form-data。 但在創建對象的時候,它不必附加到任何形式。 什么時候修改窗體? 解決方案很簡單 - 我們在構造函數中創建一個監視請求: ~~~ class UploadControl extends Nette\Forms\Controls\BaseControl { public function __construct($label) { $this->monitor('Nette\Forms\Form'); // ... } // ... } ~~~ 并且在表單可用時調用附加的方法: ~~~ protected function attached($form) { parent::attached($form); if ($form instanceof Nette\Forms\Form) { $form->getElementPrototype()->enctype = 'multipart/form-data'; } } ~~~ 使用查找監視和查找組件或路徑是非常精確優化的,以獲得最佳性能。 ## Iterating over children 有一個方法getComponents($ deep = FALSE,$ type = NULL)。 第一個參數確定是否應該深入(遞歸地)查找組件。 使用TRUE,它不僅迭代所有它的孩子,而且它的所有孩子的孩子等。第二個參數服務器作為一個可選的過濾器通過類或接口。 例如,這是表單驗證如何在內部執行的方式: ~~~ $valid = TRUE; foreach ($form->getComponents(TRUE, 'Nette\Forms\IControl') as $control) { if (!$control->getRules()->validate()) { $valid = FALSE; break; } } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看