/ Gists / Nette

Gists - Nette

On gists

From https://forum.nette.org/cs/20267-jde-nejak-zmenit-data-v-active-row-kdyz-jsou-ted-read-only#p139460 Wrapper nad ActiveRow, Nette

Nette Nette-Tricks

nette-wrapper-active-row.php #

class RowWrapper extends Nette\Object
{
    protected $row;

    protected $data;

    public function __construct(Nette\Database\Table\ActiveRow $row)
    {
        $this->row = $row;
    }

    public function &__get($key)
    {
        if(isset($this->data[$key]) {
            $value = $this->data[$key];
        }
        $value = $this->row->$key;

        return $value;
    }

    public function __set($key, $value)
    {
        $this->data[$key] = $value;
    }

    //pripadne jeste related a ref

}

On gists

Ruční vykreslení formuláře v Nette (skoro ruční)

Nette Nette-Forms Nette-Tricks Nette-Latte

semi-manual-form-renderning.latt #

{form $form}
<ul class=error n:if="$form->ownErrors">
	<li n:foreach="$form->ownErrors as $error">{$error}</li>
</ul>

<table>
<tr n:foreach="$form->controls as $input" n:class="$input->required ? required">
	<th>{label $input /}</th>
	<td>{input $input} <span class=error n:ifcontent>{$input->error}</span></td>
</tr>
</table>
{/form}

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

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>

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);