PHP: отправить форму с собой и визуализировать различные элементы страницы? - PullRequest
0 голосов
/ 30 января 2012

Я никогда не делал этого раньше и просто нужен маленький совет, как это сделать ...

У меня есть файл index.php с простой контактной формой.

<form id="contactform" method="post" action="<?php echo $_SERVER["SCRIPT_NAME"] ?>">

Файл index.php имеет следующий скрипт сверху.

<!DOCTYPE html>
<html dir="ltr" lang="en-US">

<?php

    //Vars
    $Name = Trim(stripslashes($_POST['author']));
    $EmailFrom = Trim(stripslashes($_POST['email']));
    $Subject = Trim(stripslashes($_POST['subject']));
    $Type = Trim(stripslashes($_POST['type']));
    $Comment = Trim(stripslashes($_POST['message']));
    $EmailTo = "address@something.com";

    //Validation
    $valid = true;
    if ( $Name == "" ) $valid = false;
    if ( isValidEmail( $EmailFrom ) == 0 ) $valid = false;
    if ($Subject == "") $valid = false;
    if ($Comment == "") $valid = false;
    function isValidEmail( $email = null ) {
        return preg_match( "/^[\d\w\/+!=#|$?%{^&}*`'~-][\d\w\/\.+!=#|$?%{^&}*`'~-]*@[A-Z0-9][A-Z0-9.-]{1,61}[A-Z0-9]\.[A-Z]{2,6}$/ix", $email );
    }

    //Body
    $Body = $Type;
    $Body .= "\n\n";
    $Body .= $Comment;

    //Headers
    $email_header = "From: " . $EmailFrom . "\r\n";
    $email_header .= "Content-Type: text/plain; charset=UTF-8\r\n";
    $email_header .= "Reply-To: " . $EmailFrom . " \r\n";

    //Send
    if ($valid)
        $success = mail($EmailTo, $Subject, $Body, $email_header);

?>

У меня два вопроса сейчас:

1.) Как именно я могу рендерить / не рендерить определенные вещи, когда проверка прошла неправильно, или при отправке письма возвращается ошибка?

например. Я знаю, что могу это сделать!

        if ( !$valid )
            print "Failed to make contact. Enter valid login credentials! <a href='/#contact' title='try again'>try again?</a>";

        if ( $success )
            print "Successfully made contact.";
        else
            print "Failed to make contact. <a href='/#contact' title='try again'>try again?</a>"; */

    ?>

Однако $valid всегда будет неправильным при загрузке страницы, если не отправлять форму, а также электронное письмо всегда будет возвращать сообщение об ошибке при загрузке первой страницы. Как я могу отображать или не отображать определенные вещи только при отправке формы?

например. При отправке формы и возвращении успеха я больше не хочу отображать #contactform. Я просто хочу напечатать «Успешно установленный контакт» в h1 или около того.

Как я могу это сделать? Это, наверное, довольно просто, я просто не могу найти решение для себя.

2.) При использовании $_SERVER["SCRIPT_NAME"] или PHP_SELF в качестве действия URL после отправки формы всегда изменится на «mydomain.com/index.php». Могу ли я предотвратить это? Я хочу предоставить сам файл index.php, но мне просто не нравится, когда в URL записывается /index.php. Можно ли это предотвратить?

Спасибо за вашу помощь!

1 Ответ

1 голос
/ 30 января 2012

Матовый,

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

if( isset($_POST['Submit']) ){  //only attempt to display if form submitted.
    //Your code here
}

Что касается не включения каталога в действие формы, есть много способов сделать это, но вот один:

$scriptString= explode('/',$_SERVER['SCRIPT_NAME']);
$scriptSize = count($scriptString)-1;
$script = $scriptString[$scriptSize];

А затем используйте $ script в действии формы.

...