我做了一个 Magento CMS static blocks 里用的倒计时 block。虽然功能比较简单,但还是比较智能的,所以还是想自我表彰一下。这不是独立的模块,我也没打算就拿这么单一的功能去生成一个模块,类似的功能我都会合并在一个 Msdk (Magento SDK) 模块里。
<?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 * http://www.php.net/manual/en/dateinterval.format.php * * "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