Skip to content

Instantly share code, notes, and snippets.

@deuterium7
Created August 1, 2017 09:45
Show Gist options
  • Save deuterium7/3d576df318cbf882948e8e85aba1d5e8 to your computer and use it in GitHub Desktop.
Save deuterium7/3d576df318cbf882948e8e85aba1d5e8 to your computer and use it in GitHub Desktop.
Zabornyi Alex
<?php
// Включение ошибок
ini_set( "display_errors", 1 );

// Массив полей с параметрами где есть тип поля, массив ошибок, обязательность поля, имя на русском, значение 
$allFields = [
    'name'    => ['type' => 'text', 'errors' => [], 'require' => true, 'value' => '', 'rusName' => 'Имя', 'checkLen' => true, 'class' => []],
    'surname' => ['type' => 'text', 'errors' => [], 'require' => true, 'value' => '', 'rusName' => 'Фамилия', 'checkLen' => true, 'class' => []],
    'age'     => ['type' => 'text', 'errors' => [], 'require' => false, 'value' => '', 'rusName' => 'Возраст', 'checkLen' => false, 'class' => []],
    'check1'  => ['type' => 'checkbox', 'errors' => [], 'require' => false, 'value' => '', 'rusName' => 'Чек', 'checkLen' => false, 'class' => []],
    'file[]'  => ['type' => 'file', 'errors' => [], 'require' => false, 'value' => '', 'rusName' => 'Файлы', 'checkLen' => false, 'class' => []]
];

//функция проверки полей на пустоту
function checkAllField(&$allFields)
{
    foreach ($allFields as $key => $value)
    {
        // сразу присваеваем значение полю если есть такое поле в посте и оно не пустое
        $allFields[$key]['value'] = (isset( $_POST[$key] )) ? $_POST[$key] : "";
        //проверяем на пустоту и длину поля, при этом т.к. не все поля обязательные добавляем проверку на обязательность
        if ( (!isset( $allFields[$key]['value'] ) || empty( $allFields[$key]['value'] )) && $allFields[$key]['require'] == true ) {
            //если возникает ошибка то запихиваем ее в массив ошибок
            $allFields[$key]['errors'][] = "Пустое поле " . $allFields[$key]['rusName'];
        } elseif ( strlen( $allFields[$key]['value'] ) < 2 && $allFields[$key]['checkLen'] == true ) {
            $allFields[$key]['errors'][] = "Короткое поле " . $allFields[$key]['rusName'];
        }
    }
}

//Функция проверки файлов
function checkFiles() {
	$errors = array(
        "1" => "Размер принятого файла превысил максимально допустимый размер.",
        "2" => "Размер загружаемого файла превысил значение.",
        "3" => "Загружаемый файл был получен только частично.",
        "4" => "Не выбран файл для загрузки.",
        "6" => "Отсутствует временная папка.",
        "7" => "Не удалось записать файл на диск.",
        "8" => "Программа остановилы загрузку файла."
    );

    if ( $_FILES['upload']['error'] == 0 ) {

    	for ($i = 0; $i < count($_FILES['file']['name']); $i++) {

			if ( $_FILES['file']['size'][$i] < 2097152 ) {

				$path_info = pathinfo($_FILES['file']['name'][$i]);
				$allows = array('txt','rtf','pdf','doc','docx');
				$path_info_name = $path_info['basename'];
				
				if ( in_array($path_info['extension'], $allows) ) {
					$hashname = md5(time().rand());
				
					move_uploaded_file(
						$_FILES['file']['tmp_name'][$i],
						$_SERVER['DOCUMENT_ROOT']."/".$hashname.".".$path_info['extension']
					);
					?>
					<p style="color: green;">
						<?php echo "Загружен файл '$path_info_name': "; ?>
					</p>
					<?php
				} else {
					?>
					<p style="color: red;">
						<?php echo "Загружаемый файл '$path_info_name' - не текстовый!!!"; ?>
					</p>
					<?php
				}
			} else {
				?>
				<p style="color: red;">
					<?php echo "<br>Превышен лимит загружаемого '$path_info_name' файла!!!"; ?>
				</p>
				<?php
			}	
		}
    } else {
    	?>
		<p style="color: red;">
			<?php echo $errors[$_FILES['upload']['error']]; ?>
		</p>
		<?php
    }
}

//Функция добавления классов полей
function addClass($className, &$fieldName) {
	$fieldName['class'][] = "$className";
}

//проверяем был ли передан пост и нужно ли вообще запускать валидацию
if ( count( $_POST ) > 0 ) {
    //запускаем валидацию    
    checkAllField( $allFields );

    if ( count( $_FILES ) > 0) {
    	checkFiles();
    }
}
?>

<!-- блок для добавления классов -->
<?php 
	addClass('upper', $allFields['name']);
	addClass('lower', $allFields['surname']);
?>


<form method="post" enctype="multipart/form-data">
    <?php
    // идем по всем полям 
    foreach ($allFields as $keyField => $valueField)
    {
        ?>
        <span><?= $valueField["rusName"] ?></span>
        <?php
        if ( $allFields[$keyField]['type'] == 'checkbox' ) {
        	if ( isset($_POST[$keyField]) ) {
        		?><input type="<?= $valueField["type"] ?>" name = "<?= $keyField ?>" class="<?= $valueField["class"]?>" checked/><?php // checkbox выбран
        	} else {
        		?><input type="<?= $valueField["type"] ?>" name = "<?= $keyField ?>" class="<?= $valueField["class"]?>"/><?php	// checkbox не выбран
        	}
        } elseif ( $allFields[$keyField]['type'] == 'file' ) {
        	?><input type="<?= $valueField["type"] ?>" name = "<?= $keyField ?>" class="<?= $valueField["class"]?>" multiple/><?php // формат для всех остальных
        } else {
        	?><input type="<?= $valueField["type"] ?>" value="<?= $valueField["value"] ?>" name = "<?= $keyField ?>" class="<?= $valueField["class"]?>"/><?php // формат для всех остальных
        }
        ?>
        <?php
        //проверяем ошибки у поля на текущей итерации 
        if ( count( $valueField["errors"] ) > 0 ) {
            ?>
            <div class="errors" style="color: red">
            <?php // implode объеденяет элементы массива в строку, соеденяя их тем что передается в первом параметре  ?>
            <?= implode( ", ", $valueField["errors"] ) ?>
            </div>
            <?php
        }
    }
    ?>
    <input type="submit" value="Отправить">
</form>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment