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);