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

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

Gal Shafrir 23-07-10 16:07

PHP וSQL - מערכת רב-לשונית
 
אהלן, חבר'ה.

בימים אלו אני שוקד על פיתוח מערכת CMS מודולרית,
שמכילה חלק מהמודולים הבאים:
  • עמודים
  • חדשות/כתבות/מאמרים
  • גלריות
  • טפסים
  • בלוקים
  • וכו'.

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

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

הציעו לי לעשות טבלה מקשרת בין תרגום לבין פריט במודול:
parentID - הפריט שרוצים לתרגם
itemID - הפריט המתורגם (להלן: התרגום עצמו)
module - כמובן, לאיזה מודול שייך התרגום (עמודים/מאמרים/...)
lang - קוד השפה (he/en וכו')

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


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

דוגמה לשליפת כל העמודים בשפה מסוימת:
PHP קוד:

    public function get_all($lang '')
    {
        
$sql "SELECT `translations`.`itemID`, `pages`.*
        FROM `pages`, `translations`
        WHERE `translations`.`parentID` = `pages`.`ID` AND `translations`.`lang`='{$lang}'
        AND `translations`.`module` = 'pages'"
;
        
        
$query $this->db->query($sql);
        
        
$pages $query->result_array();
        
        if (
count($pages) > 0)
        {
            foreach (
$pages as $key => $page)
            {
                
$sql "SELECT * FROM `pages` WHERE `ID` = '{$page['itemID']}'";
                
$q $this->db->query($sql);
                
                
$r $q->result_array();

                
$pages[$key]['name'] = $r[0]['name'];
                
$pages[$key]['content'] = $r[0]['content'];
                
$pages[$key]['title'] = $r[0]['title'];
            }
        }

        
/*$this->db->order_by('homepage', 'desc');
        $this->db->order_by('order', 'asc');    
        $query = $this->db->get('pages');*/
        
        
return $pages;
    } 

הקוד לדעתי לא יעיל, ועליי למצוא פתרון יותר יעיל מזה.

פתרון נוסף:
לשייך לכל מודול 2 טבלאות: אחת לתכנים ואחת לכל שאר הדברים
שצריך לשמור לגבי אותו הפריט (סטטוס, כתובת וכו').

אשמח לעזרה בנושא, זו פעם ראשונה שאני עושה דבר כזה.

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

SarafC 23-07-10 16:19

אני לא חושב שהבנתי אותך במדוייק, אבל אם אתה רוצה לעבוד עם מספר שפות, למה לא לעבוד עם קבצי LANG?

Gal Shafrir 23-07-10 16:22

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

AlmogBaku 23-07-10 16:24

http://img707.imageshack.us/img707/9041/tblexitems.png

Gal Shafrir 23-07-10 16:30

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

AlmogBaku 23-07-10 16:59

אני מתכנת DB בד"כ ע"י mysql workbench

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

Gal Shafrir 23-07-10 17:33

אלמוג, יש שיטה דרך המסד ליצור את מה שכתוב בסכמה באנגלית מימין?
או דרך יעילה לעשות זאת בPHP?..

AlmogBaku 23-07-10 18:02

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

כלומר:
אם בתרגום לא הכנסתי כותרת, הכותרת תהיה הכותרת של האב.

Gal Shafrir 23-07-10 19:10

ציטוט:

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

כלומר:
אם בתרגום לא הכנסתי כותרת, הכותרת תהיה הכותרת של האב.

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

אני מחפש דרך יעילה יותר לעשות את זה,
בלי לולאות מיותרות וכו'.

AlmogBaku 24-07-10 19:54

כי עשית שם משהו אחר לגמרי..
שוב- אתה צריך ליצור טבלאה אחת בכל הסיפור הזה.

תיצור פעולה רקורסיבית שמביאה לך את המידע הסופיע עם המידע(פעולה()-לוקחת נתונים. אם יש לו אבא, ממלאת את הנתונים הריקים בנתונים מפעולה())


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

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