{"id":317,"date":"2009-06-23T10:25:49","date_gmt":"2009-06-23T09:25:49","guid":{"rendered":"http:\/\/morony.pl\/?p=317"},"modified":"2009-06-23T10:34:31","modified_gmt":"2009-06-23T09:34:31","slug":"obiektowe-php-zaawansowany-przyklad-obsluga-formularzy-html-cz1","status":"publish","type":"post","link":"https:\/\/morony.pl\/?p=317","title":{"rendered":"Obiektowe php &#8211; zaawansowany przyk\u0142ad &#8211; obs\u0142uga formularzy html cz1"},"content":{"rendered":"<p>Witam. Ostatnio mamy z Goto straszny nawa\u0142 pracy (praca, studia oraz niespodzianka o kt\u00f3rej ca\u0142y czas pami\u0119tamy i nied\u0142ugo napiszemy) co nie pozwala nam systematycznie rozwija\u0107 podj\u0119tych przez nas temat\u00f3w. Ja dla odmiany znalaz\u0142em dzisiaj chwile czasu i postanowi\u0142em rozpocz\u0105\u0107 kolejny &#8211; czyste PHP. Nie chc\u0119 rozpisywa\u0107 si\u0119 na temat czego\u015b czego w internecie pe\u0142no. Chc\u0119 si\u0119 dzi\u015b zaj\u0105\u0107 ca\u0142kiem zaawansowanych programowaniem. Mam nadziej\u0119 \u017ce uda mi si\u0119 poni\u017cszym artyku\u0142em przekona\u0107 twardzieli koduj\u0105cych strukturalnie do pot\u0119gi obiektowego PHP.<\/p>\n<p>Do zrozumienia poni\u017cszego przyk\u0142adu potrzebna b\u0119dzie do\u015b\u0107 bieg\u0142a znajomo\u015b\u0107 podstaw programowania w PHP, poniewa\u017c nie b\u0119d\u0119 tutaj t\u0142umaczy\u0142 \u017cadnej sk\u0142adni. Tego w internecie pe\u0142no w ka\u017cdym j\u0119zyku. Nie b\u0119d\u0119 te\u017c t\u0142umaczy\u0142 za bardzo sk\u0142adni obiektowego php. O tym te\u017c zosta\u0142o napisanych wiele bardzo dobrych kurs\u00f3w i nie ma sensu tego powiela\u0107. Ja chc\u0119 si\u0119 skupi\u0107 na m\u0105drym i przydatnym wykorzystaniu pot\u0119gi jak\u0105 jest programowanie obiektowe. A zatem &#8211; do dzie\u0142a.<\/p>\n<h2>Najpierw Plan<\/h2>\n<p>Jak wiemy (a przynajmniej powinni\u015bmy) obs\u0142uga formularzy w php jest bardzo prosta. Najpierw tworzymy jego struktur\u0119 w HTML, nast\u0119pnie po klikni\u0119ciu na stronie wy\u015blij otwiera si\u0119 zdefiniowana przez nas strona (ta sama albo inna) gdzie w tablicy $_POST lub $_GET (zale\u017cnie od naszych potrzeb) oraz $_FILES znajduj\u0105 si\u0119 warto\u015bci przes\u0142ane przez formularz kt\u00f3re mo\u017cemy dowolnie wykorzysta\u0107. Jest to bardzo proste, ale bardzo uci\u0105\u017cliwe. \u00a0A w jaki spos\u00f3b wykorzysta\u0107 do obs\u0142ugi formularzy programowanie obiektowe?<\/p>\n<p>Ka\u017cdy formularz zawiera jakies pola (tekstowe, ptaszki do zaznaczania itp). Pola owe posiadaj\u0105 szereg w\u0142a\u015bciwo\u015bci, kt\u00f3re dla poszczeg\u00f3lnych typ\u00f3w p\u00f3l mog\u0105 si\u0119 r\u00f3\u017cni\u0107. Ka\u017cdemu elementowi w taki sam spos\u00f3b mo\u017cemy nada\u0107 parametr <em>value<\/em> ale nie mo\u017cemy w elemencie tekstowym poda\u0107 <em>checked=&#8221;checked&#8221;<\/em>, a co mo\u017cemy zrobi\u0107 dla elementu typu radio. Taka zasada dzia\u0142ania formularza wr\u0119cz jest idealna do tego by ka\u017cdy z jego element\u00f3w sta\u0142 si\u0119 obiektem. Co wi\u0119cej poszczeg\u00f3lne obiekty powinny si\u0119 r\u00f3\u017cni\u0107 kilkoma szczeg\u00f3\u0142ami (w zale\u017cnosci od typu pola). A\u017c si\u0119 prosi by stworzy\u0107 klas\u0119 podstawow\u0105 dla elementu formularza oraz szereg klas potomnych ze szczeg\u00f3lnymi w\u0142asno\u015bciami dla wyodr\u0119bnienia poszczeg\u00f3lnych element\u00f3w.<\/p>\n<p>Czyli narazie doszli\u015bmy do tego i\u017c potrzebujemy:<\/p>\n<ul>\n<li>klasy\u00a0<strong>input<\/strong>, zawieraj\u0105cej najwa\u017cniejsze w\u0142asno\u015bci oraz funkcje identyczne dla wszystkich element\u00f3w formularza (takich jak label czy value)<\/li>\n<li>poszczeg\u00f3lnych klas dla r\u00f3\u017cnych element\u00f3w takich jak <strong>input_text, input_textarea, input_radio, input_select<\/strong>. Klasy te b\u0119d\u0105 dziedziczy\u0107 z klasy input. dzi\u0119ki temu zaoszcz\u0119dzimy na kodzie. Nie b\u0119dziemy musieli za ka\u017cdym razem definiowa\u0107 w\u0142asno\u015bci &#8220;value&#8221;.<\/li>\n<\/ul>\n<p>Co dalej? Sam formularz r\u00f3wnie\u017c zawiera swoje parametry a tak\u017ce \u00a0list\u0119 element\u00f3w. Zr\u00f3bmy wi\u0119c i z niego objekt, a przekonamy si\u0119 co zyskamy dzi\u0119ki temu.<\/p>\n<p>Nasza klasa form b\u0119dzie zawiera\u0142a tablic\u0119 przechowuj\u0105c\u0105 list\u0119 jego element\u00f3w. Co to daje? Pomy\u015blmy co b\u0119dzie si\u0119 dzia\u0142o po kolei w kodzie wykorzystuj\u0105c\u0105 nasz formularz.<\/p>\n<p>Najpierw zdefiniujemy sobie nowy obiekt formularza.<\/p>\n<pre class=\"prettyprint\">$form = new form;<\/pre>\n<p>Nast\u0119pnie wype\u0142nimy jego tablic\u0119 elementami tworz\u0105c odpowiednie nowe obiekty. Przyjmijmy \u017ce ka\u017cdemu elementowi ju\u017c w momencie tworzenia (za pomoc\u0105 magicznej metody __construct() ) przypiszemy jego unikaln\u0105 nazw\u0119. Co nam to da? Zastan\u00f3wmy si\u0119 co si\u0119 stanie je\u015bli prze\u015blemy ten formularz (narazie pomijamy w jaki spos\u00f3b on si\u0119 pojawi w og\u00f3le na stronie &#8211; zajmiemy si\u0119 tym p\u00f3\u017aniej) na t\u0105 sam\u0105 stron\u0119 i znowy wywo\u0142amy skrypt \u0142aduj\u0105cy nasz obiekt formularza z list\u0105 element\u00f3w. Tym razem mamy ju\u017c w pami\u0119ci tak\u017ce wype\u0142nion\u0105 tabel\u0119 $_POST i mo\u017cemy korzystaj\u0105c z listy element\u00f3w z kt\u00f3rych ka\u017cdy ma nazw\u0119 wyci\u0105gn\u0105\u0107 z tej tablicy interesuj\u0105ce nas (przes\u0142ane za pomoc\u0105 naszego formularza) dane.<\/p>\n<h3>metoda getData()<\/h3>\n<p>napiszemy sobie metod\u0119 getData(), kt\u00f3ra wykonuj\u0105c p\u0119tl\u0119 po wszystkich elementach formularza, za pomoc\u0105 parametru <em>name<\/em> danego elementu sprawdzi czy zosta\u0142 on przes\u0142any &#8211; to znaczy pobierze go z tablicy $_POST. Co mo\u017cemy zrobi\u0107 dalej? Dla ka\u017cdego elementu formularza (a w\u0142a\u015bciwie jego obiektu) stworzymy sobie parametr $correct oraz metod\u0119 check(). Podczas pobierania warto\u015bci przes\u0142anych przez formularz dla ka\u017cdego obiektu w zale\u017cno\u015bci od zmiennej $correct sprawdzimy poprawno\u015b\u0107 przes\u0142anej zmiennej (0 &#8211; brak sprawdzania, 1-mail, 2-data itp) je\u017celi oka\u017ce si\u0119 \u017ce warto\u015b\u0107 jest niepoprawna wtedy wygenerujemy odpowiedni b\u0142\u0105d i wstawimy go do parametru $err naszego elementu formularza. Co najfajniejsze b\u0119dzie si\u0119 to dzia\u0142o wewn\u0105trz klasy, bez jakiegokolwiek zainteresowania z naszej strony z punktu widzenia w\u0142a\u015bciwego ju\u017c kodu.<\/p>\n<p>Ale co zrobi\u0107 z tymi danymi kt\u00f3re si\u0119 pobra\u0142y? Ka\u017cdy element ma unikaln\u0105 nazw\u0119. Mo\u017cemy wi\u0119c stworzy\u0107 dla ka\u017cdego elementu parametr o nazwie takiej jak\u0105 nazw\u0119 ma element. Dzi\u0119ki temu warto\u015b\u0107 przes\u0142ana przez element &#8220;desc&#8221; b\u0119dzie dost\u0119pna za pomoc\u0105 kodu:<\/p>\n<pre class=\"prettyprint\">echo $form->desc;<\/pre>\n<p>Fajne prawda? \ud83d\ude42<\/p>\n<h3>metoda sended()<\/h3>\n<p>Skoro mamy mo\u017cliwo\u015b\u0107 sprawdzenia czy nasz element przes\u0142a\u0142 poprawne dane, powinni\u015bmy m\u00f3c te\u017c wykona\u0107 inny kod dla poprawnego ca\u0142ego formularza a inny dla formularza z jakim\u015b b\u0142\u0119dem. Do tego pos\u0142u\u017cy metoda sended() obiektu formularza, kt\u00f3ra sprawdzi czy wszystkie elementu s\u0105 poprawne, czy te\u017c co\u015b jest nie tak. wynik metody b\u0119dziemy mogli wykorzysta\u0107 w instrukcji warunkowej.<\/p>\n<h3>Wykorzystanie ca\u0142ego tego majdanu.<\/h3>\n<p>W uproszeczeniu (pomijaj\u0105c definicj\u0119 klas. Przyjmijmy \u017ce one ju\u017c s\u0105) obs\u0142uga naszego formularza mo\u017ce wygl\u0105da\u0107 tak:<\/p>\n<pre class=\"prettyprint\">    $form = new $form;\r\n    $form->elements[]=new input_text('name', 'Imi\u0119');\r\n    $form->elements[]=new input_text('sname', 'Nazwisko');\r\n    $element=new input_text('mail', 'E-mail');\r\n    $element->class='mail';\r\n    $element->correct=2;\r\n    $form->elements[] = $element; \/\/ ten element jest troszke\r\n                               \/\/ bardziej rozbudowany.\r\n    $form->getData();\r\n    if($form->sended){\r\n        echo 'Witaj '.$form->name.' '.$form->sname.'.';\r\n    } else {\r\n        echo $form->renderErrors(); \/\/metoda wy\u015bwietlaj\u0105ca b\u0142\u0119dy\r\n                 \/\/ poszczeg\u00f3lnych element\u00f3w je\u015bli istniej\u0105\r\n        echo $form->render(); \/\/ metoda wy\u015bwietlaj\u0105ca formularz\r\n    }<\/pre>\n<p>I to tyle. Powy\u017cszy kod w zale\u017cno\u015bci od tego czy dane zosta\u0142y poprawnie przes\u0142ane wykorzysta je, albo wy\u015bwietli informacje o b\u0142\u0119dzie oraz wy\u015bwietli sam formularz (je\u015bli kt\u00f3re\u015b dane by\u0142y niepoprane, r\u00f3wnie\u017c odpowiednie kontrolki zostan\u0105 zaznaczone np. czerwonym t\u0142em). Wszystko w kilkunastu liniach bardzo przejrzystego kodu. Ca\u0142y kod obs\u0142uguj\u0105cy to b\u0119dzie siedzia\u0142 w klasach, kt\u00f3re niebawem napiszemy. I nie iteresuje nas w momencie korzystania z formularzy HTML, sprawdzanie poprawno\u015bci, sprawdzanie czy formularz wys\u0142any, wy\u015bwietlanie listy b\u0142\u0119d\u00f3w oraz pobieranie danych z tablicy $_POST. Wszystko robi si\u0119 samo.<\/p>\n<p>Pozdrawiam i zapraszam na drug\u0105 cz\u0119\u015b\u0107 tego artyku\u0142u kt\u00f3ra pojawi si\u0119 ju\u017c niebawem.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Witam. Ostatnio mamy z Goto straszny nawa\u0142 pracy (praca, studia oraz niespodzianka o kt\u00f3rej ca\u0142y czas pami\u0119tamy i nied\u0142ugo napiszemy) co nie pozwala nam systematycznie rozwija\u0107 podj\u0119tych przez nas temat\u00f3w. Ja dla odmiany znalaz\u0142em dzisiaj chwile czasu i postanowi\u0142em rozpocz\u0105\u0107 kolejny &#8211; czyste PHP. Nie chc\u0119 rozpisywa\u0107 si\u0119 na temat czego\u015b czego w internecie pe\u0142no. [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/morony.pl\/index.php?rest_route=\/wp\/v2\/posts\/317"}],"collection":[{"href":"https:\/\/morony.pl\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/morony.pl\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/morony.pl\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/morony.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=317"}],"version-history":[{"count":9,"href":"https:\/\/morony.pl\/index.php?rest_route=\/wp\/v2\/posts\/317\/revisions"}],"predecessor-version":[{"id":326,"href":"https:\/\/morony.pl\/index.php?rest_route=\/wp\/v2\/posts\/317\/revisions\/326"}],"wp:attachment":[{"href":"https:\/\/morony.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=317"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/morony.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=317"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/morony.pl\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=317"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}