代码之家  ›  专栏  ›  技术社区  ›  Rob Wilkerson

分割日期时间值时的智能

  •  0
  • Rob Wilkerson  · 技术社区  · 15 年前

    我的 Event 模型。作为一个不喜欢蛋糕自动输入默认美学的人,我将创建我自己的。我的理解是,尽管只是从阅读中了解到,Cake提供了一些关于在save时连接datetime值的智能。具体来说,它将检测日期时间值的月、日、年、小时、分钟和子午线子部分,并在保存时自动将它们合并。

    我更感兴趣,但找不到证据,是一个简单的故障。我想使用日期选择器作为日期部分,并使用默认的时间输入,您猜对了,时间。蛋糕能做到吗?我试过了,但没用,但我不确定这是因为我做了错事,还是因为找不到合适的东西。

    我当然可以不费吹灰之力自己做,但如果蛋糕已经有了这个内置的功能,而我只是没有正确地打开它,那么有些努力比没有努力更重要。

    谢谢。

    1 回复  |  直到 15 年前
        1
  •  0
  •   Rob Wilkerson    15 年前

    对源代码的遍历,特别是 Model::deconstruct() 告诉我蛋糕天生的智慧没有这么深。它期望由自己的datetime输入提供完整的组件粒度(即,月、日、年、小时、分钟和子午线的单独datetime组件)。我想要更好的用户体验,所以我想使用一个日期选择器,将整个日期存储为单个组件。要做到这一点,我必须要有创造力。

    我选择做的是推翻 方法将日期分解为其组件。下面是一些代码,有助于可视化我希望部署的解决方案:

    # 
    # 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 );
    }
    

    data[Event][start_time][date] 与溶液无关。可以说,当 date 文本框接收焦点一个非常漂亮的日历出现。

    在我的例子中,我还有几个具有datetime属性的模型,因此我最终将 deconstruct() AppModel