Обработка динамической формы №2

Vect0r

Новичок
В продолжение темы http://phpclub.ru/talk/threads/Обработка-динамической-формы.68136/

Почитал эту тему, но там вопрос не рассмотрен до того момента, который бы хотелось узнать. Опишу ситуацию:
Есть форма
PHP:
<input type="text" name="simple"> 
<input type="text" name="my_arr[el1]">
Для каждого из полей у меня есть класс formField, объекты которого содержат в том числе названия переменных из формы..
То есть допустим
PHP:
$field[1]->acronym = 'simple';
$field[2]->acronym = 'my_arr[el1]';
Мне надо в описании класса как-то получать переданные значения для последующей проверки полей.
В простом случае всё просто:
PHP:
$this->value = $_REQUEST[$this->acronym];
Однако для массивов эта тема не прокатывает, поскольку нет переменной $_REQUEST['my_arr[el1]'], а есть $_REQUEST['my_arr']['el1']
Было бы удобно сделать как-то так
PHP:
$temp_arr = $_REQUEST;
$val = 'temp_arr["'.implode('"]["', str_replace(']','',explode('[',$this->acronym))).'"]';  //в итоге в этой переменной получится нечто вроде 'temp_arr["my_arr"]["el1"]'
$this->value = $$val;
То есть вызвать переменную переменной, но так тоже нельзя. Можно только так
PHP:
$temp_arr = $_REQUEST;
$val = 'temp_arr';
$this->value = ${$val}['my_arr']['el1'];
Но это не очень удобно, потому что надо будет каждую размерность массива учитывать отдельно. Подскажите, есть ли какой-то более простой и универсальный способ получить данные? То есть такой, чтобы я мог в input указать массив любой размерности =)
 

craz

Нестандартное звание
PHP:
$temp_arr = $_REQUEST;
$val = 'temp_arr';
$this->value = ${$val}['my_arr']['el1'];
PHP:
foreach($_REQUEST["my_arr"] as $key=>$value){
 echo "ключ $key";
 echo "=его значение $value";
}
 

Vect0r

Новичок
Да это понятно, не дет. сад же, я вас умоляю...
А если $_REQUEST = array('my_arr'=>array('el1'=> array('el2'=>2))) , то опять дописывать код уже под 3-х-мерный массив? А потом 4-х и 5ти. Нужна помощь в создании универсального способа. Понимаю, что 10-мерный массив – это ОМГ и изврат, но хочется максимальной универсализации. Чтобы потом, создав переменную 3х-мерного массива, не получить ошибку.
 

craz

Нестандартное звание
как у вас так происходит? как они у вас вкладываются то?
 

Vect0r

Новичок
Ну, смотрите, если <input name="a[с]" value = 3>, то получаем $_REQUEST['a']['с']=3
Если <input name="a[с][d]" value = 4>, то $_REQUEST['a']['c']['d']=4
так ведь?
Поэтому нужно либо писать какую-то рекурсивную функцию, которая в зависимости от имени будет влезать всё дальше и дальше в $_REQUEST в попытке найти данные, либо делать в тупую различные обработчики для каждого нового измерения.
 

craz

Нестандартное звание
ну дальше то не будет вложенности!
$_REQUEST["formname"] - данные формы так?
$_REQUEST["formname"]["arrInput"] - данные всех инпут полей достаете и пользуетесь
 

Vect0r

Новичок
Терзают меня смутные сомнения, что я не был понят...
В общем, если ещё есть желание понять, чего я хочу, то приведу упрощённый листинг.

form.html
PHP:
<form action="receiver.php" method="post">
<input type="text" name="simple">
<input type="text" name="my_arr[el1]">
<input type="submit">
</form>
receiver.php
PHP:
class FormField     /// Это некий универсальный класс, который будет использоваться для всех полей формы
{
    function __construct($name) {
         $this->name = $name;
    }
    function getValue() {
         $this->value = $_REQUEST[$this->name];
    }
}

$f1 = new FormField("simple");
$f2 = new FormField("my_arr[el1]");
$f1->getValue();        // Здесь всё зашибись
$f2->getValue();        // А вот здесь ничего хорошего.
То есть нужен некий универсальный метод, который бы вытаскивал не только значения перменных, но и многомерных массивов.
 

craz

Нестандартное звание
Терзают меня смутные сомнения, что я не был понят...
В общем, если ещё есть желание понять, чего я хочу, то приведу упрощённый листинг.

form.html
PHP:
<form action="receiver.php" method="post">
<input type="text" name="simple">
<input type="text" name="my_arr[el1]">
<input type="submit">
</form>
receiver.php
PHP:
class FormField     /// Это некий универсальный класс, который будет использоваться для всех полей формы
{
    function __construct($name) {
         $this->name = $name;
    }
    function getValue() {
         $this->value = $_REQUEST[$this->name];
    }
}

$f1 = new FormField("simple");
$f2 = new FormField("my_arr[el1]");
$f1->getValue();        // Здесь всё зашибись
$f2->getValue();        // А вот здесь ничего хорошего.
if (is_array($this->value = $_REQUEST[$this->name])){} // у тебя тут другая логика должна быть
 

Vect0r

Новичок
Вот её то я и ищу! =)
Пока что единственное решение - вызов рекурсивной функции.
 

craz

Нестандартное звание
Вот её то я и ищу! =)
Пока что единственное решение - вызов рекурсивной функции.
что за рекурсивная логика?))))))) вы новое слово где то вычитали?

ваша функция в конце-то концов

PHP:
function getValue() {
         if ( is_array($_REQUEST[$this->name] ) ) {}
                $this->value = Array();
                foreach ($_REQUEST[$this->name] as $key=>$value){
                       $this->value[$key]=$value;
                }
         else {
             $this->value = $_REQUEST[$this->name];
         } 
        return $this->value;
    }
 

Vect0r

Новичок
ага, а теперь добавляем в форму <input type="text" name="a[c][d][e]">
Что выдаст ваша функция? Правильно, ничего хорошего. Чувствую, что сейчас вы допишите в функцию ещё парочку проверок на is_array. Не стоит.

Вот здесь и нужна рекурсия. Просто думал, что можно обойтись без неё, возможно, какими-то встроенными способами. Я вам с самого начала писал об универсальности способа.

P.S.: Кстати, про новое слово, это было обидно. Едва удержался от ответных оскорблений.
 

craz

Нестандартное звание
ага, а теперь добавляем в форму <input type="text" name="a[c][d][e]">
Что выдаст ваша функция? Правильно, ничего хорошего. Чувствую, что сейчас вы допишите в функцию ещё парочку проверок на is_array. Не стоит.

Вот здесь и нужна рекурсия. Просто думал, что можно обойтись без неё, возможно, какими-то встроенными способами. Я вам с самого начала писал об универсальности способа.

P.S.: Кстати, про новое слово, это было обидно. Едва удержался от ответных оскорблений.
офигительно, а нафик я в форму это добавлю? киньте-ка мне эту форму посмотреть где такое нужно.

Ниче оскорбляйтесь это иногда бывает полезно, особенно в случае еды супа вилкой.

P.s. Кстати вполне вероятно что я вот жил программил лет 5 и нифига не разу не встречался с вашей конкретной задачей, но это никак не влияет на способ и на то что ее можно решить.
 

Vect0r

Новичок
Конструктор форм я ваяю, поэтому название переменной может быть довольно экзотическим в зависимости от сексуальных предпочтений людей, использующих конструктор. Естественно, большинство людей вполне себе нормальные и адекватные, но нужно просчитать и наличие ужасных извращенцев и попытаться удовлетворить и их потребности :)
 
  • Like
Реакции: craz

craz

Нестандартное звание
Конструктор форм я ваяю, поэтому название переменной может быть довольно экзотическим в зависимости от сексуальных предпочтений людей, использующих конструктор. Естественно, большинство людей вполне себе нормальные и адекватные, но нужно просчитать и наличие ужасных извращенцев и попытаться удовлетворить и их потребности :)
но всеже поймите, что вы должны ограничить этих педофилов, а не позволять им сношаться с вашими формочками!

Таким образом задача сводиться к тому чтобы ограничить пользователя в создании сложных конструкций содержащих вложенные поля, и начать кушать суп как все ложкой...

Да и у вас и так много проблем кроме этой я боюсь(контруктор форм же!), чтобы так долго зацикливаться на этом
 

Vect0r

Новичок
Всё... расциклился =)
Если кому вдруг захочется так же, как и мне, дать доступ к сокровенному по полной, то вот решение =)

PHP:
	function getValue($val_name=null, $val_arr=null) {
		if($val_name===null)	$val_name = $this->acronym;
		if($val_arr===null)		$val_arr = $_REQUEST;
		$exploder = explode('[', $val_name);
		if(count($exploder)>1)
			{
			$new_arr = $val_arr[$exploder[0]];
			$val_name = str_replace(']','',$exploder[1]);
			unset($exploder[0]); unset($exploder[1]);
			$val_name .= (!empty($exploder)) ? '['.implode('[', $exploder) : '';
			return $this->getValue($val_name, $new_arr);
			}
		else
			{
			echo $val_name.'-'.count($exploder).'<br>';

			return $val_arr[$val_name];
			}
	}
Соответственно, где-то в классе вызываем $this->value=$this->getValue();
 

Mamont

Новичок
PHP:
class FormField
{
    function __construct($name) {
      $this->name = $name;
    }
    function getValue() {
      $keys = explode( '[', str_replace(']','',$this->name) );
      $value = &$_POST;
      foreach( $keys as $key ){
         if( !is_array($value) ) return false;
         $value = &$value[$key];
      }
      return $value;
    }
}
 
Сверху