public static function computeItem(FormType $_type, $_item) { $item = static::$prototype[$_type->__toString()]; $countPrototype = count($item); $item = array_merge($item, $_item); // jesli rozszerzono prototyp - zabron if (count($item) !== $countPrototype) { throw new \InvalidArgumentException("Too many fields!"); } // jesli nie podano nazwy - zabron if (array_key_exists("name", $item) && $item["name"] === "") { throw new \InvalidArgumentException("Empty name is forbidden!"); } //W values przy sprawdzaniu czy wybrano jedna z opcji sprawdzamy przez == a nie === - mozemy ustawic wartosc jako int'a, a w formularzu przekazuje sie string. //By nie bylo problemu na pustym stringu (0 == "") zabraniam podawac wartosci "" jako wartosc przy select/radio/checkbox. //Byc moze w przyszlosci zostanie to poprawione i bedziemy rozrozniac "0" !== "" - wymaga to konwersji kluczy do int'a. Do rozwazenia i przemyslenia. Przy PHP 5.2 byly przy takim podejsciu jakies problemy, nie pamietam niestety jakie :( if (array_key_exists("values", $item) && is_array($item["values"]) && array_key_exists("", $item["values"])) { throw new \InvalidArgumentException("Empty value for select/radio/checkbox is forbidden!"); } return $item; }
public function add(FormType $_type, $_options) { static $added = array(); $item = FormType::computeItem($_type, $_options); if (array_key_exists("name", $item)) { if (isset($added[$item["name"]])) { throw new \InvalidArgumentException("Name '{$item["name"]}' already exists!"); } $added[$item["name"]] = true; } $item["type"] = $_type; $this->items[] = $item; }