OOP Formulář - jdu na to dobře ? – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

OOP Formulář - jdu na to dobře ? – PHP – Fórum – Programujte.comOOP Formulář - jdu na to dobře ? – PHP – Fórum – Programujte.com

 

dObi0
Duch
22. 2. 2012   #1
-
0
-

Zdravím,

momentálně se snažím pořádně naučit PHP objektově, a jelikož mám nejraději učit se na něčem za chodu, snažím se napsat univerzální tvorbu formulářů, s následnou validací. Zatím mám uděláno pouze tvorbu formulářových Inputů a následné přidělené vlastních validačních pravidel.

Chtěl bych od vás proto radu, jestli na to jdu vůbec aspoň trochu dobře, abych pak nezjistil, že jsem se celou dobu učil psát OOP špatným způsobem. Proto děkuji za prolouskání mého kódu a udělení nějaký rad, zda-li je kód vůbec použitelný.

Díky.

PHP kód:

<?php

class Forms {
  
  /* 
   * Defaultni nastaveni pravidel pro vsechny formularova data 
   * Tyto data muzete pote libovolne upravovat, viz funkce teto tridy zvana 'add_rule'
   * 
   */
  public $rules = Array ( "DEFAULT" => Array ( "MAXLENGHT" => "20", 
                                               "MINLENGHT" => "10",
                                               "REQUIRED" => TRUE )
                        ); 
  /* Funkce umoznujici nastaveni pravidel pro formularova data 
   * Nastaveni se zapisuje ve tvaru:
   *  
   * AddRule ( "PRAVIDLO", "HODNOTA" ) 
   * popripade vicenasobne pridani pravidel:
   * AddRule ( "PRAVIDLO_1", "HODNOTA_1", "PRAVIDLO_2", "HODNOTA_2", atd... )
   *  
   */
  public function AddRule( $rules ) {
    $rules = func_get_args(); 
    foreach($rules as $key => $value) {
      if($key % 2 == 0) $this->rules["USER_DEFINED"][$value] = isset($rules[$key++]) ? $rules[$key++] : null; 
    }
    $this->rules[$this->id] = array_merge( $this->rules["DEFAULT"], $this->rules["USER_DEFINED"] );
    return $this;   
  }
  
  /* ADD CHILD
   * 
   * Funkce dostava vygenerovany formularovy input a formularovy label, ktery spoji a vypise na obrazovku vysledny formularovy prvek
   * 
   */
  public function AddChild( $control, $label ) {
    echo $label -> label . $control -> form;
  }
/* ADD TEXT INPUT
 * 
 * Funkce dovoluje vytvorit formularovy prvek typu - <input type="text" />
 * 
 * Pri vytvareni tridy predame pomoci parametru vsechny mozne nastaveni, ve tvaru:
 * AddTextInput ( $name, $label, $value, $cls, $id )
 * Tedy napr.:
 * AddTextInput ( "username", "Uzivatelske jmeno", "Zadejte uz. jmeno", "usernam_trida", "username_id" );
 * 
 * Tyto informace predame tride TextInput, ktera vygeneruje vysledny formularovy input
 * Dalsi doplnujici info predame tride Label, ktera nam vygeneruje vysledny LABEL ve tvaru <label for="id"> $label </label>
 * Vysledek spojime pomoci funkce AddChild a konecny formularovy prvek vypiseme
 * 
 */
  public function AddTextInput( $name = NULL, $label = NULL, $value = NULL, $cls = NULL, $id = NULL ) {
    if ( $id == "" ) { $id = $name; }
    $this -> id = $id;
    $control = new TextInput( $type = "text", $name, $value, $cls, $id );
    $label = new Label ( $label, $id );
    $this -> AddChild( $control, $label );
    return $this;
  }

/* ADD PASSWORD INPUT
 * 
 * Totozna jako funkce AddTextInput
 * 
 */
  public function AddPasswordInput( $name = NULL, $label = NULL, $value = NULL, $cls = NULL, $id = NULL ) {
    if ( $id == "" ) { $id = $name; }
    $this -> id = $id;
    $control = new TextInput( $type = "password", $name, $value, $cls, $id );
    $label = new Label ( $label, $id );
    $this -> AddChild( $control, $label );
    return $this;
  } 

/* ADD EMAIL INPUT
 * 
 * Totozna jako funkce AddTextInput
 * 
 */
  public function AddEmailInput( $name = NULL, $label = NULL, $value = NULL, $cls = NULL, $id = NULL ) {
    if ( $id == "" ) { $id = $name; }
    $this -> id = $id;
    $control = new TextInput( $type = "text", $name, $value, $cls, $id );
    $label = new Label ( $label, $id );
    $this -> AddChild( $control, $label );
    return $this;
  } 
  
 /* ADD SUBMIT INPUT
 * 
 * Totozna jako funkce AddTextInput
 * 
 */
  public function AddSubmitInput( $name = NULL, $label = NULL, $value = NULL, $cls = NULL, $id = NULL ) {
    if ( $id == "" ) { $id = $name; }
    $control = new TextInput( $type = "submit", $name, $value, $cls, $id );
    $label = new Label ( $label, $id );
    $this -> AddChild( $control, $label );
    return $this;
  } 
  
}

/* TEXT INPUT
 * 
 * Trida dostava pomoci parametru uzivatelsky definovane informace o formularovem inputu
 * A nasledne z nej sklada dany formularovy prvek a predava zpet
 * 
 */
class TextInput extends Forms {
  public function __construct( $type, $name, $value, $cls, $id ) {
    $this -> form = '<input type="'.$type.'" name="'.$name.'" value="'.$value.'" class="'.$cls.'" id="'.$id.'" onChange="validate(this)" />'."\n" . '<div class="validate_input" id="'.$id.'_validate"></div>'."\n"; 
  }
}

/* LABEL
 * 
 * Trida dostava pomoci parametru uzivatelsky definovane informace o formularovem labelu
 * A nasledne z nej sklada dany formularovy label a predava zpet
 * 
 */
class Label extends Forms {
  public function __construct( $label, $id ) {
    if ( $label != "" ) $this -> label = "\t".'<label for="'.$id.'">'.$label.'</label>';
    else $this -> label = "";
  }
}

?>

HTML Vytváření formulářů, příklad:

$forms = new Forms();
        $forms -> AddTextInput("username", "Vase jmeno", "Vlozte sve jmeno", "input_cls", "input_id") -> AddRule( "MAXLENGHT","50" );
        $forms -> AddPasswordInput("password", "Vase heslo", "Vlozte sve jmeno 2", "input2_cls", "input2_id") -> AddRule( "MAXLENGHT","40" );
        $forms -> AddEmailInput("email", "Vas emial:", "Vlozte svuj email", "email_cls", "email_id") -> AddRule( "MAXLENGHT","40", "MINLENGHT","30" );
        $forms -> AddSubmitInput("submit", "", "ODESLAT", "submit_cls", "submit_id");
Nahlásit jako SPAM
IP: 90.177.10.–
pajousek
~ Anonymní uživatel
5 příspěvků
22. 2. 2012   #2
-
0
-

Základních pár poznatků ... snad tě nakopnou správným směrem trochu (hlavně ta 4ka) :)

1. proč je název třídy množné číslo? instancuješ ($form = new Form()) JEDEN formulář, né více :)

2. proč ty public vlastnosti? chceš, aby ti někdo mohl pravidla takhle měnit zvenku? myslím si, že ne

3. přistupuješ k TextInput->form a Label->label ... určitě ti to nevyhazuje ani E_NOTICE? :)

4. proč třída TextInput dědí od formuláře? dědění je vztah "is" ... je snad textové políčko (a label) formulář? :) nikoliv -- formuláře obsahuje text inputy a labely, což je takzvaná kompozice (vztah "has")

Nahlásit jako SPAM
IP: 89.103.230.–
dObi0
Duch
22. 2. 2012   #3
-
0
-

#2 pajousek


Děkuji za cenné rady :)

1. Máš pravdu, snažím se, aby názvy tříd měly aspoň trochu hlavu a patu, a zde mě to bohužel netrklo, že jednotné číslo bude přeci jen logický správnější :)

2. No s vlastnostma viditelnosti ještě trochu bojuji. I když tak nějak teoretický vím, která co představuje, prakticky se stále bojím někde používat třeba Private vlastnosti, ale na to časem určitě kápnu.

3. Právě, že v tom nějak problém nevidím, a parser taky nic neháže, tak nevím.

4. V tom máš pravdu, automaticky jsem tam hodil dědičnost, vlastně ani nevím proč. 

Nahlásit jako SPAM
IP: 90.177.10.–
pajousek0
Duch
23. 2. 2012   #4
-
0
-

Private se právěže vůbec neboj, používej HLAVNĚ private ... většinu času budeš chtít co nejvíce skrýt vnitřní implementaci :)

Rozhodně by bylo lepší něco jako

<?php
$form = new Form();
$form->addText('name','Název)->addRule('required', true);
$form->render();

s např. takovými třídami ... je to jen naprosto hrubý nástřel a není tam vidět spousta té "logiky" pod pokličkou :)

<?php

class Form
{
	public function addText($name, $label) {}
	public function addSubmit($name, $label) {}
	public function addPassword($name, $label) {}
        public function add...
        public function render() {}
}

class FormElement
{
	public function __construct($type, $attributes, $label, $value) {}
        public function addRule($rule, $value) {}
	public function render() {}
}
Nahlásit jako SPAM
IP: 89.103.230.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 7 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý