سؤال

أحتاج إلى أن يكون لديك عنصر واجهة مستخدم لبدء وإنهاء على شكل.

أي يقوم المستخدم بتحديد تاريخ ثم يحدد وقت البدء والنهاية.

في أداة التاريخ القياسية ، يمكنك تحديد تاريخ ووقت ، ومع ذلك ، يجب أن أكون قادرًا على تحديد وقت الانتهاء أيضًا.

هل فعل أي منكم ذلك من قبل؟

يمكنني إنشاء 3 أجهزة تعامل منفصلة:

  • تاريخ
  • وقت البدء
  • وقت النهاية

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

هل هذا كيف ستفعل ذلك؟ شكرا يا رفاق!

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

المحلول

أعتقد أن ما تريد تحقيقه باستخدام أشكال Symfony أمر سهل للغاية. أنت على حق ، فأنت بحاجة إلى ثلاث أجهزة مساعدة منفصلة وثلاثة مصادقة منفصلة ، لا يوجد حل خارج الصندوق لهذا الموقف بالضبط.

في طريقة تكوين النموذج الخاص بك ، سيكون لديك شيء مثل:

$this->setWidgets(array(
  'date' => new sfWidgetFormDate(),
  'time_start' => new sfWidgetFormTime(array('label' => 'Start Time', 'with_seconds' => false)),
  'time_finish' => new sfWidgetFormTime(array('label' => 'End Time', 'with_seconds' => false)
));

$this->setValidators(array(
  'date' => new sfValidatorDate(),   // by default outputs in format Y-m-d
  'time_start' => new sfValidatorTime(),  // by default outputs in format H:i:s
  'time_finish' => new sfValidatorTime(),
));

دعنا نفترض أن الكائن له خصائصين ، كما اقترحت ، كلاهما حقول في وقت البيانات.

في الإجراء الخاص بك ، سيكون لديك شيء مثل ما يلي لتعيين حقول DateTime:

$values = $this->form->getValues();

$object->setStartDateTime(sprintf('%s %s', $values['date'], $values['time_start']));
$object->setFinishDateTime(sprintf('%s %s', $values['date'], $value['time_finish']));

تحرير: اقتراح آخر هو عدم استخدام أداة Time Interget SFWIDGETFormTime المدمجة حيث يمكن أن تبدو قبيحة للغاية. يمكنك ببساطة استخدام مربع نص عادي (محاذاة المركز ، مع MaxLength = 5) ، وسيظل جهاز التحقق من SFValidatortime يعمل بشكل مثالي.

امل ان يساعد.

نصائح أخرى

يبدو أن المتطلبات الخاصة بك محددة للتطبيق وليس شيئًا سيساعدك إطار عمل Symfony Form في الحصول على خارج الصندوق.

أود أن أذهب مع اقتراح توليد start_date و end_date من إخراج الأدوات الثلاث ، أو إذا كان تطبيقك يحتاج إلى عودة إلى تاريخ ، start_time و end_time بشكل منفصل لاحقًا ، ثم ربما حفظ ثلاث قيم بشكل منفصل والتلاعب بها عند الاستعلام عنها.

لذلك ، لقد قمت بالرمز من أجل ذلك وهو يعمل بشكل جيد للغاية. لقد أزلت جميع عناصر واجهة المستخدم غير الضرورية والتحقق. إليكم كيف فعلت ذلك:

class VisitForm extends BaseVisitForm
{
  private function getMinutes()
  {
     $minutes = array();

     for($i = 0; $i < 60; $i = $i + 5)
     {
       $minutes[$i] = sprintf('%02d', $i);
     }
     return $minutes;   
  }

  public function configure()
  {

      $this->setWidgets(array(
      'id'            => new sfWidgetFormInputHidden(),
      'date'            => new sfWidgetFormJQueryDate(array('date_widget' => new sfWidgetFormDate(array('years' => $years, 'can_be_empty'=> false)), 'image' => '/images/icons/calendar.png', 'format'=>'%day%/%month%/%year%')),
      'start_time'    => new sfWidgetFormTime(array('with_seconds' => false,'can_be_empty'=> false, 'default' => '08:00', 'minutes'=> array_combine($this->getMinutes(), $this->getMinutes()))),
      'end_time'          => new sfWidgetFormTime(array('with_seconds' => false,'can_be_empty'=> false, 'default' => '08:00', 'minutes'=> array_combine($this->getMinutes(), $this->getMinutes())))

    ));

    $this->setValidators(array(

      'start_time'    => new sfValidatorTime(),
      'end_time'      => new sfValidatorTime(),
      'date'            => new sfValidatorDate(),
    ));

    $this->widgetSchema->setNameFormat('visit[%s]');

    $this->errorSchema = new sfValidatorErrorSchema($this->validatorSchema);
  }

 protected function doUpdateObject($values)
  {     
    $this->getObject()->setStartDate(sprintf("%s %s", $values['date'], $values['start_time']));
    $this->getObject()->setEndDate(sprintf("%s %s", $values['date'], $values['end_time']));

    parent::doUpdateObject($values);
  }

  public function updateDefaultsFromObject()
  {
    if(!$this->getObject()->isNew())
    {
        $this->setDefault('date', $this->getObject()->getDateTimeObject('start_date')->format('Y-m-d'));
        $this->setDefault('start_time', $this->getObject()->getDateTimeObject('start_date')->format('H:i'));
        $this->setDefault('end_time', $this->getObject()->getDateTimeObject('end_date')->format('H:i'));
    }
    parent::updateDefaultsFromObject();

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