PDA

View Full Version : منظور از کلاس template چیست؟



one hacker alone
سه شنبه 07 خرداد 1392, 03:06 صبح
با یاد خدا
سلام دوستان گرامی
در برخی مطالب دوستان توضیحاتی در مورد ساختار و یا استفاده از کلاس تمپلیت دادن
اما از ابتدای کار نگفتن که کلا این کلاس چیه ؟
ایا از قبل ساخته شده؟ یا یه مفهوم عام هست و خودمون بوجود میاریم؟

wallfa
سه شنبه 07 خرداد 1392, 15:51 عصر
پی اچ پی با داشتن قابلیت های بالای خودش دارای ضعف هایی هم هست که به کمک بعضی چیز ها بر طرف شده است .
شما برای تولید سیستم مورد نظر خود باید از کد خام پی اچ پی استفاده کنید یا از کلاس های آماده کمک بگیرید .

منظور در این سیستم هم همان موضوع است .
یک کلاس که مربوط به سیستم قالب میشه ! و کد ها پی اچ پی از ساختار اچ تی ام ال جدا میکنه .

one hacker alone
سه شنبه 07 خرداد 1392, 18:27 عصر
کلیات رو گرفتم ولی هنوز کامل برام حضم نشده
دوستان اگه حوصله دارین بیشتر توضیح بدین ممنون میشم
اینکه تفاوت دوسیستم که یکیشون از این کلاس استفاده کرده و یکی نه چیه؟ مزایا؟ علت بوجود امدن این کلاس؟ و اینکه ایا استاندارد خاصی برای طراحی داره یا دلخواه و نسبت به سیستم هست

one hacker alone
جمعه 17 خرداد 1392, 03:47 صبح
دوستان کسی نیست جواب این موضوع رو بده

AbiriAmir
جمعه 17 خرداد 1392, 12:13 عصر
دوست عزیز ساختار های مختلفی برای کدنویسی به مرور زمان بوجود اومده که کارشون اینه که کدنویسی رو اصولی تر میکنن و نتیجش اینه که خوانایی کد بیشتر میشه و بعضی مزایای دیگه
از جمله این روش ها الگوی MVC هست که کلا میاد لایه ی view رو از کدهای هسته نزم افزار جدا میکنه (معمولا بصورت شی گرا یا Object Oriented پیاده سازی میشه)
یکی دیگه از روش ها نوشتن کدها به صورت فانکشنال هست...
البته این روش ها روش های ثبت شده و کاملا ثابتی نیستند و برنامه نویس با توجه به کارش و با خلاقیت خودش میاد این روش ها رو تغییر میده و یا با هم ترکیب میکنه.

حالا بریم سر اصل مطلب یا همون کلاس قالب

ببینید شما 1 راه برای این که 1 نرم افزار رو با PHP بسازید اینه که کدهای HTML رو بنویسید و مابین اونها هرجا که لازمه کدهای PHP هسته نرم افزارتون رو بنویسید.
اما عیب این روش چیه؟
مشخصه که کدها کاملا نامرتب و اسپاگتی میشه و در واقع بخش view نرم افزار با هسته نرم افزار یکجا هست که بعدا برای تغییرات توی نرم افزارهای بزرگ شما رو دچار مشکل میکنه.
( مثلا برای تغییر ظاهر نرم افزار کدهای هسته نرم افزار هم جلوی شما هست! ) یا یکی دیگه از عیب هاش اینه که اگر خواستید قالب سایت رو در مناسبت های مختلف عوض کنید اینکار ممکن نیست.

حالا یکی از چاره هایی که برای این مشکل اندیشیده شده استفاده از کلاس یا موتور قالب هست. (Template Engine)
شیوه کار بدین صورت هست که شما 1 قالب که معمولا 1 صفحه HTML هست رو توسط PHP لود میکنید... در حین اجرای کدهای PHP و قبل از فرستادن چیزی به Output شما 1 سری پردازش ها رو داری، از جمله لود کردن از دیتابیس و...
حالا فرض کنید تو صفحه HTML شما 1 تگ وجود داره به نام [sitetitle] . بعد شما میای عنوان سایت رو توسط PHP از دیتابیس و یا هرجای دیگه میخونی و براحتی اون تگ قالب رو با عنوان سایت جایگزین میکنی.
اینجوریه که کدهای HTML شما از کدهای PHP تفکیک میشن و زیبایی و خوانایی و گسترش پذیری نرم افزار شما بیشتر میشه.

این به طور خیلی ساده بود
پیشنهاد میکنم برای آشنایی بیشتر با موتورهای قالب ساده کار کنید و کدهای اونا رو بخونید متوجه میشید که کارشون چیه
( تاکید میکنم ابتدا با موتورهای قالب ساده کار کنید و نه مثلا Smarty )

موفق باشید

MRmoon
جمعه 17 خرداد 1392, 12:20 عصر
موفق باشید

ميشه شما يك template engine ساده رو معرفي كنيد براي بررسي.

چون اين اسمارتي خيلي پيچيدست.

يك سادش رو معرفي كنيد ممنون ميشم.

AbiriAmir
شنبه 18 خرداد 1392, 13:24 عصر
بفرمایید این 1 نمونه هست مال سیستم مدیریت محتوای راش
1 نمونه کامل تر هم بود اگر پیدا کردن میذارم همینجا




<?php
// Security
if ( !defined( 'sec' ) ) {
die( "You are not allowed to access this page directly!" );
}
class Template
{
var $tags = array( );
var $required_tags = array( );
var $blocks = array( );
var $tpl = '';
var $parsed_tpl = '';

function load( $tpl = '' )
{
if ( !empty( $tpl ) ) {
if ( !file_exists( $tpl ) ) {
$this->tplerror( 'Could not find the template file <b>' . $tpl . "</b>" );
return FALSE;
}
$tpl = @implode( '', @file( $tpl ) );
$tpl = $tpl ? $tpl : $this->tplerror( 'Could not read the template file!' );
$this->tpl = $tpl;
}
}
function tplerror( $error )
{
echo $error;
return FALSE;
}
function assign( $input, $value = '', $required = FALSE )
{
if ( is_array( $input ) ) {
foreach ( $input as $tag => $value ) {
if ( empty( $tag ) )
$this->tplerror( 'R a s h C M S::The tag name shouldnt be empty.' );
if ( $required == TRUE ) {
$this->required_tags[ $tag ] = $value;
} else {
$this->tags[ $tag ] = $value;
}
}
} elseif ( is_string( $input ) ) {
if ( empty( $input ) )
$this->tplerror( 'R a s h C M S::The tag name shouldnt be empty.' );
else {
if ( $required == TRUE ) {
$this->required_tags[ $input ] = $value;
} else {
$this->tags[ $input ] = $value;
}
}
} else {
return FALSE;
}
return TRUE;
}

/*-----------------------------------------------------------------*/

function block( $block_name, $block_array )
{
if ( !is_string( $block_name ) || empty( $block_name ) )
$this->tplerror( 'R a s h C M S::Block name is not a string or is empty!' );

if ( !is_array( $block_array ) )
$this->tplerror( 'R a s h C M S::Block array is not an array!' );
$this->blocks[ $block_name ][ ] = $block_array;
}

/*-----------------------------------------------------------------*/

function parse( )
{
if ( empty( $this->tpl ) ) {
return;
}

# blocks
$tmp_blocknames = array( );
foreach ( $this->blocks as $block_name => $block_arrays ) {
if ( $anzahl = preg_match_all( '/<tag:' . preg_quote( $block_name, '/' ) . '>(.*)<\/tag:' . preg_quote( $block_name, '/' ) . '>/sU', $this->tpl, $matches ) ) {
for ( $i = 0; $i < $anzahl; $i++ ) {
$block_plus_definition = $matches[ 0 ][ $i ];
$block = $matches[ 1 ][ $i ];

if ( is_int( strpos( $block, '<!-- IF' ) ) ) {
$parse_control_structures = TRUE;
}

$parsed_block = '';
foreach ( $block_arrays as $block_array ) {
$tmp = $block;
if ( isset( $parse_control_structures ) ) {
$tmp = $this->_parse_control_structures( $tmp, array_merge( $block_array, $this->tags, $this->required_tags ) );
}
foreach ( $block_array as $tag_name => $tag_value ) {
$tmp = str_replace( '[' . $tag_name . ']', $tag_value, $tmp );
}
$parsed_block .= $tmp;
}
$this->tpl = str_replace( $block_plus_definition, $parsed_block, $this->tpl );
$tmp_blocknames[ ] = $block_name;
unset( $parse_control_structures );
}
}
}
if ( count( $this->blocks ) > 0 ) {
$this->tpl = preg_replace( "/<(tag|\/tag):(" . implode( '|', $tmp_blocknames ) . ")>/", '', $this->tpl );
}
# unbenutze blcke entfernen
$this->tpl = preg_replace( "/<tag:([a-zA-Z0-9_-]+)>.*<\/tag:\\1>( |\r|\n)?/msU", '', $this->tpl );

# single tags
foreach ( $this->required_tags as $tag_name => $tag_value ) {
if ( !is_int( strpos( $this->tpl, $tag_name ) ) )
$this->tplerror( 'R a s h C M S::Could not find tag <i>' . $tag_name . '</i> in the template file!' );
else {
$this->tpl = str_replace( '[' . $tag_name . ']', $tag_value, $this->tpl );
}
}
foreach ( $this->tags as $tag_name => $tag_value ) {
$this->tpl = str_replace( '[' . $tag_name . ']', $tag_value, $this->tpl );
}

# if & else
$this->tpl = $this->_parse_control_structures( $this->tpl, array_merge( $this->tags, $this->required_tags ), $this->blocks );


$this->parsed_tpl = $this->tpl;
$this->tpl = '';
}

/*-----------------------------------------------------------------*/

function showit( )
{
if ( !empty( $this->tpl ) ) {
$this->parse();
}
print $this->parsed_tpl;
}

/*-----------------------------------------------------------------*/

function dontshowit( )
{
if ( !empty( $this->tpl ) ) {
$this->parse();
}
return $this->parsed_tpl;
}

/*-----------------------------------------------------------------*/

function reset( )
{
$this->tpl = '';
$this->parsed_tpl = '';
$this->tags = array( );
$this->required_tags = array( );
$this->blocks = array( );
}

/*-----------------------------------------------------------------*/

function _parse_control_structures( $tpl, $vars, $blocks = array( ) )
{
if ( $matchnumber = preg_match_all( '/<!-- IF (!?)((BLOCK )?)([_a-zA-Z0-9\-]+) -->(.*)((<!-- ELSEIF !\(\\1\\2\\4\) -->)(.*))?<!-- ENDIF \\1\\2\\4 -->/msU', $tpl, $matches ) ) {
for ( $i = 0; $i < $matchnumber; $i++ ) {
//print( $matches[8 ][$i] . '<br />');
if ( !empty( $matches[ 2 ][ $i ] ) ) {
$code = 'if( ' . $matches[ 1 ][ $i ] . 'isset($blocks[\'' . $matches[ 4 ][ $i ] . '\']) )' . "\n";
} else {
$code = 'if( ' . $matches[ 1 ][ $i ] . '( isset($vars[\'' . $matches[ 4 ][ $i ] . '\']) ) )' . "\n";
}
$code .= '{ $tpl = str_replace( $matches[0][$i], $this->_parse_control_structures( $matches[5][$i], $vars, $blocks ), $tpl ); }' . "\n";
$code .= ' else ' . "\n";
$code .= '{ $tpl = str_replace( $matches[0][$i], !empty($matches[7][$i]) ? $this->_parse_control_structures( $matches[8][$i], $vars, $blocks ) : \'\', $tpl ); }';
eval( $code );
}
}
return $tpl;
}
}
?>