PDA

View Full Version : سوال: راهنمایی راجب سیستم کد قالب وبلاگ ها



theboy
یک شنبه 17 دی 1391, 02:58 صبح
سلام.
خوب شکر خدا کار اسکریپت وبلاگ دهی ما داره خوب پیش میره و الان رسیدم به قسمت قالب ها.

مشکلی که بهش بر خوردم:

چجوری تگ هایی که در کد قالب هست رو بجاشون کد php بذارم؟ :متفکر:

خودم روش str_replace به ذهنم رسید ولی برای حلقه ها به مشکل برخوردم! مثبلا <posts_start> رو باید با while بذارم که str_replace جواب نمیده!

راه دیگه ای سراغ دارید؟

theboy
دوشنبه 18 دی 1391, 00:43 صبح
راستی من قالب نهایی رو بعد از دریافت از دیتابیس با Echo نمایش می دم! شما پیشنهاد دیگه ای ندارید؟

webdesign2
دوشنبه 18 دی 1391, 00:58 صبح
راستی من قالب نهایی رو بعد از دریافت از دیتابیس با Echo نمایش می دم! شما پیشنهاد دیگه ای ندارید؟ سلام !
همین کارت درسته

theboy
دوشنبه 18 دی 1391, 01:50 صبح
سلام !
همین کارت درسته
آخه اون موقع در اجرای بعضی کدها مثل whileو... به مشکل می خورم!

Tarragon
دوشنبه 18 دی 1391, 08:33 صبح
کاش یه جستجو می کردید!
http://barnamenevis.org/showthread.php?319805

theboy
دوشنبه 18 دی 1391, 09:34 صبح
کاش یه جستجو می کردید!
http://barnamenevis.org/showthread.php?319805

تا جایی که من فهمیدم مشکل من با ایشون زمین تا آسمون فرق داره!;)
ایشون یه فایل html دارن که خوب includeش می کنند تو صفحه، ولی من قالب رو با Echo نمایش می دم!!
(کاش بیشتر دقت می کردید!)

MMSHFE
دوشنبه 18 دی 1391, 16:59 عصر
دوست عزیز، مشکل شما هم دقیقاً مثل این دوستمون هست. فایل htm. هم مثل فایل متنی معمولی فاقد هرگونه پردازش هست. مهم اینه که شما قالب متنی رو بخونید، بعد هرجا حلقه لازم بود، یک رشته خالی میسازین و توی حلقه هربار یک رکورد رو میخونید و بصورت رشته به انتهای رشته قبلی اضافه میکنید. نهایتاً بعد از حلقه، رشته خالی اولیه با یک رشته کامل که فاقد مطالب شما هست جایگزین شده و میتونید با str_replace یا هر روش دیگری، اون رو جایگزین تگی کنید که توی قالب براش درنظر گرفتین.

theboy
دوشنبه 18 دی 1391, 18:17 عصر
دوست عزیز، مشکل شما هم دقیقاً مثل این دوستمون هست. فایل htm. هم مثل فایل متنی معمولی فاقد هرگونه پردازش هست. مهم اینه که شما قالب متنی رو بخونید، بعد هرجا حلقه لازم بود، یک رشته خالی میسازین و توی حلقه هربار یک رکورد رو میخونید و بصورت رشته به انتهای رشته قبلی اضافه میکنید. نهایتاً بعد از حلقه، رشته خالی اولیه با یک رشته کامل که فاقد مطالب شما هست جایگزین شده و میتونید با str_replace یا هر روش دیگری، اون رو جایگزین تگی کنید که توی قالب براش درنظر گرفتین.
درسته فایل .htm معمولی هست. ولی فقط با includeکردنش تمام کد ها نمایش داده میشن. ولی من برای نمایش باید از echoو... استفاده کنم که اون موقع در حلقه ها دچار مشکل میشه! یعنی می گه در echo نمیشه while گذاشت! اگرم while رو جدا گانه بنویسم و متغیر توش رو بذارم به صورت حلقه نمیشه و فقط یک پست رو نمایش می ده!

اگر حرف بالام ربطی نداره اگه میشه شما یه مثال راجب راه حلی که گفتی بزن.
ممنون.

MMSHFE
دوشنبه 18 دی 1391, 18:23 عصر
دوست گرامی، میتونید بجای include کردن از file_get_contents استفاده کنید و محتواش رو بخونید و بریزین توی یک متغیر و بعد با اون متغیر هرکاری خواستین (str_replace و...) انجام بدین و نهایتاً محتوای آماده شده رو echo کنید.

theboy
دوشنبه 18 دی 1391, 19:12 عصر
خوب آخه قالب ها در فایل نیستند که! تو دیتابیس هستند.

MMSHFE
دوشنبه 18 دی 1391, 19:14 عصر
خوب دوست عزیز، بجای استفاده از file_get_contents از توی دیتابیس بخونید و توی متغیر بریزین و بقیه کارها هم که یکسانه. باور کنید این مسئله اینقدرها که خودتون توی ذهنتون اون رو دشوار کردین، پیچیده نیست. یکم آرامش داشته باشین و دوباره به مسئله فکر کنید تا راه حلها خودشون رو به شما نشون بدن.

theboy
دوشنبه 18 دی 1391, 20:46 عصر
خوب دوست عزیز، بجای استفاده از file_get_contents از توی دیتابیس بخونید و توی متغیر بریزین و بقیه کارها هم که یکسانه. باور کنید این مسئله اینقدرها که خودتون توی ذهنتون اون رو دشوار کردین، پیچیده نیست. یکم آرامش داشته باشین و دوباره به مسئله فکر کنید تا راه حلها خودشون رو به شما نشون بدن.
ببین دوست عزیز دقیقا مشکل من همینه!
باید کدها رو از دیتابیس بگیرم و بریزم توی متغییر، حالا چجوری باید نمایشش بدم؟ با Echo. خوب وقتی ECHO می کنم اون قسمتی که باید با while جایگزین بشه ارور میده.

اگه میشه شما خودت یه چیز فرضی بنویس! یه متن رو echo کن بعد یه قسمت متن رو با while جایگزین کن. به طوری که در متن مثلا <posts_start> شروع حلقه و </posts_start> پایان حلقه باشه.[post_title] چیزی باشه که در حلقه تکرار میشه(از دیتابیس). قبل و بعد [post_title] طراح بتونه کد html بذاره!
اینه که من توش موندم :متفکر:

MMSHFE
دوشنبه 18 دی 1391, 21:04 عصر
شما اون لینکی که دوستان گذاشتن رو نگاه کردین؟ اونها محتوا از فایل htm. خونده میشد. شما فقط همون بخشی که از فایل میخوند رو تغییر بدین و از دیتابیس بخونید. قبل از جایگزین کردن هم نباید چیزی رو echo کنید.

theboy
دوشنبه 18 دی 1391, 22:54 عصر
ببینید من هر دوی این کدها رو امتحان کردم:



<?php
$query = mysql_query("SELECT * FROM `posts` WHERE `bid`='$bid'");
while($record = mysql_fetch_array($query)){
$title = $record['title'];
$theme = str_replace('[post_title]',$title,$theme);
};

echo $theme;
?>





<?php
$query = mysql_query("SELECT * FROM `posts` WHERE `bid`='$bid'");
while($record = mysql_fetch_array($query)){
$title = $record['title'];
$theme = str_replace('[post_title]',$title,$theme);
};

echo $theme;
?>


در هر دو فقط یک پست نمایش داده میشه! یعنی حلقه کار نمی کنه!!

MMSHFE
دوشنبه 18 دی 1391, 23:53 عصر
اینو امتحان کنید:


<?php
$query = mysql_query("SELECT * FROM `posts` WHERE `bid`='{$bid}'");
$titles = '';
if($query) {
while($record = mysql_fetch_assoc($query)){
$titles .= '<p>' . $record['title'] . '</p>';
}
}
$theme = str_replace('[post_title]', $titles, $theme);
echo $theme;
?>

حلقه شما کار میکنه منتها هربار مقدار جدید جایگزین مقدار قبلی title$ میشه درحالی که توی کدی که من گذاشتم، بخاطر =. هربار مقدار جدید به انتهای مقدار قبلی اضافه میشه.
موفق باشید.

theboy
سه شنبه 19 دی 1391, 08:18 صبح
مشکل اصلی اینجا خودشو نشون میده!
الان تمام پست هام رو نشون میده، ولی انگار همه ی پست ها رو ریخته تو یه متغیر که هرجا [post_title] باشه اون متغییر نمایش داده میشه!! یعنی کل پست ها(فعلا عنوانشون) یه رشته هست و نمیشه برای هر عنوان استایل اختصاصی تعریف کرد.
مثلا در قالب یه همچین چیزی بشه:



[post_title]

<br />

<hr />


یعنی بعد از هر پست یه <br /> یه <hr /> باشه ولی الان اینطوری نیست! مثلا دو تا پست داریم. تست 1 و تست 2 باید اینطوری باشه:
تست 1
<br />
<hr />
تست 2
<br />
<hr />

ولی الان اینجوریه:
تست1تست2
<br />
<hr />

MMSHFE
سه شنبه 19 دی 1391, 19:50 عصر
<?php
$query = mysql_query("SELECT * FROM `posts` WHERE `bid`='{$bid}'");
$titles = '';
if($query) {
while($record = mysql_fetch_assoc($query)){
$titles .= $record['title'] . '<br/><hr/>';
}
}
$theme = str_replace('[post_title]', $titles, $theme);
echo $theme;
?>

theboy
سه شنبه 19 دی 1391, 20:01 عصر
<?php
$query = mysql_query("SELECT * FROM `posts` WHERE `bid`='{$bid}'");
$titles = '';
if($query) {
while($record = mysql_fetch_assoc($query)){
$titles .= $record['title'] . '<br/><hr/>';
}
}
$theme = str_replace('[post_title]', $titles, $theme);
echo $theme;
?>

خوب نه دیگه!
این یه سیستم وبلاگ دهیه! کسی که داره قالب رو طراحی می کنه قرار نیست حلقه رو دستکاری کنه که، فقط با [post_title] کار داره!
یعنی اینطوری بنویسه:

[post_title] <br /><hr />
بعد در عمل اینطوری که شما دادی کار کنه.

MMSHFE
سه شنبه 19 دی 1391, 22:00 عصر
خوب دوست عزیز، شما یکم راه رو اشتباه رفتین. توی قسمت ویرایش قالب کاربر باید اینطوری بنویسه (مثال) :


[post]
[post_title]<br/><hr/>
[post_body]
[!post]

یعنی یه جاهای تگ جفت باید بگذاره ( مثل [post] ) که پایانش با ! یا / (برحسب تمایل خودتون) مشخص میشه. اینطوری میفهمین تا کجا محدوده تگ پست هست. حالا مثلاً توی اون بخش، post_title یعنی عنوان و...
مثال برای پردازش قالب بالا:


<?php
$start = strpos($theme, '[post]');
$end = strpos($theme, '[!post]', $start + strlen('[!post]'));
$post = substr($theme, $start, $end - $start);
$query = mysql_query("SELECT * FROM `posts` WHERE `bid`='{$bid}'");
$posts = '';
if($query) {
while($record = mysql_fetch_assoc($query)) {
$temp = $post;
$temp = str_replace('[post_title]', $record['title'], $temp);
$temp = str_replace('[post_body]', $record['body'], $temp);
$posts .= $temp;
}
}
$theme = str_replace($post, $posts, $theme);
echo $theme;
?>

کار طراحی موتور قالب به این راحتیها هم نیست. مثلاً میتونید قسمت بازشدن تگ پستها رو تخصصی تر کنید. مثلاً اگه کاربر توی قالبش بنویسه:


[post:5:DESC]
...
[!post]

فقط 5 پست آخر نشون داده بشه (که در اینجا خودتون باید به انتهای کوئری، ORDER BY `id` DESC LIMIT 5 رو اضافه کنید).
در کل یک مقدار تفکر و تعمق و خلاقیت میخواد. سخت هست ولی غیرممکن نیست.
اگه بخواین وارد این پیچیدگیها بشین، استفاده از Smarty خیلی بهتره.

theboy
سه شنبه 19 دی 1391, 23:51 عصر
میشه راجب smarty بیشتر توضیح بدید؟ مستندات فارسی هم داره؟

nsco_nsco
چهارشنبه 20 دی 1391, 00:12 صبح
سلام
این لینک رو ببینید دوستان چند روز پیش گذاشته بودند :
http://barnamenevis.org/showthread.php?377749-Master-Page-%D8%AF%D8%B1-php
اخرین پست رو ببینید موفق باشید

theboy
چهارشنبه 20 دی 1391, 09:33 صبح
راستش یه نگاهی انداختم. به نظرم استفاده ازش خیلی به نفعم نیست!

شما فرض کن این انجین میاد {while} رو جایگزین while می کنه، بعد من بیام تو قالب [post] رو جایگزین {while} کنم که اون جایگزینش کنه با while خوب خیلی قاطی پاتی میشه :لبخند:
فکر کنم همون خودم جایگزین کنم بهتر باشه!

theboy
چهارشنبه 20 دی 1391, 11:29 صبح
خوب دوست عزیز، شما یکم راه رو اشتباه رفتین. توی قسمت ویرایش قالب کاربر باید اینطوری بنویسه (مثال) :


[post]
[post_title]<br/><hr/>
[post_body]
[!post]
یعنی یه جاهای تگ جفت باید بگذاره ( مثل [post] ) که پایانش با ! یا / (برحسب تمایل خودتون) مشخص میشه. اینطوری میفهمین تا کجا محدوده تگ پست هست. حالا مثلاً توی اون بخش، post_title یعنی عنوان و...
مثال برای پردازش قالب بالا:


<?php
$start = strpos($theme, '[post]');
$end = strpos($theme, '[!post]', $start + strlen('[!post]'));
$post = substr($theme, $start, $end - $start);
$query = mysql_query("SELECT * FROM `posts` WHERE `bid`='{$bid}'");
$posts = '';
if($query) {
while($record = mysql_fetch_assoc($query)) {
$temp = $post;
$temp = str_replace('[post_title]', $record['title'], $temp);
$temp = str_replace('[post_body]', $record['body'], $temp);
$posts .= $temp;
}
}
$theme = str_replace($post, $posts, $theme);
echo $theme;
?>

کار طراحی موتور قالب به این راحتیها هم نیست. مثلاً میتونید قسمت بازشدن تگ پستها رو تخصصی تر کنید. مثلاً اگه کاربر توی قالبش بنویسه:


[post:5:DESC]
...
[!post]
فقط 5 پست آخر نشون داده بشه (که در اینجا خودتون باید به انتهای کوئری، ORDER BY `id` DESC LIMIT 5 رو اضافه کنید).
در کل یک مقدار تفکر و تعمق و خلاقیت میخواد. سخت هست ولی غیرممکن نیست.
اگه بخواین وارد این پیچیدگیها بشین، استفاده از Smarty خیلی بهتره.

آقا این عالی بود و کار کرد فقط یه مشکلی داره!
هر بار که عنوان رو چاپ می کنه کنارش یه بار هم می نویسه [post] یعنی انگار این کلمه افتاده تو حلقه. اینو حل کنید تمومه.


البته دو تا خواهش دیگه هم دارم که به اندازه ی قبلی مهم نیستن! یکی اینکه کد رو یه توضیح مختصر بهم بدید.
بعد اینکه قسمت آخر که طراح بتونه مثلا بزنه [post limit:5] ایده ای دارید که چطوری میشه عملیش کرد؟ میشه یه مثال بزنید؟

theboy
پنج شنبه 21 دی 1391, 15:48 عصر
آقا کسی نمی دونه مشکل چیه؟ :گریه:

nsco_nsco
پنج شنبه 21 دی 1391, 18:47 عصر
سلام الان دقیق بگید مشکلتون چی هست با تشکر

theboy
پنج شنبه 21 دی 1391, 23:33 عصر
سلام الان دقیق بگید مشکلتون چی هست با تشکر
سلام.
ممنون از توجهتون.
پست شماره 23 توضیح دادم:

هر بار که عنوان رو چاپ می کنه کنارش یه بار هم می نویسه [post] یعنی انگار این کلمه افتاده تو حلقه. اینو حل کنید تمومه.

theboy
جمعه 22 دی 1391, 19:30 عصر
آقا من چیکار کنم :گریه:

nsco_nsco
یک شنبه 24 دی 1391, 03:18 صبح
سلام این مشکل را فایلش رو برام ایمیل کن تا برات حلش کنم موفق باشید

theboy
یک شنبه 24 دی 1391, 09:51 صبح
سلام این مشکل را فایلش رو برام ایمیل کن تا برات حلش کنم موفق باشید
سلام.
فایلش و کدهاش دقیقا همینه:


<?php

$theme = $blog_data['theme'];
$start = strpos($theme, '[post]');
$end = strpos($theme, '[!post]', $start + strlen('[!post]'));
$post = substr($theme, $start, $end - $start);
$query = mysql_query("SELECT * FROM `posts` WHERE `bid`='{$bid}'");
$posts = '';
if($query) {
while($record = mysql_fetch_assoc($query)) {
$temp = $post;
$temp = str_replace('[post_title]', $record['title'], $temp);
$temp = str_replace('[post_body]', $record['body'], $temp);
$posts .= $temp;
}
}
$theme = str_replace($post, $posts, $theme);
echo $theme;
?>

MMSHFE
یک شنبه 24 دی 1391, 23:34 عصر
آقا این عالی بود و کار کرد فقط یه مشکلی داره!
هر بار که عنوان رو چاپ می کنه کنارش یه بار هم می نویسه [post] یعنی انگار این کلمه افتاده تو حلقه. اینو حل کنید تمومه.
داخل حلقه while، قبل از دستور آخر ( =. posts$ ) این دستور رو اضافه کنید:

$temp = str_replace('[post]', '', $temp);
موفق باشید.