Membuat Text Based Table dengan PHP untuk Printer Dot Matrix



Buat file TableText.php

<?php /** @since 12 March 2015 23:29
 * @version 1.0.0
 * @license LGPLv3
 * 
 */
class TableText{
	
	private $width;
	private $column;
	private $border;
	private $line;
	private $columnbase;
	private $header;
	private $footer;
	private $body;
	private $temporer_column;
	private $temporer_content;
	private $temporer_colspan;
	private $temporer_align;
	private $current_column;
	private $initline;
	private $initspace;
	private $is_used_bodyspace;
	private $bodyspace;
	
	
	
	/**
	 * initiating TableText
	 * $column must less than width
	 * $line and $border must <=1 character
	 * 
	 * @param int $width how much text width (100 mean 100 character)
	 * @param int $column how much column will be used in this table (5 mean 5 column)
	 * @param string $line the line base text to separate header, content and footer. default - 
	 * @param string $border the border base text default | 
	 */
	public function __construct($width,$column,$bodyspace=" ",$line="-",$border="|"){
		$this->width=$width;
		$this->column=$column;
		$this->border=$border;
		$this->line=$line;
		$this->header="";
		$this->footer="";
		$this->body="";
		$this->current_column=0;
		$this->initColumnBase($width, $column);
		$this->initLine();
		$this->initSpace();
		$this->temporer_content=array();
		$this->temporer_colspan=array();
		$this->temporer_align=array();
		$this->temporer_column="";
		$this->is_used_bodyspace=false;
		$this->bodyspace=$bodyspace;
	}
	
	
	/**
	 * set should used the Body Space or NOT
	 * @param unknown $used
	 */
	public function setUseBodySpace($used){
		$this->is_used_bodyspace=$used;
	}
	
	
	/**
	 * create line for creating line
	 */
	private function initLine(){
		$line=0;
		if(strlen($this->border)>0)	$line=$this->line($this->width+1);
		else $line=$this->line( ($this->width) - ($this->column) );
		$this->initline=$line;
	}
	/**
	 * create space for creating space
	 */
	private function initSpace(){
		$space=0;
		if(strlen($this->border)==0)	$space="";
		else $space=$this->border.$this->space( ($this->width) - 1).$this->border;
		$this->initspace=$space;
	}
	
	/**
	 * getting length based on colspan
	 * @param unknown $colspan
	 * @return unknown|number
	 */
	public function getLengthBase($colspan){
		if($colspan==1){
			$colbase=$this->columnbase[$this->current_column];
			$this->current_column++;
			return $colbase;
		}else{
			$base=0;
			for($c=0;$c<$colspan;$c++){
				$base+=$this->columnbase[$this->current_column+$c];
			}
			$base+=$colspan-1;
			$this->current_column+=$colspan;
			return $base;
		}
	}
	
	/**
	 * refined content based on lenght and align
	 * @param unknown $content
	 * @param unknown $length
	 * @param unknown $align
	 * @return string
	 */
	public function refinedContent($content,$length,$align){
		$vlen=strlen($content);
		if($vlen>$length){
			return substr($content, 0,$length);
		}
		
		if($align=="left") {
			$space=$this->space($length-$vlen);
			return $content.$space;
		}else if($align=="right"){
			$space=$this->space($length-$vlen);
			return $space.$content;
		}else{
			$selisih=$length-$vlen;
			$left=floor($selisih/2);
			$right=$selisih-$left;
			$spaceleft=$this->space($left);
			$spaceright=$this->space($right);
			return $spaceleft.$content.$spaceright;
		}
		
	}
	
	/**
	 * adding a new Column to Table
	 * @param $content the content that want to add
	 * @param $colspan how many colspan
	 * @param string $align should be center,left, or right
	 * @param string $commit put it on the head,body, or footer
	 * @return TableText
	 */
	public function addColumn($content,$colspan,$align='left',$commit=NULL){
		$this->temporer_content[]=$content;
		$this->temporer_colspan[]=$colspan;
		$this->temporer_align[]=$align;
		
		if($commit!=NULL){
			$this->commit($commit);
		}
		return $this;
	}
	
	/**
	 * put current temporary_column to the body, footer or header.
	 * @param stirng $commit shouild be body, footer or header
	 * @return TableText
	 */
	public function commit($commit){
		$continue=true;
		while($continue){
			$number=0;
			$continue=false;
			foreach($this->temporer_content as $content){
				$colspan=$this->temporer_colspan[$number];
				$align=$this->temporer_align[$number];				
				$ct_in=$this->putColumn($content, $colspan, $align);
				$this->temporer_content[$number]=substr($this->temporer_content[$number], $ct_in);
				if(strlen($this->temporer_content[$number])>0)	$continue=true;
				$number++;
			}
			$this->line_commit($commit);
		}
		$this->addBodySpace($commit);
		$this->temporer_content=array();
		$this->temporer_colspan=array();
		$this->temporer_align=array();
		return $this;
	}
	
	/**
	 * adding new space in Table
	 * @param string $commit should be body, footer or header
	 */
	private function addBodySpace($commit){
		if($commit=="body" && $this->is_used_bodyspace){
			$number=0;
			foreach($this->temporer_content as $content){
				$colspan=$this->temporer_colspan[$number];
				$align=$this->temporer_align[$number];
				$this->putBodySpace($colspan);
				$number++;
			}
			$this->line_commit($commit);
		}
	}
	
	/**
	 * put the column to header, footer or body
	 * @param string $commit it must be header, footer or body
	 * @return TableText
	 */
	public function line_commit($commit){
		if($commit=="header"){
			$this->header.=$this->temporer_column.$this->border."\n";
		}else if($commit=="body"){
			$this->body.=$this->temporer_column.$this->border."\n";
		}else if($commit=="footer"){
			$this->footer.=$this->temporer_column.$this->border."\n";
		}
		$this->current_column=0;
		$this->temporer_column="";
		return $this;
	}
	
	/**
	 * put content for one column, it's handling more than one 
	 * line of content.
	 * @param string $content the one line content
	 * @param int $colspan 
	 * @param string $align should be center, right or left
	 * @return number
	 */
	public function putColumn($content,$colspan,$align){
		$lengthbase=$this->getLengthBase($colspan);
		$ct=$this->refinedContent($content, $lengthbase,$align);
		$this->temporer_column.=$this->border.$ct;
		return strlen($ct);
	}
	
	/**
	 * put line/space in to separate beetween a line in the body
	 * @param unknown $colspan
	 * @return TableText
	 */
	public function putBodySpace($colspan){
		$lengthbase=$this->getLengthBase($colspan);
		$bodysp="";
		for($i=0;$i<$lengthbase;$i++){
			$bodysp.=$this->bodyspace;
		}
		$this->temporer_column.=$this->border.$bodysp;
		return $this;
	}
	
	/**
	 * get the Table Text
	 * @return string
	 */
	public function getText(){
		$result=$this->initline."\n";
		$result.=$this->header;
		$result.=$this->initline."\n";
		$result.=$this->body;
		if(!$this->is_used_bodyspace || $this->bodyspace=="" || $this->bodyspace==" ")
			$result.=$this->initline."\n";
		$result.=$this->footer;
		$result.=$this->initline;
		return $result;
	}
	
	/**
	 * adding line in the Table
	 * @param string $commit should be header, body or footer
	 * @return TableText
	 */
	public function addLine($commit){
		if($commit=="header"){
			$this->header.=$this->initline."\n";
		}else if($commit=="body"){
			$this->body.=$this->initline."\n";
		}else if($commit=="footer"){
			$this->footer.=$this->initline."\n";
		}
		return $this;
	}
	
	/**
	 * adding space in the Table
	 * @param string $commit should be header, body or footer
	 * @return TableText
	 */
	public function addSpace($commit){
		if($commit=="header"){
			$this->header.=$this->initspace."\n";
		}else if($commit=="body"){
			$this->body.=$this->initspace."\n";
		}else if($commit=="footer"){
			$this->footer.=$this->initspace."\n";
		}
		return $this;
	}
	
	/**
	 * create the basis of the column width 
	 * @param  $width length of char width
	 * @param unknown $column that wanted
	 */
	private function initColumnBase($width,$column){
		$this->columnbase=array();
		if(strlen($this->line)>0){
			$width=$width-$column+1;
		}
		$part=floor($width/$column);
		for($p=0;$p<$part-1;$p++){
			$this->columnbase[]=$part;
			$width-=$part;
		}
		$this->columnbase[]=$width;
		return $this;
	}
	
	/**
	 * return the column length of table
	 */
	private function getColumnLength($index){
		return $this->columnbase[$index];
	}
	
	/**
	 * set the column length base for each column
	 * @param int $index
	 * @param int $length
	 */
	public function setColumnLength($index,$length){
		$this->columnbase[$index]=$length;
		return $this;
	}
	
	/**
	 * make a space
	 * @param unknown $number
	 * @return string
	 */
	private function space($number){
		$space="";
		for($i=0;$i<$number;$i++){
			$space.=" ";
		}
		return $space;
	}
	
	/**
	 * make a line
	 * @param unknown $number
	 * @return string
	 */
	private function line($number){
		if($this->line=="") return "";
		$line="";
		for($i=0;$i<$number;$i++){
			$line.=$this->line;
		}
		return $line;
	}
	
	/**
	 * create a border
	 * @param unknown $number
	 * @return string
	 */
	private function border($number){
		if($this->border=="") return "";
		$border="";
		for($i=0;$i<$number;$i++){
			$border.=$this->border;
		}
		return $border;
	}
}



?>
Kode PHP untuk membuat Table
$tp=new TableText($lebar_kolom,6);
$tp ->setColumnLength(0, 5)
	->setColumnLength(1, 33)
	->setColumnLength(2, 44)
	->setColumnLength(3, 18)
	->setUseBodySpace(true);

$tp	->addSpace("header")
	->addColumn("KARTU KELUARGA", 4,"center")
	->commit("header")
	->addSpace("header")
	->addLine("header");

$tp	->addColumn("No. ", 1,"center")
	->addColumn("NAMA", 1,"center")
	->addColumn("ALAMAT", 1,"center")
	->addColumn("TANGGAL LAHIR", 1,"center")
	->commit("header");

$tp	->addColumn((1).".", 1)
	->addColumn("NURUL HUDA", 1,"left")
	->addColumn("SEDAYULAWAS, BRONDONG, LAMONGAN", 1,"center")
	->addColumn("14 Mei 1989", 1,"right")
	->commit("body");

$tp	->addColumn((2).".", 1)
	->addColumn("EKA SAFITRI", 1,"left")
	->addColumn("GUMINING, TAMBAKREJO, DUDUK SAMPEYAN, GRESIK", 1,"center")
	->addColumn("20 September 1989", 1,"right")
	->commit("body");

$tp	->addColumn((3).".", 1)
	->addColumn("SALMAN AL FARISI IBNU AL - HUDA", 1,"left")
	->addColumn("KALILOMBARU, KENJERAN, SURABAYA", 1,"center")
	->addColumn("21 Mei 2013", 1,"right")
	->commit("body");

$tp	->addColumn("TOTAL", 1,"left")
	->addColumn("10 Orang", 3,"right")
	->commit("footer")
	->addLine("footer")
	->addColumn("BARANG YANG SUDAH DIBELI TAK DAPAT DIBALIKIN", 4,"center")
	->commit("footer");

echo $tp->getText();
?>
Lihat via github gist Link Nota

Posting Komentar

Lebih baru Lebih lama