<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://atk-framework.com/index.php?action=history&amp;feed=atom&amp;title=DateTime_and_Time_Attributes_with_AM_PM_time</id>
	<title>DateTime and Time Attributes with AM PM time - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://atk-framework.com/index.php?action=history&amp;feed=atom&amp;title=DateTime_and_Time_Attributes_with_AM_PM_time"/>
	<link rel="alternate" type="text/html" href="https://atk-framework.com/index.php?title=DateTime_and_Time_Attributes_with_AM_PM_time&amp;action=history"/>
	<updated>2026-09-23T12:09:28Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://atk-framework.com/index.php?title=DateTime_and_Time_Attributes_with_AM_PM_time&amp;diff=19448&amp;oldid=prev</id>
		<title>Jgarifuna: Created page with &#039;The modified atkTimeAttribute below allows display of time in AM PM format for atkTimeAttribute  and atkDateTimeAttribute.  &#039;&#039;&#039;Usage to show AM/PM our for atkTimeAttribute:&#039;&#039;&#039;  &lt;…&#039;</title>
		<link rel="alternate" type="text/html" href="https://atk-framework.com/index.php?title=DateTime_and_Time_Attributes_with_AM_PM_time&amp;diff=19448&amp;oldid=prev"/>
		<updated>2011-02-11T01:20:21Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;#039;The modified atkTimeAttribute below allows display of time in AM PM format for atkTimeAttribute  and atkDateTimeAttribute.  &amp;#039;&amp;#039;&amp;#039;Usage to show AM/PM our for atkTimeAttribute:&amp;#039;&amp;#039;&amp;#039;  &amp;lt;…&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;The modified atkTimeAttribute below allows display of time in AM PM format for atkTimeAttribute  and atkDateTimeAttribute.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Usage to show AM/PM our for atkTimeAttribute:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$time = &amp;amp;$this-&amp;gt;add(new atkTimeAttribute(&amp;quot;stime&amp;quot;,0,23,array(&amp;quot;00&amp;quot;,&amp;quot;15&amp;quot;,&amp;quot;30&amp;quot;,&amp;quot;45&amp;quot;),&amp;quot;&amp;quot;, 0),NULL,400);&lt;br /&gt;
$time-&amp;gt;setTimeFormat(&amp;#039;12h&amp;#039;); // display hour in AM/PM format&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Usage to show AM/PM our for atkDateTimeAttribute:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$modified_date = &amp;amp;$this-&amp;gt;add(new atkDateTimeAttribute(&amp;quot;modified_date&amp;quot;,  AF_HIDE_ADD |  AF_READONLY),NULL,500);&lt;br /&gt;
$modified_date-&amp;gt;m_time-&amp;gt;setTimeFormat(&amp;#039;12h&amp;#039;); // display hour in AM/PM format&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Modified class.atktimeattribute.inc from ATK 6.5.0&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  /**&lt;br /&gt;
   * This file is part of the Achievo ATK distribution.&lt;br /&gt;
   * Detailed copyright and licensing information can be found&lt;br /&gt;
   * in the doc/COPYRIGHT and doc/LICENSE files which should be&lt;br /&gt;
   * included in the distribution.&lt;br /&gt;
   *&lt;br /&gt;
   * @package atk&lt;br /&gt;
   * @subpackage attributes&lt;br /&gt;
   *&lt;br /&gt;
   * @copyright (c)2000-2004 Ibuildings.nl BV&lt;br /&gt;
   * @license http://www.achievo.org/atk/licensing ATK Open Source License&lt;br /&gt;
   *&lt;br /&gt;
   * @version $Revision: 6185 $&lt;br /&gt;
   * $Id: class.atktimeattribute.inc 6478 2009-08-22 03:49:07Z marc $&lt;br /&gt;
   */&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Flags for atkTimeAttribute&lt;br /&gt;
   */&lt;br /&gt;
  define(&amp;quot;AF_TIME_SECONDS&amp;quot;, AF_SPECIFIC_1);&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * The atkTimeAttribute class represents an attribute of a node&lt;br /&gt;
   * that has a selectbox to select from predefined time values.&lt;br /&gt;
   *&lt;br /&gt;
   * @author Wim Kosten &amp;lt;wim@ibuildings.nl&amp;gt;&lt;br /&gt;
   * @package atk&lt;br /&gt;
   * @subpackage attributes&lt;br /&gt;
   *&lt;br /&gt;
   */&lt;br /&gt;
  class atkTimeAttribute extends atkAttribute&lt;br /&gt;
  {&lt;br /&gt;
    var $m_beginTime = 0;&lt;br /&gt;
    var $m_endTime = 23;&lt;br /&gt;
    var $m_steps = array(&amp;quot;0&amp;quot;,&amp;quot;30&amp;quot;);&lt;br /&gt;
    var $m_default = &amp;quot;&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    /* defines the format of the time in:&lt;br /&gt;
    		24h - display hour from 00 to 23&lt;br /&gt;
    		12h - display hour from 12am to 11pm&lt;br /&gt;
    	*/&lt;br /&gt;
    var $m_timeFormat = &amp;quot;24h&amp;quot;;  &lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Constructor&lt;br /&gt;
     * @param string $name      Name of the attribute&lt;br /&gt;
     * @param int $beginTime    Time to start with (eg 8)&lt;br /&gt;
     * @param int $endTime      Time to end with (eg 24)&lt;br /&gt;
     * @param int|array $steps  containing possible minute or seconds values (eg array(&amp;quot;00&amp;quot;,&amp;quot;15&amp;quot;,&amp;quot;30&amp;quot;,&amp;quot;45&amp;quot;))&lt;br /&gt;
     *                          or the interval (eg 5 for 00,05,10,15, etc.)&lt;br /&gt;
     *                          if the flag AF_TIME_SECONDS is set, this is for seconds, the minutes will be range(0, 59)&lt;br /&gt;
     *                          else this is for the minutes and the seconds will not be displayed&lt;br /&gt;
	   * @param string $default   Start Time (exp: 20:30)&lt;br /&gt;
     * @param int $flags        Flags for this attribute&lt;br /&gt;
     */&lt;br /&gt;
    function atkTimeAttribute($name, $beginTime=0, $endTime=23, $steps=array(&amp;quot;00&amp;quot;,&amp;quot;15&amp;quot;,&amp;quot;30&amp;quot;,&amp;quot;45&amp;quot;), $default=&amp;quot;&amp;quot;, $flags=0)&lt;br /&gt;
    {&lt;br /&gt;
      $this-&amp;gt;atkAttribute($name,$flags); // base class constructor&lt;br /&gt;
      $this-&amp;gt;m_beginTime = $beginTime;&lt;br /&gt;
      $this-&amp;gt;m_endTime   = $endTime;&lt;br /&gt;
      if (is_array($steps))  $this-&amp;gt;m_steps     = $steps;&lt;br /&gt;
      else                   $this-&amp;gt;m_steps     = $this-&amp;gt;intervalToSteps($steps);&lt;br /&gt;
      $this-&amp;gt;m_default   = $default;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
	/*&lt;br /&gt;
		Jorge Garifuna&lt;br /&gt;
		2/10/11&lt;br /&gt;
		&lt;br /&gt;
		sets the time format&lt;br /&gt;
		&lt;br /&gt;
		@param string $m_timeFormat	&lt;br /&gt;
					    		24h - display hour from 00 to 23&lt;br /&gt;
					    		12h - display hour from 12am to 11pm		&lt;br /&gt;
	*/&lt;br /&gt;
	function setTimeFormat($m_timeFormat){	&lt;br /&gt;
		$this-&amp;gt;m_timeFormat = $m_timeFormat;&lt;br /&gt;
	}// end function&lt;br /&gt;
	&lt;br /&gt;
    /**&lt;br /&gt;
     * Convert an interval (integer) to an array with steps.&lt;br /&gt;
     *&lt;br /&gt;
     * @param int $interval The interval to convert&lt;br /&gt;
     * @return array The array with steps.&lt;br /&gt;
     */&lt;br /&gt;
    function intervalToSteps($interval)&lt;br /&gt;
    {&lt;br /&gt;
      $steps=array();&lt;br /&gt;
      for ($i=0;$i&amp;lt;=59;$i++)&lt;br /&gt;
      {&lt;br /&gt;
        if ($i%$interval===0)&lt;br /&gt;
        {&lt;br /&gt;
          $steps[] = $i;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      return $steps;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Converts a date string (HHMISS) to an&lt;br /&gt;
     * array with 2 fields (hours, minutes, seconds).&lt;br /&gt;
     * @param string $time the time string&lt;br /&gt;
     * @return array with 3 fields (hours, minutes, seconds)&lt;br /&gt;
     */&lt;br /&gt;
    function timeArray($time)&lt;br /&gt;
    {&lt;br /&gt;
      return array(&amp;quot;hours&amp;quot; =&amp;gt; substr($time, 0, 2),&lt;br /&gt;
                   &amp;quot;minutes&amp;quot; =&amp;gt; substr($time, 2, 2),&lt;br /&gt;
                   &amp;quot;seconds&amp;quot; =&amp;gt; substr($time, 4, 2));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Display&amp;#039;s text version of Record&lt;br /&gt;
     * @param array $record&lt;br /&gt;
     * @return text string of $record&lt;br /&gt;
     */&lt;br /&gt;
    function display($record)&lt;br /&gt;
    {&lt;br /&gt;
	  	$value = $record[$this-&amp;gt;fieldName()];&lt;br /&gt;
      if ($value[&amp;quot;hours&amp;quot;] === &amp;quot;&amp;quot;) return &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
              &lt;br /&gt;
        /* Jorge Garifuna&lt;br /&gt;
        		2/10/11&lt;br /&gt;
	    		set AM/PM for display&lt;br /&gt;
	    	*/&lt;br /&gt;
	    	$ampmlabel =&amp;#039;&amp;#039;;&lt;br /&gt;
	    	if($this-&amp;gt;m_timeFormat==&amp;#039;12h&amp;#039;){&lt;br /&gt;
			if($value[&amp;quot;hours&amp;quot;]==0){&lt;br /&gt;
				$value[&amp;quot;hours&amp;quot;]=&amp;#039;12&amp;#039;;&lt;br /&gt;
				$ampmlabel = &amp;#039;am&amp;#039;;&lt;br /&gt;
			}elseif($value[&amp;quot;hours&amp;quot;]&amp;gt;12){&lt;br /&gt;
				$value[&amp;quot;hours&amp;quot;] = ($value[&amp;quot;hours&amp;quot;]-12);&lt;br /&gt;
				$ampmlabel = &amp;#039;pm&amp;#039;;&lt;br /&gt;
			}else{&lt;br /&gt;
				$ampmlabel = &amp;#039;am&amp;#039;;&lt;br /&gt;
			}// end if AM/PM&lt;br /&gt;
		}// end if&lt;br /&gt;
      &lt;br /&gt;
      $tmp_time = sprintf(&amp;quot;%02d:%02d&amp;quot;, $value[&amp;quot;hours&amp;quot;], $value[&amp;quot;minutes&amp;quot;]);&lt;br /&gt;
      if ($value[&amp;quot;seconds&amp;quot;] &amp;amp;&amp;amp; $this-&amp;gt;hasFlag(AF_TIME_SECONDS)) $tmp_time.=sprintf(&amp;quot;:%02d&amp;quot;, $value[&amp;quot;seconds&amp;quot;]);&lt;br /&gt;
      &lt;br /&gt;
      return $tmp_time.$ampmlabel;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Convert values from an HTML form posting to an internal value for&lt;br /&gt;
     * this attribute.&lt;br /&gt;
     *&lt;br /&gt;
     * For the regular atkAttribute, this means getting the field with the&lt;br /&gt;
     * same name as the attribute from the html posting.&lt;br /&gt;
     *&lt;br /&gt;
     * @param array $postvars The array with html posted values ($_POST, for&lt;br /&gt;
     *                        example) that holds this attribute&amp;#039;s value.&lt;br /&gt;
     * @return String The internal value&lt;br /&gt;
     */&lt;br /&gt;
    function fetchValue($postvars)&lt;br /&gt;
    {&lt;br /&gt;
      $result = $postvars[$this-&amp;gt;fieldName()];&lt;br /&gt;
&lt;br /&gt;
      if(!is_array($result))&lt;br /&gt;
      {&lt;br /&gt;
        $exploded = explode(&amp;quot;:&amp;quot;,$postvars[$this-&amp;gt;fieldName()]);&lt;br /&gt;
        if (count($exploded)&amp;lt;=1) return &amp;quot;&amp;quot;;&lt;br /&gt;
        $result= array();&lt;br /&gt;
        $result[&amp;quot;hours&amp;quot;]  = $exploded[0];&lt;br /&gt;
        $result[&amp;quot;minutes&amp;quot;]= $exploded[1];&lt;br /&gt;
        if ($exploded[2]) $result[&amp;quot;seconds&amp;quot;]= $exploded[2];&lt;br /&gt;
      }&lt;br /&gt;
      else if (strlen($result[&amp;#039;hours&amp;#039;]) == 0 || strlen($result[&amp;#039;minutes&amp;#039;]) == 0)&lt;br /&gt;
      {&lt;br /&gt;
        return NULL;&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        $result = array(&lt;br /&gt;
          &amp;#039;hours&amp;#039; =&amp;gt; $result[&amp;#039;hours&amp;#039;],&lt;br /&gt;
          &amp;#039;minutes&amp;#039; =&amp;gt; $result[&amp;#039;minutes&amp;#039;],&lt;br /&gt;
          &amp;#039;seconds&amp;#039; =&amp;gt; $result[&amp;#039;seconds&amp;#039;]&lt;br /&gt;
        );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return $result;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Returns a piece of html code that can be used in a form to edit this&lt;br /&gt;
     * attribute&amp;#039;s value.&lt;br /&gt;
     *&lt;br /&gt;
     * @param array $record The record that holds the value for this attribute.&lt;br /&gt;
     * @param String $fieldprefix The fieldprefix to put in front of the name&lt;br /&gt;
     *                            of any html form element for this attribute.&lt;br /&gt;
     * @param String $mode The mode we&amp;#039;re in (&amp;#039;add&amp;#039; or &amp;#039;edit&amp;#039;)&lt;br /&gt;
     * @return String A piece of htmlcode for editing this attribute&lt;br /&gt;
     */&lt;br /&gt;
    function edit($record=&amp;quot;&amp;quot;, $fieldprefix=&amp;quot;&amp;quot;, $mode=&amp;quot;&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
      if(($this-&amp;gt;m_default==&amp;quot;NOW&amp;quot; &amp;amp;&amp;amp; $this-&amp;gt;m_ownerInstance-&amp;gt;m_action==&amp;quot;add&amp;quot;) ||&lt;br /&gt;
         ($this-&amp;gt;m_default==&amp;quot;&amp;quot; &amp;amp;&amp;amp; $this-&amp;gt;hasFlag(AF_OBLIGATORY)))&lt;br /&gt;
      {&lt;br /&gt;
	     $this-&amp;gt;m_default=date(&amp;quot;H:i:s&amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
      $default = explode(&amp;quot;:&amp;quot;,$this-&amp;gt;m_default);&lt;br /&gt;
&lt;br /&gt;
      $id = $fieldprefix.$this-&amp;gt;fieldName();&lt;br /&gt;
      $field = $record[$this-&amp;gt;fieldName()];&lt;br /&gt;
&lt;br /&gt;
      $onChangeCode = &amp;#039;&amp;#039;;&lt;br /&gt;
      if(count($this-&amp;gt;m_onchangecode))&lt;br /&gt;
      {&lt;br /&gt;
        $this-&amp;gt;_renderChangeHandler($fieldprefix);&lt;br /&gt;
        $onChangeCode = &amp;#039; onChange=&amp;quot;&amp;#039; . $this-&amp;gt;getHtmlId($fieldprefix) . &amp;#039;_onChange(this);&amp;quot;&amp;#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // set vars for hour / minutes dropdowns&lt;br /&gt;
      $this-&amp;gt;registerKeyListener($id.&amp;#039;[hours]&amp;#039;, KB_CTRLCURSOR|KB_LEFTRIGHT);&lt;br /&gt;
      $this-&amp;gt;registerKeyListener($id.&amp;#039;[minutes]&amp;#039;, KB_CTRLCURSOR|KB_LEFTRIGHT);&lt;br /&gt;
      $this-&amp;gt;registerKeyListener($id.&amp;#039;[seconds]&amp;#039;, KB_CTRLCURSOR|KB_LEFTRIGHT);&lt;br /&gt;
      $m_hourBox = &amp;#039;&amp;lt;select id=&amp;quot;&amp;#039;.$id.&amp;#039;[hours]&amp;quot; name=&amp;quot;&amp;#039;.$id.&amp;quot;[hours]\&amp;quot; class=\&amp;quot;atktimeattribute\&amp;quot;{$onChangeCode}&amp;gt;\n&amp;quot;;&lt;br /&gt;
      $m_minBox  = &amp;#039;&amp;lt;select id=&amp;quot;&amp;#039;.$id.&amp;#039;[minutes]&amp;quot; name=&amp;quot;&amp;#039;.$id.&amp;quot;[minutes]\&amp;quot; class=\&amp;quot;atktimeattribute\&amp;quot;{$onChangeCode}&amp;gt;\n&amp;quot;;&lt;br /&gt;
      $m_secBox  = &amp;#039;&amp;lt;select id=&amp;quot;&amp;#039;.$id.&amp;#039;[seconds]&amp;quot; name=&amp;quot;&amp;#039;.$id.&amp;quot;[seconds]\&amp;quot; class=\&amp;quot;atktimeattribute\&amp;quot;{$onChangeCode}&amp;gt;\n&amp;quot;;&lt;br /&gt;
      // set default values for both boxes&lt;br /&gt;
      // depends upon atkaction&lt;br /&gt;
      // if add/admin, use $default param, else use time in $record&lt;br /&gt;
      if (is_array($field))&lt;br /&gt;
      {&lt;br /&gt;
        $m_defHour = $field[&amp;quot;hours&amp;quot;];&lt;br /&gt;
        $m_defMin  = $field[&amp;quot;minutes&amp;quot;];&lt;br /&gt;
        $m_defSec  = $field[&amp;quot;seconds&amp;quot;];&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        $m_defHour = $default[0];&lt;br /&gt;
        $m_defMin  = $default[1];&lt;br /&gt;
        $m_defSec  = $default[2];&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      atkdebug(&amp;quot;defhour=$m_defHour   defmin=$m_defMin&amp;quot;);&lt;br /&gt;
      // generate hour dropdown&lt;br /&gt;
      if (!$this-&amp;gt;hasflag(AF_OBLIGATORY))&lt;br /&gt;
        $m_hourBox .= &amp;#039;&amp;lt;option value=&amp;quot;&amp;quot;&amp;#039;.($m_defHour === &amp;quot;&amp;quot; ? &amp;#039; selected&amp;#039; : &amp;#039;&amp;#039;).&amp;#039;&amp;gt;&amp;lt;/option&amp;gt;&amp;#039;;&lt;br /&gt;
      for ($i=$this-&amp;gt;m_beginTime;$i&amp;lt;=$this-&amp;gt;m_endTime;$i++)&lt;br /&gt;
      {&lt;br /&gt;
        if ($m_defHour!==&amp;quot;&amp;quot; &amp;amp;&amp;amp; ($i == $m_defHour))&lt;br /&gt;
        {&lt;br /&gt;
          $sel = &amp;quot; selected&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          $sel = &amp;quot;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        /* Jorge Garifuna&lt;br /&gt;
        		2/10/11&lt;br /&gt;
	    		set AM/PM for display&lt;br /&gt;
	    	*/&lt;br /&gt;
	    	$tlabel = $i;&lt;br /&gt;
	    	if($this-&amp;gt;m_timeFormat==&amp;#039;12h&amp;#039;){&lt;br /&gt;
			if($i==0){&lt;br /&gt;
				$tlabel = &amp;#039;12am&amp;#039;;&lt;br /&gt;
			}elseif($i&amp;gt;12){&lt;br /&gt;
				$tlabel = ($i-12).&amp;#039;pm&amp;#039;;&lt;br /&gt;
			}else{&lt;br /&gt;
				$tlabel = $i.&amp;#039;am&amp;#039;;&lt;br /&gt;
			}// end if AM/PM&lt;br /&gt;
		}// end if&lt;br /&gt;
        // $m_hourBox .= sprintf(&amp;quot;&amp;lt;option value=&amp;#039;%02d&amp;#039;%s&amp;gt;%02d&amp;lt;/option&amp;gt;\n&amp;quot;,$i,$sel,$i);&lt;br /&gt;
        $m_hourBox .= sprintf(&amp;quot;&amp;lt;option value=&amp;#039;%02d&amp;#039;%s&amp;gt;%s&amp;lt;/option&amp;gt;\n&amp;quot;,$i,$sel,$tlabel);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // generate minute dropdown&lt;br /&gt;
      if (!$this-&amp;gt;hasflag(AF_OBLIGATORY))&lt;br /&gt;
        $m_minBox .= &amp;#039;&amp;lt;option value=&amp;quot;&amp;quot;&amp;#039;.($m_defMin === &amp;quot;&amp;quot; ? &amp;#039; selected&amp;#039; : &amp;#039;&amp;#039;).&amp;#039;&amp;gt;&amp;lt;/option&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
      if ($this-&amp;gt;hasFlag(AF_TIME_SECONDS))&lt;br /&gt;
      {&lt;br /&gt;
        $minute_steps = range(00, 59);&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        $minute_steps = $this-&amp;gt;m_steps;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      for ($i=0;$i&amp;lt;=count($minute_steps)-1;$i++)&lt;br /&gt;
      {&lt;br /&gt;
       if($i!=0) $prev = $minute_steps[$i-1];&lt;br /&gt;
       else $prev= -1;&lt;br /&gt;
       if ($minute_steps[$i] &amp;gt;= $m_defMin &amp;amp;&amp;amp; $prev &amp;lt; $m_defMin&amp;amp;&amp;amp;($m_defMin!=&amp;quot;&amp;quot;))&lt;br /&gt;
       {&lt;br /&gt;
        $sel = &amp;quot; selected&amp;quot;;&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
        $sel = &amp;quot;&amp;quot;;&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
       $m_minBox .= sprintf(&amp;quot;&amp;lt;option value=&amp;#039;%02d&amp;#039;%s&amp;gt;%02d&amp;lt;/option&amp;gt;\n&amp;quot;,$minute_steps[$i],$sel,$minute_steps[$i]);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // generate second dropdown&lt;br /&gt;
      if (!$this-&amp;gt;hasFlag(AF_OBLIGATORY))&lt;br /&gt;
        $m_secBox .= &amp;#039;&amp;lt;option value&amp;quot;&amp;quot;&amp;#039;.($m_defSec === &amp;quot;&amp;quot; ? &amp;#039; selected&amp;#039; : &amp;#039;&amp;#039;).&amp;#039;&amp;gt;&amp;lt;/option&amp;gt;&amp;#039;;&lt;br /&gt;
      for ($i=0;$i&amp;lt;=count($this-&amp;gt;m_steps)-1;$i++)&lt;br /&gt;
      {&lt;br /&gt;
        if($i!=0) $prev= $this-&amp;gt;m_steps[$i-1];&lt;br /&gt;
        else $prev= -1;&lt;br /&gt;
        if ($this-&amp;gt;m_steps[$i] &amp;gt;= $m_defSec &amp;amp;&amp;amp; $prev &amp;lt; $m_defSec&amp;amp;&amp;amp;($m_defSec!=&amp;quot;&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
          $sel = &amp;quot; selected&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          $sel = &amp;quot;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        $m_secBox .= sprintf(&amp;quot;&amp;lt;option value=&amp;#039;%02d&amp;#039; %s&amp;gt;%02d&amp;lt;/option&amp;gt;\n&amp;quot;,$this-&amp;gt;m_steps[$i],$sel,$this-&amp;gt;m_steps[$i]);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      // close dropdown structures&lt;br /&gt;
      $m_hourBox .= &amp;quot;&amp;lt;/select&amp;gt;&amp;quot;;&lt;br /&gt;
      $m_minBox  .= &amp;quot;&amp;lt;/select&amp;gt;&amp;quot;;&lt;br /&gt;
      if($this-&amp;gt;hasFlag(AF_TIME_SECONDS))&lt;br /&gt;
      {&lt;br /&gt;
        $m_secBox  .= &amp;quot;&amp;lt;/select&amp;gt;&amp;quot;;&lt;br /&gt;
        $m_secBox = &amp;quot;:&amp;quot; . $m_secBox;&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        $m_secBox = &amp;quot;&amp;lt;input type=\&amp;quot;hidden\&amp;quot; name=\&amp;quot;&amp;quot;.$fieldprefix.$this-&amp;gt;fieldName().&amp;quot;[seconds]\&amp;quot; value=\&amp;quot;00\&amp;quot;&amp;gt;\n&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // assemble display version&lt;br /&gt;
      return $m_hourBox.&amp;quot;:&amp;quot;.$m_minBox.$m_secBox;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Converts the internal attribute value to one that is understood by the&lt;br /&gt;
     * database.&lt;br /&gt;
     *&lt;br /&gt;
     * @param array $rec The record that holds this attribute&amp;#039;s value.&lt;br /&gt;
     * @return String The database compatible value&lt;br /&gt;
     */&lt;br /&gt;
    function value2db($rec)&lt;br /&gt;
    {&lt;br /&gt;
      $hours = $rec[$this-&amp;gt;fieldName()][&amp;quot;hours&amp;quot;];&lt;br /&gt;
      $minutes = $rec[$this-&amp;gt;fieldName()][&amp;quot;minutes&amp;quot;];&lt;br /&gt;
      $seconds = $rec[$this-&amp;gt;fieldName()][&amp;quot;seconds&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
      if ($hours==&amp;quot;&amp;quot; || $minutes==&amp;quot;&amp;quot; || ($this-&amp;gt;hasFlag(AF_TIME_SECONDS) &amp;amp;&amp;amp; $seconds==&amp;quot;&amp;quot;)) return NULL;&lt;br /&gt;
&lt;br /&gt;
      $result = sprintf(&amp;quot;%02d&amp;quot;,$hours).&amp;quot;:&amp;quot;.sprintf(&amp;quot;%02d&amp;quot;,$minutes).&amp;quot;:&amp;quot;.sprintf(&amp;quot;%02d&amp;quot;,$seconds);&lt;br /&gt;
&lt;br /&gt;
      return $result;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
		/**&lt;br /&gt;
     * Convert database value to time array&lt;br /&gt;
     * @param array $rec database record with date field&lt;br /&gt;
     * @return array with 3 fields (hours:minutes:seconds)&lt;br /&gt;
     */&lt;br /&gt;
    function db2value($rec)&lt;br /&gt;
    {&lt;br /&gt;
      if (strlen($rec[$this-&amp;gt;fieldName()]) == 0 )&lt;br /&gt;
      {&lt;br /&gt;
        $retval=NULL;&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
         $retval = array(&amp;quot;hours&amp;quot;=&amp;gt;substr($rec[$this-&amp;gt;fieldName()], 0, 2),&lt;br /&gt;
                   &amp;quot;minutes&amp;quot;=&amp;gt;substr($rec[$this-&amp;gt;fieldName()], 3, 2),&lt;br /&gt;
                   &amp;quot;seconds&amp;quot;=&amp;gt;substr($rec[$this-&amp;gt;fieldName()], 6, 2));&lt;br /&gt;
      }&lt;br /&gt;
      return $retval;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Returns a piece of html code that can be used in a form to search values&lt;br /&gt;
     * @param array $record Array with fields&lt;br /&gt;
     * @param boolean $extended if set to false, a simple search input is&lt;br /&gt;
     *                          returned for use in the searchbar of the&lt;br /&gt;
     *                          recordlist. If set to true, a more extended&lt;br /&gt;
     *                          search may be returned for the &amp;#039;extended&amp;#039;&lt;br /&gt;
     *                          search page. The atkAttribute does not&lt;br /&gt;
     *                          make a difference for $extended is true, but&lt;br /&gt;
     *                          derived attributes may reimplement this.&lt;br /&gt;
     * @param string $fieldprefix The fieldprefix of this attribute&amp;#039;s HTML element.&lt;br /&gt;
     * @return piece of html code with a checkbox&lt;br /&gt;
     */&lt;br /&gt;
    function search($record=&amp;quot;&amp;quot;, $extended=false, $fieldprefix=&amp;quot;&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
     return parent::search($record, $extended, $fieldprefix);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Retrieve the list of searchmodes supported by the attribute.&lt;br /&gt;
     *&lt;br /&gt;
     * @return array List of supported searchmodes&lt;br /&gt;
     */&lt;br /&gt;
    function getSearchModes()&lt;br /&gt;
    {&lt;br /&gt;
      // exact match and substring search should be supported by any database.&lt;br /&gt;
      // (the LIKE function is ANSI standard SQL, and both substring and wildcard&lt;br /&gt;
      // searches can be implemented using LIKE)&lt;br /&gt;
      // Possible values&lt;br /&gt;
      //&amp;quot;regexp&amp;quot;,&amp;quot;exact&amp;quot;,&amp;quot;substring&amp;quot;, &amp;quot;wildcard&amp;quot;,&amp;quot;greaterthan&amp;quot;,&amp;quot;greaterthanequal&amp;quot;,&amp;quot;lessthan&amp;quot;,&amp;quot;lessthanequal&amp;quot;&lt;br /&gt;
      return array(&amp;quot;exact&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Checks if a value is valid.&lt;br /&gt;
     *&lt;br /&gt;
     * @param array $rec    The record that holds the value for this&lt;br /&gt;
     *                      attribute. If an error occurs, the error will&lt;br /&gt;
     *                      be stored in the &amp;#039;atkerror&amp;#039; field of the record.&lt;br /&gt;
     * @param String $mode The mode for which should be validated (&amp;quot;add&amp;quot; or&lt;br /&gt;
     *                     &amp;quot;update&amp;quot;)&lt;br /&gt;
     */&lt;br /&gt;
    function validate(&amp;amp;$rec, $mode)&lt;br /&gt;
    {&lt;br /&gt;
      $value = $rec[$this-&amp;gt;fieldName()];&lt;br /&gt;
      if ($this-&amp;gt;hasFlag(AF_OBLIGATORY) &amp;amp;&amp;amp; ($value[&amp;quot;hours&amp;quot;]==-1 || $value[&amp;#039;minutes&amp;#039;]==-1))&lt;br /&gt;
      {&lt;br /&gt;
        triggerError($rec, $this-&amp;gt;fieldName(), &amp;#039;error_obligatoryfield&amp;#039;);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Adds this attribute to database queries.&lt;br /&gt;
     *&lt;br /&gt;
     * Database queries (select, insert and update) are passed to this method&lt;br /&gt;
     * so the attribute can &amp;#039;hook&amp;#039; itself into the query.&lt;br /&gt;
     *&lt;br /&gt;
     * @param atkQuery $query The SQL query object&lt;br /&gt;
     * @param String $tablename The name of the table of this attribute&lt;br /&gt;
     * @param String $fieldaliasprefix Prefix to use in front of the alias&lt;br /&gt;
     *                                 in the query.&lt;br /&gt;
     * @param Array $rec The record that contains the value of this attribute.&lt;br /&gt;
     * @param int $level Recursion level if relations point to eachother, an&lt;br /&gt;
     *                   endless loop could occur if they keep loading&lt;br /&gt;
     *                   eachothers data. The $level is used to detect this&lt;br /&gt;
     *                   loop. If overriden in a derived class, any subcall to&lt;br /&gt;
     *                   an addToQuery method should pass the $level+1.&lt;br /&gt;
     * @param String $mode Indicates what kind of query is being processing:&lt;br /&gt;
     *                     This can be any action performed on a node (edit,&lt;br /&gt;
     *                     add, etc) Mind you that &amp;quot;add&amp;quot; and &amp;quot;update&amp;quot; are the&lt;br /&gt;
     *                     actions that store something in the database,&lt;br /&gt;
     *                     whereas the rest are probably select queries.&lt;br /&gt;
     */&lt;br /&gt;
    function addToQuery(&amp;amp;$query, $tablename=&amp;quot;&amp;quot;, $fieldaliasprefix=&amp;quot;&amp;quot;, $rec=&amp;quot;&amp;quot;, $level, $mode)&lt;br /&gt;
    {&lt;br /&gt;
      if ($mode == &amp;quot;add&amp;quot; || $mode == &amp;quot;update&amp;quot;)&lt;br /&gt;
      {&lt;br /&gt;
        $value = $this-&amp;gt;value2db($rec);&lt;br /&gt;
        if($value == NULL)&lt;br /&gt;
          $query-&amp;gt;addField($this-&amp;gt;fieldName(),&amp;#039;NULL&amp;#039;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,false);&lt;br /&gt;
        else&lt;br /&gt;
          $query-&amp;gt;addField($this-&amp;gt;fieldName(),$value,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,!$this-&amp;gt;hasFlag(AF_NO_QUOTES));&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
        $query-&amp;gt;addField($this-&amp;gt;fieldName(),&amp;quot;&amp;quot;,$tablename,$fieldaliasprefix,!$this-&amp;gt;hasFlag(AF_NO_QUOTES));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Return the database field type of the attribute.&lt;br /&gt;
     *&lt;br /&gt;
     * @return String The &amp;#039;generic&amp;#039; type of the database field for this&lt;br /&gt;
     *                attribute.&lt;br /&gt;
     */&lt;br /&gt;
    function dbFieldType()&lt;br /&gt;
    {&lt;br /&gt;
      return &amp;quot;time&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Returns a piece of html code that can be used in a form to display&lt;br /&gt;
     * hidden values for this attribute.&lt;br /&gt;
     * @param array $record Array with values&lt;br /&gt;
     * @param String $fieldprefix The fieldprefix to put in front of the name&lt;br /&gt;
     *                            of any html form element for this attribute.&lt;br /&gt;
     * @return Piece of htmlcode&lt;br /&gt;
     */&lt;br /&gt;
    function hide($record=&amp;quot;&amp;quot;, $fieldprefix)&lt;br /&gt;
    {&lt;br /&gt;
      $field = $record[$this-&amp;gt;fieldName()];&lt;br /&gt;
&lt;br /&gt;
      if (is_array($field))&lt;br /&gt;
        foreach ($field as $key =&amp;gt; $value)&lt;br /&gt;
          $result .= &amp;#039;&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;&amp;#039;.$fieldprefix.$this-&amp;gt;formName().&amp;#039;[&amp;#039;.$key.&amp;#039;]&amp;quot; &amp;#039;.&amp;#039;value=&amp;quot;&amp;#039;.$value.&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
      else&lt;br /&gt;
        $result = &amp;#039;&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;&amp;#039;.$fieldprefix.$this-&amp;gt;formName().&amp;#039;&amp;quot; value=&amp;quot;&amp;#039;.$field.&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
      return $result;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Creates a searchcondition for the field,&lt;br /&gt;
     * was once part of searchCondition, however,&lt;br /&gt;
     * searchcondition() also immediately adds the search condition.&lt;br /&gt;
     *&lt;br /&gt;
     * @param atkQuery $query     The query object where the search condition should be placed on&lt;br /&gt;
     * @param String $table       The name of the table in which this attribute&lt;br /&gt;
     *                              is stored&lt;br /&gt;
     * @param mixed $value        The value the user has entered in the searchbox&lt;br /&gt;
     * @param String $searchmode  The searchmode to use. This can be any one&lt;br /&gt;
     *                              of the supported modes, as returned by this&lt;br /&gt;
     *                              attribute&amp;#039;s getSearchModes() method.&lt;br /&gt;
     * @return String The searchcondition to use.&lt;br /&gt;
     */&lt;br /&gt;
    function getSearchCondition(&amp;amp;$query, $table, $value, $searchmode)&lt;br /&gt;
    {&lt;br /&gt;
      // When we get $value as a substring, we autocomplete the time&lt;br /&gt;
      // So 9 becomes 09:00:00 and 11:15 becomes 11:15:00&lt;br /&gt;
      if (!is_array($value))&lt;br /&gt;
      {&lt;br /&gt;
        $retval = array(&amp;quot;hours&amp;quot;=&amp;gt;substr($value, 0, 2),&lt;br /&gt;
                   &amp;quot;minutes&amp;quot;=&amp;gt;substr($value, 3, 2),&lt;br /&gt;
                   &amp;quot;seconds&amp;quot;=&amp;gt;substr($value, 6, 2));&lt;br /&gt;
&lt;br /&gt;
        if (!$retval[&amp;quot;seconds&amp;quot;]) $retval[&amp;quot;seconds&amp;quot;]=&amp;quot;00&amp;quot;;&lt;br /&gt;
        if (!$retval[&amp;quot;minutes&amp;quot;]) $retval[&amp;quot;minutes&amp;quot;]=&amp;quot;00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        if (strlen($retval[&amp;quot;hours&amp;quot;])==1)   $retval[&amp;quot;hours&amp;quot;] =   &amp;quot;0&amp;quot;.$retval[&amp;quot;hours&amp;quot;];&lt;br /&gt;
        if (strlen($retval[&amp;quot;minutes&amp;quot;])==1) $retval[&amp;quot;minutes&amp;quot;] = &amp;quot;0&amp;quot;.$retval[&amp;quot;minutes&amp;quot;];&lt;br /&gt;
        if (strlen($retval[&amp;quot;seconds&amp;quot;])==1) $retval[&amp;quot;seconds&amp;quot;] = &amp;quot;0&amp;quot;.$retval[&amp;quot;seconds&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
        $value = implode(&amp;quot;:&amp;quot;,$retval);&lt;br /&gt;
      }&lt;br /&gt;
      return parent::getSearchCondition($query, $table, $value, $searchmode);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Parse a timestring to an array&lt;br /&gt;
     *&lt;br /&gt;
     * @param string $stringvalue The time to parse&lt;br /&gt;
     * @return array array with hours, minutes and seconds&lt;br /&gt;
     */&lt;br /&gt;
    function parseTime($stringvalue)&lt;br /&gt;
    {&lt;br /&gt;
  		//Assuming hh:mm:ss&lt;br /&gt;
		  $retval = array(&amp;quot;hours&amp;quot;=&amp;gt;substr($stringvalue, 0, 2),&lt;br /&gt;
		     &amp;quot;minutes&amp;quot;=&amp;gt;substr($stringvalue, 3, 2),&lt;br /&gt;
		     &amp;quot;seconds&amp;quot;=&amp;gt;substr($stringvalue, 6, 2));&lt;br /&gt;
&lt;br /&gt;
		  if (!$retval[&amp;quot;seconds&amp;quot;]) $retval[&amp;quot;seconds&amp;quot;]=&amp;quot;00&amp;quot;;&lt;br /&gt;
		  if (!$retval[&amp;quot;minutes&amp;quot;]) $retval[&amp;quot;minutes&amp;quot;]=&amp;quot;00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		  if (strlen($retval[&amp;quot;hours&amp;quot;])==1)   $retval[&amp;quot;hours&amp;quot;] =   &amp;quot;0&amp;quot;.$retval[&amp;quot;hours&amp;quot;];&lt;br /&gt;
		  if (strlen($retval[&amp;quot;minutes&amp;quot;])==1) $retval[&amp;quot;minutes&amp;quot;] = &amp;quot;0&amp;quot;.$retval[&amp;quot;minutes&amp;quot;];&lt;br /&gt;
		  if (strlen($retval[&amp;quot;seconds&amp;quot;])==1) $retval[&amp;quot;seconds&amp;quot;] = &amp;quot;0&amp;quot;.$retval[&amp;quot;seconds&amp;quot;];&lt;br /&gt;
		  return $retval;&lt;br /&gt;
	  }&lt;br /&gt;
  }&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Until next time,&lt;br /&gt;
&lt;br /&gt;
Jorge Garifuna&lt;br /&gt;
[http://www.GariDigital.com]&lt;/div&gt;</summary>
		<author><name>Jgarifuna</name></author>
	</entry>
</feed>