0 follower

איסוף קלט מאסיבי

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

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

$_POST['ModelClass'][$i]

במקום ב $_POST['ModelClass']

public function actionBatchUpdate()
{
    // שליפת מידע בצורה מאסיבית
    // בנחה שכל ערך הוא מודל של המחלקה `Item`
    $items=$this-»getItemsToUpdate();
    if(isset($_POST['Item']))
    {
        $valid=true;
        foreach($items as $i=»$item)
        {
            if(isset($_POST['Item'][$i]))
                $item-»attributes=$_POST['Item'][$i];
            $valid=$valid && $item-»validate();
        }
        if($valid)  // כל הערכים תקינים
            // פעולות לביצוע
    }
    // הצג את הטופס
    $this-»render('batchUpdate',array('items'=»$items));
}

לאחר שיש לנו את הפעולה כתובה, אנו צריכים לעבוד על קובץ התצוגה batchUpdate המציג את השדות בטבלת HTML.

«div class="form"»
«?php echo CHtml::beginForm(); ?»
«table»
«tr»«th»Name«/th»«th»Price«/th»«th»Count«/th»«th»Description«/th»«/tr»
«?php foreach($items as $i=»$item): ?»
«tr»
«td»«?php echo CHtml::activeTextField($item,"[$i]name"); ?»«/td»
«td»«?php echo CHtml::activeTextField($item,"[$i]price"); ?»«/td»
«td»«?php echo CHtml::activeTextField($item,"[$i]count"); ?»«/td»
«td»«?php echo CHtml::activeTextArea($item,"[$i]description"); ?»«/td»
«/tr»
«?php endforeach; ?»
«/table»
 
«?php echo CHtml::submitButton('Save'); ?»
«?php echo CHtml::endForm(); ?»
«/div»«!-- form --»

יש לשים לב למעלה שאנו משתמשים ב

"[$i]name"

במקום ב "name" כפרמטר שני בעת הקריאה ל CHtml::activeTextField.

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

Found a typo or you think this page needs improvement?
Edit it on github !