سؤال

أحاول إنشاء نموذج باستخدام مكون zend_form ، لكن عدد العناصر يختلف. يتم تخزين المعلومات الخاصة بكل عنصر zend_form في قاعدة بيانات (الاسم ، الخيارات ، المصادقة ، المرشحات ، إلخ).

يتكون التطبيق الذي أعمل عليه من بناء استطلاعات تحتوي على عدد متفاوتة من الأسئلة. يرتبط كل سؤال بصفائف مختلفة من الإجابات. في نهاية المطاف ، هدفي هو إنشاء صفائف من أزرار مربعات الاختيار/الاختيار ، ديناميكيًا ، جانب الخادم.

أنا أبحث عن طريقة جميلة لإنشاء النموذج الخاص بي ، لكنني لست متأكدًا من أفضل طريقة لتحميل النموذج في النموذج. هل يجب تحميل النموذج في وحدة التحكم ثم تم تمريره (بطريقة ما ، عبر معلمة؟) مباشرة إلى النموذج ، أم أنه من الأفضل تحميل النموذج داخل طريقة init ()؟ أين هو أفضل مكان لوضع المنطق ، هل يجب أن يكون داخل فئة النموذج ، أو داخل وحدة التحكم ، أو داخل النموذج؟

فكرتي هي إحضار خصائص عنصر النموذج (الاسم ، القواعد ، المرشحات ، إلخ) في قاعدة البيانات ، ثم تكرارها وأخيراً تقديم النموذج. ما رأيك في هذا النهج؟ في النهاية ، سيتم إضافة العناصر ديناميكيًا (من جانب العميل) ، هذه المرة ، باستخدام مكتبة Ajax ومكتبة JavaScript (مثل jQuery).

فيما يلي بعض الروابط المفيدة التي وجدتها عبر Google ، لكنني أعتقد أنها جميعًا تجيب على سؤال مختلف قليلاً عني:

عند بناء النماذج الديناميكية ، جانب الخادم:

عند بناء النماذج الديناميكية ، جانب العميل ، مع معالجة أياكس:

هل كانت مفيدة؟

المحلول

يمكنك تمديد zend_form.

نموذج Zend ليس مكانًا جيدًا للمنطق ، فقط تمثيل النماذج.

لذلك ، قم بتحميل جميع العناصر المطلوبة باستخدام النموذج في وحدة التحكم وقم بتمريرها إلى النموذج في مهاجمين كمعلمات.

نصائح أخرى

أعتقد أنني وجدت حلًا ممكنًا ، فهو ينطوي على تمرير مجموعة من Zend عناصر النماذج إلى نموذج Zend :: __ Construct () طريقة. يأخذ المُنشئ مجموعة من الخيارات ، يسمى أحدها "عناصر"إلقاء نظرة على الكود المصدري داخل مكتبة Zend Framework.

قمت بترميز طريقة خاصة جديدة داخل وحدة التحكم ، تسمى BuildSurveyForm (). ملاحظة: تم تصميم الكائن ، الذي تم تمريره كمعلمة ، من استعلام ضخم SQL مع نصف دزينة من عبارات ربط ، وجلب البيانات من عدد قليل من الجداول (الدراسات الاستقصائية ، والأسئلة ، والإجابات ، وما إلى ذلك) داخل قاعدة البيانات. تتكون إحدى السمات العامة لهذه الفئة من مجموعة من الأسئلة ، المخزنة ككائنات (مع الأساليب/السمات العامة أيضًا ، إلخ). نفس الشيء للحصول على الإجابات. رمز بناء هذه الفئات تافهة إلى حد ما ويخرج من الموضوع هنا.

إليك الرمز داخل وحدة تحكم المسح. قمت بنسخ/لصق وتحرير/إسقاط بضعة أسطر لجعله أكثر وضوحًا:

private function buildSurveyForm(MyApp_Object_Survey $survey)
{
    foreach ($survey->questions as $question)
    {
        $element = new Zend_Form_Element_MultiCheckbox($question->order);
        $element->addMultiOptions($question->getAnswersLabels());
        $element->setName($question->order);
        $element->setLabel($question->title);

        $elements[] = $element;
    }

    // Here's the trick :
    $formOptions = array('elements' => $elements);

    $surveyForm = new MyApp_Survey_Form($formOptions);

    $urlHelper = $this->_helper->getHelper('url');
    $surveyForm->setAction($urlHelper->url(array(
            'controller' => 'survey',
            'action' => 'vote'),
        'default'
    ));
    $surveyForm->setMethod('post');

    $this->_forms['survey'] = $surveyForm;

    return $this->_forms['survey'];
}

ال نموذج مسح myApp يحتوي الفصل فقط على زر إرسال داخل طريقة init (). تتم إضافة العناصر التي تم إنشاؤها ديناميكيًا مع الكود أعلاه قبل زر الإرسال هذا (وهو أمر غير متوقع ، ولكنه مفيد). هذا الفئة ببساطة يمتد Zend_Form.

ثم ، ضمن إجراء وحدة تحكم / عرض للمسح:

public function viewAction()
{
    $surveyModel =    $this->_model['survey'];
    $survey =        $surveyModel->getFullSurvey($this->_getParam('id'));
    $survey =        new MyApp_Object_Survey($survey);
    // Calls above private method :
    $surveyForm =    $this->buildSurveyForm($survey);

    $this->view->assign(array(
         'surveyForm' => $surveyForm,
    ));
}

إن إضافة المرشحات والمقاواة والديكور لتكوين عناصر أصبح الآن تافهة. اقتراحي قذر بعض الشيء ، لكنني أعتقد أنه ينجز المهمة. سأضيف اقتراحًا جديدًا إذا وجدت شيئًا أكثر أناقة. لا تتردد في نشر إجابات/حلول مختلفة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top