PHP > メモ > フォームクラスのサンプル

2006年01月27日

昨晩考えてたフォームクラスのサンプル。 フォーム名やプロパティは連想配列を使わずに、メソッドで定義することにした。


<?php
class sampleForm extends form{

	function sampleForm(){
	
		$name = 'name';
		$mail = 'mail';
		$address = 'address';
		$text = 'text';
	
		$this->setElement($name,$mail,'input');
		$this->setProperty($name,$mail,'type','text');
		$this->setProperty($name,'maxlengh','50');
		$this->set($name,'名前');
		$this->setProperty($mail,'maxlengh','80');
		$this->set($mail,'メルアド');
		
		$this->setElement($text,'textarea ');
		$this->setProperty($text,'cols','20');
		$this->setProperty($text,'rows','10');
		$this->set($text,'本文');
		
		$this->setElement($address,'select');
		$this->setOption($address,'list',array('default'=>'住所選択','osaka'=>'大阪' , 'tokyo'=>'東京' , 'nagoya'=>'名古屋'));
		$this->setOption($address,'selected',array('default'));
		$this->setOption($address,'disabled',array('default'));
	}

}
class form {
	var $form = array();
	var $errorMsg;
	
	function setElement(){
		$args = func_get_args();
		if(count($args) < 2){
			print '因数が足りないぞ';
		}else{
			$elem = array_pop($args);
			foreach($args as $value){
				$this->form[$value]['element'] = $elem;
				switch($elem){
					case 'input':
						$this->form[$value]['property']['value'] = '';
						break;
					default:
						$this->form[$value]['value'] = '';
				}
			}
		}
	}
	
	function setProperty(){
		$args = func_get_args();
		if(count($args) < 3){
			print '因数が足りないのは気のせいか?';
		}else{
			$propVal = array_pop($args);
			$propNam = array_pop($args);
			foreach($args as $value){
				$this->form[$value]['property'][$propNam] = $propVal;
			}
		}
	}
	
	function setOption($name,$propNam,$propVal){
		if($this->form[$name]['element'] !== 'select'){
			print 'selectじゃないのにoptionタグ付けれるか!?';
		}else{
			$this->form[$name]['option'][$propNam] = $propVal;
		}
	}
	
	function set($name,$value){
		switch($this->form[$name]['element']){
			case 'input':
				$this->form[$name]['property']['value'] = $value;
				break;
			default:
				$this->form[$name]['value'] = $value;
		}
	}
	
	function get($name){
		switch($this->form[$name]['element']){
			case 'input':
				return $this->form[$name]['property']['value'];
			default:
				return $this->form[$name]['value'];
		}
	}
	
	function disp($name){
		$tag = '<'.$this->form[$name]['element'];
		foreach($this->form[$name]['property'] as $key=>$value){
			$tag .= ' '.$key.'="'.$value.'"';
		}
		switch($this->form[$name]['element']){
			case 'input':
				$tag .= ' />';
				return $tag;
			case 'select':
				$tag .= '>'."\n";
				foreach($this->form[$name]['option']['list'] as $key => $value){
					$tag .= '<option value="'.$key.'"';
					if(in_array($key,$this->form[$name]['option']['selected'])) $tag .= ' selected';
					if(in_array($key,$this->form[$name]['option']['disabled'])) $tag .= ' disabled';
					$tag .= '>'.$value.'</option>'."\n";
				}
				$tag .= '</select>';
				return $tag;
			case 'textarea ':
				$tag .= '>'.$this->form[$name]['value'].'</textarea>';
				return $tag;
		}
	}
	
}
?>

実行ファイルはこちら

<?php 
require 'form.php';

$form = new sampleForm();
print '<form>
		'.$form->disp('name').'<br>
		'.$form->disp('mail').'<br>
		'.$form->disp('address').'<br>
		'.$form->disp('text').'<br>
		</form>'
?>

これを実行すると、

<input value="名前" type="text" maxlengh="50" />
<input value="メルアド" type="text" maxlengh="80" />
<select> 
    <option value="default" selected disabled>住所選択</option>
    <option value="osaka">大阪</option>
    <option value="tokyo">東京</option>
    <option value="nagoya">名古屋</option>
</select>
<textarea cols="20" rows="10">本文</textarea>

というhtmlが出力されて、 以下のように表示される。





こんな感じの方向で実装していこうと思う。 入力チェックやエラー処理等を実装しないとな。

あと、<select>タグの取り扱いをもうちょっと考える必要がある。 現状では<optgroup>タグに対応してないし、内部の配列構造をもう少しスマートにしたいな。

setElement()やsetProperty()はfunc_get_args()を使ってるので、複数の因数を入れて同じ値をまとめてセットできるようにした。
しかしながら、正しいhtmlを吐くためのチェック等はしてないので、エレメントやプロパティは何でも指定できる。
setElement($name,'ipod')なんて指定しちゃうと、<input>ではなくて<ipod>タグが出力されてしまう。

エレメント名やプロパティ名を正しく指定するのは書く側の責務ということでいいかな。

posted by 37to at : 13:44 | コメント (0) | トラックバック (0)

コメント

この記事に対するコメントはまだありません。


投稿する

投稿者情報を保存しますか?


トラックバック

トラックバックURI


一覧

この記事に対するトラックバックはまだありません。