Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP Forms Radio Buttons

Tags:

php

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/>";
    }
}

1 Answers

...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));
like image 171
Rob Avatar answered Sep 06 '26 08:09

Rob



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!