PDA

View Full Version : سوال: حلقه ها با html



Tarragon
چهارشنبه 16 اسفند 1391, 05:43 صبح
سلام من یه صفحه دارم به نام template.tpl قسمتی از اون رو کد زیر تشکیل می ده:

<div class="footer_menu right">
<IK:footer-menu>
<a href="<IK:footer-menu_link>" class="menu" ><IK:footer-menu_title></a>
</IK:footer-menu>
<a href="rss/" class="feed" title="feed"><img src="public/images/feed.png" width="28" height="28"></a>

و من یه آرایه دارم مثل کد زیر
$about = array(
array("title" => "مسی","link" => "messi"),
array("title" => "رونالدو","link" => "ronaldo")
);
حالا من نیاز دارم دو کد بالا رو با هم ترکیب کنم یعنی برای هم خط از ارایه یک بار کد بین تگ <IK:footer-menu> تکرار بشه و در اون کد بجای <IK:footer-menu_title> و <IK:footer-menu_link> متن ارایه جایگزین بشه و در آخر جایگزین تگ <IK:footer-menu> بشه و کل قسمت html بهمراه متن قبل و بعد رو چاپ کنه.
پیشاپیش از جواب هاتون ممنونم.:قلب::قلب::بوس::بوس:

Tarragon
چهارشنبه 16 اسفند 1391, 10:52 صبح
آخه چرا کسی جواب سوال های منو نمی ده؟!
تو تاپیک قبلی هم هیچ استادی جواب منو نداد!
خواهش می کنم کمک کنید من به جواب این سوال شدید نیاز دارم.

mokha21
چهارشنبه 16 اسفند 1391, 11:54 صبح
دوست عزیز کدی که به نظر من رسید اینه:


<?php

$html =
'<div class="footer_menu right">
<IK:footer-menu>
<a href="<IK:footer-menu_link>" class="menu" ><IK:footer-menu_title></a>
</IK:footer-menu>
<a href="rss/" class="feed" title="feed"><img src="public/images/feed.png" width="28" height="28"></a>';


$array = array(
array( 'title' => 'مسی' , 'link' => 'http://messi.com'),
array( 'title' => 'رونالدو' , 'link' => 'http://ronaldo.com')
);


$start = strpos( $html , '<IK:footer-menu>' ) + strlen('<IK:footer-menu>');
$end = strpos( $html , '</IK:footer-menu>' );


$a = rtrim( substr( $html , $start , $end-$start ) );


$exit = '';

foreach($array as $_a)
{
$_a_ = $a;
$_a_ = str_replace( '<IK:footer-menu_link>' , $_a['link'] , $_a_ );
$_a_ = str_replace( '<IK:footer-menu_title>' , $_a['title'] , $_a_ );

$exit .= $_a_;
}

$result = preg_replace( '@\n<IK:footer-menu>.*?</IK:footer-menu>@si' , $exit , $html );

echo $result;

?>

ولی ممکنه راه دیگه ای وجود داشته باشه که بهینه تر باشه .

Tarragon
چهارشنبه 16 اسفند 1391, 12:04 عصر
سلام
تشکر که بهم کمک کردید اما با DOM نمی شه؟

mokha21
چهارشنبه 16 اسفند 1391, 12:08 عصر
شرمنده من همین قدر بلد بودم.

Tarragon
چهارشنبه 16 اسفند 1391, 12:26 عصر
شرمنده من همین قدر بلد بودم.
نه بابا این چه حرفیه!همین که افتخار دادید و بهم کمک کردید یه دنیا ارزش داره!تشکر.

MMSHFE
چهارشنبه 16 اسفند 1391, 13:07 عصر
<?php
$contents = file_get_contents('template.tpl');
$about = array(
array("title" => "مسی","link" => "messi"),
array("title" => "رونالدو","link" => "ronaldo")
);
$start = '<IK:footer-menu>';
$end = '</IK:footer-menu>';
$footerMenu = substr($contents, strpos($contents, $start));
$footerMenu = substr($contents, 0, strpos($contents, $end) + strlen($end));
$fMenu = '';
foreach($about as $link) {
$fMenu .= str_replace('<IK:footer-menu_link>', $link['link'], str_replace('<IK:footer-menu_title>', $link['title'], $footerMenu)) . PHP_EOL;
}
$contents = str_replace($footerMenu, $fMenu, $contents);
echo $contents;
?>

با DOM معمولی فکر نکنم چون تگهای شما سفارشی هستن. شاید با XMLDOM بشه یه کارهایی کرد ولی بهتر از اون، نوشتن یک Template Engine اختصاصی هست.

Tarragon
چهارشنبه 16 اسفند 1391, 13:38 عصر
سلام.
اولا سپاس بسیار.
بعد با اجازه استاد شهرکی خط 20 رو اینجوری تغییر بدید
$contents = str_replace($footerMenu, $fMenu,$contents);
تا ارور نده.
سوما خروجی اینه

<div class="footer_menu right">
<IK:footer-menu>
<a href="messi" class="menu" >مسی</a>
</IK:footer-menu>
<div class="footer_menu right">
<IK:footer-menu>
<a href="ronaldo" class="menu" >رونالدو</a>
</IK:footer-menu>

<a href="rss/" class="feed" title="feed"><img src="public/images/feed.png" width="28" height="28"></a>

نوشتن یک Template Engine اختصاصی هست.
یعنی چی؟!
می شه یکم توضیح بدید آخه من خیلی وارد نیستم :(
بازم هم تشکر.

MMSHFE
چهارشنبه 16 اسفند 1391, 14:56 عصر
با تشکر از نکته ای که گفتین (البته خط 15 بود). توی کدی که تست کردم درست بود ولی نمیدونم چرا اینجا اینجوری کپی شده. بگذریم، همین کاری که دارین انجام میدین رو بهش میگن ساخت Template Engine یعنی نوشتن یک موتور قالب که بتونه تگهای سفارشی شما رو شناسایی و جایگزین کنه. کاری که Smarty و سایر TEها انجام میدن.

Tarragon
چهارشنبه 16 اسفند 1391, 17:28 عصر
ببخشید اما الان خروجی درست نیست! خروجی رو بالا زدم.لطفا یه چک بکنید.
الان با DOM نشد؟
اگر بخوام کاری کنم با DOM بشه چکار باید بکنم؟

Tarragon
پنج شنبه 17 اسفند 1391, 07:57 صبح
up........

ببخشید اما الان خروجی درست نیست! خروجی رو بالا زدم.لطفا یه چک بکنید.

MMSHFE
پنج شنبه 17 اسفند 1391, 10:48 صبح
<?php
$contents = file_get_contents('template.tpl');
$about = array(
array('title' => 'مسی', 'link' => 'messi'),
array('title' => 'رونالدو', 'link' => 'ronaldo')
);
$s = '<IK:footer-menu>';
$e = '</IK:footer-menu>';
$spos = strpos($contents, $s);
$footerMenu = substr($contents, $spos);
$epos = strpos($footerMenu, $e);
$footerMenu = substr($footerMenu, 0, $epos + strlen($e));
$fMenu = '';
foreach($about as $link) {
$menu = substr($footerMenu, strlen($s), strlen($e) * -1);
$fMenu .= str_replace('<IK:footer-menu_link>', $link['link'], str_replace('<IK:footer-menu_title>', $link['title'], $menu)) . PHP_EOL;
}
$contents = str_replace($footerMenu, $fMenu, $contents);
echo $contents;
?>

Tarragon
جمعه 18 اسفند 1391, 20:56 عصر
سلام
تشکر آقای شهرکی کد بسیار عالی بود اما یه سوال برام بوجود اومد.اونم اینه که در سورس

<div class="footer_menu right">

<a href="messi" class="menu" >مسی</a>


<a href="ronaldo" class="menu" >رونالدو</a>


<a href="rss/" class="feed" title="feed"><img src="public/images/feed.png" width="28" height="28"></a>
که خروجی کد شما است 5 بار "بدون نیاز" خط به پایان می رسه چطوری می شه اینو حذف کرد؟

MMSHFE
جمعه 18 اسفند 1391, 21:54 عصر
اون PHP_EOL آخر خطوط رو حذف کنید، هرچند ضرورتی نداره چون توی خروجی نهایی تغییری ایجاد نمیکنه و HTML به </br> حساسه نه Enter و اینطوری کد خواناتره.

Tarragon
شنبه 19 اسفند 1391, 06:43 صبح
سلام
تشکر ، می دونم آخه می خوام کدم تمیز تر باشه و کسی که توی سورس صفحه می یاد احساس کدنویسی استاندارد رو نسبت به سایت داشته باشه!

MMSHFE
شنبه 19 اسفند 1391, 23:53 عصر
کلاً باید ببینید کجاها New Line درج میشه. خروجی ها رو Trim کنید تا New Line ها حذف بشن. یکم روی کد کار کنید دستتون میاد، کار سختی نیست.

Tarragon
یک شنبه 20 اسفند 1391, 15:30 عصر
سلام
ببخشید آقای شهرکی(یا هر استاد دیگه) اگر بخواهم از حلقه های تودرتو استفاده کنم میشه؟
مثلا واسه مثال زیر چه کد phpی نیاز هست؟


<div class="main" >
<IK:news_box>
<div class="news_box right">
<div class="box_head right"><a href="<IK:news-box_link>"><IK:news-box_title></a></div>
<ul>
<IK:news-box_ul><li id="sp"><a target="_blank" href="<IK:news-box_li_link>" ><IK:news-box_li_title></a></li>
</IK:news-box_ul>
</ul>
</div></IK:news_box>
</div>

MMSHFE
یک شنبه 20 اسفند 1391, 22:45 عصر
هیچ کاری نشد نداره. با کمی تفکر و تغییر نمونه کدی که گذاشتم، میتونید این مورد رو هم بنویسید.

Tarragon
دوشنبه 21 اسفند 1391, 05:47 صبح
ببخشید می شه کد رو خودتون ویرایش کنید آخه من از strpos و ... غیره هیچی سر در نمی یارم.

MMSHFE
دوشنبه 21 اسفند 1391, 08:44 صبح
این توابع که کار پیچیده ای نمیکنن. مثلاً همین strpos دو تا رشته میگیره و محل پیدا شدن رشته دوم توی رشته اول رو برمیگردونه. اگر هم نتونه پیداش کنه، false برمیگردونه.

Tarragon
دوشنبه 21 اسفند 1391, 14:09 عصر
آرماگون سوم چیه؟

MMSHFE
دوشنبه 21 اسفند 1391, 14:12 عصر
مشخص میکنه از چندمین کارکتر شروع به جستجو کنه.

Tarragon
دوشنبه 21 اسفند 1391, 14:20 عصر
شما نمی تونید کد رو کامل کنید بهم بدید؟
شرمنده ها و ببخشید :X

Tarragon
سه شنبه 22 اسفند 1391, 17:07 عصر
اقای شهرکی با کمک explde و inplode هم میشه این کارو کرد.
بنظر شما این بهتریه یا اون؟
آخه من می فهمم که توی اونا چی شده اما با اینها تقریبا هیچی نمی فهمم.

MMSHFE
چهارشنبه 23 اسفند 1391, 01:02 صبح
هرجور خودتون راحتترین. کدی که من گذاشتم فقط یک نمونه بود.