All I'm trying to do is generate a form with text input fields and buttons in the coding style below. The text input fields are working fine. However, the radio button class is not. The radio button class should have a title for the group and the addOption function should show each option with a radio button. When I test my code, there's no title "Number of Scoops" and only one radio button for "Three Scoops" and not for "One Scoop" and "Two Scoops." What am I doing wrong? Here's my code:
IceCreamForm.php:
<?php
require_once 'Form.php';
require_once 'RadioButton.php';
require_once 'TextInput.php';
require_once 'Validator.php';
$form = new Form();
$form -> addInput(new TextInput("First Name: ", "firstName"));
$form -> addInput(new TextInput("Last Name: ", "lastName"));
$form -> addInput(new TextInput("Ice Cream Flavor: ", "iceCreamFlavor"));
$radio = new RadioButton("Number of Scoops: ");
$radio -> addOption("One Scoop", "one");
$radio -> addOption("Two Scoops", "two");
$radio -> addOption("Three Scoops", "three");
$form -> addInput($radio);
echo $form -> generateHTML();
Form.php:
<?php
class Form
{
const GET = "GET";
const POST = "POST";
private $action = "someLocation.php";
private $inputs = array();
private $method = "POST";
public $form = "";
public $name = "";
function __construct()
{
}
function addInput(TextInput $input)
{
$this -> inputs[] = $input;
}
function getAction(): string
{
return $this -> action;
}
function getMethod(): string
{
return $this -> method;
}
function setAction(string $action)
{
$this -> action = $action;
return $this;
}
function setMethod(string $method)
{
$this -> method = $method;
return $this;
}
function set($param, $value)
{
$this -> $param = $value;
}
function generateHTML(): string
{
$this -> form = '<form action="' . $this -> getAction() . '"
method="' . $this -> getMethod() . '">';
foreach ($this -> inputs as $input)
{
$this -> form .= $input -> generateHTML();
}
$this -> form .= '</form>';
return $this -> form;
}
}
TextInput.php:
<?php
class TextInput
{
const TYPE = "text";
private static $REQUIRED = "REQUIRED";
private $defaultValue;
private $id;
private $label;
private $name;
private $onNewLine;
private $required = false;
private $type;
function __construct($label = "", $name = "", $defaultValue = "", $id = "", $onNewLine = "", $required = false, $type = self::TYPE)
{
$this -> defaultValue = $defaultValue;
$this -> id = $id;
$this -> label = $label;
$this -> name = $name;
$this -> onNewLine = $onNewLine;
$this -> required = $required;
$this -> type = $type;
}
public function generateHTML():string
{
$req = "";
if ($this -> required == true)
{
$req = self::$REQUIRED;
}
return "<label>$this->label</label><input id='$this->id' type='$this->type' name='$this->name' onNewLine='$this->onNewLine' $req/><br/>";
}
}
RadioButton.php:
<?php
require_once 'TextInput.php';
class RadioButton extends TextInput
{
const TYPE2 = "radio";
private $selected = false;
private $type;
function __construct($selected = false, $type = self::TYPE2)
{
$this -> selected = $selected;
$this -> type = $type;
}
function addOption(string $label, string $value)
{
$this -> label = $label;
$this -> value = $value;
}
public function generateHTML():string
{
$req = "";
if ($this -> required == true)
{
$req = self::$REQUIRED;
}
return "<label>$this->label</label><input id='$this->id' type='$this->type' value='$this->value' onNewLine='$this->onNewLine' $req/><br/>";
}
}
...there's no title "Number of Scoops"...
Because your RadioButton constructor doesn't set a title. Only $selected and $type.
...and only one radio button for "Three Scoops" and not for
"One Scoop" and "Two Scoops."...
Because your addOption method overwrites the previously set label and value. Try adding them to an array.
function addOption(string $label, string $value) {
$this->options[] = [
'label' => $label,
'value' => $value,
];
}
Then in your generateHTML()...
return join('', array_map(function($item) {
return sprintf('<label>%s</label> <input type="radio" value="%s">', $item['label'], $item['value']);
}, $this->options));
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With