intro
Иногда возникает задача вставить на страницу форму обратной связи, ну или вообще какую нибудь форму для отправки информации на почтовый ящик. И вот решил я это дело несколько автоматизировать. Создал простой класс который позволяет создавать форму и отправлять данные из нее мне на почту. Ключевые возможности, настраиваемый стиль каждого поля, возможность передачи вашему скрипту для дальнейшей обработки формы, редирект на вашу страниц после отправки, и возвращение результата прямиком на страницу с формой ajax’ом.

Теперь подробнее о открытых методах класса

SimpleFeedBack

SimpleFeedBack($flag,$url), flag использовать ajax = true/false, url куда отсылать данные формы (параметры можно задать позже в своих методах).
setDefault($flag), flag тоже самое что и в конструкторе класса.
setUrl($url), url тоже что и в конструкторе.
addInput($id,$caption), addTextArea($id,$caption,$cols,$rows), добавляет в форму поле IBPUT и TEXTAREA соответственно, id параметр ID в хтмл, должен быть уникальным для каждого добавленного поля, в CSS именно для id и пишутся стили. caption описание, то что видит человек на странице перед полем ввода. rows, cols не обязательные параметры, по умолчанию оба = 15, влияют на размер поля textarea, но кто этого не знает).
setSubmitValue($str), изменяет надпись на кнопке субмит, по умолчанию «submit»
getField($id), возвращает хтмл код пары описание/поле ввода, по уникальному ID
show(), возвращает всю форму.

код класса

class SimpleFeedBackForm {
    private $sendDefault=true;
    private $url="";
    private $aParamWebForm=Array();
    private $i1=0;
    private $i2=0;
    private $submitValue="submit";

    public function __construct($flag=true,$url=""){
        $this->url=$url;
        $this->sendDefault=$flag;
    }
    public function setDefault($b){
        $this->sendDefault=$b;
    }
    public function setSubmitValue($str){
        $this->submitValue=$str;
    }

    public function setUrl($scriptURL){
        $this->url=$scriptURL;
    }

    public function addInput($id,$caption){
        if (empty($id)){$id="field"+$this->i1;}
        if (empty($id)){$id="field"+$this->i1;}
        $this->i1++;
        
        $this->addToArray(1,$id,$caption,array());
    }
    public function addTextArea($id,$caption,$cols=15,$rows=15){
        if (empty($id)){$id="field"+$this->i1;}
        if (empty($id)){$id="field"+$this->i1;}
        $this->i1++;
        
        $this->addToArray(2,$id,$caption,array("cols"=>$cols,"rows"=>$rows));
    }

    private function addToArray($i,$id,$caption,$adop){        
        $this->aParamWebForm[$id]=count($adop)==0 ? array($i,$caption) : array($i,$caption,$adop);
    }
    public function getField($id){
        
        if (array_key_exists($id, $this->aParamWebForm)){
            
            switch ($this->aParamWebForm[$id][0]){
                case 1:
                    return '<div id="'.$id.'"><span>'.$this->aParamWebForm[$id][1].'</span><br/><input type="Text" name="'.$id.'" value=""></div>';
                    break;
                case 2:                    
                    return '<div id="'.$id.'"><span>'.$this->aParamWebForm[$id][1].'</span><br/><textarea cols="'.$this->aParamWebForm[$id][2]['cols'].'" rows="'.$this->aParamWebForm[$id][2]['rows'].'" type="Text" name="'.$id.'"></textarea></div>';
                    break;
                default:
                    return "";
            }
        }else{            
            return null;
        }
    }
    public function show(){
        $this->getHiddenValues();
        if ($this->sendDefault==true){
            $ascript=AjaxWeb::getAjaxWeb();
        }
        print '<div id="simpleFeedBack">';
        print  $this->sendDefault==true ? $ascript->getScript() : '';
        print '<form action="'.$this->url.'" method="post" '.($this->sendDefault==true? 'OnSubmit="sendRequest(); return false"' : '').'>';
        print $this->getAllFields();
        print '<input type="Submit" value="'.$this->submitValue.'">';
        print $this->getHiddenValues();
        print '</form>';
        print '</div>';

    }

    private function getHiddenValues(){
        $hidden='<input type="hidden" name="'.(rand(1,9)).'_Default" value="'.($this->sendDefault==true ? 1 : 0).'">';
        foreach ($this->aParamWebForm as $key=>$value){
            $hidden.='<input type="hidden" name="'.(rand(1,9)).'_'.$key.'" value="'.$value&#91;1&#93;.'">';
        }
        return $hidden;
    }
    private function getAllFields(){
        $out="";
        foreach ($this->aParamWebForm as $id=>$value){
            $out.=$this->getField($id);
        }
        return $out;
    }
}

class AjaxWeb{
    private static $ac=null;
    private function __construct(){}
    public static function getAjaxWeb(){
        
        if (self::$ac==null){
            self::$ac=new AjaxWeb;
        }
        return self::$ac;
    }
    public function getScript(){
        return '<script language="JavaScript">

      function createXMLHttp() {
        if(typeof XMLHttpRequest != "undefined") { // для браузеров аля Mozilla

          return new XMLHttpRequest();
        } else if(window.ActiveXObject) { // для Internet Explorer (all versions)
          var aVersions = ["MSXML2.XMLHttp.5.0", "MSXML2.XMLHttp.4.0",
                   "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp",
                   "Microsoft.XMLHttp"
                   ];
          for (var i = 0; i < aVersions.length; i++) {
            try { //
              var oXmlHttp = new ActiveXObject(aVersions&#91;i&#93;);

              return oXmlHttp;
            } catch (oError) {

            }
          }
          throw new Error("Невозможно создать объект XMLHttp.");
        }
      }
	   function getRequestBody(oForm) {
        var aParams = new Array();
        for(var i = 0; i < oForm.elements.length; i++) {
          var sParam = encodeURIComponent(oForm.elements&#91;i&#93;.name);
          sParam += "=";
          sParam += encodeURIComponent(oForm.elements&#91;i&#93;.value);
          aParams.push(sParam);
        }
        return aParams.join("&");
      }
	  function sendRequest() {
        var oForm = document.forms&#91;0&#93;;
        var sBody = getRequestBody(oForm);
        var oXmlHttp = createXMLHttp();

        oXmlHttp.open("POST",oForm.action, true);
        oXmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

        oXmlHttp.onreadystatechange = function() {
          if(oXmlHttp.readyState == 4) {
            if(oXmlHttp.status == 200) {
              saveResult(oXmlHttp.responseText);
            } else {
              saveResult("Ошибка: " + oXmlHttp.statusText);
            }
          }
        };

        oXmlHttp.send(sBody);
      }

      function saveResult(sText) {
        var sElem = document.getElementById("divStatus");
        sElem.innerHTML = sText;
      }
</script>
<div id="divStatus"></div>';
    }
}

SimpleServer

за обработку и отправку данных формы на почту отвечает класс SimpleServer, он умеет, не поверите, отправлять почту, возвращать результат если выбран вариант работы ajax, либо редирект на заданную вами страницу после отправки письма.
методы класса:
SipmpleServer($email,$strOk,$strBad,$redirect), email обязательный параметр, куда отправлять почту, strOk, strBad при выборе ajax возвращает строку соответствующую строку при успешной и нет выполнении скрипта, redirect страницу на которую будет отправлен пользователь после отправки данных, nonAjax)
setEmail($email), email ваша почта, на случай если в конструкторе она уже успела устареть.
setSubject($str), тема письма
setHeader($str), дополнительные заголовки в письмо, можно написать от кого, задать кодировку, абсолютно что душе угодно, согласно RFC.
setOkString($str), setBadString($str), ответ скрипта от результатов работы.
setRefreshURL($url), для nonAjax работы, инструкция куда послать пользователя.
setParam($array), какие поля представляют интерес для скрипта (помните про ID, вот их то он ищет в POST), если массив пуст, то обрабатывается весь $_POST, array это массив, надо быть внимательным. Оптимально оставлять его пустым.
work(), собственно запускает процесс обработки и отправки письма и сопутствующие процедуры)

код SimpleServer

class SimpleServer {
    private $strOk="";
    private $strBad="";
    private $refreshUrl=null;
    private $sendTo=null;

    private $subj="";
    private $header=null;
    private $param=array();

    public function __construct($email,$strOk="Ok",$strBad="Bad",$refresh=null){
        $this->setEmail($email);
        $this->setOkString($strOk);
        $this->setBadString($strBad);
        $this->setRefreshURL($refresh);
    }
    public function setSubj($str){
        $this->subj=$str;
    }
    public function setEmail($str){
        $this->sendTo=$str;
    }
    public function setOkString($str){
        $this->strOk=$str;
    }
    public function setBadString($str){
        $this->strBad=$str;
    }
    public function setRefreshURL($url){
        $this->refreshUrl=$url;
    }
    public function setParam($array){
        $this->param=$array;
    }
    public function setHeader($string){
        $this->Header=$string;
    }
    public function work(){
        $p=Prepare::getPrepare();
        list($ret,$body)=$p->get();
        $mail=Mail::getMail();
        $flag=$mail->mailMe($this->sendTo,$body,$this->subj,$this->header);
        if ($ret==1){
            if ($flag==true){
                print $this->strOk;
            }else{
                print $this->strBad;
            }
        }else{
            header('Location: '.$this->refreshUrl.'');
            exit;
        }
        
    }
}

class Mail{
    private static $m=null;    
    private function __construct(){
    }
    public static function getMail(){
        if (self::$m==null){
            self::$m=new Mail;
        }
        return self::$m;
    }
    public function mailMe($to,$body,$subj,$header){
        if (mail($to,$subj,$body,$header)){
            return true;
        }else{
            return false;
        }
    }
}
class Prepare{
    private static $p=null;
    private $array=array();
    private $arrayHash=array();
    private $arrayHiddenValue=array();

    private function __construct(){        
    }
    public static function getPrepare(){
        if (self::$p==null){
            self::$p=new Prepare;
        }
        return self::$p;
    }

    private function parse(){
        if (!empty($_POST)){
            
        }
        if ($this->array==null){
            foreach ($_POST as $key=>$value){
                if (!preg_match("/^[0-9]{1}_(.+?)$/",$key)){
                    $this->arrayHash[$key]=$value;
                }
            }
        }else{
            foreach ($array as $key){
                $this->arrayHash[$key]=empty($_POST['$key']) ? '' : $_POST['$key'];
                if (preg_match("/[0-9]{1}_(.+?)/",$key,$a)){}
            }
        }
    }
    private function getHiddenValues(){
        $keys=array_keys($_POST);
        
        foreach ($keys as $key){
            if (preg_match("/^[0-9]{1}_(.+?)$/",$key,$temp)){
                $this->arrayHiddenValue[$temp[1]]=$_POST[$temp[0]];
            }
        }
        
    }
    public function get($array=array()){
        $this->array=$array;
        
        $this->parse();
        $this->getHiddenValues();

        return array($this->arrayHiddenValue['Default'],$this->getBody());
    }

    private function getBody(){
        $out="";
        foreach ($this->arrayHash as $key=>$value){
            $out.=$this->arrayHiddenValue[$key]." : \n  ".$value."\n\r";
        }
        return $out;
    }

}

пример странички с формой:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
        <title></title>
        <style>
            #name,#email{
	margin-bottom : 5px;
}
#name,#email span{
	clear : both;
	font-family : Verdana, Geneva, Arial, Helvetica, sans-serif;
	font-size : 12px;
}
#name input{
	border : 1px solid Black;
	padding-left : 3px;
	padding-right : 3px;
	padding-top : 2px;
	padding-bottom : 2px;
}
#email input{
	border : 1px solid Black;
	padding-left : 3px;
	padding-right : 3px;
	padding-top : 2px;
	padding-bottom : 2px;
}
#text{
	margin-bottom : 5px;
}
#text span{
	clear : both;
	font-family : Verdana, Geneva, Arial, Helvetica, sans-serif;
	font-size : 12px;
}
#text textarea{
	border : 1px solid Black;
	padding-left : 3px;
	padding-right : 3px;
	padding-top : 2px;
	padding-bottom : 2px;
}
        </style>
    </head>
    <body>
        <?php

        include_once("SimpleFeedBackForm.php");
        $web=new SimpleFeedBackForm();
        $web->setUrl("./plush.php");
        $web->setDefault(false);
        $web->setSubmitValue("послать");
        $web->addInput("name", "Ваше имя?");
        $web->addInput("email", "почта?");
        $web->addTextArea("text", "Тело сообщения",38,9);        
        print $web->show();
        
        ?>
    </body>
</html>

пример странички с серверным классом

<?php
/* 
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
include_once('./SimpleServer.php');
$server=new SimpleServer("null@null.nul");
$server->setRefreshURL("http://yandex.ru");
$server->work();
?>