ריענון נתונים בממשק צפיה
-
יש לי מערכת טלפונית לרישום נקרא לזה "תורים"
נרשמים במערכת ובוחרים את השעה המבוקשת מתוך טבלת התורים.
במערכת נוצר כל יום רשימת תורים על פי הגדרות, וכאשר לקוח מתקשר הוא יכול לבחור תור פנוי מרשימת התורים.
בשטח, יש דלפק בו נמצא נציג המקבל את הבאים וכאשר מגיעים לשטח מזדהים באמצעות הזיהוי והנציג רואה למתי הוזמן ומעדכן על התור אישור הגעה ו/או מעדכן באם שולם או לא התור הנוכחי.
המערכת הטלפונית היא באמצעות (ימות המשיח עם שלוחת API המחוברת לשרת שלי הכתוב) בנוד.
ממשק הניהול הינו בפרימוורק YII2 הכתוב בPHP.
בסיס הנתונים הינו mysql, השרת הינו nginx.
כל רישום במערכת הטלפונית נשמרת ישירות בבסיס הנתונים, ובמקביל גם בתהליך עצמו בנוד.
ממשק הניהול שואב את הנתונים ישירות מבסיס הנתונים.
השאלות הן בנוגע לממשק הניהול.
יש לי כבר בממשק תצוגה שמציגה את טבלת הרישום.
אך הבעיה היא שאני צריך שהמסך יתעדכן כל הזמן בנתונים הדינאמיים של הרישום, זאת אומרת שאם כעת נרשם מישהו במערכת או ביטל ושינה תור וכו' הכל ישתקף אונליין במסך הממשק.
למיטב הבנתי ישנם שתי דרכים, א. ריענון אוטומטי של הדף כל X שניות, שזה אומר שהPHP ישאב שוב את הנתונים מבסיס הנתונים וירנדר את ה HTML שוב שוב.
אני לא צריך לטעון ממש את כל הדף, אלא YII2 תומך ב pjax שזה ריענון אוטומטי של רק חלק מסויים בדף. שזה אומר לרענן רק את החלק של הטבלה של התורים ללא התפריט העליון, כך שזה פחות מפריע לעין.
אך עדיין דורש כל פעם שאיבת הנתונים המלאים, ויכול גם להפריע לביצוע פעולות על תור. כגון אם הנציג ירצה לבצע שמירה ידנית של תור ותוך כדי מישהו נרשם לתור זה דרך הטלפון וכדומה, (אני בכל מקרה יעשה ולידאציה בצד השרת לפני שמירת תור ידני שאני בודק שהוא אכן עדיין פנוי, אבל בכל זאת לצד הלקוח הייתי רוצה שזה מיד יעודכן כנרשם ויתבטל האפשרות של שמירה ידנית).
האמת היא שאני יכול אולי גם לבדוק אפשרות של ריענון על ידי שאיבת json בלבד של הטבלה העדכנית, ולבצע מיזוג מחדש לתוך הטבלה, או יותר מזאת לעבור שורה שורה ולבצע השוואה ובאם השתנה משהו מהקיים זה יעדכן אותו ואחרת לא ישנה אותו כלל, שזה הכי פחות יפריע לעין.
הדרך השניה שאף פעם לא נגעתי בה הינה באמצעות סוקט, שהדף יהיה מחובר כל הזמן לשרת ובכל שינוי בשרת אני דוחף אותו ישירות לקליינט.
אשמח לדעת מה חוות דעתכם, ראשית אם יש פיתרון יותר טוב, שנית האם לעבוד עם סוקט הוא קל או קשה, ומה קורה כאשר החיבור נופל לרגע וכו', עד כמה עבודה ובלאגן יהיה לי מזה.
בנוסף, מעניין לעניין באותו עניין, בעת רישום ידני, על הנציג לבחור את המנוי מתוך טבלת המנויים, לצורך כך עלי לפתוח לו חלון בחירת מנוי, שהוא יכול לחפשו בקלות בכל אחד מהפרטים, כגון שם או טלפון או מספר זהות וכדומה, חשבתי לטעון לו את הכל לחלונית בחירה שיהיה בה טבלה קטנה מבוססת datatable.
השאלה היא איך אני יכול לגרום שגם אם נרשם כעת מנוי חדש למערכת (לא לתור, אלא למינוי), זה יתווסף אוטומטי לטבלה השמורה בזכרון, והאם זה בכלל יעיל לשמור בזכרון של הדף טבלת מנויים, שיכול להגיע לכמה אלפי מנויים לסניף, אלא עדיף תמיד לבצע חיפוש בצד שרת בלבד, אך מסיר את הדינאמיות והקלילות של החיפוש בטבלה על ידי datatable.
סליחה על האריכות אך @dovid אוהב לקבל סיפור מלא (מקוה שכך הכל ברור).
אשמח לקבל את חוות דעתכם -
@חוקר
אם יש לך חשבון נפרד לכל נציג.
אולי אפשר לשמור סטטוס במקום נפרד
ולפנות לשם כל שניה ע"י pjax.
וכל פעם שנעשה הזמנה מהטלפון, לאפס את הסטטוס
ורק אם הסטטוס על 0 ימשוך את כל הנתונים מחדש
ויגדיר את הסטטוס מחדש ל1.
כל זה יכול להעשות גם ע"י סוקט
כמו שכאן באתר מופיע הודעה "יש הודעות חדשות"
ואז אפשר לרענן כדי למשוך את הכל. -
@חוקר אמר בריענון נתונים בממשק צפיה:
סליחה על האריכות אך @dovid אוהב לקבל סיפור מלא
רגע, חסר החלק של איפה הסבתא מצד האמא נולדה, או שפיספתי משהו?
ועכשיו ברצינות, רציתי להעיר:
הדרך השניה שאף פעם לא נגעתי בה הינה באמצעות סוקט, שהדף יהיה מחובר כל הזמן לשרת ובכל שינוי בשרת אני דוחף אותו ישירות לקליינט
אתה מציג את זה כאילו זה שתי פתרונות שונות לאותה בעיה:
- רענון הכל
לעומת
- websocket
אבל הם לא קשורים, הם פתרונות לבעיות שונות:
יש לך שאלה אחת, איך לסנכרן את הדאטה בדפדפן עם הדאטה ב-DB, לרענן את הכל מהשרת או לקבל רק שינויים מהשרת ולמזג את השינויים בדאטה הקיימת.
אפשר לעשות את השיטה השנייה גם בלי ווב סוקט אלא לתשאל את השרת כל כמה שניות אם יש שינויים.
ווב סוקט הוא פתרון לנושא אחר, כלומר, אתה לא רוצה לתשאל את השרת כל הזמן אם יש שינויים אלא שהשרת יודיע לך מתי שיש שינויים, ווב סוקט פותר לך את זה.
אבל גם עם ווב סוקט הבחירה בידך מה לעשות במקרה שיש שינויים. האם לרענן את הכל או לקבל רק את השינויים. -
הצגת פה כמה שאלות ומגבלות שיש לך (YII2...)
ניכר שפרימוורק צד לקוח היה מיקל עליך אבל זה לא קריטי.
למרות כל האריכות, לא ידוע לנו מה הבעיה שיש לך ואיפה "נתקעת".
בנוגע לשני הדרכים כמו ש@yossi אמר, כל מה שאפשר לעשות בסוקט אפשר לעשות גם בלעדיו. כלומר גם שם אתה יכול לקבל דף מרונדר שוב, או רק טבלה, או רק מידע (json).הייתרון של סוקט זה בעיקר בעובדה שהשרת יכול ליזום פניה אליך על שינוי מסויים, לעומת בקשות ajax בהם אתה צריך לבקש מהשרת את כלל השינויים שהיו מאז התשאול הקודם (או גרוע מכך את כלל הנתונים).
לפעמים קשה מאוד להעביר שינויים לקליינט: אם מדובר בסתם טבלה אחת של רשומות שרק מוסיפים לה, הקליינט יכול לבקש את כל השורות החדשות מאז רשומה X. אבל אם גם מוחקים וגם משנים אז הצד שרת חייב לבצע יומן של פעולות אלו כדי שהקליינט יכול לבקש את השינויים הרלוונטיים עבורו.בנוגע לרשימת מנויים עדיף לא לנהל בצד לקוח את כלל הרשימה, datatables לזכרוני תומך יופי בעיבוד וחיפוש ודפדוף של צד שרת.
-
@dovid אמר בריענון נתונים בממשק צפיה:
datatables לזכרוני תומך יופי בעיבוד וחיפוש ודפדוף של צד שרת
הוא עושה את העבודה אבל קשיים שנתקלתי:
- האדיטור של datatables ניגש לטבלת ערכים פשוטה, אבל בטבלה שיש לה עמודות id מקושרות לטבלאות אחרות ( ID עיר וכיו"ב), מאד קשה לעדכן (ואחרי העדכון הוא מחזיר לך את ה-ID לתצוגה אצלך ואתה שוב צריך לחפש את הערך המקושר (=שם העיר).
- כמו"כ הזנת הערכים שם הוא לפי מס' עמודה ולא לפי שם עמודה. ככה אם החלטת להוסיף עמודה אתה צריך לשנות חצי קוד.
- יש שם קשיים בהתאמות css.
לענ"ד אם יש לך פריימוורק לקוח זה עדיף.
-
@chagold אמר בריענון נתונים בממשק צפיה:
לענ"ד אם יש לך פריימוורק לקוח זה עדיף.
לא כ"כ הבנתי לאיזה חלק התכוונת.
רק אציין שאני לא צריך אפשרות עריכה רגילה, אלא אני משתמש בתפריט הנפתח ע"י לחיצה בעכבר, שם אני נותן פונקציות לביצוע על השורה הנלחצת, בהתאמה אישית.
הקטע של ה datatable הוא לא עבור כלל טבלת התורים המוצגת בממשק (לזה אני משתמש בתצוגה המובנית הרגילה של YII2), אלא עבור האפשרות של רישום ידני (על ידי פקיד) של תור מהרשימה, שאני צריך לאפשר לבחור עבור איזה מנוי לרשום את התור.
שם חשבתי לפתוח לו חלון (דיאלוג) והוא יצטרך לבחור את המנוי המבוקש וללחוץ עליו ואז יוכל לשמור לו את התור. -
@חוקר אם אין עריכת הטבלת datatable בכלל אז יש רק את נושא העיצוב (לא תוכל להקטין את העמודות כרצונך).
אם כוונת @dovid שגם כשמוסיפים משתמש לצד שרת זה משתקף בקליינט - אני לא זוכר (וזה לא אומר כלום). אבל אם צריך לקבל את המשתמש החדש ע"י בקשה שלך (או כשעורכים משתמש אז אתה צריך לקבל את המידע המעודכן), אז רלוונטי גם ההערה השניה שלי על שזה מסודר שם לפי עמודות.