Onderstaande PHP-listing is alvast een aanzet voor een datumprikker.
Code: Selecteer alles
<?php
/**
* Bezorgdatum prikken
*
* Bestellingen kunnen worden bezorgd op dinsdag tot en met zaterdag.
* Maandag is bij PostNL geen bezorgdag meer voor de eerste afleverpoging.
* Bovendien worden bestellingen niet verzonden op zaterdag of zondag,
* maar pas de maandag erop, zodat ze toch pas op dinsdag worden bezorgd.
*
* @author Ward van der Put <http://twitter.com/bloknood>
* @license http://opensource.org/licenses/GPL-3.0 GNU General Public License
* @version 0.1
*/
class StoreCore_Shipping_Bezorgdatum
{
/**
* @var array
*/
private $DeliveryDays = array();
/**
* @param void
* @return object
*/
public function __construct()
{
$current_year = (int) date('Y');
$next_year = $current_year + 1;
$easter_date_current_year = $this->getEasterDate($current_year);
$easter_date_next_year = $this->getEasterDate($next_year);
$holidays = array();
// Nieuwjaarsdag: 1 januari
$holidays[] = mktime(0, 0, 0, 1, 1, $current_year);
$holidays[] = mktime(0, 0, 0, 1, 1, $next_year);
// Dag na nieuwjaarsdag: 2 januari
$holidays[] = mktime(0, 0, 0, 1, 2, $current_year);
$holidays[] = mktime(0, 0, 0, 1, 2, $next_year);
// Eerste paasdag: paaszondag
$holidays[] = $easter_date_current_year;
$holidays[] = $easter_date_next_year;
// Tweede paasdag: paasmaandag
$holidays[] = $easter_date_current_year + 86400;
$holidays[] = $easter_date_next_year + 86400;
// Dinsdag na tweede paasdag
$holidays[] = $easter_date_current_year + 2 * 86400;
$holidays[] = $easter_date_next_year + 2 * 86400;
// Koninginnedag: 30 april
$holidays[] = mktime(0, 0, 0, 4, 30, $current_year);
$holidays[] = mktime(0, 0, 0, 4, 30, $next_year);
// Dag na koninginnedag en Dag van de Arbeid: 1 mei
$holidays[] = mktime(0, 0, 0, 5, 1, $current_year);
$holidays[] = mktime(0, 0, 0, 5, 1, $next_year);
// Bevrijdingsdag: 5 mei
$holidays[] = mktime(0, 0, 0, 5, 5, $current_year);
$holidays[] = mktime(0, 0, 0, 5, 5, $next_year);
// Dag na bevrijdingsdag: 6 mei
$holidays[] = mktime(0, 0, 0, 5, 6, $current_year);
$holidays[] = mktime(0, 0, 0, 5, 6, $next_year);
// Hemelvaartsdag: 39 dagen na eerste paasdag
$holidays[] = $easter_date_current_year + 39 * 86400;
$holidays[] = $easter_date_next_year + 39 * 86400;
// Eerste pinksterdag (pinksterzondag): 49 dagen na eerste paasdag
$holidays[] = $easter_date_current_year + 49 * 86400;
$holidays[] = $easter_date_next_year + 49 * 86400;
// Tweede pinksterdag (pinkstermaandag): 50 dagen na eerste paasdag
$holidays[] = $easter_date_current_year + 50 * 86400;
$holidays[] = $easter_date_next_year + 50 * 86400;
// Dinsdag na tweede pinksterdag: 51 dagen na eerste paasdag
$holidays[] = $easter_date_current_year + 51 * 86400;
$holidays[] = $easter_date_next_year + 51 * 86400;
// Eerste kerstdag: 25 december
$holidays[] = mktime(0, 0, 0, 12, 25, $current_year);
$holidays[] = mktime(0, 0, 0, 12, 25, $next_year);
// Tweede kerstdag: 26 december
$holidays[] = mktime(0, 0, 0, 12, 26, $current_year);
$holidays[] = mktime(0, 0, 0, 12, 26, $next_year);
// Dag na tweede kerstdag: 27 december
$holidays[] = mktime(0, 0, 0, 12, 27, $current_year);
$holidays[] = mktime(0, 0, 0, 12, 27, $next_year);
/**
* Dagelijkse deadline voor de fulfilment van orders.
* Voor 16:00 uur is morgen de eerste bezorgdag en
* na 16:00 uur wordt overmorgen de eerstvolgende bezorgdag.
*
* @todo Eventueel 16 vervangen door (configuratie)constante.
*/
if (date('G') < 16) {
$first_day = mktime(0, 0, 0, date('n'), date('j'), date('Y')) + 86400;
} else {
$first_day = mktime(0, 0, 0, date('n'), date('j'), date('Y')) + 2 * 86400;
}
$search = array(
'tuesday', 'wednesday', 'thursday', 'friday', 'saturday',
'january', 'february', 'march', 'may', 'june', 'july', 'august', 'october'
);
$replace = array(
'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag',
'januari', 'februari', 'maart', 'mei', 'juni', 'juli', 'augustus', 'oktober'
);
$delivery_days = array();
for ($day = $first_day; $day < $first_day + (366 * 86400); $day = $day + 86400) {
/**
* De functie date('w', $day) retourneert de dagen van de week genummerd
* van 0 (zondag) t/m 6 (zaterdag). Bezorgen is mogelijk op dinsdag (2)
* t/m zaterdag (6), dus niet op zondag (0) of maandag (1).
*/
if (date('w', $day) > 1) {
if (!in_array($day, $holidays)) {
$delivery_days[date('Y-m-d', $day)] = str_ireplace($search, $replace, strtolower(date('l j F Y', $day)));
}
}
if (count($delivery_days) >= 12) {
break;
}
}
$this->DeliveryDays = $delivery_days;
}
/**
* @param void
* @return string
*/
public function __toString()
{
return $this->getSelect();
}
/**
* @param int $year
* @return int
*/
public static function getEasterDate($year)
{
if (function_exists('easter_date')) {
return easter_date($year);
}
/**
* Bereken de datum van eerste paasdag (paaszondag) met het algoritme
* van Delambre.
*
* @link http://www.php.net/manual/en/function.easter-days.php
*/
$a = $year % 19;
$b = floor($year / 100);
$c = $year % 100;
$d = floor($b / 4);
$e = $b % 4;
$f = floor(($b + 8) / 25);
$g = floor(($b - $f + 1) / 3);
$h = (19 * $a + $b - $d - $g + 15) % 30;
$i = floor($c / 4);
$k = $c % 4;
$l = (32 + 2 * $e + 2 * $i - $h - $k) % 7;
$m = floor(($a + 11 * $h + 22 * $l) / 451);
$n = ($h + $l - 7 * $m + 114);
$month = floor($n / 31);
$day = $n % 31 + 1;
return mktime(0, 0, 0, $month, $day, $year);
}
/**
* @param string $id
* @return string
*/
public function getSelect($id = 'Ecom_ShipTo_DeliveryDate')
{
$return = '<label for="' . $id . '">Gewenste bezorgdatum: <br>';
$return .= '<select id="' . $id . '" name="' . $id . '">';
$delivery_days = $this->DeliveryDays;
foreach ($delivery_days as $key => $value) {
$return .= '<option ';
if (isset($_POST[$id]) && $_POST[$id] === $key) {
$return .= 'selected ';
}
$return .= 'value="' . $key . '">' . $value . '</option>';
}
$return .= '</select>';
$return .= '</label>';
return $return;
}
}