【问题标题】:Intelligence when segmenting a datetime value分割日期时间值时的智能
【发布时间】:2010-10-06 20:38:33
【问题描述】:

我的Event 模型中有一个日期时间值。我不是 Cake 的自动输入默认美学的忠实粉丝,我将创建自己的。我的理解,虽然只是从阅读中得知,Cake 提供了一些关于在保存时连接日期时间值的智能。具体来说,它将检测日期时间值的月、日、年、小时、分钟和子午线子部分,并在保存时自动组合它们。

我更感兴趣但找不到证据的是更简单的细分。我想使用日期选择器作为日期部分和默认时间输入,你猜对了,时间。蛋糕能做到吗?我已经尝试过了,但它不起作用,但我不确定这是因为我做错了事情还是没有正确的事情。

我自己当然可以毫不费力地做到这一点,但是如果 Cake 已经内置了这个,而我只是没有正确解锁它,那么付出努力总比不付出努力。

谢谢。

【问题讨论】:

    标签: datetime cakephp-1.3


    【解决方案1】:

    源代码之旅,特别是Model::deconstruct() 告诉我,Cake 的本机智能并没有这么深入。它期望其自己的日期时间输入提供完整的组件粒度(即,月、日、年、小时、分钟和子午线的单独日期时间组件)。我想要更好的用户体验,所以我想使用一个日期选择器,将整个日期存储为一个组件。为此,我必须发挥创造力。

    我选择做的是覆盖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 代码。这是一个应用于data[Event][start_time][date] 字段的简单jQuery UI 行为,与解决方案没有密切关系。可以说,当date 文本框获得焦点时,会出现一个非常漂亮的日历。

    就我而言,我还有几个具有日期时间属性的模型,所以我最终将 deconstruct() 覆盖移到了我的 AppModel 上,这样我就可以在整个过程中使用它了。干燥。

    【讨论】:

      猜你喜欢
      • 2013-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-29
      • 2011-05-12
      • 2022-06-20
      • 1970-01-01
      相关资源
      最近更新 更多