PDA

View Full Version : مشکل با تابع str_replace و Template Engine



maysam.m
دوشنبه 25 مرداد 1389, 21:03 عصر
با سلام

من میخواستم یک Template Engine درست کنم که در پیاده سازی آن و با تابع str_replace مشکل پیدا کردم.

من مثلا یه صفحه به نام mytheme.php دارم. تعدادی تگ در آن به این صورت تعریف کرده ام.

$_title
$_description
$_keywords
..
یک آرایه دارم که تمام تگهای قالب را دارا می باشد

$theme_tags = array(
'$_title',
'$_description',
'$_keywords'
);

و یک آرایه دارم که این اطلاعات را از دیتابیس میخواند را دارد

$theme = array(
$row['site_title'],
$row['description'],
$row['keywords']
);

حالا میخواهم که تابع str_replace اطلاعات را به این صورت جایگزین کند:


for ($i=0; $i < 3; $i++)
{
$content = theme($theme_tags[$i], $theme[$i], $theme_content);
}

$theme_file = 'theme.php';
$theme_content = file_get_contents($theme_file);

مشکل اینجاست که تابع فقط یکی از مقادیر آرایه جایگزین میکند.
برای انجام چنین کاری شما پیشنهاد میکنید چه کار کنم؟

bestirani2
دوشنبه 25 مرداد 1389, 22:01 عصر
با سلام

من میخواستم یک Template Engine درست کنم که در پیاده سازی آن و با تابع str_replace مشکل پیدا کردم.

من مثلا یه صفحه به نام mytheme.php دارم. تعدادی تگ در آن به این صورت تعریف کرده ام.

$_title
$_description
$_keywords
..یک آرایه دارم که تمام تگهای قالب را دارا می باشد

$theme_tags = array(
'$_title',
'$_description',
'$_keywords'
);و یک آرایه دارم که این اطلاعات را از دیتابیس میخواند را دارد

$theme = array(
$row['site_title'],
$row['description'],
$row['keywords']
);حالا میخواهم که تابع str_replace اطلاعات را به این صورت جایگزین کند:


for ($i=0; $i < 3; $i++)
{
$content = theme($theme_tags[$i], $theme[$i], $theme_content);
}

$theme_file = 'theme.php';
$theme_content = file_get_contents($theme_file);مشکل اینجاست که تابع فقط یکی از مقادیر آرایه جایگزین میکند.
برای انجام چنین کاری شما پیشنهاد میکنید چه کار کنم؟
منظورت رو واضح تر بگو
چرا از smarty استفاده نمیکنی

maysam.m
سه شنبه 26 مرداد 1389, 01:01 صبح
منظورت رو واضح تر بگو
چرا از smarty استفاده نمیکنی

برای یک سی ام ساده اسمارتی به درد نمی خورد.
این کد شاید منظورم را بهتر بیان کند:


$theme = array(
$row['site_title'],
$row['description'],
$row['keywords']
);
$theme_tags = array(
'$_title',
'$_description',
'$_keywords'
);

$theme_file = 'theme/default/header.php';
$theme_content = file_get_contents($theme_file);

$final ='';

for ($i=0; $i < 3; $i++)
{
$final = theme($theme_tags[$i], $theme[$i], $theme_content);
}

echo $final;



<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title> $_title </title>
<meta name="description" content="$_description" />
<meta name="keywords" content="$_keywords" />
</head>

bestirani2
سه شنبه 26 مرداد 1389, 01:09 صبح
برای یک سی ام ساده اسمارتی به درد نمی خورد.
این کد شاید منظورم را بهتر بیان کند:


$theme = array(
$row['site_title'],
$row['description'],
$row['keywords']
);
$theme_tags = array(
'$_title',
'$_description',
'$_keywords'
);

$theme_file = 'theme/default/header.php';
$theme_content = file_get_contents($theme_file);

$final ='';

for ($i=0; $i < 3; $i++)
{
$final = theme($theme_tags[$i], $theme[$i], $theme_content);
}

echo $final;
واسه چی به درد نمیخوره؟

maysam.m
سه شنبه 26 مرداد 1389, 01:41 صبح
واسه چی به درد نمیخوره؟

من میخوام یه Template Engine شخصی داشته باشم در ضمن کل حجم اسکریپت من یک سوم اسمارتی هم نمیشه! و وقتی میشه از خود php استفاده کرد چرا اسمارتی؟

SAMAN_PHP
سه شنبه 26 مرداد 1389, 01:44 صبح
میثم جان مشکلت حل نشد؟.
خوب در هر بار چرخش حلقه مقدار جدید جایگزین مقدار قبلی متغیر finalمشه واسه همین فقط مقدار اخری رو نشون میده

maysam.m
سه شنبه 26 مرداد 1389, 01:49 صبح
میثم جان مشکلت حل نشد؟.
خوب در هر بار چرخش حلقه مقدار جدید جایگزین مقدار قبلی متغیر finalمشه واسه همین فقط مقدار اخری رو نشون میده

نه سامان جان :عصبانی++:
برای حل این مشکل پیشنهادی دارید؟

bestirani2
سه شنبه 26 مرداد 1389, 02:02 صبح
من میخوام یه Template Engine شخصی داشته باشم در ضمن کل حجم اسکریپت من یک سوم اسمارتی هم نمیشه! و وقتی میشه از خود php استفاده کرد چرا اسمارتی؟
وقتی یک برنامه رو کلی برنامه نویس وقت گذاشتند و نوشتند فکر نمیکنم نیازی به رو نویسی داشته باشی، خوبی دنیای اپن سورس هم همین هست
حالا یک موقع نیازهات رو جواب نمیده که خیلی حالات پیش میاد که میای توش تغییرات میدی و یا به دلیل امنیت میخوای خودت بنویسی نه اینکه بخوای یک اسکریپت ضعیف که به قول خودت یک سومش هم نمیشه بنویسی
به عنوان مثال در صورت استفاده از کش در اسمارتی سرعتتون در حد قابل قبولی بالا میره
حالا فرض کنید همین یک مورد رو بخواهید پیاده کنید، کلی خط کد هست و فکر یک نفر
به هر حال اگه میخوای مال خودتون رو داشته باشید، تابع theme رو قرار بدهید تا ببینیم چه اتفاقی میفته

SAMAN_PHP
سه شنبه 26 مرداد 1389, 02:02 صبح
میخوای لینک چندتا Template Engine با اموزش رو برات بذارم یا حتما میخوای از کد خودت استفاده کنی

maysam.m
سه شنبه 26 مرداد 1389, 02:19 صبح
وقتی یک برنامه رو کلی برنامه نویس وقت گذاشتند و نوشتند فکر نمیکنم نیازی به رو نویسی داشته باشی، خوبی دنیای اپن سورس هم همین هست
حالا یک موقع نیازهات رو جواب نمیده که خیلی حالات پیش میاد که میای توش تغییرات میدی و یا به دلیل امنیت میخوای خودت بنویسی نه اینکه بخوای یک اسکریپت ضعیف که به قول خودت یک سومش هم نمیشه بنویسی
به عنوان مثال در صورت استفاده از کش در اسمارتی سرعتتون در حد قابل قبولی بالا میره
حالا فرض کنید همین یک مورد رو بخواهید پیاده کنید، کلی خط کد هست و فکر یک نفر
به هر حال اگه میخوای مال خودتون رو داشته باشید، تابع theme رو قرار بدهید تا ببینیم چه اتفاقی میفته

اینکه چرا نمیخوام از اسمارتی استفاده کنم دلایل خیلی زیادی داره در انجمن iranphp.net خیلی در این مورد بحث شده.

این تاپیک را نمیدونم خوندی یا نه؟

http://www.iranphp.net/forum/showthread.php?t=1979


میخوای لینک چندتا Template Engine با اموزش رو برات بذارم یا حتما میخوای از کد خودت استفاده کنی

چند تا کلاس را دیدم ولی خواستم خودم یه کلاس از پایه شروع کنم بنویسم تا عملی متوجه بشم. :لبخندساده:
سایر کلاس ها برای جایگزین کردن تگ ها از چه روشی استفاده میکنند؟
ممنون میشم یه مختصر توضیحی بدی.

SAMAN_PHP
سه شنبه 26 مرداد 1389, 02:30 صبح
همه تمپلت انجنینهایی که من دیدم از تابع str_replace استفاده میکنن.
این لینک (http://forum.rightclick.ir/viewtopic.php?f=10&t=847&start=0&st=0&sk=t&sd=a&sid=b7b74d368c1e4a3121d9a1e18d7d8082)رو ببین

راستی اگه داخل حلقه مقدار رو چاپ کنی درست نمیشه؟

bestirani2
سه شنبه 26 مرداد 1389, 02:38 صبح
اینکه چرا نمیخوام از اسمارتی استفاده کنم دلایل خیلی زیادی داره در انجمن iranphp.net خیلی در این مورد بحث شده.

این تاپیک را نمیدونم خوندی یا نه؟

http://www.iranphp.net/forum/showthread.php?t=1979

چند تا کلاس را دیدم ولی خواستم خودم یه کلاس از پایه شروع کنم بنویسم تا عملی متوجه بشم. :لبخندساده:
سایر کلاس ها برای جایگزین کردن تگ ها از چه روشی استفاده میکنند؟
ممنون میشم یه مختصر توضیحی بدی.
اینکه با یک فریم ورک کار کنید بهتر هست بحثی رویش نیست ولی استفاده از اسمارتی 100% بهتر از نوشتن کلاس ساده هست
در ضمن اسمارتی اگر از کش استفاده بشه اصلاً کند نیست
شما یک وبلاگ نوشتید که توش فقط مطلب میگذارید
صفحات مطلب ثابت هست
صفحه اول سایت هم شاید در روز 1 بار که آپدیت میکنید تغییر کند
حالا اسمارتی میاد کد اچ تی ام ال مربوط به اینها را کش میکند و در دفعات بعد به جای فراخوانی از بانک اطلاعاتی و دستورات پی اچ پی، مستقیماً کد اچ تی ام ال رو اجرا میکند و وقتی چیزی وارد بانک اطلاعاتی میشه، صفحه را از نو بروز میکند
این یکی از بهترین دلایل استفاده از اسمارتی هست که سرعت بالایی میاره

mohmadd
سه شنبه 26 مرداد 1389, 02:48 صبح
این کد که از روی کد شما ویرایش کردم با چند بار تست برای من کاملا کار میکنه به تابع نیازی نیست.

<?php
$theme = array('test','test','test');
$theme_tags = array(
'$_title',
'$_description',
'$_keywords'
);
$theme_content = file_get_contents('zzz.txt');
for ($i=0; $i < 3; $i++)
{
$theme_content = str_replace($theme_tags[$i], $theme[$i], $theme_content);
}
echo $theme_content;
?>

mohmadd
سه شنبه 26 مرداد 1389, 02:54 صبح
اگه میخوای خودت یه کلاس بنویسی. برای یادگیری خیلی خوبه
حتی میشه خیلی نزدیک به smarty یه چیزایی نوشت
اما هدف اگه نوشت یه کلاس اختصاصیه کاملا وقت تلف کردنه .اوپن سورس حالشو ببر : دی

maysam.m
سه شنبه 26 مرداد 1389, 03:04 صبح
همه تمپلت انجنینهایی که من دیدم از تابع str_replace استفاده میکنن.
این لینک (http://forum.rightclick.ir/viewtopic.php?f=10&t=847&start=0&st=0&sk=t&sd=a&sid=b7b74d368c1e4a3121d9a1e18d7d8082)رو ببین

راستی اگه داخل حلقه مقدار رو چاپ کنی درست نمیشه؟

ممنون ولی میزارم فردا یه نگاهی بهش میندازم. الان مغزم نمیکشه! :لبخند:



اینکه با یک فریم ورک کار کنید بهتر هست بحثی رویش نیست ولی استفاده از اسمارتی 100% بهتر از نوشتن کلاس ساده هست
در ضمن اسمارتی اگر از کش استفاده بشه اصلاً کند نیست
شما یک وبلاگ نوشتید که توش فقط مطلب میگذارید
صفحات مطلب ثابت هست
صفحه اول سایت هم شاید در روز 1 بار که آپدیت میکنید تغییر کند
حالا اسمارتی میاد کد اچ تی ام ال مربوط به اینها را کش میکند و در دفعات بعد به جای فراخوانی از بانک اطلاعاتی و دستورات پی اچ پی، مستقیماً کد اچ تی ام ال رو اجرا میکند و وقتی چیزی وارد بانک اطلاعاتی میشه، صفحه را از نو بروز میکند
این یکی از بهترین دلایل استفاده از اسمارتی هست که سرعت بالایی میاره

اینهایی که شما میگی درسته ولی هیچی مثل چیزی که خودت نوشتی باارزش نیست. من به جای اینکه بیام وقتم را روی یادگیری اسمارتی بگذارم که برای کار من - که احتیاجی به کش ندارد - مناسب نیست، یه کلاسی مطابق خواسته هام می نویسم و بعدها هم گسترشش میدم.

maysam.m
سه شنبه 26 مرداد 1389, 03:07 صبح
این کد که از روی کد شما ویرایش کردم با چند بار تست برای من کاملا کار میکنه به تابع نیازی نیست.

<?php
$theme = array('test','test','test');
$theme_tags = array(
'$_title',
'$_description',
'$_keywords'
);
$theme_content = file_get_contents('zzz.txt');
for ($i=0; $i < 3; $i++)
{
$theme_content = str_replace($theme_tags[$i], $theme[$i], $theme_content);
}
echo $theme_content;
?>

این کد به خاطر این کار کرده است که test را تکرار کرده اید. و اگر به جای test چند کلمه دیگر بگذارید کد به مشکل بر می خورد.


اگه میخوای خودت یه کلاس بنویسی. برای یادگیری خیلی خوبه
حتی میشه خیلی نزدیک به smarty یه چیزایی نوشت
اما هدف اگه نوشت یه کلاس اختصاصیه کاملا وقت تلف کردنه .اوپن سورس حالشو ببر : دی
کاملا درسته. ولی میخوام یه کلاسی از چیزایی که میخوام با ترکیبی از کلاسهای دیگه درست کنم تا بعدا هم بتونم ازشون استفاده کنم.

bestirani2
سه شنبه 26 مرداد 1389, 03:10 صبح
ممنون ولی میزارم فردا یه نگاهی بهش میندازم. الان مغزم نمیکشه! :لبخند:




اینهایی که شما میگی درسته ولی هیچی مثل چیزی که خودت نوشتی باارزش نیست. من به جای اینکه بیام وقتم را روی یادگیری اسمارتی بگذارم که برای کار من - که احتیاجی به کش ندارد - مناسب نیست، یه کلاسی مطابق خواسته هام می نویسم و بعدها هم گسترشش میدم.
کش یعنی سرعت بیشتر
توی هر چیزی بگی نیاز هست
یک لینک باکس رو فرض کن
هر وقت لینک جدید ارسال میشه، کش جدید ساخته میشه
کش یک چیز مهم هست، هم تحت سرور و هم کلاینت

mohmadd
سه شنبه 26 مرداد 1389, 03:43 صبح
کد پی اچ پی :

<?php

$theme = array('salam', 'mr', 'mohamd');
$theme_tags = array('$_title', '$_description', '$_keywords');
$theme_content = file_get_contents('zzz.txt');
for ($i = 0; $i < 3; $i++)
{
$theme_content = str_replace($theme_tags[$i], $theme[$i], $theme_content);
}
echo $theme_content;

?>

محتوای zzz.txt


$_keywords salam $_title $_description vorod shoma ra ...


خروجی نهایی :


mohamd salam salam mr vorod shoma ra ...

mohmadd
سه شنبه 26 مرداد 1389, 03:48 صبح
کاملا درسته. ولی میخوام یه کلاسی از چیزایی که میخوام با ترکیبی از کلاسهای دیگه درست کنم تا بعدا هم بتونم ازشون استفاده کنم.
من با نظر bestiran کاملا موافقم .
چیزی که می نویسید اصلا قابل مقایسه با smarty نخواهد بود ...
ما اگه تو زندگی به چیزی احتیاج داشته باشیم نمیریم دوباره اونو کشف اختراع کنیم
اگه اینطور بود دنیا الان به علم کامپیوتر هم نرسیده بود ...
شما اگه میتونی برو همون smarty رو گسترش بده ... (یا طبق نیازت کم زیادش کن)
اگه واقعا نمیتونی پس پیشرفت کن تا بعدا بتونی ...