我做了一个 Magento CMS static blocks 里用的倒计时 block。虽然功能比较简单,但还是比较智能的,所以还是想自我表彰一下。这不是独立的模块,我也没打算就拿这么单一的功能去生成一个模块,类似的功能我都会合并在一个 Msdk (Magento SDK) 模块里。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | <?php /*** * Usage: * * Example 1: * {{block type="msdk/date_countdown" deadline="2010-10-31" before="Halloween in %d days!!" after="Happy Halloween!"}} * * Example 2: * {{block type="msdk/date_countdown" deadline="2010-10-31 19:35:00" before="Lucky draw in %i minute!!" after="" smart_plural="true"}} * * Obviously, "deadline" value is required. And it should be fed in ISO 8601 format. * * "before" and "after" are the message strings to be used before and after deadline respectively. * If any of them is not set, it uses "%h" as default. * If you want the message string be empty, you must set it to "", explicitly. (Not setting it will result in "%h") * You can use "%d" for days, "%m" for months, ... in the message strings. For a complete list of usable symbols, visit * * "smart_plural" is a switch you can turn it on using smart_plural="true" (It is default to false). * When it is on, it looks for singular words in the message strings, and turn them into plurals when appropriate. * This feature is in experiment stage, so it may not be so smart. */ class Qian_Msdk_Block_Date_Countdown extends Mage_Core_Block_Template { //unix timestamp protected $_deadline ; protected $_before = '%h' ; //default to hour diff protected $_after = '%h' ; //default to hour diff protected $_smartPlural = false; //default to false; //DateInterval protected $_interval ; //to store value used by different methods, avoid passing value protected function _toHtml() { $now = Mage::getModel( 'core/date' )-> date (); $dateNow = date_create( $now ); $dateDeadline = date_create( $this ->_deadline); $interval = $dateNow ->diff( $dateDeadline ); if ( $interval ->format( '%R%s' ) > 0) { //before deadline $display = $this ->_before; } else { //after deadline $display = $this ->_after; } $this ->_interval = $interval ; $display = $this ->_pluralize( $display ); return $interval ->format( $display ); } public function setDeadline( $strDeadline ) { $this ->_deadline = Mage::getModel( 'core/date' )-> date ( $strDeadline ); return $this ; } public function setBefore( $before ) { $this ->_before = $before ; return $this ; } public function setAfter( $after ) { $this ->_after = $after ; return $this ; } public function setSmartPlural( $smartPlural ) { if ( $smartPlural == 'true' || $smartPlural == 'yes' || $smartPlural == 1) { $this ->_smartPlural = true; } else { $this ->_smartPlural = false; } return $this ; } protected function _pluralize( $str ) { if (! $this ->_smartPlural) { //smart plural not turned on, no further processing return $str ; } $pattern = '/(.*)(%[YyMmDdaHhIiSs])(\s+)([a-zA-Z]+)([^a-zA-Z]|$)(.*)/Ui' ; return preg_replace_callback( $pattern , "self::_pluralizeMatches" , $str ); } protected function _pluralizeMatches( $matches ) { return $matches [1] . Mage::helper( 'msdk/plural' )->english( $this ->_interval->format( $matches [2]), $matches [4]) . $matches [5] . $matches [6]; } } |
Leave a Reply