/ Gists

Gists

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>

On gists

Vlastní filtr(y) v komponentě

Nette

filter-in-component.php #

	public function createTemplate($class = NULL)
	{
		  
		  $template = parent::createTemplate($class);
		  $template->addFilter('streakBar', function($s, $maxBar = 5, $paramId){


		  		if ($paramId == 1470)
		  		{
		  			$streakBar = \Nette\Utils\Html::el('div')->addClass('streak-bar');
		  			$off = $maxBar - $s;
		  			$on = $s;

		  			for ($i = 1; $i <= $on; $i++)
		  			{
		  				$onBar = \Nette\Utils\Html::el('div')->addClass('bar on');
		  				$streakBar->add($onBar);
		  			}

		  			for ($i = 1; $i <= $off; $i++)
		  			{
		  				$offBar = \Nette\Utils\Html::el('div')->addClass('bar off');
		  				$streakBar->add($offBar);
		  			}


					return $streakBar->addTitle($on . '/' . $maxBar);

		  		}

		  		return $s;
		  });

		  return $template;
	}

On gists

MPDF , Nette , Latte, šablona do MPDF

Nette

presenter.php #

	<?php 
	
	    $mpdf = new \mPDF('utf-8','A4','','',12,12,2,2,10,10, 'P'); 
	    $mpdf->useOnlyCoreFonts = true;
	    $mpdf->SetDisplayMode('fullpage');
		$this->template->setFile(INDEX_DIR . '/app/FrontModule/templates/ConfigIt/pdf.latte');
        $mpdf->WriteHTML((string) $this->template);
        $mpdf->Output($name, 'd');
		$this->terminate();

On gists

From https://forum.nette.org/cs/11005-nette-ajax-js-alt-obsluha-pro-ajax-s-jquery?p=5

Nette JavaScript

spinner-nette-ajax.js #

(function($, undefined) {
$.nette.ext('spinner', {
        init: function () {
                spinner = $('<div></div>', { id: "ajax-spinner" });
                spinner.appendTo("body");
        },
        before: function (xhr, settings) {
                $("#ajax-spinner").css({
                        visibility: "visible",
                        left: settings.nette.e.pageX,
                        top: settings.nette.e.pageY
                });
        },
        complete: function () {
                $("#ajax-spinner").css({
                        visibility: "hidden"
                });
        }
});
})(jQuery);

On gists

Close on document, but not on this element.

jQuery Helpers-Filters-Plugins

on-document-click-close.js #

    $(document).on('click', function(e){

    	if ($(e.target).closest('.user-sign-in-form').length === 0) 
    	{
       		$('.user-sign-in-form').fadeToggle();
    	}

    });

On gists

Jquery - replace tag with another

jQuery Helpers-Filters-Plugins

replace-tag-by-another.js #

$('li').replaceWith(function(){
  return $("<div />").append($(this).contents());
});

On gists

Stay on top

jQuery

fixed-nav-stay-on-top.js #

$(function(){
	var $win = $(window)
	var $nav = $('.mytoolbar');
	var navTop = $('.mytoolbar').length && $('.mytoolbar').offset().top;
	var isFixed=0;
 
	processScroll()
	$win.on('scroll', processScroll)
 
	function processScroll() {
	var i, scrollTop = $win.scrollTop()
 
	if (scrollTop >= navTop && !isFixed) { 
		isFixed = 1
		$nav.addClass('subnav-fixed')
	} else if (scrollTop <= navTop && isFixed) {
		isFixed = 0
 		$nav.removeClass('subnav-fixed')
	}
}

On gists

Nette - odeslání přílohy emailem

Nette

send-mail-with-attachment.php #

if ($values['cv']->isOk())
{
  $mail->addAttachment($values['cv']->name, file_get_contents($values['cv']->temporaryFile));
}