הוסטס - פורום אחסון האתרים הגדול בישראל

הוסטס - פורום אחסון האתרים הגדול בישראל (https://hosts.co.il/forums/index.php)
-   פורום תיכנות (https://hosts.co.il/forums/forumdisplay.php?f=14)
-   -   איך פועלת מערכת טמפלטים (https://hosts.co.il/forums/showthread.php?t=72499)

possible 08-03-09 09:46

איך פועלת מערכת טמפלטים
 
אוקיי אז עלה לי רעיון לפרוייקט אבל נתקעתי בשלב שאני לא יודע איך לעשות את המערכת טמפלטים ביעילות, הייתי שמח אם הייתם מנחים אותי באיזה אלגוריתם נחמד.

תודה לעוזרים.

vadimg88 08-03-09 11:54

http://www.vadimg.co.il/2009/02/08/%...B%D7%95%D7%9C/

possible 08-03-09 12:02

אחלה תודה הבנתי :P
עכשיו צריך להכין לעצמי CLASS כזה :P

נ.ב אחלה בלוג

intercooler3819 08-03-09 16:37

בזבוז זמן לכתוב מערכת טמפלטים

אקסטרה זמני עיבוד וטרנזלציה של הקוד

עדיף לבצע דבר כזה

בהנחה שיש לך את הקוד של הטמפלט במשתנה כלשהו לבצע
PHP קוד:

eval("?>" . $string . "<?php");

הקוד יורץ כמו שצריך בין הקוד PHP שלך
וגם תוכל לשלב PHP לכל דבר בתור הקוד שלך

הייתי ממליץ לעשות OUTPUT BUFFERING בנוסף ולהדפיס בסוף

בהצלחה

אדיר 08-03-09 21:48

ציטוט:

נכתב במקור על ידי nitsanbn (פרסם 701865)
בזבוז זמן לכתוב מערכת טמפלטים

אקסטרה זמני עיבוד וטרנזלציה של הקוד

עדיף לבצע דבר כזה

בהנחה שיש לך את הקוד של הטמפלט במשתנה כלשהו לבצע
PHP קוד:

eval("?>" . $string . "<?php");

הקוד יורץ כמו שצריך בין הקוד PHP שלך
וגם תוכל לשלב PHP לכל דבר בתור הקוד שלך

הייתי ממליץ לעשות OUTPUT BUFFERING בנוסף ולהדפיס בסוף

בהצלחה

אתה טוען ששימוש ב eval כמו שאתה מציע, עדיף של שימוש בתבניות?

מה גם שהפונקצייה eval חסומה בהרבה שרתים מטעמי אבטחה, חשבת על זה?

daMn 08-03-09 22:01

ציטוט:

נכתב במקור על ידי xPerfection (פרסם 701909)
אתה טוען ששימוש ב eval כמו שאתה מציע, עדיף של שימוש בתבניות?

מה גם שהפונקצייה eval חסומה בהרבה שרתים מטעמי אבטחה, חשבת על זה?

זה שהיא חסומה לא אמור להיות אישיו, זה שיש בעיות אבטחה רציניות ועוד בדרך שאתה עשית את זה, מילא הייתה עובד בהכנסה למשתנה כמו MYBB, אז כן עדיף לבצע בדרכים שואדים דיבר עליהם מאשר הדרך שאתה הצעת.

אדיר 08-03-09 22:27

ציטוט:

נכתב במקור על ידי daMn (פרסם 701914)
זה שהיא חסומה לא אמור להיות אישיו, זה שיש בעיות אבטחה רציניות ועוד בדרך שאתה עשית את זה, מילא הייתה עובד בהכנסה למשתנה כמו MYBB, אז כן עדיף לבצע בדרכים שואדים דיבר עליהם מאשר הדרך שאתה הצעת.

שנסכם את זה במילה אחת?

-!- לא -!-

תבניות, סוף הסיפור.
ואדים כמו שכתבתי לך כבר באחד הפוסטים שלך, אחלה בלוג.

intercooler3819 09-03-09 14:09

אתם כולכם קופצים בלי לחשוב אחרי ואדים

מערכות טמפלטים זה חסרון גדול
ואני יגיד לכם גם למה
על כל טמפלט שנטען יש לבצע:
* טעינה שלו
* PARSING של הקוד והצבת משתנים, ביצוע לולאות וכד'
* קבלת הקוד החדש לאחר ההצבות
* שמירה בבאפר או הדפסה

בשיטה שלי יש לבצע:
* טעינה
* שמירה בבאפר או הדפסה

כיוון שאתם מריצים את זה בתור PHP כמו שהוא אז מה שתקבלו זה פשוט פלט לכל דבר שניתן לעשות בו שימוש לכל דבר, זה כמו ECHO של סטרינג כלשהו

היתרון כאן זה שלא צריך ללמוד ולזכור איך עובדת המערכת טמפלטים שלכם כיוון שזה ממש RAW PHP, עוד יתרון זה שלא צריך לבצע PARSING של הקוד לפני הדפסה ועוד יתרון שאתם לא צריכים לכתוב את כל ההמרות האלה ובנוסף אם אתם לא רוצים לכתוב המרות של לולאות וכו' אתם פשוט יכולים לשלב PHP בקוד שלכם

ואין כאן שום פגם באבטחה
הקוד PHP שמורץ עם הEVAL זה קוד שאתם כתבתם
אם הוא לא מאובטח זה בעיה שלכם וזה לא שום חור אבטחה

יש עוד נקודה שיש לחשוב עליה
החסרון הגדול של מערכת טמפלטים זה שאם מישהו ימשיך לכתוב את הקוד שלכם (משהו שאני מניח שלא נהוג אצלכם, אצלי הוא נהוג והרבה) הוא יצטרך ללמוד את המבנה של המערכת טמפלטים שלכם ואת הPARSING שלה וזה מכה רצינית כשזה קורה.. (מניסיון..)

dabi 09-03-09 14:37

ניצן לא הבנתי אותך
אתה מעודד שימוש בהפרדת הקוד PHP מ HTML אם לא תתן דוגמא בבקשה לדף עם שילוב של PHP ו HTML

vadimg88 09-03-09 14:49

ציטוט:

אתם כולכם קופצים בלי לחשוב אחרי ואדים
אני מבין שנפלת עליי ואתה לא מרפה... ;)

אין ספק שהיתרון ב RAW PHP זה שאין צורך בעיבוד של הנתונים בו. והנכונות להשתמש במערכת מסוג זה תלויה במפתח ובקהל היעד של כל מערכת. אם המערכת תיהיה מוצעת לקהל יעד רחב ביניהם משתמשים שאין להם ניסיון בשפה אז מערכת מסוג זה תיהיה עדיפה (גם אם יקח לה עוד חצי שנייה לעיבוד) מאחר ולכל משתמש פשוט שלא מבין בתכנות יהיה יותר קל לכתוב

<if>
</if>

מאשר

<?php if(): ?>

<?php endif;?

זה גם מקצר לו את הקוד וגם יותר קריא.

לעומת מערכת שהיא סגורה ורק לקהל יעד ספציפי שיודעים לתכנת אז כמובן שעדיף ללכת על קוד PHP ללא צורך במערכת כלשהי.

intercooler3819 09-03-09 14:53

חח לא נפלתי עליך :-)
דווקא בפוסט שלך שקישרת אליו סימנת בסוף שמה שאני מציע יותר יעיל (או שזה בפוסט אחר אצלך באתר חח)

ממ תראה בהנחה שאתה הולך לכתוב למערכת בPHP אז אין סיבה שלא להשתמש בRAW PHP בטמפלטים

אני פשוט מניסון שלי ממש התחרפנתי כשהייתי צריך ללמוד את הסינטקס מערכות טמפלטים מחדש, זה מעיק ולחינם בדרך כלל (פעם אחת זה היה כ'כ קיצוני שהחלטתי להמיר את זה לRAW חח)

daMn 09-03-09 15:14

אני כן מסכים איתך ניצן שאין טעם לבנות מערכת טמפלטינג, זה לדעתי טעות, אבל פשוט להפריד עד כמה שאפשר PHP מHTML, ולהשתמש פשוט בסינטקס של PHP בIFים ולולאת ומשתנים ולא יותר מזה.
כל כך הרבה פריצות יכולות לבוא מEVAL שאם במקרה ושכחת לאבטח איבר קטן אחד הנזק שיכול להיגרם הוא עצום, לכן אני עובד עם אינקלוד פשוט.

AlmogBaku 11-03-09 20:23

ואדים המערכת שלך מסובכת מידי.

אני מצטרף לניצן, זו שיטה הרבה יותר פשוטה, ואם רוצים לעשות tags בקוד אפשר לטעון את הקוד למשתנה להריץ עליו פארסינג ולעשות evaluate..

dabi 11-03-09 20:28

לא הבנתי חברים
בתור מתכנת מה לעשות
אני משתמש בדבר כזה
http://massassi.com/bTemplate/
להפריד ב PHP ל HTML זה די קליל אני מאמין שכל מתכנת אחרי 5 דקות של לימוד יבין
זה לא טוב? אז מה ההכי טוב לעשות שהיה מסודר
תודה

daMn 11-03-09 20:46

ציטוט:

נכתב במקור על ידי dabi (פרסם 702464)
לא הבנתי חברים
בתור מתכנת מה לעשות
אני משתמש בדבר כזה
http://massassi.com/bTemplate/
להפריד ב PHP ל HTML זה די קליל אני מאמין שכל מתכנת אחרי 5 דקות של לימוד יבין
זה לא טוב? אז מה ההכי טוב לעשות שהיה מסודר
תודה

בעיקרון תקרא את המאמר שוואדים כתב, אם באמת חשוב לך שלא יהיו תגי PHP בקבצי View תעבוד עם איזשהו parser, אבל קח בחשבון שיותר מהיר לעבוד בלעדיו, פשוט לכתוב בקודHTML משתני PHP ולאנקלד את התבנית לאתר.

vadimg88 11-03-09 20:46

התשובה היא פשוטה. ומה שאני הולך לומר לך זה מניסיון של שנים, הרבה טעויות במהלך הזמן ופתרונם במהלך שנותי בתור מתכנת.

זה פשוט מאוד, קודם כל תשאל לאיזה קהל יעד המערכת הולכת להיות מכוונת אליו.

אם קהל היעד הוא כלל עולמי/ארצי שזה אומר שכל משתמש יוכל להוריד את זה ולהשתמש בזה, התשובה היא חד משמעית! מערכת טמפלייט ללא ספק!
אם קהל היעד הוא אתה או מתכנת אחר או משהו פנימי בחברה או בכלל משתמשים שיש להם ניסיון עבודה עם PHP אז גם כאן התשובה היא חד משמעית! קוד PHP רגיל בתוך קבצי HTML , ללא שום EVAL.

פשוט מאוד תצור קבצי .phtml תגדיר את השרת שיקרא קבצים עם סיומת זו כקבצי PHP רגילים וכל ה HTML יהיה שם ותוך כדי תוכל לעשות

<?php echo $something; ?>

או בשיטה הקצרה:

<?=$something;?>

אפשר להתווכח שעות על נושאים כאלה, ואפשר פשוט ללמוד ממשהו שכבר התנסה בזה בעבר (בידיוק בנושא הספציפי הזה) ובסופו של דבר הגיע למסקנות הנלמדות.

מכאן זה שיקול דעת של כל אחד מה יותר עדיף לו לעשות.

daMn 11-03-09 20:49

ציטוט:

נכתב במקור על ידי vadimg88 (פרסם 702467)
התשובה היא פשוטה. ומה שאני הולך לומר לך זה מניסיון של שנים, הרבה טעויות במהלך הזמן ופתרונם במהלך שנותי בתור מתכנת.

זה פשוט מאוד, קודם כל תשאל לאיזה קהל יעד המערכת הולכת להיות מכוונת אליו.

אם קהל היעד הוא כלל עולמי/ארצי שזה אומר שכל משתמש יוכל להוריד את זה ולהשתמש בזה, התשובה היא חד משמעית! מערכת טמפלייט ללא ספק!
אם קהל היעד הוא אתה או מתכנת אחר או משהו פנימי בחברה או בכלל משתמשים שיש להם ניסיון עבודה עם PHP אז גם כאן התשובה היא חד משמעית! קוד PHP רגיל בתוך קבצי HTML , ללא שום EVAL.

פשוט מאוד תצור קבצי .phtml תגדיר את השרת שיקרא קבצים עם סיומת זו כקבצי PHP רגילים וכל ה HTML יהיה שם ותוך כדי תוכל לעשות

<?php echo $something; ?>

או בשיטה הקצרה:

<?=$something;?>

אפשר להתווכח שעות על נושאים כאלה, ואפשר פשוט ללמוד ממשהו שכבר התנסה בזה בעבר (בידיוק בנושא הספציפי הזה) ובסופו של דבר הגיע למסקנות הנלמדות.

מכאן זה שיקול דעת של כל אחד מה יותר עדיף לו לעשות.

מוסכם, השאלה שנשאלת היא שאם אני מתכנת בתצורת תגי PHP בתוך קוד HTML אני משתמש בEVAL או באיזשהו אינקלוד על מנת להדפיס בסופו של דבר את התבנית?

vadimg88 11-03-09 20:54

כפי שכבר אמרתי. לא. תשמור את הקבצים בסיומת לדוגמא .phtml ואז תגדיר בשרת שקבצים בסיומת .phtml הם בידיוק כמו קבצים בסיומת .php ואז השרת יעבד אותם בצורת קוד PHP.

daMn 11-03-09 20:59

ציטוט:

נכתב במקור על ידי vadimg88 (פרסם 702470)
כפי שכבר אמרתי. לא. תשמור את הקבצים בסיומת לדוגמא .phtml ואז תגדיר בשרת שקבצים בסיומת .phtml הם בידיוק כמו קבצים בסיומת .php ואז השרת יעבד אותם בצורת קוד PHP.

לא הבנת, הכוונה הייתה בעת ההדפסה הסופית של האתר.
ניקח לדוגמא users.phtml , האם אני קורא לו דרך require או שאני עושה לו eval?

vadimg88 11-03-09 21:07

require כמובן. אפשר גם לכתוב פונקציה שתדפיס קובץ תצוגה כלשהו ולהעביר אליה פרמטרים בנוסף. ככה שיהיה ניתן לדוגמא להגדיר פרמטר בקוד ה PHP שלך בשם var$ ואז בקובץ הטמפלייט יהיה ניתן להשתמש בו.

daMn 11-03-09 21:28

ציטוט:

נכתב במקור על ידי vadimg88 (פרסם 702474)
require כמובן. אפשר גם לכתוב פונקציה שתדפיס קובץ תצוגה כלשהו ולהעביר אליה פרמטרים בנוסף. ככה שיהיה ניתן לדוגמא להגדיר פרמטר בקוד ה PHP שלך בשם var$ ואז בקובץ הטמפלייט יהיה ניתן להשתמש בו.

כן גם זה צריך, אני בעיקרון משתמש בob.
PHP קוד:

function get_include_contents($filename) {
    if (
is_file($filename)) {
        
ob_start();
        include 
$filename;
        
$contents ob_get_contents();
        
ob_end_clean();
        return 
$contents;
    }
    return 
false;



vadimg88 11-03-09 21:35

אני משתמש בזה:

PHP קוד:

public function renderInternal($_viewFile_,$_data_=null,$_return_=false)
    {
        
// we use special variable names here to avoid conflict when extracting data
        
if(is_array($_data_))
            
extract($_data_,EXTR_PREFIX_SAME,'data');
        else
            
$data=$_data_;
        if(
$_return_)
        {
            
ob_start();
            
ob_implicit_flush(false);
            require(
$_viewFile_);
            return 
ob_get_clean();
        }
        else
            require(
$_viewFile_);
    } 

ואז השימוש:

PHP קוד:

$this->renderInternal('something.phtml', array('somevar' => $var)); 

ואז בקובץ phtml אני עושה:

PHP קוד:

<!-- some html here -->
<?php echo $somevar?>
<!-- some html here -->


Daniel 12-03-09 00:20

לפי דעתי OB לא צריך לשמש במערכת....
יש פעמים שבהם חייבים להשתמש ב-OB (אגב lack של תמיכה מ-PHP בנוגע להצגת נתונים, לדוגמא מ-phpinfo),
אבל בטמפלייט? אני ממש לא אוהב את זה, אני מעדיף להשתמש יותר בקבצי סקין עם <if> (כאשר אני משתמש בעוד כמה דברים כדי לקצר תהליכים), נכון שזה דורש גם parsing של הקוד - אבל לפי דעתי זה יותר דינאמי ויותר נוח.

נכון שבסופו של דבר - עדיף בלי קלאסים, בלי מערכת טמפלייטים, בלי גרשיים כפולות ("), לדאוג שהשם של המשתמש יהיה כמה שיותר קצר... אבל היי! יש גבול לרמה של היעילות שצריך שתיהיה.... קוד PHP מתקמפל בכל הרצה, זה מספיק... אתה תחסוך את האקסטרה זמן אם תשתמש ב-APC בשביל העניין....

אני מעדיף שהמערכת שלי תרוץ 50.1 שניות ולא 50 שניות אבל אני אדע שאחר כך כשאצטרך לבצע בה שינויים, זה לא יגזול ממני כמעט שום מאמץ..
חוץ מזה שאתה יכול גם לבצע cache לטמפלייטס...

intercooler3819 12-03-09 01:40

אבל אתה תדע שאתה צריך לדעת סינטקס בעוד שאם יבוא בחור חדש ויעיף מבט על הקוד וירצה לשפץ אותו ולעשות לו מתיחת פנים הוא יצטרך לקרוא את המערכת טמפלטים שלך,ף ללמוד אותה ואז להתחיל לעבוד

ד'א ואדים הסינטקס הבא אמור להכנס בPHP6 כמו שאני זוכר חח
<?php=$var;?>

(הגיע הזמן.. ?> לא תומך תמיד ואם לא צריך לעשות PARSING)

וואדים מתישהו בעבר בדקתי את זה
מכל הבאים
include();
require();
require_once();
include_once();

האינקלוד הרגיל הכי מהיר
יש לי גם הסבר לזה אפילו מבלי להריץ את הדברים אבל אני עוד רגע נרדם..

Shon12 12-03-09 02:03

ציטוט:

נכתב במקור על ידי nitsanbn (פרסם 702513)
אבל אתה תדע שאתה צריך לדעת סינטקס בעוד שאם יבוא בחור חדש ויעיף מבט על הקוד וירצה לשפץ אותו ולעשות לו מתיחת פנים הוא יצטרך לקרוא את המערכת טמפלטים שלך,ף ללמוד אותה ואז להתחיל לעבוד

ד'א ואדים הסינטקס הבא אמור להכנס בPHP6 כמו שאני זוכר חח
<?php=$var;?>

(הגיע הזמן.. ?> לא תומך תמיד ואם לא צריך לעשות PARSING)

וואדים מתישהו בעבר בדקתי את זה
מכל הבאים
include();
require();
require_once();
include_once();

האינקלוד הרגיל הכי מהיר
יש לי גם הסבר לזה אפילו מבלי להריץ את הדברים אבל אני עוד רגע נרדם..

אני לא יודע מה יש בינך לבין וואדים...
ואני גם לא ממש מכיר את שניכם, אבל אני חייב להגיב לזה - אתה כל הזמן מחפש אותו בקטנות.
איפה לשים לו רגל, ככה זה נראה כלפי חוץ(לי לפחות).

vadimg88 12-03-09 06:59

כמו שאמרתי כל אחד יקח את מה שהוא למד כאן וינסה את זה בעצמו. לאחר מכן הוא ידע עם מה הכי כדי לו להשתמש.

AlmogBaku 12-03-09 15:36

אני בכל אופן בחרתי להשתמש בשיטה של evaluate לקוד.
PHP קוד:

$skin file_get_contents("skins/" $skinName "/index.php");
$skin skinTags($skin);
eval(
"?>" $skin); 


פשוט וקל, לא עושה בעיות לא מסבך לא כלום. מניסיון.

intercooler3819 12-03-09 17:27

ציטוט:

נכתב במקור על ידי Shon12 (פרסם 702515)
אני לא יודע מה יש בינך לבין וואדים...
ואני גם לא ממש מכיר את שניכם, אבל אני חייב להגיב לזה - אתה כל הזמן מחפש אותו בקטנות.
איפה לשים לו רגל, ככה זה נראה כלפי חוץ(לי לפחות).

חח ההודעה האחרונה הייתה מופנת אל MASTER T זה באמת לא היה ברור, מצטער

ואממ לא אני לא מחפש אף אחד - באמת שלא (:

וואדים - בחור נחמד, גדול (יש בינינו כמה שנים טובות) ופיקח |Lol|

vadimg88 12-03-09 17:45

אני בסך הכל בן 21, אז אלה אם כן אתה בן 14 אז אני לא כל כך גדול. :)

Daniel 12-03-09 18:52

ציטוט:

נכתב במקור על ידי nitsanbn (פרסם 702595)
חח ההודעה האחרונה הייתה מופנת אל MASTER T זה באמת לא היה ברור, מצטער

ואממ לא אני לא מחפש אף אחד - באמת שלא (:

וואדים - בחור נחמד, גדול (יש בינינו כמה שנים טובות) ופיקח |Lol|

P=
X: "פלוני, אתה מתכנת לא טוב"
W: "היי - אל תגיד לאנשים את זה"
X: "אוקיי, MasterT, אתה מתכנת לא טוב"


בכל מקרה, וואדים, בשבילי תמיד תיהיה גדול P= אגב, ב-PML (PHP Mailing List) למיטב זכרוני לפני מספר ימים מישהו הציגאת השאלה של include vs eval, תעיף מבט =]

intercooler3819 12-03-09 20:04

כן **** מישהו הציג (דרך אג בנחמד שאתה מפרסם שם חח שמתי לב אתה זה **** כן?)

אבל זה היה שאלה על משהו אחר לגמרי

מה ההבדל בין לבצע אינקלוד לבין לבצע EVAL לתוך של הקובץ שאתה רוצה לעשות לו אינקלוד..

בגדול יותר טוב להשתמש באינקלוד כי אחרכך יש לך אופציה לבצע אוטימיזציה עם EACCELERATOR ודומיו אבל מישהו כתב שם שהייתה לו בעיה עם הסקופ והפונקציות המאונקלדות (לא זוכר בדיוק - הנה לינק לMARC: http://marc.info/?l=php-general&m=123685482428695&w=2 אתם מוזמנים לקרוא זה התגובה של רוברט)

להת'

Daniel 12-03-09 20:12

ציטוט:

נכתב במקור על ידי nitsanbn (פרסם 702634)
כן **** מישהו הציג (דרך אג בנחמד שאתה מפרסם שם חח שמתי לב אתה זה **** כן?)

אבל זה היה שאלה על משהו אחר לגמרי

מה ההבדל בין לבצע אינקלוד לבין לבצע EVAL לתוך של הקובץ שאתה רוצה לעשות לו אינקלוד..

בגדול יותר טוב להשתמש באינקלוד כי אחרכך יש לך אופציה לבצע אוטימיזציה עם EACCELERATOR ודומיו אבל מישהו כתב שם שהייתה לו בעיה עם הסקופ והפונקציות המאונקלדות (לא זוכר בדיוק - הנה לינק לMARC: http://marc.info/?l=php-general&m=123685482428695&w=2 אתם מוזמנים לקרוא זה התגובה של רוברט)

להת'

כן, ****, אם מישהו רוצה לחטוף אותי אני מוכן גם לספק פרטים נוספים (תמורת אחוז מהכופר, כמובן)

אגב, require ו-include הן גם מובנית לחלוטין - לא?
תיקון טעות, גם eval מובנית

AlmogBaku 13-03-09 10:59

למעשה ההבדל בין לאנקלד קובץ לבין לעשות לו Evaluate במקרה הזו הוא רק בפארסינג...


כל הזמנים הם GMT +2. הזמן כעת הוא 20:00.

מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ