<com:TContent ID="body" > <h1 id="701">Komponenty</h1> <p id="110113" class="block-content"> Komponent jest instancją klasy lub klasy potomnej <tt>TComponent</tt>. Klasa bazowa <tt>TComponent</tt> implementuje mechanizm właściwości oraz zdarzeń kompomentu. </p> <h2 id="702">Właściwości komponentu (ang. component properties)</h2> <p id="110114" class="block-content"> Właściwość kompoenentu może być postrzegana jako publiczna zmienna opsiującą określoną cechę/właściwość komponentu, taką jak kolor tła, rozmiar czcionki, itp. Właściwość jest definiowana poprzez istnienie metody getter i/lub setter w klasie. Na przykład w <tt>TControl</tt> definiujemy właściwość <tt>ID</tt> komponentu używając następujących funkcji typu getter i setter, <com:TTextHighlighter CssClass="source block-content" id="code_110056"> class TControl extends TComponent { public function getID() { ... } public function setID($value) { ... } } </com:TTextHighlighter> </p> <p id="110115" class="block-content"> Aby pobrać lub ustawić właściwość <tt>ID</tt>, postępuj jak poniżej (tak jakbyś miał do czynienia ze zmienną): <com:TTextHighlighter CssClass="source block-content" id="code_110057"> $id = $component->ID; $component->ID = $id; </com:TTextHighlighter> Jest to równoznaczne z następującym zapisem: <com:TTextHighlighter CssClass="source block-content" id="code_110058"> $id = $component->getID(); $component->setID( $id ); </com:TTextHighlighter> </p> <p id="110116" class="block-content"> Właściwość jest "tylko do odczytu" jeśli posiada metodę getter a nie posiada metody setter. Odkąd nazwy metod w PHP nie są zależne od wielkiej bądź małej litery, właściwości również są niewrażliwe na wielkość liter. Klasa kompomentu dziedziny wszystkie właściwości rodzica. </p> <h3 id="706">Subwłaściwości (ang. subproperties)</h3> <p id="110117" class="block-content"> Subwłaściwość jest właściwością właściwości typu obiektowego. Dla przykładu <tt>TWebControl</tt> posiada właściwość <tt>Font</tt>, która jest typu <tt>TFont</tt>. Wtedy właściwość <tt>Name</tt> właściwości <tt>Font</tt> jest subwłaściwością w stosunku do <tt>TWebControl</tt>. </p> <p id="110118" class="block-content"> Aby pobrać lub ustawić subwłaściwość <tt>Name</tt> należy użyć następującej metody: <com:TTextHighlighter CssClass="source block-content" id="code_110059"> $name = $component->getSubProperty('Font.Name'); $component->setSubProperty('Font.Name', $name); </com:TTextHighlighter> Jest to równoznaczne z następującym zapisem: <com:TTextHighlighter CssClass="source block-content" id="code_110060"> $name = $component->getFont()->getName(); $component->getFont()->setName( $name ); </com:TTextHighlighter> </p> <h2 id="703">Zdarzenia komponentu</h2> <p id="110119" class="block-content"> Zdarzenia komponentu są specjalnymi właściwościami, które pobierają nazwy metod jako swoje wartości. Przypisując (ustawiając) metodę do zdarzenia (will hook up the method ) do miejsca gdzie zdarzenie jest wywoływane. Dzięki temu zachowanie komponentu może zostać zmodyfikowane w sposób, który nie był przewidziany podczas fazy dewelopowania komponentu. </p> <p id="110120" class="block-content"> Zdarzenie komponentu jest definiowane poprzez istnienie metody, której nazwa zaczyna się przedrostkiem <tt>on</tt>. Nazwa zdarzenia jest nazwą metody i z tego powodu jest niewrażliwa na wielkość liter. Na przykład w komponencie <tt>TButton</tt> mamy: <com:TTextHighlighter CssClass="source block-content" id="code_110061"> class TButton extends TWebControl { public function onClick( $param ) { ... } } </com:TTextHighlighter> W ten sposób definiujemy metodę o nazwie <tt>OnClick</tt> a uchwyt do zdarzenia przez nią definiowanego może być przypisany w jeden z następujących sposobów: <com:TTextHighlighter CssClass="source block-content" id="code_110062"> $button->OnClick = $callback; $button->OnClick->add( $callback ); $button->OnClick[] = $callback; $button->attachEventHandler( 'OnClick' , $callback ); </com:TTextHighlighter> gdzie <tt>$callback</tt> odnosi się do poprawnej funkcji typu callback w PHP (np. nazwy funkcji, metody klasy <tt>array($object,'method')</tt>, itp.) </p> <h2 id="704">Przestrzenie nazw (ang. namespaces)</h2> <p id="110121" class="block-content"> Przestrzeń nazw odnosi się do logicznego pogrupowania nazwy klas w taki sposób, że moga być one odróżniane od innych klas, których nazwy są identyczne. Ponieważ PHP nie wspiera przestrzeni nazw sam w sobie, nie można stworzyć instancji dwóch klas, które mają tą samoą nazwę ale różne definicje. Aby odróżniać się od klas użytkowników wszystkie klasy PRADO posiadają prefix 'T' (oznaczający 'Type' - z angielskiego: typ). Zachęcamy do nazywania własnych klas w ten sposób. W odróznieniu można dodawać prefiksy klas zaczynające się dowolną inną literą (lub grupą liter). </p> <p id="110122" class="block-content"> Przestrzeń nazw w PRADO jest postrzegana jako folder zawierający jednen lub więcej plików klas. Poprzez poprzedzania nazwy klasy przestrzenią nazw klasa może zostać określona jednoznacznie. Każda przestrzeń nazw jest w PRADO określona w następujący sposób: <div class="source"> PathAlias.Dir1.Dir2 </div> gdzie <tt>PathAlias</tt> jest aliasem jakiegoś katalogu, gdzie <tt>Dir1</tt> i <tt>Dir2</tt> są podkatalogami tego katalogu. Klasa o nazwie <tt>MyClass</tt> zdefiniowana w <tt>Dir2</tt> jest fully qualified poprzez <tt>PathAlias.Dir1.Dir2.MyClass</tt>. </p> <p id="110123" class="block-content"> By używać przestrzeni nazw w kodzie, napisz: <com:TTextHighlighter CssClass="source block-content" id="code_110063"> Prado::using('PathAlias.Dir1.Dir2.*'); </com:TTextHighlighter> co spowoduje dołączenie katalogu wskazywanego przez <tt>PathAlias.Dir1.Dir2</tt> do ścieżek include w PHP, dzięki czemu instancje klas zdefiniowanych w podanym katalogu mogą zostać utworzone bez podawania pełnej przestrzeni nazw. Możesz również zainkludować pojedyńczą definicję klasy poprzez <com:TTextHighlighter CssClass="source block-content" id="code_110064"> Prado::using('PathAlias.Dir1.Dir2.MyClass'); </com:TTextHighlighter> co spowoduje zainkludowanie pliku klasy <tt>MyClass</tt> jeśli nie została ona jeszcze zdefiniowana. </p> <p id="110124" class="block-content"> Aby zobaczyć więcej informacji o definiowaniu aliasów zobacz sekcję <a href="?page=Configurations.AppConfig">konfigurowanie aplikacji</a>. </p> <h2 id="705">Tworzenie instancji komponentu</h2> <p id="110125" class="block-content"> Tworzenie instancji komponentu oznacza tworzenie instancji klasy komponentu. Rozróżniamy dwa typy instancji komponentu: statyczną i dynamiczną. Utworzone komponenty nazywane są odpowiednio komponentami statycznymi i dynamicznymi. </p> <h3 id="707">Dynamiczne tworzenie instancji komponentów</h3> <p id="110126" class="block-content"> Dynamiczne tworzenie instancji komponentów oznacza tworzenie instancji komponentu w kodzie PHP. Wygląda to identycznie jak zwyczajne tworznie komponentów w PHP. Komponent może zostać dynamicznie utworzony w jeden z poniższych sposobów w PHP: <com:TTextHighlighter CssClass="source block-content" id="code_110065"> $component = new ComponentClassName; $component = Prado::createComponent('ComponentType'); </com:TTextHighlighter> gdzie <tt>ComponentType</tt> wskazuje na nazwę klasy lub nazwę typu w formacie przestrzeni nazw (np. <tt>System.Web.UI.TControl</tt>). Drugi sposób został wprowadzony aby wypełnić brak wsparcia dla przestrzeni nazw w PHP. </p> <h3 id="708">Statyczne tworzenie instancji komponentów</h3> <p id="110127" class="block-content"> Statyczne tworzenie instancji komponentów odnosi się do tworznenia komponentów poprzez <a href="?page=Configurations.Overview">konfigurację</a>. Proces tworzenia odbywa się po stronie frameworku. Na przykład w <a href="?page=Configurations.AppConfig">konfiguracji aplikacji</a> można skonfigurować moduł, który zostanie załadowany podczas uruchamiania aplikacji. Zatem moduł jest statycznym komponentem stworzonym przez framework. Statyczne tworzenie instancji jest często wspólnie używane w <a href="?page=Configurations.Templates1">szablonach</a>. Każdy tag komponentu w szablonie określa komponent, który będzie automatycznie stworzony przez framework, kiedy szablon będzie ładowany. Na przykład w szablonie strony następujący tag doprowadzi do stworzenia komponentu <tt>TButton</tt> na stronie: <com:TTextHighlighter Language="prado" CssClass="source block-content" id="code_110066"> <com:TButton Text="Register" /> </com:TTextHighlighter> </p> </com:TContent>