I noticed in http://ontoworld.org/wiki/Date-related_tables that user 
Patrick is trying to display parts of a date.  For example, show Jul 6 
as birthday of G.W. Bush whose date of birth is 1946-07-06.

Inline queries allow passing a unit, e.g.
   [[mass:=*oz]]
will show masses in ounces instead of the primary unit (kg).

So I modified SMW_DT_DateTime.php to take this unit, but interpret it as 
  a date format string (SMW formats dates using strftime(), 
http://us2.php.net/manual/en/function.strftime.php ).  Thus

<ask>
   [[date of birth:=+]]
   [[date of birth:=*%b %d]]
</ask>

will show just the month and day part of a Type:Date in "Jul 6" format. 
  Pretty cool, though still not enough to derive astrological signs of 
the zodiac from Date of birth.  ;-)

Someone else has already noted that you can't ask for an attribute twice 
in one inline query with two different "units"; this would be nice so 
you could have parts of the date in separate columns so you can sort by 
time, or birthday, or year.  Has a bug been filed for this?

I currently can't check in to MediaWiki Subversion, but it's a simple 
patch (below).

--
=S


$ svn diff SMW_DT_DateTime.php | expand -4
Index: SMW_DT_DateTime.php
===================================================================
--- SMW_DT_DateTime.php (revision 17944)
+++ SMW_DT_DateTime.php (working copy)
@@ -39,6 +39,10 @@
      * @access public
      */
     function processValue($v,&$datavalue) {
+       // For a DateTime, "units" is really a format from an inline query
+       // rather than the units of a float.
+       $desiredUnits = $datavalue->getDesiredUnits();
+       //echo "DEBUG: in DateTimeHandler->processValue(), 
desiredUnits="; echo implode('|',$desiredUnits); echo "<br />\n";
         $str_val = trim($v);
         $time = strtotime($str_val);
         if ($time == -1 || $time === false) {
@@ -50,22 +54,33 @@
         // so reformat back to ISO8601. Unfortunatelly, ISO in
         // general is not compatible with XSD; but it should work
         // for the restricted interval we currently support.
-       $str_val = strftime("%Y-%m-%d", $time);
-       $user_val = $str_val;
-       // See if there is a significant time component.
-       // TODO: what about TimeZone?!
-       if ( abs($time - strtotime($str_val)) > 0.5) {
-           $user_val .= strftime(" %H:%M:%S", $time);
+       $date_part = strftime("%Y-%m-%d", $time);
+       $str_val = $date_part . strftime("T%H:%M:%S", $time); // always 
show time in XSD
+       $datavalue->setProcessedValues($v, $str_val, $time);
+
+       // Determine the user-visible string.
+       if (count($desiredUnits) ==0) {
+           // The default user-visible string shows date, plus
+           // time of day separated by space if it's significant.
+           $user_val = $date_part;
+           // See if there is a significant time component.
+           // TODO: what about TimeZone?!
+           if ( abs($time - strtotime($str_val)) > 0.5) {
+               $user_val .= strftime(" %H:%M:%S", $time);
+           }
+           $datavalue->setPrintoutString($user_val);
+       } else {
+           // Print the date in all wanted formats (even if some of 
them would be equivalent -- we obey the user's wish)
+           foreach ($desiredUnits as $wantedFormat) {
+               $datavalue->setPrintoutString(strftime($wantedFormat, 
$time));
+           }
         }
-       $str_val .= strftime("T%H:%M:%S", $time); // always show time in XSD

-       $datavalue->setProcessedValues($v, $str_val, $time);
-       $datavalue->setPrintoutString($user_val);
         //smwfNumberFormat($time) . ' seconds since 1970' ;
         // do not show the seconds since 1970; showing a date in 
multiple calendar systems could be a future output enhancement (Roman, 
Gregorian, whatever calendar), if the date is "historical" enough

         $datavalue->addQuicksearchLink();
-       $datavalue->addServiceLinks($str_val); //possibly provide single 
alues (year, month, ...) in the future
+       $datavalue->addServiceLinks($str_val); //possibly provide single 
values (year, month, ...) in the future
         return;
     }

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Semediawiki-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/semediawiki-devel

Reply via email to