/ Gists

Gists

On gists

Custom Router -- Nette

Nette

custom-router.php #

$router[] = new Route('<slug .+>', array(
    null => Route::FILTER_IN => function($params) {
        // nacist z databaze podle $params['slug'];
        if (nenalezeno) {
            return null;
        }
        unset($params['slug']);
        $params['module'] = '...';
        $params['presenter'] = '...';
        $params['action'] = '...';
        $params['id'] = '...';
        $params['...'] = '...';
        return $params;
    },
    null => Route::FILTER_OUT => function($params) {
        // nacist $slug z db prodle $params['module'], $params['presenter'], $params['action'], ...
        if (nenalezeno) {
            return null;
        }
        unset($params['module'], $params['presenter'], ...);
        $params['slug'] = $slug;
        return $params;
    },
));

On gists

Nahrazeni obrazku na webu 1px transparentnim gifem

JavaScript

replace-img.js #

(function(img) {
    for (var i = img.length; i--; ) {
        img[i].src = "data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAAHAP8ALAAAAAABAAEAAAICRAEAOw==";
    }
})(document.images);

On gists

České řazení / Czech sorting

PHP Helpers-Filters-Plugins

cs-sort.php #

<? 
setlocale(LC_ALL, 'cs_CZ.UTF-8');
header("content-type: text/html; charset=UTF-8");

$arr = explode(",", "č, d, b, a, š, ř, o, x, z, ž, á, s, m");

uasort($arr, "strcoll");
echo "<pre>" . print_r($arr, 1) . "</pre>";

?>

On gists

Recolor image From http://stackoverflow.com/questions/12178874/replace-a-color-with-another-in-an-image-with-php

PHP

recolor-image.php #

<?php
$imgname = "1.gif";
$im = imagecreatefromgif ($imgname);
$index = imagecolorexact ($im,0,128,0);
imagecolorset($im,$index,240,255,0);
$imgname = "result.gif";
imagegif($im,$imgname);
?>
<img src="result.gif">

On gists

From http://blog.bobbyallen.me/2015/04/04/get-nearest-places-from-mysql-with-latitude-and-longditude/

MySql

lat-lng.sql #

-- Set your users current location in LAT/LONG here
set @lat=51.891648;
set @lng=0.244799;

-- The main SQL query that returns the closest 5 airports.
SELECT id, icao, lat, lng, 111.045 * DEGREES(ACOS(COS(RADIANS(@lat))
 * COS(RADIANS(lat))
 * COS(RADIANS(lng) - RADIANS(@lng))
 + SIN(RADIANS(@lat))
 * SIN(RADIANS(lat))))
 AS distance_in_km
FROM airports
ORDER BY distance_in_km ASC
LIMIT 0,5;

On gists

Google Maps Simple Multiple Marker Example

Gmaps

Google Maps Simple Multiple Mark #

<html>
<head>
  
  <title>Google Maps Multiple Markers</title>
  <script src="http://maps.google.com/maps/api/js?sensor=false" type="text/javascript"></script>
</head>
<body>
  <div id="map" style="height: 400px; width: 500px;">
</div>
<script type="text/javascript">
    var locations = [
      ['Bondi Beach', -33.890542, 151.274856, 4],
      ['Coogee Beach', -33.923036, 151.259052, 5],
      ['Cronulla Beach', -34.028249, 151.157507, 3],
      ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
      ['Maroubra Beach', -33.950198, 151.259302, 1]
    ];

    var map = new google.maps.Map(document.getElementById('map'), {
      zoom: 10,
      center: new google.maps.LatLng(-33.92, 151.25),
      mapTypeId: google.maps.MapTypeId.ROADMAP
    });

    var infowindow = new google.maps.InfoWindow();

    var marker, i;

    for (i = 0; i < locations.length; i++) { 
      marker = new google.maps.Marker({
        position: new google.maps.LatLng(locations[i][1], locations[i][2]),
        map: map
      });

      google.maps.event.addListener(marker, 'click', (function(marker, i) {
        return function() {
          infowindow.setContent(locations[i][0]);
          infowindow.open(map, marker);
        }
      })(marker, i));
    }
  </script>
</body>
</html>

On gists

Povolení načtení webu ve Frames, Nette

Nette Nette-Neon Nette-Tricks

example.neon #

common:
	security:
		debugger: true
		frames: SAMEORIGIN

On gists

From http://pavelbier.cz/tagged/nette

Nette Nette-Forms

nette-formular-ukazka.php #

require_once('./Nette/loader.php');

define(HESLO_MIN_ZNAKU,6);
define(URL_ADRESA_OBCHODNICH_PODMINEK,'http://www.example.com/');

function loginValidator($item){
  return dibi::query('SELECT [id] FROM [zakaznici] WHERE [nick]=%s LIMIT 1',$item->getValue())->count() == 0 ? true : false;
}


$form = new Form('registracni_formular');
$form->setMethod('post');
$form->getElementPrototype()->id = 'registrace';
$form->getElementPrototype()->class = 'formular';
$form->addGroup('Přihlašovací údaje');
$form->addText('nick','Login:',25)
     ->addRule(Form::FILLED, 'Login nebyl vyplněn')
     ->addRule('loginValidator', 'Tento login již existuje');
$form->addPassword('heslo','Heslo:',25)
      ->addRule(Form::FILLED, 'Heslo nebylo vyplněno')
      ->addRule(Form::MIN_LENGTH, 'Heslo je příliš krátké', HESLO_MIN_ZNAKU)
      ->setOption('description','Heslo musí mít minimálně '.HESLO_MIN_ZNAKU.' znaků'); 
$form->addPassword('heslo2','Zopakujte heslo:',25)
      ->addRule(Form::FILLED, 'Heslo nebylo vyplněno')
      ->addRule(Form::EQUAL, 'Hesla se neshodují',$form['heslo']); 

$form->addGroup('Povinné údaje');

$form->addText('email', 'Email:',35)
      ->addRule(Form::FILLED, 'Email nebyl vyplněn')
      ->addRule(Form::EMAIL, 'Zadaný email není platným emailem')
      ->emptyValue = '@';

$typ_osoby = array(
  '1' => 'Fyzická osoba',
  '2' => 'Právnická osoba',
);

$form->addRadioList('typ', 'Typ:', $typ_osoby)->addRule(Form::FILLED, 'Vyberte typ registrovaného subjektu')->addCondition(Form::EQUAL, 2)->toggle('povinneUdajePravnicka');
$form->addText('jmeno','Jméno:',35)->addRule(Form::FILLED, 'Zadejte jméno');
$form->addText('prijmeni','Příjmení:',35)->addRule(Form::FILLED, 'Zadejte příjmení');
$form->addText('ulice','Ulice:',35)->addRule(Form::FILLED, 'Zadejte ulici');
$form->addText('mesto','Město:',35)->addRule(Form::FILLED, 'Zadejte město');
$form->addText('psc','PSČ:',35)->addRule(Form::FILLED, 'Zadejte PSČ');
$souhlasLabel = Html::el()->setHtml('Souhlasím s <a href="'.URL_ADRESA_OBCHODNICH_PODMINEK.'" target="_blank">obchodními</a> podmínkami.');
$form->addCheckbox('souhlas', $souhlasLabel)->addRule(Form::FILLED, 'Pro pokračování je nutné souhlasit s podmínkami.');

$form->addGroup('Povinné údaje právnické osoby')->setOption('container', Html::el('fieldset')->id('povinneUdajePravnicka'));
$form->addText('firma','Firma:',35)->addConditionOn($form['typ'], Form::EQUAL, 2)->addRule(Form::FILLED,'Zadejte firmu');
$form->addText('ico','IČO:',35)->addConditionOn($form['typ'], Form::EQUAL, 2)->addRule(Form::FILLED,'Zadejte IČO');
$form->addText('dic','DIČ:',35)->addConditionOn($form['typ'], Form::EQUAL, 2)->addRule(Form::FILLED,'Zadejte DIČ');
$form->addGroup('Nepovinné údaje')->setOption('container', Html::el('fieldset')->id('nepovinneUdaje'));
$form->addText('telefon','Telefon:',35);
$form->addText('mobil','Mobil:',35);
$form->addText('fax','Fax:',35);
$form->setCurrentGroup(NULL);

$form->addSubmit('ok','Registrovat se')->getControlPrototype()->class = 'submit';
$form->addProtection('Vypršela platnost formuláře.');

if ($form->isSubmitted() and $form->isValid()) {
  $values = $form->getValues();
  unset($values['heslo2']);
  unset($values['souhlas']);
  $ok = dibi::query('INSERT INTO [zakaznici] %v',$values);
  //..... nasleduje redirect
  
} else {

  $defaults = array('typ'=>1);
  $form->setDefaults($defaults);
  
}

On gists

Nette simple tree

Nette

tree.yaml #

						{var $parent = 0}
						{var $level = 0}

						{block menu}
							{if isset($gbookTree[$parent])}
								{foreach $gbookTree[$parent] as $id => $row}
																	

									{var $initials = explode(" ", $row['name'], 2)}
									{var $indent = 0}

									{if $level == 1}
										{var $indent = 0}
									
									{elseif $level > 1}
										{var $indent = 100}
									{/if}
				
									{* discussion item *}
									<div class="blog-discussion__item blog-discussion__item--last" style="margin-left: {$indent}px" id="cmt-{$id}">
										
										<div class="blog-discussion__image">
											{if $level > 1}
												<img src="/assets/gfx/gbook-reaction.jpg" alt="" />
											{/if}
											<div class="blog-discussion__circle{if $level > 0} blog-discussion__circle--small{/if}">{$initials[0]|truncate:1,''} {ifset $initials[1]}{$initials[1]|truncate:1,''}{/ifset}</div>
										</div>
										<div class="blog-discussion__content">
											
											<div class="blog-discussion__name">
												{$row['name']}
											</div>

											<div class="blog-discussion__date">
												{$row['create_date']|date:'j.n.Y'}
											</div>

											<div class="blog-discussion__text">
												<p>{$row['msg']}</p>
												<p><a href="" data-text="{_}Reagujete na uživatele{/_}: {$row[name]}" class="blog-answer">{_}answer{/_}</a></p>
											</div>

										</div>


										{ifset $gbookTree[$id]}
											{include #menu, parent => $id, level => $level + 1 }
										{/ifset}


									</div>




								{/foreach}
							{/if}

						{/block}

On gists

Vykreslení objektu Nette\Utils\Paginator, použití {include ../paginator.latte, paginator => $paginator}, kde $paginator máme předán z presen

Nette Bootstrap

paginator.latte #

{** Bootstrapové vykreslení paginatoru *}

{default $maxOdkazu = 15}
{default $postupnychStranek = 4} 

{var $min = $paginator->getBase()}
{var $max = $paginator->getPageCount()}
{var $pocet = ($max - $min)}
{var $aktStrana = $paginator->getPage()}
{var $doplnkovychStran = $maxOdkazu - 2 - ($postupnychStranek*2) + 1}
{var $volnychMist = $maxOdkazu - $doplnkovychStran}
{var $doplnkovyKrok = ceil(($max - $min) / $volnychMist)}

<ul class="pagination">
	{* odkaz na předchozí stranu, když jsem na první straně tak odkazuje na sebe *}
	<li n:class="$paginator->isFirst()?disabled"><a n:href="this, page => $paginator->isFirst()?$aktStrana:($aktStrana-1)">&laquo;</a></li>
		{if (($max-$min)<=$maxOdkazu)} {* Dají se odkazy vykreslit postupně? *}
			{for $p = $min;$p<=$max;$p++}
			<li n:class="($aktStrana == $p)? active">
				<a n:href="this, page => $p">{$p}</a>
			</li>
		{/for}
	{else}
		{for $p = $min;$p<=$max;$p++}
			{var $prvniAPosledni = ($p == $min || $p == $max)}
			{var $nejblizsiRozsah = ($p > ($aktStrana - $postupnychStranek) && $p < ($aktStrana + $postupnychStranek))}
			{var $doplnek = (($p % $doplnkovyKrok) == 0)}
			{if $prvniAPosledni || $nejblizsiRozsah || $doplnek}
				<li n:class="($aktStrana == $p)? active">
					<a n:href="this, page => $p">{$p}</a>
				</li>
			{/if}
		{/for}
	{/if}
	{* odkaz na následující stranu, když jsem na poslední straně tak odkazuje na sebe *}
	<li n:class="$paginator->isLast()?disabled"><a n:href="this, page => $paginator->isLast()?$aktStrana:($aktStrana+1)">&raquo;</a></li>
</ul>