(PHP) Хочу поделится полезной функцией

GetAnswe
Дата: 10.07.2006 13:56:27
Часто приходится формировать списки (select) в форме, довольно утомительная процедура, особенно если тащишь инфу из базы или ещё от куда нибудь и надо еще и выделить в списке (select) один из элементов (options). Хочу поделится одним из моих методов созданный именно для этого. Думаю пригодится. Комментарии приветствуются!

/**
* Класс для работы с формами.
*/
class Form {

	/** 
	* Метод для создания списка (options) для выпадающего меню (select).
	* Методу можно передавать два аргумента: первый - значения для создания "options",
	* второй - значение, которое надо выделить в списке.
	* 
	* Второй аргумент можно опускать - в этом случаем будет выделен 1-й элемент.
	* Первый аргумент может быть в виде строки или в виде массива.
	*
	* Если аргумент представлен в виде массива, то возможны два варианта.
	* Массив может быть как одномерным так и многомерным.
	* Если массив многомерный, то каждый элемент массива должен состоять из 2-х элементов:
	* первый элемент будет преобразован в текст списка, второй в значения и т.д.
	* Если массив одномерный, то каждый элемент массива будет преобразован в элемент списка,
	* при этом текст и значения элемента списка будут идентичные.
	*
	* Если аргумент представлен в виде строки, то возможны также два варианта.
	* Строка может быть представленна в виде
	* "текст списка => значение списка[, текст списка -> значение списка ...]"
	* или в виде "текст списка[, текст списка ...]". Во втором варианте значение списка
	* будет одиноково с текстом списка.
	*/
	function DoOptions() {
		$args   = func_get_args();
		$arg1   = $args[0];

		// Если значения для преобразования представлены в виде строки,
		// то преобруем её в массив.
		if (is_string($arg1)) {

			// Определяем, как представлена строка для преобразования, и в зависимости от этого
			// формируем одномерный или многомерный массив.
			$arg1 = str_replace(' ', '', $arg1);
			$arg1 = explode(',', $arg1);
			if (strstr($arg1[0], '=>'))
				for($i = 0; $i < count($arg1); $i++)
					$arg1[$i] = explode('=>', $arg1[$i]);
		}

		// Определяем, существует ли значение для списка (одномерный или многомерный массив),
		// если нет, то присваиваем значению списка текст списка.
		$options = '';
		if (is_array($arg1[0])) {

			// Формируем список
			$options = '';
			foreach ($arg1 as $tmp) {
				$text  = $tmp[0];
				$value = $tmp[1];

				// Выделяем тот элемент списка который передан в качестве 2-го параметра.
				$selected = (isset($args[1]) && $args[1] == $value)?
				            	'selected':
				            	'';
				$options .= "<option value=\"$value\" $selected>$text</option>\n";
			}
		} else {
			foreach ($arg1 as $text) {

				// Выделяем тот элемент списка который передан в качестве 2-го параметра.
				$selected = (isset($args[1]) && $args[1] == $text)?
				            	'selected':
				            	'';
				$options .= "<option value=\"$text\" $selected>$text</option>\n";
			}
		}
		return $options;
	}
}
Robert Tappan Moris
Дата: 10.07.2006 14:20:11
В случае, когда первый элемент указывается как строка, теряются все пробелы. К тому же в этом случае нужно поменять местами "текстсписка" и "значениесписка", чтобы не путать, людей пользующихся ассоциативными массивами.
	DoOptions("текст списка => значение списка");
выводит
	<option value="значениесписка" >текстсписка</option>
Robert Tappan Moris
Дата: 10.07.2006 14:37:41
При решении, выделять ли текущий пукнт лучше пробел перед "selected" вынести в переменную, ведь он нужен только когда есть слово "selected".
	$selected = (isset($args[1]) && ($args[1] == $text))?
	    ' selected':
	    '';
	$options .= "<option value=\"$text\"$selected>$text</option>\n";

Конечно лишний пробел - это фигня, но все-таки. Зачем нужно таскать с собой то, что на самом деле не нужно?
GetAnswer
Дата: 10.07.2006 14:45:51
По поводу пробелов я и не подумал, спасибо.
Robert Tappan Moris
Дата: 10.07.2006 16:10:32
Ещё не понятно зачем заводить фукнцию в класс? Чтобы больше писать при вызове?
Пчеловод
Дата: 10.07.2006 16:54:39
а HTML_Form нельзя использовать?
GetAnswer
Дата: 10.07.2006 17:33:19
По поводу класса - это просто один из методов этого класса.
А по поводу использования HTML_Form, что то я не понял, о чём Вы?
Пчеловод
Дата: 10.07.2006 17:46:03
об этом - класс для работы с HTML-формами.
GetAnswer
Дата: 10.07.2006 18:13:01
Там нету аналога моего метода, причём в моём методе формировать Option можно из строки 2-мя способами и из массива также 2-мя способами, что довольно таки удобно при разных задачах
Пчеловод
Дата: 11.07.2006 09:13:24
GetAnswer
Там нету аналога моего метода, причём в моём методе формировать Option можно из строки 2-мя способами и из массива также 2-мя способами, что довольно таки удобно при разных задачах
Конечно нету! Пировские классы ведь "студенты" пишут, и вообще они мало что в программировании смыслят :)
А теперь читаем внимательно описание класса:
addSelect [line 563]
void addSelect( string $name, string $title, array $entries, [mixed $default = null], [int $size = 1], [string $blank = ''], [bool $multiple = false], [string $attr = ''], [string $thattr = HTML_FORM_TH_ATTR], [string $tdattr = HTML_FORM_TD_ATTR])

Adds a select list to the list of fields to be processed by display()

NOTE: In order for defaults to be automatically selected in the output, the PHP data types of the $default must match the data types of the keys in the $entries array.

See: HTML_Form::display(), HTML_Form::displaySelect(), HTML_Form::displaySelectRow(), HTML_Form::returnSelect(), HTML_Form::returnSelectRow()
Access: public

Parameters:
string $name — the string used in the 'name' attribute
string $title — the string used as the label
array $entries — an array containing the <options> to be listed. The array's keys become the option values and the array's values become the visible text.
mixed $default — a default value for the element
int $size — an integer saying how many rows should be
string $blank — if this string is present, an <option> will be added to the top of the list that will contain the given text in the visible portion and an empty string as the value
bool $multiple — a bool saying if multiple choices are allowed
string $attr — a string of additional attributes to be put in the element (example: 'id="foo"')
string $thattr — a string of additional attributes to be put in the <th> element (example: 'class="foo"')
string $tdattr — a string of additional attributes to be put in the <td> element (example: 'class="foo"')