<?php
namespace FrontModule\Components;
use Nette,
Andweb,
Model;
class ProductDeliveryDateInfo extends Andweb\Application\UI\FrontControl
{
const HOUR = 13;
protected $items = array(
'Praha' => array(
'Osobní odběr Praha' => 0,
'Expresní večerní doručení Praha' => 0,
),
'Česká republika' => array(
'Česká pošta' => 1,
'Zásilkovna' => 1,
'Kurýrní služba' => 1,
),
'Slovensko' => array(
'Česká pošta' => 2,
'Zásilkovna' => 2,
'Kurýrní služba' => 2,
),
);
public function __construct()
{
}
public function renderDefault()
{
$template = $this->template;
$template->items = $this->items;
// Fucking php5.3 on production
$that = $this;
$template->registerHelper('formatDate', function($s) use ($that) {
return $that->formatDate($s);
});
}
public function renderNotAvailable()
{
$template = $this->template;
$this->view = 'default';
$template->notAvailable = TRUE;
$template->items = $this->items;
// Fucking php5.3 on production
$that = $this;
$template->registerHelper('formatDate', function($s) use ($that) {
return $that->formatDate($s);
});
$this->render();
}
public function formatDate($s)
{
$today = new \DateTime();
$tomorrow = clone $today;
$tomorrow->modify('+ 1 day');
if ($today->format('j.n.Y') == $s)
return $this->presenter->translator->translate('dnes');
if ($tomorrow->format('j.n.Y') == $s)
return $this->presenter->translator->translate( 'zítra');
return $s;
}
// ukaze na velikonocni nedeli, napric vsemi casovymi pasmy, jinak funkce easter_day se chova obcas divne, viz php.net
public function getEasterDateTime($year)
{
$base = new \DateTime("$year-03-21");
$days = easter_days($year);
return $base->add(new \DateInterval("P{$days}D"));
}
public function isNotHoliday(\Datetime $date)
{
// statni svatky
$holidays = array('01-01', '05-01', '05-08', '07-05', '07-06', '09-28', '10-28', '11-17', '12-24', '12-25', '12-26');
// velikonocni pondeli
$holidays[] = $this->getEasterDateTime(date('Y'))->modify('+1day')->format('m-d');
// velky patek, (pred velikonocnim pondelim)
$holidays[] = $this->getEasterDateTime(date('Y'))->modify('-2day')->format('m-d');
$day = $date->format('w');
if ($day == 0 || $day == 6)
return FALSE;
if (in_array($date->format('m-d'), $holidays))
return FALSE;
return TRUE;
}
function getDeliveryDate($actualDate, $dayDelay = 0)
{
$actualDate = new \DateTime($actualDate);
$actualDate->modify("+$dayDelay day");
while (!$this->isNotHoliday($actualDate))
{
$actualDate->modify('+1 day');
}
return $actualDate;
}
public function formatter($dayDelay)
{
// 13h a vic + 1 day
if (date('H') >= self::HOUR)
$dayDelay += 1;
return $this->getDeliveryDate(date('Y-m-d'), $dayDelay);
}
}
<?php
class User {
protected $name;
protected $timeline = array();
public function __construct($name)
{
$this->name = $name;
}
public function addTweet(Tweet $tweet)
{
$this->timeline[] = $tweet;
}
}
class Tweet {
protected $id;
protected $text;
protected $read;
public function __construct($id, $text)
{
$this->id = $id;
$this->text = $text;
$this->read = false;
}
public function __invoke($user)
{
$user->addTweet($this);
return $user;
}
}
$users = array(new User('Ev'), new User('Jack'), new User('Biz'));
$tweet = new Tweet(123, 'Hello world');
$users = array_map($tweet, $users);
var_dump($users);
<!--
https://jsbin.com/fetikedayu/1/edit?html,css,js,output
https://jsbin.com/zofifoceli/edit?html,css,output
-->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>JS Bin</title>
<style>
.c-tooltip {
display: inline-block;
vertical-align: middle;
margin: -2px 0 0 5px;
position: relative;
font-weight: 400;
height: 16px;
width: 16px;
margin: 250px;
border: 1px solid red;
}
.c-tooltip__text {
display: block;
visibility: hidden;
opacity: 0;
pointer-events: none;
position: absolute;
left: 50%;
top: calc(100% + 20px);
transform: translate3d(-50%,20px,0);
width: 320px;
max-width: 80vw;
padding: 20px 20px 0;
background-color: #fff;
color: #000;
transition: opacity .3s,transform .3s,visibility 0s .3s;
border-radius: 4px;
filter: drop-shadow(0 0 1px #d9d6d4) drop-shadow(0 0 1px #d9d6d4) drop-shadow(0 0 1px #d9d6d4) drop-shadow(0 0 20px rgba(0,0,0,.1));
}
.c-tooltip__text:before
{
position: absolute;
background: transparent;
content: "";
top: -50px;
height: 100px;
width: 100%;
left: 0;
}
.c-tooltip__pointer {
position: absolute;
left: 50%;
top: -7px;
display: block;
width: 14px;
height: 14px;
transform: translateX(-50%) rotate(45deg);
background-color: #fff;
}
.c-tooltip--visible .c-tooltip__text,
.c-tooltip:hover .c-tooltip__text,
.c-tooltip__text:hover
{
visibility: visible;
opacity: 1;
pointer-events: all;
transform: translate3d(-50%,0,0);
transition: visibility 0s .3s,opacity .3s .3s,transform .3s .3s;
z-index: 100;
}
</style>
</head>
<body>
<div class="c-tooltip">
<span class="c-tooltip__icon">
<svg viewBox="0 0 16 16">
<path d="M0 8C0 3.584 3.584 0 8 0C12.416 0 16 3.584 16 8C16 12.416 12.416 16 8 16C3.584 16 0 12.416 0 8ZM9.73605 8.13602L10.456 7.40002C10.912 6.94402 11.2 6.30402 11.2 5.60002C11.2 3.83202 9.76805 2.40002 8.00005 2.40002C6.23205 2.40002 4.80005 3.83202 4.80005 5.60002L6.40005 5.60002C6.40005 4.72002 7.12005 4.00002 8.00005 4.00002C8.88005 4.00002 9.60005 4.72002 9.60005 5.60002C9.60005 6.04002 9.42405 6.44002 9.12805 6.72802L8.13605 7.73602C7.56005 8.32002 7.20005 9.12002 7.20005 10L7.20005 10.4L8.80005 10.4C8.80005 9.20002 9.16005 8.72002 9.73605 8.13602ZM8.79995 13.6L7.19995 13.6L7.19995 12L8.79995 12L8.79995 13.6Z"></path>
</svg>
</span>
<div class="c-tooltip__text">
<span class="c-tooltip__pointer"></span>
<p><a class="c-tooltip__link" href="https://www.vzhurudolu.cz/prirucka/metrika-lps">LPS (Lighthouse Performance Score)</a> je hlavní skóre nástroje Lighthouse pro tuto konkrétní stránku. LPS měříme každý den syntetickým testem.</p>
<p>LPS se nepromítá do celkového zhodnocení stránky.</p>
<p><strong>Optimální hodnota ja 90 % a více.</strong></p>
</div>
</div>
</body>
</html>
<?php
$string = '<div>ěščřžýáíé</div><p>testik</p> <p>testik2</p>';
$dom = new \DOMDocument('1.0', 'UTF-8');
$dom->loadHTML('<body>'.mb_convert_encoding($string, 'HTML-ENTITIES', 'UTF-8').'</body>');
// změny na $dom
echo substr($dom->saveHTML($dom->documentElement), 12, -14);
-- datetime
SET @MIN = '2019-06-29 00:53:27';
SET @MAX = '2019-06-29 13:53:27';
UPDATE tablename
SET columnname = TIMESTAMPADD(SECOND, FLOOR(RAND() * TIMESTAMPDIFF(SECOND, @MIN, @MAX)), @MIN)
-- https://stackoverflow.com/questions/24378490/update-table-with-random-values-from-given-set-of-string-values
-- string
update table t
set col = elt(floor(rand()*3) + 1, 'value1', 'value2', 'value3');
-- or
UPDATE `table`
SET `column`=(CASE CEIL(RAND()*3)
WHEN 1 THEN 'value1'
WHEN 2 THEN 'value2'
WHEN 3 THEN 'value3'
END);
-- random numbet between N a M
-- For range (min..max( (min inclusive, max exclusive) it is:
FLOOR( RAND() * (max-min) + min )
-- For range (min..max) (min+max inclusive) it is:
FLOOR( RAND() * (max-min+1) + min )
<?php
// DIBI
$q = []
array_push('SELECT * FROM %n', $table);
array_push('WHERE id > %d', $id);
$res = dibi::fetchAll($q);
// NDB
$q = $args = [];
$q[] = "SELECT * FROM ?";
$args[] = $table;
$q[] = "WHERE id > ?";
$args[] = $id;
$res = $this->db->fetchAll(implode(' ', $q), ...$args);
(function($){
$.fn.isInViewport = function(){
var elementTop = $(this).offset().top;
var elementBottom = elementTop + $(this).outerHeight();
var viewportTop = $(window).scrollTop();
var viewportBottom = viewportTop + $(window).height();
return (elementBottom > viewportTop && elementTop < viewportBottom);
};
$.fn.youTubeImage = function(){
this.each(function(){
var src = $(this).find('iframe').attr('title'); //.attr('src')
var arr = src.split('/');
if(typeof arr[2] != 'undefined'){
if(arr[2].indexOf('youtube')+1){
$(this).addClass('is-youtube');
}
}
if(arr.length){
var id = arr[arr.length-1].replace(/^(.*)\?(.*)$/, '$1');
var image = 'http://img.youtube.com/vi/' + id + '/0.jpg';
$(this).css({backgroundImage:'url(' + image + ')'});
}
var href = 'https://www.youtube.com/watch?v=' + id;
$(this).find('a').attr({ href: href, target: '_blank'});
});
return this;
};
$.fn.showWhenScrolled = function(){
var self = this;
this.init = function(){
self.each(function(){
var frame = $(this).find('iframe');
if($(this).isInViewport()){
if(!frame.attr('src')){
frame.attr({ src : frame.attr('title') });
}
}
});
};
$(window).on('scroll resize orientationchange', function(){
self.init();
});
self.init();
return this;
};
}(jQuery));
<?php
// State
/*
Definice
--------
Návrhový vzor State umožňuje objektu změnit chování, změní-li se jeho vnitřní
stav. Navenek se tato změna jeví, jako by objekt změnil svoji třídu.
Pro implementaci tohoto návrhového vzoru jsou nutné následující kroky:
1. V aplikaci identifikovat třídu, jejíž chování závisí na aktuálním stavu in stance.
2. Identifikovat metody odpovědné za změnu stavu a vytvořit rozhraní, které
bude obsahovat tyto metody.
3. Vytvořit způsob pro uložení aktuálního stavu objektu v původní třídě
a vytvořit metodu zabezpečující změnu aktuálního stavu.
4. Vytvořit způsob, kterým bude třída sama schopná spravovat svoje stavy. Případně
je možné spravovat jednotlivé stavy pomocí továrny nebo je implementovat
jako jedináčky.
5. Implementovat jednotlivé třídy stavů a zabezpečit přechody mezi nimi.
*/
// BAD
$printer = new LaserPrinter('Printer 1');
$book = new Book('PC', 580);
$printer->plugIn();
$printer->turnOn();
$printer->warmUp();
$printer->printPublication($book, 5);
$printer->turnOff();
$printer->unPlug();
interface Printer
{
public function plugIn();
public function unPlug();
public function turnOn();
public function turnOff();
public function warmUp();
public function printPublication(Publication $p, $count = 1);
public function getType();
public function getPageCounter();
}
/*
Implementovali jste velmi monolitické bloky kódu. Téměř každá metoda
obsahuje bloky if, které se musejí provádět jeden za druhým.
Takovýto kód není otevřený pro další rozšíření. Přijde-li v budoucnosti
požadavek, že není možné začít tisk, pokud neproběhla vnitřní diagnostika
tiskárny, budete muset kvůli doplnění jedné dodatečné podmínky změnit
několik metod.
*/
class LaserPrinter implements Printer
{
protected $plugedIn = false;
protected $turnedOn = false;
protected $warmedUp = false;
protected $type = null;
protected $pageCounter = 0;
function __construct($type)
{
$this->type = $type;
}
public function plugIn()
{
$this->plugedIn = true;
print "Tiskárna zapojena.\n";
}
public function turnOn()
{
if (true !== $this->plugedIn)
{
throw new \BadMethodCallException(
"Tiskárna nebyla zapojena do sítě."
);
}
$this->turnedOn = true;
print "Tiskárna zapnuta.\n";
}
public function warmUp()
{
if (true !== $this->plugedIn)
{
throw new \BadMethodCallException("Tiskárna nebyla zapojena do sítě.");
}
if (true !== $this->turnedOn)
{
throw new \BadMethodCallException("Tiskárna nebyla zapnuta.");
}
$this->warmedUp = true;
print "Tiskárna rozehřátá.\n";
}
public function printPublication(Publication $p, $count = 1)
{
if (true !== $this->plugedIn) {
throw new \BadMethodCallException(
"Tiskárna nebyla zapojena do sítě."
);
}
if (true !== $this->turnedOn) {
throw new \BadMethodCallException("Tiskárna nebyla zapnuta.");
}
if (true !== $this->warmedUp) {
throw new \BadMethodCallException("Tiskárna nebyla rozehřátá.");
}
$pageCount = $p->getPageCount();
$this->pageCounter += $pageCount * $count;
return true;
}
public function turnOff()
{
$this->warmedUp = false;
$this->turnedOn = false;
print "Tiskárna vypnutá.\n";
}
public function unPlug()
{
if (true === $this->turnedOn) {
throw new \BadMethodCallException("Tiskárna je pořád zapnuta.");
}
$this->plugedIn = false;
print "Tiskárna odpojena.\n";
}
public function getType()
{
return $this->type;
}
public function getPageCounter()
{
return $this->pageCounter;
}
}
// GOOD, pattern STATE
interface PrinterState
{
const STATE_OFFLINE = 0;
const STATE_PLUGED_IN = 1;
const STATE_TURNED_ON = 2;
const STATE_WARMED_UP = 3;
public function setState(PrinterState $state);
public function getState($stateId);
public function plugIn();
public function turnOn();
public function warmUp();
public function printPublication(Publication $p, $count = 1);
public function turnOff();
public function unPlug();
}
class LaserPrinter implements Printer
{
protected $state;
protected $states = array();
protected $type = null;
protected $pageCounter = 0;
function __construct($type)
{
$this->type = $type;
$this->states[Printer::STATE_OFFLINE] = new OfflinePrinterState($this);
$this->states[Printer::STATE_PLUGED_IN] = new PlugedInPrinterState($this);
$this->states[Printer::STATE_TURNED_ON] = new TurnedOnPrinterState($this);
$this->states[Printer::STATE_WARMED_UP] = new WarmedUpPrinterState($this);
$this->state = $this->getState(Printer::STATE_OFFLINE);
}
public function plugIn()
{
$this->state->plugIn();
}
public function turnOn()
{
$this->state->turnOn();
}
public function warmUp()
{
$this->state->warmUp();
}
public function printPublication(Publication $p, $count = 1)
{
$pageCount = $this->state->printPublication($p, $count);
if (false !== $pageCount) {
$this->pageCounter += $pageCount;
}
}
public function turnOff()
{
$this->state->turnOff();
}
public function unPlug()
{
$this->state->unPlug();
}
public function getType()
{
return $this->type;
}
public function getPageCounter()
{
return $this->pageCounter;
}
public function getState($stateId)
{
return $this->states[$stateId];
}
public function setState(PrinterState $state)
{
printf("Tiskárna měni stav: %s.\n", get_class($state));
$this->state = $state;
}
}
abstract class AbstractPrinterState implements PrinterState
{
protected $printer;
public function __construct(Printer $printer)
{
$this->printer = $printer;
}
}
class OfflinePrinterState extends AbstractPrinterState
{
public function plugIn()
{
$this->printer->setState(
$this->printer->getState(Printer::STATE_PLUGED_IN)
);
print "Tiskárna zapojena do sítě.\n";
}
public function turnOn()
{
throw new \BadMethodCallException("Tiskárna nebyla zapojena.\n");
}
public function warmUp()
{
throw new \BadMethodCallException("Tiskárna nebyla zapnuta.\n");
}
public function printPublication(Publication $p, $count = 1)
{
throw new \BadMethodCallException("Není možné.\n");
}
public function turnOff()
{
throw new \BadMethodCallException("Tiskárna nebyla zapnuta.\n");
}
public function unPlug()
{
throw new \BadMethodCallException("Tiskárna nebyla zapojena.\n");
}
}
class PlugedInPrinterState extends AbstractPrinterState
{
public function plugIn()
{
throw new \BadMethodCallException("Tiskárna již byla zapojena.\n");
}
public function turnOn()
{
$this->printer->setState(
$this->printer->getState(Printer::STATE_TURNED_ON)
);
print "Tiskárna zapnuta.\n";
}
public function warmUp()
{
throw new \BadMethodCallException("Tiskárna nebyla zapnuta.\n");
}
public function printPublication(Publication $p, $count = 1)
{
throw new \BadMethodCallException("Není možné.\n");
}
public function turnOff()
{
throw new \BadMethodCallException("Tiskárna nebyla zapnuta.\n");
}
public function unPlug()
{
$this->printer->setState(
$this->printer->getState(Printer::STATE_OFFLINE)
);
print "Tiskárna odpojena.\n";
}
}
class TurnedOnPrinterState extends AbstractPrinterState
{
public function plugIn()
{
throw new \BadMethodCallException("Tiskárna již byla zapojena.\n");
}
public function turnOn()
{
throw new \BadMethodCallException("Tiskárna již byla zapnuta.\n");
}
public function warmUp()
{
$this->printer->setState(
$this->printer->getState(Printer::STATE_WARMED_UP)
);
print "Tiskárna rozehřátá.\n";
}
public function printPublication(Publication $p, $count = 1)
{
throw new \BadMethodCallException("Není možné.\n");
}
public function turnOff()
{
$this->printer->setState(
$this->printer->getState(Printer::STATE_PLUGED_IN)
);
print "Tiskárna vypnutá.\n";
}
public function unPlug()
{
throw new \BadMethodCallException("Tiskárna je pořád zapnutá.\n");
}
}
class WarmedUpPrinterState extends AbstractPrinterState
{
public function plugIn()
{
throw new \BadMethodCallException("Tiskárna již byla zapojena.\n");
}
public function turnOn()
{
throw new \BadMethodCallException("Tiskárna již byla zapnuta.\n");
}
public function warmUp()
{
throw new \BadMethodCallException("Tiskárna již byla rozehřáta.\n");
}
public function printPublication(Publication $p, $count = 1)
{
$pageCount = $p->getPageCount() * $count;
printf("Vytištěných %d stran.\n", $pageCount);
return $pageCount;
}
public function turnOff()
{
$this->printer->setState(
$this->printer->getState(Printer::STATE_PLUGED_IN)
);
print "Tiskárna vypnutá.\n";
}
public function unPlug()
{
throw new \BadMethodCallException("Tiskárna je pořád zapnutá.\n");
}
}
// USAGE
$printer = new LaserPrinter('Printer 1');
$book = new Book('PC', 580);
$printer->plugIn();
$printer->turnOn();
$printer->warmUp();
$printer->printPublication($book, 5);
$printer->turnOff();
$printer->unplug();
<?php
/*
Definice
--------
Návrhový vzor Strategy definuje rodinu algoritmů, které zapouzdřuje, a umožňuje
jejich záměnu nezávisle na klientovi, který ji používá.
Pro implementaci tohoto návrhového vzoru jsou nutné následující kroky:¨
1. Definovat rozhraní, která budou muset implementovat všechny třídy z rodiny
algoritmů.
2. Implementovat minimálně 2 konkrétní implementace rozhraní z bodu 1.
3. Vytvořit způsob, kterým bude do objektu využívajícího tento vzor vložena
konkrétní implementace třídy z bodu 2.
4. Ve třídě využívající vzor Strategy vytvořit metodu, která své volání deleguje
na objekt vložený do třídy v bodě 3.
*/
interface Debugger
{
public function debug($message);
}
class DebuggerEcho implements Debugger
{
public function debug($message)
{
echo $message . PHP_EOL;
}
}
class DebuggerLog implements Debugger
{
// zapis do souboru, pro demonstraci jen s prefixem ...
public function debug($message)
{
echo 'LOG: ' . $message . PHP_EOL;
}
}
class DebuggerNull implements Debugger
{
public function debug($message)
{
}
}
// $library = new Library(new DebuggerEcho);