SCOPE של משתנה בדרופל 6
שאלה של מתחיל :
אני בונה מודול חדש ובו אני מגדיר משתנה בצורה הבאה : global $myNewVar;
שאלתי היא : מהו ה-SCOPE של המשתנה המוגדר כך כ global ?
דוגמא יותר ספציפית :
שני משתמשים שונים מחוברים לאתר ושניהם משתמשים במודול שלי.
אחד מהם מבצע פעולה שתשנה את ערכו של $myNewVar.
האם המשתמש השני יחוש בשינוי ? - אני מקווה ומניח שלא... - אני צודק ?
אם הייתי רוצה שהמשתמש השני ירגש בהבדל, הייתי צריך להשתמש (למשל) ב variable_set וב variable_get. - נכון ?
אשמח אם משיהו יאיר את עיני ואו יפנה אותי לתיעוד.
תודה מראש.

http://thedrupalblog.com/defi
http://thedrupalblog.com/defined-variables-scope-tip
הכי טוב קוד פתוח. יותר טוב דרופל. www.drupal-expert.com
תודה על התגובה המהירה. מה
תודה על התגובה המהירה.
מה שכתוב בלינק שהפנית אותי אליו, כבר ידוע לי.
אבל עדיין לא קיבלתי תשובה לשאלותיי הספציפיות.
תודה מראש.
http://drupal.org/node/52649
http://drupal.org/node/52649
כל משתמש מקבל "scope" משלו. כל המשתנים נטענים לזכרון השרת עם הקריאה למודול , וכמובן לוקחים בחשבון את מערכת ה- cache . (כן, גם משתנים נשמרים ב- cache).
שינויי המשתנה הגלובלי לעולם תלוי במיקום הפונקציה שקראה למשתנה + מיקום המודול בסדר העלייה של דרופל, תוך התחשבות במערכת ה- cache של דרופל. ככל שהמשתנה מוגדר/מעודכן בשלב מוקדם יותר של טעינת עמוד כלשהו כך יותר מודולים / יותר חלקים בדרופל יהיו חשופים למשתנה.
הדרך שאני הייתי מעביר מידע בין משתמשים היא באמצעות בסיס הנתונים - כפי שרשמת ( variable_set / variable_get ) ששומר לטבלת המשתנים הגלובליים - טבלתvariable
session היא דרך להעביר מידע מעמוד לעמוד - אבל הם יחודיים לכל משתמש בעצם הגדרתם.
אפשרות מעניינת שעלתה בדיון בקישור שהוספתי בנושא שאלתך "משתנים גלובליים ביחס למשתמשים במערכת" - להוסיף משתנה לאובייקט $user .
אם אתה רוצה משתנה גלובלי אחד שכשמשתמש מסויים מעדכן אותו - כל המשתמשים האחרים רואים את העדכון בטעינה הבאה של העמוד , הכי טוב זה להשתמש ב- variable_set / variable_get = לשמור בבסיס הנתונים תוך כדי שימוש אוטומטי במערכת ה cache של דרופל בכל קריאה למשתנה הגלובלי...
הכי טוב קוד פתוח. יותר טוב דרופל. www.drupal-expert.com
הscope של משתנה גלובלי הוא
הscope של משתנה גלובלי הוא לפי ריקווסט לשרת, כך שמה שמשתמש אחד יעשה לא ישפיע על המשתמש השני.
פרלמן יובל
Linnovate - Community Infrastructure Care
אני חושב שהתשובה לא כל כך
אני חושב שהתשובה לא כל כך משנה, כי השימוש בגלובלים לא מומלץ, והשימוש בו נדיר מאוד בדרופל. אתה יכול לכתוב פונקציית API עם משתנה סטטי, שהפנייה אליה מציבה את הערך או מקבלת אותו. ככה, הערכים משתנים רק ממקום אחד.
אמתי -- חברת גיזרה
תודה. ברשותך, אני אתן דוגמא
תודה.
ברשותך, אני אתן דוגמא פשוטה וספציפית יותר ואשמח לשמוע המלצות.
נניח שיש לי מערך דו-מימדי myArray$ שרובו אינו משתנה לעולם, אך תאים מסוימים ממנו, משתנים בהתאם לבחירת המשתמש המחובר ואני רוצה שהבחירה/שינוי של משתמש, ישפיעו אך ורק עליו ולא על משתמשים אחרים שמחוברים כעת ובוחרים באפשרויות אחרות.
לאחר שמשתמש מבקש, אני מייצר עבורו מהמערך, טבלת HTML כך :
;theme('table', $headers, $myArray,$attributes)
את הטבלה אני מציג למשתמש כמובן ותוכנה רלוונטי אך ורק למשתמש זה.
בפתרון הנוכחי שלי , הגדרתי את המערך כ-GLOBAL
מהי הדרך היעילה והמומלצת ביותר ליצירת myArray$ במקרה שלי ?
תודה מראש
אתה יכול להשתמש
אתה יכול להשתמש ב
$_SESSION
לדוגמא
$_SESSION['my_array] = array(1,2,3);
פרלמן יובל
Linnovate - Community Infrastructure Care
אני אחדד : נניח שיש לי מערך
אני אחדד :
נניח שיש לי מערך דו מימדי ( 80 שורות על 3 עמודות ) ורוב מוחלט של התאים אינו משתנה לעולם.
לאחר שמשתמש בוחר בשינוי כלשהו, הבחירה תגרום לשינוי של 4 או 5 תאים בלבד מתוך התאים המעטים שיכולים להשתנות ולכן זה נראה לי בזבזני ליצור את המערך מחדש עבור כל משתמש, לכל SESSION.
אני מחפש את הדרך היעילה ביותר ליצור את המערך פעם אחת בלבד בחיי השרת ולכל בקשה ספציפית של משתמש, לשנות עבור המשתמש הנוכחי, רק את התאים שצריך לשנות (למשל על עותק חדש של המערך המקורי) ואז להציג את עותק המערך.
תודה מראש
לא רק שמשתמש אחר לא רואה אותו
לא רק שמשתמש אחר לא רואה אותו משתנה אלה גם בקשות דפים נפרדים של אותו משתמש גם לא רואים אותו משתנה
http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#HTTP_session_state
בפתרון הנוכחי שלי , הגדרתי את המערך כ-GLOBAL
לא מגדירים משתנה כ global אלה מצהירים עליו , בדרך כלל אין משמעות לשים global בהגדרה של המשתנה , אבל אם כן יש משמעות הרי זה אומר חפש את המשתנה ב scope שעוטף ה scope הנוכחי וזה לא הכוונה של הגדרת המשתנה
כש אתה מגדיר משתנה אתה לא רוצה שיחפשו אותו ב scope "העוטף"
כש אתה מצהיר עליו עם global אתה אומר שאתה לא מגדיר אותו אלה צריך לחפש אותו ב scope העוטף כי הוא מוגדר במקום אחר מהבלוק הנוכחי
http://il2.php.net/manual/en/language.variables.scope.php
yakoub abaya
מה שכתבתי על global לא
מה שכתבתי על global לא מדויק
אני חושב שיש scope יחיד ב php שהוא מוגדר כ global וזה לא ניתן ל קינון כמו שתיארתי לעצמי
לכן המלה global יכולה גם להגדיר משתנה ולא רק להצהיר עליו
http://www.php.net/manual/en/reserved.variables.globals.php
yakoub abaya
השימוש בו נדיר מאוד
ובכל זאת, לדוגמה: $user, $theme, $lang ועוד...
זהר סטולר, לינווייט
לינווייט תשתיות תוכן קהילתיות
אני אחדד : נניח שיש לי מערך
אני אחדד :
נניח שיש לי מערך דו מימדי ( 80 שורות על 3 עמודות ) ורוב מוחלט של התאים אינו משתנה לעולם.
לאחר שמשתמש בוחר בשינוי כלשהו, הבחירה תגרום לשינוי של 4 או 5 תאים בלבד מתוך התאים המעטים שיכולים להשתנות ולכן זה נראה לי בזבזני ליצור את המערך מחדש עבור כל משתמש, לכל SESSION.
אני מחפש את הדרך היעילה ביותר ליצור את המערך פעם אחת בלבד בחיי השרת ולכל בקשה ספציפית של משתמש, לשנות עבור המשתמש הנוכחי, רק את התאים שצריך לשנות (למשל על עותק חדש של המערך המקורי) ואז להציג את עותק המערך.
תודה מראש
נשמע כמו פרופיל של משתמש ,
נשמע כמו פרופיל של משתמש , אני לא מבין למה לא פשוט לשמור למסד נתונים במקום משתנה גלובאלי , המידע ישמר ויטען למשתנה global $user
אז או שתשתמש ב מודול content profile או תממש בעצמך hook_user
yakoub abaya
זה לא פרופיל של משתמש ולא
זה לא פרופיל של משתמש ולא מדובר על נתונים שאני צריך לשמור ב-DATABASE.
אני לא רוצה להשתמש במודול אחר ולמרות שאני חדש בדרופל (אני מתכנת מאד מנוסה, אבל לא בדרופל ולא ב- PHP...), אני בטוח שאין צורך להשתמש במודול אחר. אני גם לא רוצה ליצור תלות במודול אחר.
לעניות דעתי, מדובר בפתרון מאד פשוט, אני פשוט לא יודע מהו הפתרון הנכון בדרופל...
הבהרות :
כל משתמש בוחר בחירות מסוימות ועל פיהן אני מציג לו נתונים שרלוונטיים עבורו, לאותו הרגע בלבד.
אין לבחירותיו משמעות בעתיד, כלומר, כשהוא יגיע בפעם הבאה לאתר, אין שום משמעות לבחירותיו בעבר ולכן אין צורך לשמור נתונים ב-DATABASE.
לא מדובר על נתונים אישיים. כלומר כל משתמש שיבחר את אותן בחירות, יקבל את אותן תוצאות.
דוגמא :
נניח שמדובר על שאלון שמורכב משאלות רבות ובחירותיו של המשתמש, יופיעו בטבלת HTML .
(כל מילה בכל משפט, "יושבת" בתא נפרד בטבלת HTML )
ניקח שאלה לדוגמא :
נניח שהמשתמש צריך להכניס את ציון המבחן הפסיכומטרי שלו ועפ"י הציון, יופיע משפט שרובו קבוע מראש:
אם המשתמש יכניס 400 -
יתקבל המשפט : הציון שלך הוא מתחת לממוצע ציוני הפסיכומטרי בישראל
אם המשתמש יכניס 700 -
יתקבל המשפט : הציון שלך הוא מעל לממוצע ציוני הפסיכומטרי בישראל
כל המילים מלבד "מתחת" ו "מעל", נמצאות מראש בתאי המערך והן אינן משתנות לעולם.
כלומר אני רוצה ליצור את המערך פעם אחת ולהשאיר מילה ריקה במקום של "מעל" (או "מתחת") וכך כשמשתמש יכניס בחירה, אני אשנה רק תא אחד בכל פעם ואז אציג את המערך כטבלת HTML.
תודה מראש.
נראה לי שהפתרון של amitai
נראה לי שהפתרון של amitai הוא המתאים ביותר
yakoub abaya
מה עם להשתמש בארגומנטים בUrl?
מה עם להשתמש בארגומנטים בUrl?
פרלמן יובל
Linnovate - Community Infrastructure Care
בעצם הפתרון של משתנה global
בעצם הפתרון של משתנה global או static לא ישמור הערך במעבר בין דפים ,
לכן יהיה צורך להשתמש ב session או ארגומנטים ל url
אפשרות דרופלית נוספת זה form_state storage
yakoub abaya
שימוש בארגומנטים ב-URL, לא
שימוש בארגומנטים ב-URL, לא נראה לי פתרון "יפה" ,מה גם שהוא מוגבל באורכו.
1. אם אני מבין אותך נכון, static נשמר רק ברמת המשתמש ולא ברמת השרת. - אני צודק ?
תוכל בבקשה להפנות אותי לתיעוד על static בדרופל ?
2. מה דעתך על הפתרון הבא ?
שמירת המערך המקורי בעזרת
variable_setפעם אחת ברמת השרת ובעת הצורך, טעינתו ל-SESSION לכל משתמש בעזרתvariable_getואז מניפולציה על המערך שב SESSIONדוגמא :
$_SESSION['currArray'] = variable_get('myArray',NULL);
if (!isset($_SESSION['currArray'])){
variable_set('myArray',array('0' => 'aaa', '1'=> 'aaa', '2'=>'ccc', .......));
}
// Changing one cell:
$_SESSION['currArray']['1']='yyy';
drupal_set_message('array cell 1 is ' . $_SESSION['currArray']['1']);
פו יש הסבר על
פו יש הסבר על static
http://www.php.net/manual/en/language.variables.scope.php
הפתרון שרשמתה נראה טוב
yakoub abaya