formularz czerpiący dane z funkcji

0

Mam takie polecenie:

Napisac program słuacy do wprowadzania danych (formularz). Posluyc sie
poniszym prototypem funkcji. Oznaczenia parametrów: $label definiuje etykiety
do pól, $form definiuje nazwe pliku PHP odbierajacego dane z formularza, $submit
definiuje napis wyswietlany na przycisku, $data definiuje domyslne dane
wyswietlane na formularzu, $enable definiuje czy dane pole jest do edycji (0 -
niedostepne, 1 - nieedytowalne, 2 - edytowalne), $mess jest komunikatem który ma
sie wyswietlic na górze strony. Oprócz pliku PHP zawierajacego formularz
(zad5_form.php) naley równie napisac plik PHP odbierajacy dane z formularza
(zad5_wynik.php) i dopisujacy je w nowej linii na koncu pliku tekstowego
(zad5_dane.txt) – kada dana musi byc oddzielona znakiem separatora „%”.>

kod pomocniczy:

<?php
//formatka do wprowadzania danych
function displayForm($label=array(),$form,$submit,$data=array(),$enable=array(),$mess)
{
}// *** end displayForm
// program
$label=array('numer','imie','nazwisko','grupa');
$data=array('100','Anna','Kowalska','K0I');
$enable=array(0,1,0,1);
displayForm($label,'zad5_wynik.php', 'Wprowadz dane', $data, $enable, 'Dane studenta');
?>

Jak to ogryźć? Od czego zacząć?
Tworząc formularz by wysłać dane, muszę ręcznie powpisywać nazwy pól itp pomiędzy <form></form>? Nie ma możliwości by te dane jakośzassać z funkcji php?

0

Musisz wykorzystać ten kod pomocniczy? Toż to jakiś syf..

0

No właśnie niestety muszę (gdybym nie musiał to bym sobie z tym poradził sam).
Z tym że nie wiem jak to wykorzystać bo tak jak pisałem nie znam sposobu by formularz <form></form> w jakiś sposó potrafił ze skryptu php zassać takie informacje jak wymagane pola czy nazwe przycisku wyślij.

1

Nie pisz nigdy takich funkcji... A zwłaszcza nie twórz takich potworów, gdzie kolejność wartości w 3 zależnych od siebie tablicach ma znaczenie..

Twoim zadaniem jest stworzyć funkcję fabrykę. Przekazujesz całą masę argumentów, a funkcja zwraca Ci kod HTML.
Zacznijmy więc od testu:

<?php
// test_utils.php - funkcja pomocniczna dla testów, nie musisz się nią przejmować :)
function assertEqualHTMLStructure($expected, $actual)
{
    $from = ['/\>[^\S ]+/s', '/[^\S ]+\</s', '/(\s)+/s', '/> </s'];
    $to = ['>', '<', '\\1', '><'];

    assert(
        preg_replace($from, $to, $expected) === preg_replace($from, $to, $actual),
        "Oczekiwany HTML różni się od przekazanego wzoru"
    );
}
<?php
// zad5_form_test.php

require "zad5_form.php";
require "test_utils.php"; // tu znajduje się nasza funkcja pomocnicza, bardzo prymitywna porównywarka HTML

function test_display_form_returns_form_skeleton_without_inputs_when_when_label_data_and_enable_are_empty()
{
    $label = array();
    $data = array();
    $enable = array();

    $form = displayForm($label, "zad5_wynik.php", "Wprowadz dane", $data, $enable, "Dane studenta");

    $expected = <<<HTML
<form action="zad5_wynik.php">
    <h1>Dane studenta</h1>
    <input type="submit" value="Wprowadz dane">
</form>
HTML;

    assertEqualHTMLStructure($expected, $form);
}

function test_display_form_returns_inputs()
{
    $label = array('numer');
    $data = array(); // tym sie na razie nie przejmujemy
    $enable = array(2); // tym też

    $form = displayForm($label, "zad5_wynik.php", "Wprowadz dane", $data, $enable, "Dane studenta");

    $expected = <<<HTML
<form action="zad5_wynik.php">
    <h1>Dane studenta</h1>
    <label for="numer">
        Numer
        <input type="text" name="numer" id="numer">
    </label>
    <input type="submit" value="Wprowadz dane">
</form>
HTML;

    assertEqualHTMLStructure($expected, $form);
}

function test_display_form_returns_inputs_with_defaults()
{
    $label = array('numer');
    $data = array(100);
    $enable = array(2);

    $form = displayForm($label, "zad5_wynik.php", "Wprowadz dane", $data, $enable, "Dane studenta");

    $expected = <<<HTML
<form action="zad5_wynik.php">
    <h1>Dane studenta</h1>
    <label for="numer">
        Numer
        <input type="text" name="numer" id="numer" value="100">
    </label>
    <input type="submit" value="Wprowadz dane">
</form>
HTML;

    assertEqualHTMLStructure($expected, $form);
}

function test_display_form_returns_readonly_inputs()
{
    $label = array('numer');
    $data = array(); // tym sie teraz
    $enable = array(1);

    $form = displayForm($label, "zad5_wynik.php", "Wprowadz dane", $data, $enable, "Dane studenta");

    $expected = <<<HTML
<form action="zad5_wynik.php">
    <h1>Dane studenta</h1>
    <label for="numer">
        Numer
        <input type="text" name="numer" id="numer" readonly="readonly">
    </label>
    <input type="submit" value="Wprowadz dane">
</form>
HTML;

    assertEqualHTMLStructure($expected, $form);
}


test_display_form_returns_form_skeleton_without_inputs_when_when_label_data_and_enable_are_empty();
test_display_form_returns_inputs();
test_display_form_returns_inputs_with_defaults();
test_display_form_returns_readonly_inputs();

Twoim zadaniem jest tak zaimplementować funkcję displayForm, żeby te 4 testy przeszły. Każdy z nich sprawdza jedno z wymagań, które są ukryte w treści tego powalonego zadania.

Swoją drogą jakiś imbecyl pisał te wymagania. Dlaczego niby 2 oznacza, że input ma być edytowalny.. to powinno być domyślne.

Na zachętę uzupełnię funkcję o pierwszy test:

<?php

function displayForm($label = array(), $form, $submit, $data = array(), $enable = array(), $mess)
{
    $formTemplate = <<<HTML
<form action="%s">
    <h1>%s</h1>
    <input type="submit" value="%s">
</form>
HTML;

    return sprintf($formTemplate, $form, $mess, $submit);
}

Jeżeli masz pytania to chętnie odpowiem, jeżeli nie dasz rady tego zrobić, to 200 zł i masz zadanie do północy.

Tak jeszcze teraz mi przyszło do głowy, że można jeszcze delikatnie ulepszyć design tego kodu. Zamiast magicznych cyferek użyj stałych.

define("UNAVAILABLE", 0);
define("UNEDITABLE", 1);
define("EDITABLE", 2);

// Teraz ktoś czytający twój kod nie bedzie sie zastanawiał co to za jakiś ciąg binarny
$enable=array(0,1,0,1)
// vs
$enable=array(UNAVAILABLE, UNEDITABLE, UNAVAILABLE, UNEDITABLE);

1 użytkowników online, w tym zalogowanych: 0, gości: 1