سؤال

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

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

يمكنني بالتأكيد القيام بذلك بنفسي دون جهد كبير ، لكن بعض الجهد أكبر من عدم وجود جهد إذا كان لدى Cake بالفعل هذا مدمج وأنا لا أفتحه بشكل صحيح.

شكرًا.

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

المحلول

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

ما اخترت فعله هو تجاوز Model::deconstruct() طريقة لتحويل التاريخ إلى مكوناته. إليك بعض التعليمات البرمجية للمساعدة في تصور الحل الذي أتوقع نشره:

# 
# In my form (views/events/_form.ctp)
# When rendered, the input names resolve to data[Event][start_time][date], 
# data[Event][start_time][hour], data[Event][start_time][minute], 
# data[Event][start_time][meridian]
# 
<div class="input datetime required">
  <?php echo $this->Form->input( 'Event.start_time.date', array( 'type' => 'text', 'label' => 'Start Time', 'div' => false, 'class' => 'date' ) ) ?>
  <?php echo $this->Form->input( 'Event.start_time', array( 'type' => 'time', 'label' => false, 'div' => false, 'class' => 'time', 'empty' => true ) ) ?>
</div>

# 
# In my model (/models/event.php)
# 
function deconstruct( $field, $data ) {
  $type = $this->getColumnType( $field );

  if( in_array( $type, array( 'datetime', 'timestamp' ) ) ) {
    if( isset( $data['date'] ) && !empty( $data['date'] ) ) {
      $date = date( 'U', strtotime( $data['date'] ) );

      if( $date ) {
        $data['month'] = date( 'm', $date );
        $data['day']   = date( 'd', $date );
        $data['year']  = date( 'Y', $date );
      }
    }
  }

  # Now the date is broken down into components that the
  # well-vetted parent method expects. Let it do the heavy 
  # lifting.
  return parent::deconstruct( $field, $data );
}

للتوضيح ، لقد استبعدت رمز JavaScript الذي ينشئ المنتقي نفسه. إنه ببساطة سلوك واجهة مستخدم jQuery يتم تطبيقه على data[Event][start_time][date] حقل وليس وثيق الصلة بالحل. يكفي أن أقول ، عندما date يستقبل Textbox التركيز يظهر تقويم جميل للغاية.

في حالتي ، لدي أيضًا العديد من النماذج التي لديها خصائص DateTime ، لذا انتهى بي الأمر بنقل deconstruct() تجاوزت لي AppModel حتى أتمكن من استخدامه طوال الوقت. جاف.

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