Counter down for Magento CMS blocks

我做了一个 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

Your email address will not be published. Required fields are marked *