<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Yet another blog about PHP, HTML and CSS</title>
	
	<link>http://blog.pepa.info</link>
	<description>Petr 'PePa' Pavel</description>
	<lastBuildDate>Mon, 18 Feb 2013 10:31:32 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/YetAnotherBlogAboutPhpHtmlAndCss" /><feedburner:info uri="yetanotherblogaboutphphtmlandcss" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Configuring Nette in Neon</title>
		<link>http://feedproxy.google.com/~r/YetAnotherBlogAboutPhpHtmlAndCss/~3/h7LjeTWP6vs/</link>
		<comments>http://blog.pepa.info/php-html-css/uncategorized/configuring-nette-in-neon/#comments</comments>
		<pubDate>Mon, 18 Feb 2013 10:31:00 +0000</pubDate>
		<dc:creator>Petr 'PePa' Pavel</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Nette Framework 2.0.8 (revision b7f6732 released on 2013-01-01)]]></category>

		<guid isPermaLink="false">http://blog.pepa.info/?p=422</guid>
		<description><![CDATA[I bet you didn&#8217;t know it but Nette&#8217;s internal behaviour can be configured quite extensively in config.neon. Default form error messages, switching on/off debugger panels, changing mailer to use SMTP instead of mail() and so on. All of this can be set up in PHP but keeping configuration out of your code helps making it [...]]]></description>
				<content:encoded><![CDATA[<p>I bet you didn&#8217;t know it but Nette&#8217;s internal behaviour can be configured quite extensively in config.neon. Default form error messages, switching on/off debugger panels, changing mailer to use SMTP instead of mail() and so on. All of this can be set up in PHP but keeping configuration out of your code helps making it easier to read. <a title="Currently Czech only" href="http://doc.nette.org/cs/configuring/nette-framework" target="_blank">Do have a look</a>, it has a great potential. As usually, the documentation is pretty bare and it&#8217;s up to us to discover the whole truth. This post contains some additional information that I scavenged in forums or discovered myself.<span id="more-422"></span></p>
<p><a href="http://forum.nette.org/cs/13646-namespace-pro-user-storage#p97543" target="_blank">Assign user a session namespace </a>(session is the default storage):</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">services:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; nette.userStorage:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; setup:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &#8211; setNamespace<span class="br0">&#40;</span><span class="st0">&quot;myName&quot;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p><a href="http://pla.nette.org/cs/vlastni-latte-makra#toc-a-vlastni-trida" target="_blank">Install custom macros </a>using a factory:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">factories:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; nette.latte:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">class</span>: &nbsp;NLatteFilter</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; setup:</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &#8211; CustomMacros::<span class="me2">install</span><span class="br0">&#40;</span>::<span class="re0">$service</span>-&gt;<span class="me1">getCompiler</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Use your own <a href="http://forum.nette.org/cs/10408-notorm-nad-nette-database#p82401" target="_blank">database debugger panel</a>:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">services:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; nette.database.defaultConnectionPanel: NotORM_DatabasePanel</div>
</li>
</ol>
</div>
<p>Switch mailer to SMTP/localhost in order to catch all e-mails with <a href="http://code.google.com/a/eclipselabs.org/p/foos-bar/" target="_blank">MailSnag</a>:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">development &lt; common:</div>
</li>
<li class="li1">
<div class="de1">  nette:</div>
</li>
<li class="li1">
<div class="de1">    mailer:</div>
</li>
<li class="li1">
<div class="de1">      smtp: <span class="kw2">true</span></div>
</li>
<li class="li2">
<div class="de2">      host: localhost</div>
</li>
</ol>
</div>
<p>Post a comment if you know more goodies.</p>
<img src="http://feeds.feedburner.com/~r/YetAnotherBlogAboutPhpHtmlAndCss/~4/h7LjeTWP6vs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.pepa.info/php-html-css/uncategorized/configuring-nette-in-neon/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.pepa.info/php-html-css/uncategorized/configuring-nette-in-neon/</feedburner:origLink></item>
		<item>
		<title>You thought using Skype was secure?</title>
		<link>http://feedproxy.google.com/~r/YetAnotherBlogAboutPhpHtmlAndCss/~3/FiAaY315Bdk/</link>
		<comments>http://blog.pepa.info/php-html-css/uncategorized/you-thought-using-skype-was-secure/#comments</comments>
		<pubDate>Mon, 13 Aug 2012 11:25:00 +0000</pubDate>
		<dc:creator>Petr 'PePa' Pavel</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.pepa.info/?p=403</guid>
		<description><![CDATA[Many of us send sensitive information over Skype chat in order to prevent a third party from reading it. Think login credentials for example. What you may not know is that Skype is set by default to store chat history on your hard disk. Nothing wrong with it if it weren&#8217;t in plain text! All [...]]]></description>
				<content:encoded><![CDATA[<p>Many of us send sensitive information over Skype chat in order to prevent a third party from reading it. Think login credentials for example. What you may not know is that Skype is set by default to store chat history on your hard disk. Nothing wrong with it if it weren&#8217;t in plain text!</p>
<p><span id="more-403"></span></p>
<p>All right, it&#8217;s not exactly plain text, it&#8217;s SQLite but that&#8217;s no obstacle for a tech savvy person. Even keyboard shy people can download a plug-in for their favourite file manager (plugins here: <a href="http://code.google.com/p/farplugs/" target="_blank">FAR Manager</a> / <a href="http://www.totalcmd.net/plugring/xBaseView.html" target="_blank">Total Commander</a>). But even without a SQLite browser, you can see bits and pieces of your messages. Just open the file with any text editor. Don&#8217;t take my word for it, have a look yourself (path is for Windows 7):</p>
<pre>C:\Users\&lt;your Windows user name&gt;\AppData\Roaming\Skype\&lt;your Skype user name&gt;\main.db</pre>
<p>If using SQLite browser, look for table <em>Messages</em>. You&#8217;ll find all your private messages that you&#8217;ve sent or received in the past on this computer. All it takes for someone to see them is to sit at your keyboard when it&#8217;s not locked. Or send a virus. Also, realize that the recipient of your messages has his or her copy as well.</p>
<p>Now that I have your attention, here comes even worse news. You can&#8217;t simply purge your history. Don&#8217;t let yourself be fooled by that sweet looking button in your Skype settings. It just doesn&#8217;t work properly. I assume it&#8217;s because the records are only marked as deleted, not physically removed from the file.</p>
<p>You have to physically remove the file (wiping it, if you&#8217;re extra concerned) which unfortunately also removes all of your cached profile information. You will loose groups assignment, real names of people who haven&#8217;t logged in recently, your picture profile&#8230; Don&#8217;t ask me why when this information is also stored on the server. It just happened to me. Good luck with convincing your friends or company partners to do this in order to purge your messages.</p>
<p>I continue to send sensitive information over Skype, I just don&#8217;t store it in the history now. Luckily, I don&#8217;t need to worry about Skype company monitoring the traffic because I&#8217;m not an interesting target. But that&#8217;s a different story ;-)</p>
<img src="http://feeds.feedburner.com/~r/YetAnotherBlogAboutPhpHtmlAndCss/~4/FiAaY315Bdk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.pepa.info/php-html-css/uncategorized/you-thought-using-skype-was-secure/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.pepa.info/php-html-css/uncategorized/you-thought-using-skype-was-secure/</feedburner:origLink></item>
		<item>
		<title>Dynamic snippets for repeated forms</title>
		<link>http://feedproxy.google.com/~r/YetAnotherBlogAboutPhpHtmlAndCss/~3/4Vizi33CMMk/</link>
		<comments>http://blog.pepa.info/php-html-css/nette/dynamic-snippets-for-repeated-forms/#comments</comments>
		<pubDate>Wed, 11 Apr 2012 19:17:58 +0000</pubDate>
		<dc:creator>Petr 'PePa' Pavel</dc:creator>
				<category><![CDATA[Nette]]></category>
		<category><![CDATA[Nette Framework 2.0.1 (revision 94abcaa released on 2012-02-29)]]></category>

		<guid isPermaLink="false">http://blog.pepa.info/?p=340</guid>
		<description><![CDATA[At the time of this writing, Nette lacks a good support for dynamic snippets. You can define them wrapped in a static snippet but you can&#8217;t invalidate them individually (unless they each belong to a different control, I think). You can only invalidate the static parent snippet which means you receive all its dynamic children [...]]]></description>
				<content:encoded><![CDATA[<p>At the time of this writing, Nette lacks a good support for dynamic snippets. You can define them wrapped in a static snippet but you can&#8217;t invalidate them individually (unless they each belong to a different control, I think). You can only invalidate the static parent snippet which means you receive all its dynamic children snippets in the payload.</p>
<p>If you defined only a few snippets with small amount of data in each then no big deal. If however, you have a pageful of forms, each form containing a snippet that you want updated upon the parent form submission then you have to resort to tricks. For instance, you don&#8217;t want a message &#8220;Saved&#8221; displayed in each row/form in a product administration table.<br />
<span id="more-340"></span></p>
<p>I&#8217;m going to assume that you know <a href="http://addons.nette.org/en/ajax-form" title="with Nette add-ons">how to submit forms via AJAX</a>. Your application is already working with AJAX and the only missing piece is the dynamic snippets invalidation.</p>
<p>The trick that I ended up using is kind of mirroring the built-in functionality. I keep track of invalidated dynamic snippets and skipping definitions of those that haven&#8217;t changed. Sounds more difficult than it is, actually.</p>
<p>Notice that I define <code>invalidSnippets</code> in <code>startup()</code>.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> Admin_ProductPresenter <span class="kw2">extends</span> NPresenter <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; protected <span class="kw2">function</span> startup<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; parent::<span class="me2">startup</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// this is better placed into BasePresenter</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">template</span>-&gt;<span class="me1">isAjax</span> = <span class="re0">$this</span>-&gt;<span class="me1">isAjax</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">template</span>-&gt;<span class="me1">invalidSnippets</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">public</span> <span class="kw2">function</span> renderDefault<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// load products from db</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// and set defaults with $this[&quot;productForm-$productId&quot;]-&gt;setDefaults($data);</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">public</span> <span class="kw2">function</span> createComponentProductForm<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="co1">// create your repeated forms</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">new</span> NMultiplier<span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">new</span> ProductForm<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>When processing form submission in ProductForm::process(), I take the form&#8217;s unique identificator and use it to mark all its snippets as invalidated.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> ProductForm <span class="kw2">extends</span> NAppForm <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">public</span> <span class="kw2">function</span> __construct<span class="br0">&#40;</span><span class="re0">$parent</span> = <span class="kw2">null</span>, <span class="re0">$name</span> = <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">// form elements are added here</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">onSuccess</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = callback<span class="br0">&#40;</span><span class="re0">$this</span>, <span class="st0">&#8216;process&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">public</span> <span class="kw2">function</span> process<span class="br0">&#40;</span>NAppForm <span class="re0">$form</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="re0">$values</span> = <span class="re0">$form</span>-&gt;<span class="me1">getValues</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// update the product in db</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$this</span>-&gt;<span class="me1">presenter</span>-&gt;<span class="me1">isAjax</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">presenter</span>-&gt;<span class="me1">invalidateControl</span><span class="br0">&#40;</span><span class="st0">&quot;products&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="co1">// invalidate the wrapping static snippet</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="co1">// $this-&gt;presenter-&gt;invalidateControl(&quot;message-&quot;.$productId);</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="co1">// it makes no sense to invalidate the dynamic snippet &#8211; it doesn&#8217;t do anything</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re0">$productId</span> = <span class="re0">$values</span><span class="br0">&#91;</span><span class="st0">&#8216;productId&#8217;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">presenter</span>-&gt;<span class="me1">template</span>-&gt;<span class="me1">invalidSnippets</span><span class="br0">&#91;</span><span class="re0">$productId</span><span class="br0">&#93;</span> = <span class="kw2">true</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">presenter</span>-&gt;<span class="me1">template</span>-&gt;<span class="me1">message</span> = <span class="st0">&#8216;Saved.&#8217;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">presenter</span>-&gt;<span class="me1">flashMessage</span><span class="br0">&#40;</span><span class="st0">&quot;Saved.&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">presenter</span>-&gt;<span class="me1">redirect</span><span class="br0">&#40;</span><span class="st0">&#8216;this&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>Reaching from ProductForm over to the parent presenter&#8217;s template is smelly but let&#8217;s keep it short here. You can attach another method to onSuccess[] and do the presenter related stuff in your presenter&#8217;s method.</p>
<p>And here&#8217;s the template. Notice that I <strong>define</strong> the snippets themselves only if they are needed. That is during the initial non-AJAX rendering or if they have been invalidated.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">{snippet products}
</div>
</li>
<li class="li1">
<div class="de1">{* this is the static wrapper that Nette needs to allow dynamic snippets *}
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">{foreach $products as $product}
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; {var $productId = $product['id']}
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; {form productForm-$productId}
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; {input name} {* your form elements *}
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; {input save} {* something to submit the form with *}
</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; {* wrapper: only define if invalidated or during the initial rendering *}
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; {if isset($invalidSnippets[$productId]) || !$isAjax}
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; {snippet message-$productId span}
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; {isset($message) ? $message}
</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; {/snippet}
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; {/if}
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; {/form}
</div>
</li>
<li class="li1">
<div class="de1">{/foreach}
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">{/snippet}
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>You can define as many dynamic snippets as you want just make sure their name is unique (e.g. &#8220;something-$productId&#8221;) and you wrapped them with the if statement.</p>
<p>There&#8217;s also an alternative way, a completely different approach which ignores all the above. And that&#8217;s to detect a submitted form in the presenter and only work with its product further on. The added benefit is reduced server load &#8211; you don&#8217;t process information for other products only to throw it away at the end. The same for the template &#8211; define only this particular product&#8217;s form.</p>
<img src="http://feeds.feedburner.com/~r/YetAnotherBlogAboutPhpHtmlAndCss/~4/4Vizi33CMMk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.pepa.info/php-html-css/nette/dynamic-snippets-for-repeated-forms/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.pepa.info/php-html-css/nette/dynamic-snippets-for-repeated-forms/</feedburner:origLink></item>
		<item>
		<title>Converting hexadecimal RGB code to decimal with a bookmarklet</title>
		<link>http://feedproxy.google.com/~r/YetAnotherBlogAboutPhpHtmlAndCss/~3/R5-MAcO8Mug/</link>
		<comments>http://blog.pepa.info/php-html-css/tools/converting-hexadecimal-rgb-code-to-decimal-with-a-bookmarklet/#comments</comments>
		<pubDate>Thu, 22 Mar 2012 16:23:08 +0000</pubDate>
		<dc:creator>Petr 'PePa' Pavel</dc:creator>
				<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://blog.pepa.info/?p=331</guid>
		<description><![CDATA[Many applications use the default Windows colour picker which unfortunately, doesn&#8217;t support hexa codes. Use this bookmarklet to convert and copy the decimal values from your browser to the picker. No need to bullshit around, here&#8217;s the thing :-) Drag this onto your bookmark toolbar: RGB hex2dec Here&#8217;s the code for the curious souls out [...]]]></description>
				<content:encoded><![CDATA[<p>Many applications use the default Windows colour picker which unfortunately, doesn&#8217;t support hexa codes. Use this bookmarklet to convert and copy the decimal values from your browser to the picker. No need to bullshit around, here&#8217;s the thing :-)</p>
<p>Drag this onto your bookmark toolbar:<br />
<a href="javascript:(function(){    hexa=prompt('Enter a hexadecimal RGB code (# optional):');if (hexa.charAt(0)=='#') {hexa=hexa.substring(1,7);} var r=parseInt(hexa.substring(0,2), 16); var g=parseInt(hexa.substring(2,4), 16); var b=parseInt(hexa.substring(4,6), 16); prompt(hexa, r+' '+g+' '+b);  })();">RGB hex2dec</a><br />
<span id="more-331"></span><br />
Here&#8217;s the code for the curious souls out there. Nothing interesting. Just using built-in functionality of parseInt().</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; hexa = <span class="kw3">prompt</span><span class="br0">&#40;</span><span class="st0">&#8216;Enter a hexadecimal RGB code (# optional):&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>hexa.<span class="me1">charAt</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span> == <span class="st0">&#8216;#&#8217;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; hexa = hexa.<span class="me1">substring</span><span class="br0">&#40;</span><span class="nu0">1</span>,<span class="nu0">7</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">var</span> r = parseInt<span class="br0">&#40;</span>hexa.<span class="me1">substring</span><span class="br0">&#40;</span><span class="nu0">0</span>,<span class="nu0">2</span><span class="br0">&#41;</span>, <span class="nu0">16</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">var</span> g = parseInt<span class="br0">&#40;</span>hexa.<span class="me1">substring</span><span class="br0">&#40;</span><span class="nu0">2</span>,<span class="nu0">4</span><span class="br0">&#41;</span>, <span class="nu0">16</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">var</span> b = parseInt<span class="br0">&#40;</span>hexa.<span class="me1">substring</span><span class="br0">&#40;</span><span class="nu0">4</span>,<span class="nu0">6</span><span class="br0">&#41;</span>, <span class="nu0">16</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">prompt</span><span class="br0">&#40;</span>hexa, r + <span class="st0">&#8216; &#8216;</span> + g + <span class="st0">&#8216; &#8216;</span> + b<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<img src="http://feeds.feedburner.com/~r/YetAnotherBlogAboutPhpHtmlAndCss/~4/R5-MAcO8Mug" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.pepa.info/php-html-css/tools/converting-hexadecimal-rgb-code-to-decimal-with-a-bookmarklet/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.pepa.info/php-html-css/tools/converting-hexadecimal-rgb-code-to-decimal-with-a-bookmarklet/</feedburner:origLink></item>
		<item>
		<title>Using NCache to store image thumbnails</title>
		<link>http://feedproxy.google.com/~r/YetAnotherBlogAboutPhpHtmlAndCss/~3/r4iH6e89KnQ/</link>
		<comments>http://blog.pepa.info/php-html-css/nette/using-ncache-to-store-image-thumbnails/#comments</comments>
		<pubDate>Wed, 30 Nov 2011 09:33:19 +0000</pubDate>
		<dc:creator>Petr 'PePa' Pavel</dc:creator>
				<category><![CDATA[Nette]]></category>
		<category><![CDATA[Nette Framework 2.0-beta (revision 8a3182e released on 2011-10-11)]]></category>

		<guid isPermaLink="false">http://blog.pepa.info/?p=324</guid>
		<description><![CDATA[There are many ways to handle image thumbnails.  Sites with heavy traffic generate resized copies right after the original image is uploaded. Light traffic sites on the other hand, prefer to wait until the thumbnail is actually requested. Nette offers a few creative ways to handle this: You can use .htaccess to catch requests for [...]]]></description>
				<content:encoded><![CDATA[<p>There are many ways to handle image thumbnails.  Sites with heavy traffic generate resized copies right after the original image is uploaded. Light traffic sites on the other hand, prefer to wait until the thumbnail is actually requested. Nette offers a few creative ways to handle this:</p>
<ol>
<li>You can use .htaccess to catch requests for non-existent thumbnails and redirect them to your script.</li>
<li>Following the same theme, you can also use your ErrorPresenter to generate the thumbnail and override the response code (so that it&#8217;s not 404).</li>
<li>An unusual solution is to <a href="http://forum.nette.org/cs/8570-prace-s-obrazky-jejich-cachovani#p64241" target="_blank">use a helper</a> and generate the thumbnail when rendering your template.</li>
<li>Or simply use a presenter action.</li>
</ol>
<p>In any of these cases, you need to decide where you&#8217;re going to store the thumbnail and how you&#8217;re going to delete/update it when the main image changes. This is where you can use the excellent built-in caching aparatus.</p>
<p><span id="more-324"></span></p>
<p>To keep the demonstration simple, I&#8217;m going to use the simplest of the pack, a presenter action. This goes into your BasePresenter.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">function</span> sendResampled<span class="br0">&#40;</span><span class="re0">$model</span>, <span class="re0">$id</span>, <span class="re0">$attribute</span>, <span class="re0">$width</span>, <span class="re0">$height</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re0">$entity</span> = <span class="re0">$model</span>-&gt;<span class="me1">getById</span><span class="br0">&#40;</span><span class="re0">$id</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="co1">// a simple database query that returns a single row with the given id</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>!<span class="re0">$entity</span><span class="br0">&#91;</span><span class="st0">&#8216;id&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; throw <span class="kw2">new</span> NBadRequestException<span class="br0">&#40;</span><span class="st0">&quot;Entity no longer exists.&quot;</span>, <span class="nu0">404</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// the whole database record is gone</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re0">$fullFilePath</span> = <span class="re0">$model</span>-&gt;<span class="me1">getUploadedFile</span><span class="br0">&#40;</span><span class="re0">$id</span>, <span class="re0">$attribute</span>, <span class="re0">$entity</span><span class="br0">&#91;</span><span class="re0">$attribute</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="co1">// a custom model method that returns full path to the main image file</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$fullFilePath</span> === <span class="kw2">false</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; throw <span class="kw2">new</span> NBadRequestException<span class="br0">&#40;</span><span class="st0">&quot;This entity has no image.&quot;</span>, <span class="nu0">404</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="coMULTI">/*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp;* Now the interesting part: storing a thumbnail in NCache</span></div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">&nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re0">$configurator</span> = NEnvironment::<span class="me2">getConfigurator</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re0">$cache</span> = <span class="kw2">new</span> NCache<span class="br0">&#40;</span><span class="re0">$configurator</span>-&gt;<span class="me1">container</span>-&gt;<span class="me1">cacheStorage</span>, <span class="st0">&#8216;ResizedImages&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="co1">// ResizedImages is my own identificator &#8211; change to whatever you please</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="re0">$cache</span>-&gt;<span class="me1">clean</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="co1">// deletes all timed-out/orphaned thumbnails; this call can go into cron instead</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re0">$key</span> = <a href="http://www.php.net/get_class"><span class="kw3">get_class</span></a><span class="br0">&#40;</span><span class="re0">$model</span><span class="br0">&#41;</span>.<span class="st0">&quot;|$id|$attribute|${width}x${height}&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re0">$cachedImage</span> = <span class="re0">$cache</span>-&gt;<span class="me1">load</span><span class="br0">&#40;</span><span class="re0">$key</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$cachedImage</span> !== <span class="kw2">NULL</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$image</span> = NImage::<span class="me2">fromString</span><span class="br0">&#40;</span><span class="re0">$cachedImage</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="re0">$wwwDir</span> = NEnvironment::<span class="me2">getVariable</span><span class="br0">&#40;</span><span class="st0">&#8216;wwwDir&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$image</span> = NImage::<span class="me2">fromFile</span><span class="br0">&#40;</span><span class="re0">$wwwDir</span> . <span class="re0">$fullFilePath</span><span class="br0">&#41;</span>-&gt;<span class="me1">resize</span><span class="br0">&#40;</span><span class="re0">$width</span>, <span class="re0">$height</span>, NImage::<span class="me2">FILL</span><span class="br0">&#41;</span>-&gt;<span class="me1">crop</span><span class="br0">&#40;</span><span class="nu0">0</span>, <span class="nu0">0</span>, <span class="re0">$width</span>, <span class="re0">$height</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$cache</span>-&gt;<span class="me1">save</span><span class="br0">&#40;</span><span class="re0">$key</span>, <span class="re0">$image</span>-&gt;<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; NCache::<span class="me2">EXPIRE</span> =&gt; <span class="st0">&#8216;+ 2 months&#8217;</span>,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; NCache::<span class="me2">SLIDING</span> =&gt; <span class="kw2">TRUE</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; NCache::<span class="me2">FILES</span> =&gt; <span class="re0">$wwwDir</span> . <span class="re0">$fullFilePath</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="co1">// if the source file changes, clear its cached thumbnail</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; <a href="http://www.php.net/print"><span class="kw3">print</span></a> <span class="re0">$image</span>-&gt;<span class="me1">send</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re0">$this</span>-&gt;<span class="me1">terminate</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>This is how you then call it from your regular presenter:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> GalleryPhotoPresenter <span class="kw2">extends</span> BasePresenter <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">public</span> <span class="kw2">function</span> renderPhoto<span class="br0">&#40;</span><span class="re0">$id</span>, <span class="re0">$width</span> = <span class="kw2">null</span>, <span class="re0">$height</span> = <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">sendResampled</span><span class="br0">&#40;</span><span class="kw2">new</span> GalleryPhotoModel, <span class="re0">$id</span>, <span class="st0">&#8216;image_file_name&#8217;</span>, <span class="br0">&#40;</span><a href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span><span class="re0">$width</span><span class="br0">&#41;</span> ? <span class="re0">$width</span> : <span class="nu0">150</span><span class="br0">&#41;</span>, <span class="br0">&#40;</span><a href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span><span class="re0">$height</span><span class="br0">&#41;</span> ? <span class="re0">$height</span> : <span class="nu0">200</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<img src="http://feeds.feedburner.com/~r/YetAnotherBlogAboutPhpHtmlAndCss/~4/r4iH6e89KnQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.pepa.info/php-html-css/nette/using-ncache-to-store-image-thumbnails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.pepa.info/php-html-css/nette/using-ncache-to-store-image-thumbnails/</feedburner:origLink></item>
		<item>
		<title>n:src – the missing twin brother of n:href</title>
		<link>http://feedproxy.google.com/~r/YetAnotherBlogAboutPhpHtmlAndCss/~3/N2nSFH6dIM8/</link>
		<comments>http://blog.pepa.info/php-html-css/nette/nsrc-the-missing-twin-brother-of-nhref/#comments</comments>
		<pubDate>Wed, 23 Nov 2011 08:56:39 +0000</pubDate>
		<dc:creator>Petr 'PePa' Pavel</dc:creator>
				<category><![CDATA[Nette]]></category>
		<category><![CDATA[Nette Framework 2.0-beta (revision 8a3182e released on 2011-10-11)]]></category>

		<guid isPermaLink="false">http://blog.pepa.info/?p=317</guid>
		<description><![CDATA[As you have probably guessed by now, I love Nette. The more it hurts when I see the documentation lag behind the quality of the framework. Although I don&#8217;t understand why Latte built-in macros don&#8217;t include n:src when the oh-so-useful n:href is there my main concern however, is that nowhere in the documentation you&#8217;ll find [...]]]></description>
				<content:encoded><![CDATA[<p>As you have probably guessed by now, <a href="http://nette.org/">I love Nette</a>. The more it hurts when I see the documentation lag behind the quality of the framework. Although I don&#8217;t understand why Latte built-in macros don&#8217;t include n:src when the oh-so-useful n:href is there my main concern however, is that nowhere in the documentation you&#8217;ll find detailed information on how to add it yourself. You&#8217;re condemned to endlessly search through forum again and crawl through various outdated subdomains of nette.org.</p>
<p>Here&#8217;s my solution to the n:src alias based on <a href="http://wiki.nette.org/cs/cookbook/vlastni-makra" target="_blank">a post in the cookbook</a> and the <a href="http://api.nette.org/2.0prefixed/source-Latte.Macros.UIMacros.php.html#38" target="_blank">built-in n:href macro</a>. You can also take a peek an another post of mine on how to <a title="Tweaking your forms" href="http://blog.pepa.info/php-html-css/nette/tweaking-your-forms/">tweak your forms using macros</a>. As always, hopefully it&#8217;ll save you some time.</p>
<p><span id="more-317"></span>This goes into your BasePresenter:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">function</span> templatePrepareFilters<span class="br0">&#40;</span><span class="re0">$template</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re0">$latte</span> = <span class="kw2">new</span> NLatteFilter;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re0">$set</span> = <span class="kw2">new</span> NMacroSet<span class="br0">&#40;</span><span class="re0">$latte</span>-&gt;<span class="me1">parser</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re0">$set</span>-&gt;<span class="me1">addMacro</span><span class="br0">&#40;</span><span class="st0">&#8216;@src&#8217;</span>, <a href="http://www.php.net/create_function"><span class="kw3">create_function</span></a><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="st0">&#8216;NMacroNode $node, $writer&#8217;</span>, </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="st0">&#8216;extract(NCFix::$vars['</span>.NCFix::<span class="me2">uses</span><span class="br0">&#40;</span><a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">'me'</span>=&gt;new NUIMacros<span class="br0">&#40;</span><span class="re0">$latte</span>-&gt;<span class="me1">parser</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="st0">'], EXTR_REFS);</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; return <span class="es0">\&#8217;</span> ?&gt; src=&quot;&lt;?php <span class="es0">\&#8217;</span> . $me-&gt;macroLink($node, $writer) . <span class="es0">\&#8217;</span> ?&gt;&quot;&lt;?php <span class="es0">\&#8217;</span>;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="st0"> &nbsp; &nbsp;&#8217;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re0">$template</span>-&gt;<span class="me1">registerFilter</span><span class="br0">&#40;</span><span class="re0">$latte</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>Yes, the code does has a high wtf factor. Just look at the n:href macro, this isn&#8217;t my invention :-) I still don&#8217;t think I fully understand it but it does the trick and does so reusing the built-in macro as much as possible.</p>
<img src="http://feeds.feedburner.com/~r/YetAnotherBlogAboutPhpHtmlAndCss/~4/N2nSFH6dIM8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.pepa.info/php-html-css/nette/nsrc-the-missing-twin-brother-of-nhref/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.pepa.info/php-html-css/nette/nsrc-the-missing-twin-brother-of-nhref/</feedburner:origLink></item>
		<item>
		<title>Repeated forms on the same page</title>
		<link>http://feedproxy.google.com/~r/YetAnotherBlogAboutPhpHtmlAndCss/~3/NTIL1pfPTQA/</link>
		<comments>http://blog.pepa.info/php-html-css/nette/repeated-forms-on-the-same-page/#comments</comments>
		<pubDate>Tue, 22 Nov 2011 11:03:55 +0000</pubDate>
		<dc:creator>Petr 'PePa' Pavel</dc:creator>
				<category><![CDATA[Nette]]></category>
		<category><![CDATA[Nette Framework 2.0-beta (revision 8a3182e released on 2011-10-11)]]></category>

		<guid isPermaLink="false">http://blog.pepa.info/?p=312</guid>
		<description><![CDATA[Often you want the user to have a form not just for one entity but for all of them on the same page. A form for each product in the same category, for example. I&#8217;m not talking about multiple different forms but multiple instances of the same form. This topic has been discussed in the [...]]]></description>
				<content:encoded><![CDATA[<p>Often you want the user to have a form not just for one entity but for all of them on the same page. A form for each product in the same category, for example. I&#8217;m not talking about multiple different forms but multiple instances of the same form.</p>
<p>This topic has been discussed in the Nette forum so many times that it&#8217;s really a shame that it&#8217;s still missing in the documentation. Frustrated after an hour spent reading outdated forum posts, I offer here a complete solution based <a title="Beware! Written in Czech language :-)" href="http://forum.nette.org/cs/2888-20x-renderovani-stejneho-formu-komponenty-napr-vlozeni-produktu-do-kosiku#p34315" target="_blank">on one of the posts</a>.</p>
<p><span id="more-312"></span></p>
<p>Form definition goes into /app/forms/ProductForm.php</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> ProductForm <span class="kw2">extends</span> NAppForm <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">var</span> <span class="re0">$parent</span>; <span class="co1">// used in process()</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">public</span> <span class="kw2">function</span> __construct<span class="br0">&#40;</span><span class="re0">$parent</span> = <span class="kw2">null</span>, <span class="re0">$name</span> = <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; parent::__construct<span class="br0">&#40;</span><span class="re0">$parent</span>, <span class="re0">$name</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">parent</span> = <span class="re0">$parent</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">addText</span><span class="br0">&#40;</span><span class="st0">&#8216;title&#8217;</span>, <span class="st0">&#8216;Heading:&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&#8230;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">onSuccess</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = callback<span class="br0">&#40;</span><span class="re0">$this</span>, <span class="st0">&#8216;process&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">public</span> <span class="kw2">function</span> process<span class="br0">&#40;</span><span class="re0">$form</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$values</span> = <span class="re0">$form</span>-&gt;<span class="me1">getValues</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&#8230;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">parent</span>-&gt;<span class="me1">flashMessage</span><span class="br0">&#40;</span><span class="st0">&#8216;Product saved.&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">parent</span>-&gt;<span class="me1">redirect</span><span class="br0">&#40;</span>&#8230;<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Here&#8217;s how you use it in your presenter:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> ProductPresenter <span class="kw2">extends</span> NPresenter <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="co1">// this needs to go into action, not render</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">public</span> <span class="kw2">function</span> actionDefault<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="re0">$products</span> = &#8230;;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$products</span> <span class="kw1">as</span> <span class="re0">$product</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;_createProductForm<span class="br0">&#40;</span><span class="re0">$product</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">template</span>-&gt;<span class="me1">products</span> = <span class="re0">$products</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; protected <span class="kw2">function</span> _createProductForm<span class="br0">&#40;</span><span class="re0">$product</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="re0">$form</span> = <span class="kw2">new</span> ProductForm<span class="br0">&#40;</span><span class="re0">$this</span>, <span class="st0">&#8216;ProductForm_&#8217;</span>.<span class="re0">$product</span><span class="br0">&#91;</span><span class="st0">&#8216;id&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$form</span>-&gt;<span class="me1">setDefaults</span><span class="br0">&#40;</span><span class="re0">$product</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>And the final piece of the puzzle, your template:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">New product form:
</div>
</li>
<li class="li1">
<div class="de1">{form ProductForm}
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; {label title /} {input title, autofocus =&gt; TRUE}
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; {input save, value =&gt; &#8216;Create&#8217;}
</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &lt;br /&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; {input body}
</div>
</li>
<li class="li1">
<div class="de1">{/form}
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&lt;hr /&gt;
</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">Existing products:
</div>
</li>
<li class="li1">
<div class="de1">{foreach $products as $product}
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; {var formName = &#8216;ProductForm_&#8217; . $product['id']}
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; {form $formName}
</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; {label title /} {input title}
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; {input save}
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &lt;br /&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; {input body}
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; {/form}
</div>
</li>
<li class="li2">
<div class="de2">{/foreach}
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>As always, if it doesn&#8217;t work for you, check your Nette version and compare it with the tag below.</p>
<img src="http://feeds.feedburner.com/~r/YetAnotherBlogAboutPhpHtmlAndCss/~4/NTIL1pfPTQA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.pepa.info/php-html-css/nette/repeated-forms-on-the-same-page/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.pepa.info/php-html-css/nette/repeated-forms-on-the-same-page/</feedburner:origLink></item>
		<item>
		<title>Refreshing current user’s identity</title>
		<link>http://feedproxy.google.com/~r/YetAnotherBlogAboutPhpHtmlAndCss/~3/MfbVRzfdXPw/</link>
		<comments>http://blog.pepa.info/php-html-css/nette/refreshing-current-users-identity/#comments</comments>
		<pubDate>Wed, 09 Nov 2011 13:49:41 +0000</pubDate>
		<dc:creator>Petr 'PePa' Pavel</dc:creator>
				<category><![CDATA[Nette]]></category>
		<category><![CDATA[Nette Framework 2.0-beta (revision 8a3182e released on 2011-10-11)]]></category>

		<guid isPermaLink="false">http://blog.pepa.info/?p=298</guid>
		<description><![CDATA[Nette stores current user&#8217;s identity in session. There are a few situations when you want to reload the identity or change it completely. For example, the user updates his profile and you want the change reflected in the page header. Or a super administrator is allowed to re-authenticate as a different user without having to [...]]]></description>
				<content:encoded><![CDATA[<p>Nette stores current user&#8217;s identity in session. There are a few situations when you want to reload the identity or change it completely. For example, the user updates his profile and you want the change reflected in the page header. Or a super administrator is allowed to re-authenticate as a different user without having to know the other user&#8217;s password.</p>
<p>NUser has a convenient method called <a href="http://api.nette.org/2.0prefixed/source-Http.User.php.html#310" target="_blank">setIdentity()</a> but unfortunately, it&#8217;s declared as private so you can&#8217;t use it. The solution is either to loop through the current identity and update its fields one by one, or do it nice and clean with a custom authenticator. Let me show you.</p>
<p><span id="more-298"></span>Here&#8217;s the looping method. It just does the job.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$values</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">&#8216;id&#8217;</span> =&gt; <span class="nu0">123</span>, <span class="st0">&#8216;name&#8217;</span> =&gt; <span class="st0">&#8216;Joe Sixpack&#8217;</span>, <span class="st0">&#8216;role&#8217;</span> =&gt; <span class="st0">&#8216;administrator&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$currentIdentity</span> = <span class="re0">$this</span>-&gt;<span class="me1">parent</span>-&gt;<span class="me1">getUser</span><span class="br0">&#40;</span><span class="br0">&#41;</span>-&gt;<span class="me1">getIdentity</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2"><span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$values</span> <span class="kw1">as</span> <span class="re0">$attribute</span> =&gt; <span class="re0">$value</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re0">$currentIdentity</span>-&gt;<span class="re0">$attribute</span> = <span class="re0">$value</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>And here&#8217;s the custom authenticator. One for refreshing updated profile and another one for swapping identities.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> DummyAuthenticator implements IAuthenticator <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">public</span> <span class="kw2">function</span> authenticate<span class="br0">&#40;</span><a href="http://www.php.net/array"><span class="kw3">array</span></a> <span class="re0">$credentials</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <a href="http://www.php.net/list"><span class="kw3">list</span></a><span class="br0">&#40;</span><span class="re0">$values</span><span class="br0">&#41;</span> = <span class="re0">$credentials</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">new</span> NIdentity<span class="br0">&#40;</span><span class="re0">$values</span><span class="br0">&#91;</span><span class="st0">&#8216;id&#8217;</span><span class="br0">&#93;</span>, <span class="kw2">null</span>, <span class="re0">$values</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// in presenter</span></div>
</li>
<li class="li2">
<div class="de2"><span class="re0">$user</span> = <span class="re0">$this</span>-&gt;<span class="me1">getUser</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$newValues</span> = UserModel::<span class="me2">getById</span><span class="br0">&#40;</span><span class="re0">$user</span>-&gt;<span class="me1">getIdentity</span><span class="br0">&#40;</span><span class="br0">&#41;</span>-&gt;<span class="me1">id</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$user</span>-&gt;<span class="me1">setAuthenticator</span><span class="br0">&#40;</span><span class="kw2">new</span> DummyAuthenticator<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$user</span>-&gt;<span class="me1">login</span><span class="br0">&#40;</span><span class="re0">$newValues</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>In this example, the authenticator actually does some job &#8211; it verifies that the current user is allowed to change his identity. It&#8217;s in fact authorization, not authentication, but that&#8217;s not the point here.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> ReAuthenticator implements IAuthenticator <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">public</span> <span class="kw2">function</span> authenticate<span class="br0">&#40;</span><a href="http://www.php.net/array"><span class="kw3">array</span></a> <span class="re0">$credentials</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <a href="http://www.php.net/list"><span class="kw3">list</span></a><span class="br0">&#40;</span><span class="re0">$currentIdentity</span>, <span class="re0">$newUserId</span><span class="br0">&#41;</span> = <span class="re0">$credentials</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="re0">$newUser</span> = UserModel::<span class="me2">getById</span><span class="br0">&#40;</span><span class="re0">$newUserId</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="re0">$currentIdentity</span>-&gt;<span class="me1">role</span> == <span class="st0">&#8216;administrator&#8217;</span><span class="br0">&#41;</span> &amp;&amp; <a href="http://www.php.net/in_array"><span class="kw3">in_array</span></a><span class="br0">&#40;</span><span class="re0">$newUser</span><span class="br0">&#91;</span><span class="st0">&#8216;role&#8217;</span><span class="br0">&#93;</span>, <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">&#8216;consultant&#8217;</span>, <span class="st0">&#8216;manager&#8217;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">new</span> NIdentity<span class="br0">&#40;</span><span class="re0">$newUser</span><span class="br0">&#91;</span><span class="st0">&#8216;id&#8217;</span><span class="br0">&#93;</span>, <span class="kw2">null</span>, <span class="re0">$newUser</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="re0">$currentIdentity</span>-&gt;<span class="me1">role</span> == <span class="st0">&#8216;consultant&#8217;</span><span class="br0">&#41;</span> &amp;&amp; <span class="br0">&#40;</span><span class="re0">$newUser</span><span class="br0">&#91;</span><span class="st0">&#8216;role&#8217;</span><span class="br0">&#93;</span> == <span class="st0">&#8216;manager&#8217;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">new</span> NIdentity<span class="br0">&#40;</span><span class="re0">$newUser</span><span class="br0">&#91;</span><span class="st0">&#8216;id&#8217;</span><span class="br0">&#93;</span>, <span class="kw2">null</span>, <span class="re0">$newUser</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; throw <span class="kw2">new</span> NAuthenticationException<span class="br0">&#40;</span><span class="st0">&quot;Insufficient permissions.&quot;</span>, self::<span class="me2">NOT_APPROVED</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// in presenter</span></div>
</li>
<li class="li1">
<div class="de1">try <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="re0">$user</span> = <span class="re0">$this</span>-&gt;<span class="me1">getUser</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re0">$user</span>-&gt;<span class="me1">setAuthenticator</span><span class="br0">&#40;</span><span class="kw2">new</span> ReAuthenticator<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re0">$user</span>-&gt;<span class="me1">login</span><span class="br0">&#40;</span><span class="re0">$user</span>-&gt;<span class="me1">getIdentity</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="nu0">1234</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span> catch <span class="br0">&#40;</span>NAuthenticationException <span class="re0">$e</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &#8230;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<img src="http://feeds.feedburner.com/~r/YetAnotherBlogAboutPhpHtmlAndCss/~4/MfbVRzfdXPw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.pepa.info/php-html-css/nette/refreshing-current-users-identity/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.pepa.info/php-html-css/nette/refreshing-current-users-identity/</feedburner:origLink></item>
		<item>
		<title>Testing for unique value during form validation</title>
		<link>http://feedproxy.google.com/~r/YetAnotherBlogAboutPhpHtmlAndCss/~3/xlaEdz8v07o/</link>
		<comments>http://blog.pepa.info/php-html-css/nette/testing-for-unique-value-during-form-validation/#comments</comments>
		<pubDate>Mon, 07 Nov 2011 19:07:52 +0000</pubDate>
		<dc:creator>Petr 'PePa' Pavel</dc:creator>
				<category><![CDATA[Nette]]></category>
		<category><![CDATA[Nette Framework 2.0-beta (revision 8a3182e released on 2011-10-11)]]></category>

		<guid isPermaLink="false">http://blog.pepa.info/?p=292</guid>
		<description><![CDATA[Let&#8217;s talk about what happens when a user signs up for a new account. He fills in his nickname, e-mail address and password and clicks Register. When validating the e-mail address you need to check for at least three things: the user provided one the syntax is all right &#8211; the e-mail is formally valid [...]]]></description>
				<content:encoded><![CDATA[<p>Let&#8217;s talk about what happens when a user signs up for a new account. He fills in his nickname, e-mail address and password and clicks Register. When validating the e-mail address you need to check for at least three things:</p>
<ol>
<li>the user provided one</li>
<li>the syntax is all right &#8211; the e-mail is formally valid and can in fact exist (which doesn&#8217;t mean it really exists)</li>
<li>the address hasn&#8217;t been used yet for some other account</li>
</ol>
<p>So far not very difficult.</p>
<p>The tricky part comes when you allow the user to edit his profile. He can change any of the three values. When he submits the edit form the situation is one step more difficult than during registration. The e-mail address has in fact already been used &#8211; for the very user that is submitting the form. That is not the tricky part. The fun is how to get the user id when validating his e-mail address.</p>
<p><span id="more-292"></span><br />
Without further ado, here&#8217;s the code:<br />
(using <a href="http://www.notorm.com/">NotORM</a> initiated in BaseModel constructor)</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> UserPresenter <span class="kw2">extends</span> BasePresenter <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">function</span> createComponentAddEditForm<span class="br0">&#40;</span><span class="re0">$name</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &#8230;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="re0">$form</span>-&gt;<span class="me1">addText</span><span class="br0">&#40;</span><span class="st0">&#8216;email&#8217;</span>, <span class="st0">&#8216;E-mail:&#8217;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; -&gt;<span class="me1">setRequired</span><span class="br0">&#40;</span><span class="st0">&#8216;Please provide your e-mail address.&#8217;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; -&gt;<span class="me1">addRule</span><span class="br0">&#40;</span>NFORM::<span class="me2">EMAIL</span>, <span class="st0">&quot;Sorry, this doesn&#8217;t seem to be a valid e-mail address.&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; -&gt;<span class="me1">addRule</span><span class="br0">&#40;</span><span class="st0">&#8216;BaseModel::uniqueEmail&#8217;</span>, <span class="st0">&#8216;This e-mail is already registered.&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="re0">$form</span>-&gt;<span class="me1">addHidden</span><span class="br0">&#40;</span><span class="st0">&#8216;id&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &#8230;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">abstract <span class="kw2">class</span> BaseModel <span class="kw2">extends</span> NObject <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <a href="http://www.php.net/static"><span class="kw3">static</span></a> <span class="kw2">function</span> uniqueEmail<span class="br0">&#40;</span>NTextBase <span class="re0">$control</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$email</span> = <span class="re0">$control</span>-&gt;<span class="me1">getValue</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$values</span> = <span class="re0">$control</span>-&gt;<span class="me1">getParent</span><span class="br0">&#40;</span><span class="br0">&#41;</span>-&gt;<span class="me1">getValues</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$me</span> = <span class="kw2">new</span> self;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$queryBase</span> = <span class="re0">$me</span>-&gt;<span class="me1">db</span>-&gt;<span class="me1">users</span>-&gt;<span class="me1">where</span><span class="br0">&#40;</span><span class="st0">&#8216;email&#8217;</span>, <span class="re0">$email</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// Test for any record with given e-mail address </span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">&#40;</span><span class="re0">$values</span><span class="br0">&#91;</span><span class="st0">&#8216;id&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span><span class="re0">$queryBase</span>-&gt;<span class="me1">count</span><span class="br0">&#40;</span><span class="st0">&quot;*&quot;</span><span class="br0">&#41;</span> == <span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// Test for any record with given address &#8211; that isn&#8217;t this record</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span><span class="re0">$queryBase</span>-&gt;<span class="me1">where</span><span class="br0">&#40;</span><span class="st0">&#8216;NOT id&#8217;</span>, <span class="re0">$values</span><span class="br0">&#91;</span><span class="st0">&#8216;id&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>-&gt;<span class="me1">count</span><span class="br0">&#40;</span><span class="st0">&quot;*&quot;</span><span class="br0">&#41;</span> == <span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<img src="http://feeds.feedburner.com/~r/YetAnotherBlogAboutPhpHtmlAndCss/~4/xlaEdz8v07o" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.pepa.info/php-html-css/nette/testing-for-unique-value-during-form-validation/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.pepa.info/php-html-css/nette/testing-for-unique-value-during-form-validation/</feedburner:origLink></item>
		<item>
		<title>Tweaking your forms</title>
		<link>http://feedproxy.google.com/~r/YetAnotherBlogAboutPhpHtmlAndCss/~3/if5puhnRpx4/</link>
		<comments>http://blog.pepa.info/php-html-css/nette/tweaking-your-forms/#comments</comments>
		<pubDate>Fri, 09 Sep 2011 13:55:39 +0000</pubDate>
		<dc:creator>Petr 'PePa' Pavel</dc:creator>
				<category><![CDATA[Nette]]></category>
		<category><![CDATA[Nette Framework 2.0-beta (revision f38d86f released on 2011-08-24)]]></category>

		<guid isPermaLink="false">http://blog.pepa.info/?p=243</guid>
		<description><![CDATA[Nette forms documentation lacks information about enhancing your forms while still using the default renderer. I offer here a list of solutions for the most common needs, using getControlPrototype(), getLabelPrototype(), getSeparatorPrototype() and setOption(). The code goes into your form factory method in the presenter. Using the default renderer means you can&#8217;t tweak the look in [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://doc.nette.org/en/forms">Nette forms documentation</a> lacks information about enhancing your forms while still using the default renderer. I offer here a list of solutions for the most common needs, using getControlPrototype(), getLabelPrototype(), getSeparatorPrototype() and setOption().<br />
<span id="more-243"></span><br />
The code goes into your form factory method in the presenter. Using the default renderer means you can&#8217;t tweak the look in your template, you have to do it when you define the form.</p>
<h3>Formatting</h3>
<p>Very often it&#8217;s needed to add a css style or class to a field or its label. You can modify other elements too though. For instance, you can automatically place user&#8217;s text cursor into a particular field after the page loads.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">$form</span>-&gt;<span class="me1">addText</span><span class="br0">&#40;</span><span class="st0">&#8216;subject&#8217;</span>, <span class="st0">&#8216;Subject:&#8217;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; -&gt;<span class="me1">getControlPrototype</span><span class="br0">&#40;</span><span class="br0">&#41;</span>-&gt;<span class="me1">class</span><span class="br0">&#40;</span><span class="st0">&#8216;wideField&#8217;</span><span class="br0">&#41;</span>-&gt;<span class="me1">autofocus</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$form</span>-&gt;<span class="me1">addTextArea</span><span class="br0">&#40;</span><span class="st0">&#8216;terms&#8217;</span>, <span class="st0">&#8216;Terms and Conditions:&#8217;</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; -&gt;<span class="me1">getLabelPrototype</span><span class="br0">&#40;</span><span class="br0">&#41;</span>-&gt;<span class="me1">style</span><span class="br0">&#40;</span><span class="st0">&#8216;white-space: nowrap;&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<h3>Radio buttons on a single line</h3>
<p>Default renderer will place each radio button/label pair on a new line. What happens in terms of Nette is that it uses a line break as a separator. Here&#8217;s how to remove (or replace) the separator.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">$options</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">&#8216;one&#8217;</span> =&gt; <span class="st0">&quot;One&quot;</span>, <span class="st0">&#8216;two&#8217;</span> =&gt; <span class="st0">&quot;Two&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$form</span>-&gt;<span class="me1">addRadioList</span><span class="br0">&#40;</span><span class="st0">&#8216;type&#8217;</span>, <span class="st0">&#8216;Type:&#8217;</span>, <span class="re0">$options</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; -&gt;<span class="me1">getSeparatorPrototype</span><span class="br0">&#40;</span><span class="br0">&#41;</span>-&gt;<span class="me1">setName</span><span class="br0">&#40;</span><span class="kw2">NULL</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<h3>Read-only</h3>
<p>Make a form field (or a set of form fields) read-only &#8211; aka disabled. This field&#8217;s value will then not appear among $form->getValues().</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$form</span><span class="br0">&#91;</span><span class="st0">&#8216;type&#8217;</span><span class="br0">&#93;</span>-&gt;<span class="me1">setDisabled</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<h3>Description</h3>
<p>Piece of text or html element printed after the form field.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">$form</span>-&gt;<span class="me1">addText</span><span class="br0">&#40;</span><span class="st0">&#8216;password&#8217;</span>, <span class="st0">&#8216;Password:&#8217;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; -&gt;<span class="me1">setOption</span><span class="br0">&#40;</span><span class="st0">&#8216;description&#8217;</span>, <span class="st0">&quot;Leave empty if you don&#8217;t want to change.&quot;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Will be rendered as</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&lt;td&gt;&lt;input type=&quot;text&quot; &#8230; /&gt; &lt;small&gt;Leave empty&#8230;&lt;/small&gt;&lt;/td&gt;</div>
</li>
</ol>
</div>
<p>What if you want the description to start on a new line? Or be something else than a plain text?</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">$form</span>-&gt;<span class="me1">addText</span><span class="br0">&#40;</span><span class="st0">&#8216;password&#8217;</span>, <span class="st0">&#8216;Password:&#8217;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; -&gt;<span class="me1">setOption</span><span class="br0">&#40;</span><span class="st0">&#8216;description&#8217;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; NHtml::<span class="me2">el</span><span class="br0">&#40;</span><span class="st0">&#8216;div&#8217;</span><span class="br0">&#41;</span>-&gt;<span class="me1">setHtml</span><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; NHtml::<span class="me2">el</span><span class="br0">&#40;</span><span class="st0">&#8216;small&#8217;</span><span class="br0">&#41;</span>-&gt;<span class="me1">setText</span><span class="br0">&#40;</span><span class="st0">&quot;Leave empty if you don&#8217;t want to change.&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<h3>Printing a description with form macros</h3>
<p>When rendering your forms semi-manually with macros {form}, {label} and {input} you may also need to print the description. Nette doesn&#8217;t ship with any handy macro for that purpose but you can create your own. Best place would be your BasePresenter:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"> &nbsp;<span class="kw2">public</span> <span class="kw2">function</span> templatePrepareFilters<span class="br0">&#40;</span><span class="re0">$template</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$latte</span> = <span class="kw2">new</span> NLatteFilter;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$set</span> = <span class="kw2">new</span> NMacroSet<span class="br0">&#40;</span><span class="re0">$latte</span>-&gt;<span class="me1">parser</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="re0">$set</span>-&gt;<span class="me1">addMacro</span><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="st0">&#8216;description&#8217;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="st0">&#8216;$__desc = $form[%node.word]-&gt;getOption(&quot;description&quot;); echo %escape($__desc);&#8217;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="re0">$template</span>-&gt;<span class="me1">registerFilter</span><span class="br0">&#40;</span><span class="re0">$latte</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Additional information on <a href="http://doc.nette.org/en/templating#toc-user-defined-macros">defining your own Latte macros</a>. Don&#8217;t expect much though, it&#8217;s pretty brief.</p>
<h3>Other things you can set with setOption()</h3>
<p>(taken from API for <a href="http://api.nette.org/2.0/source-Forms.ControlGroup.php.html#76">Nette\Forms\ControlGroup</a>)</p>
<dl>
<dt>label</dt>
<dd>String or Html object &#8211; Setting this option only makes sense for a group where it replaces a label defined previously with addGroup()</dd>
<dt>container</dt>
<dd>Html object &#8211; Again, only makes for a group. Good for wrapping it with a DIV for example.</dd>
<dt>description</dt>
<dd>String or Html object &#8211; Displayed after the form field, inside of a fieldset when talking about a group. Doesn&#8217;t work for buttons (addSubmit/addButton)</dd>
<dt>visual</dt>
<dd>Wraps a group with a fieldset when true.</dd>
<dt>embedNext</dt>
<dd>Understands the next group as a child when true, or as a sibling if false (default).</dd>
</dl>
<p>(<a href="http://api.nette.org/2.0/source-Forms.Rendering.DefaultFormRenderer.php.html">Nette\Forms\Rendering\DefaultFormRenderer</a>)</p>
<dl>
<dt>class</dt>
<dd>css class</dd>
<dt>id</dt>
<dd>id attribute</dd>
</dl>
<img src="http://feeds.feedburner.com/~r/YetAnotherBlogAboutPhpHtmlAndCss/~4/if5puhnRpx4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.pepa.info/php-html-css/nette/tweaking-your-forms/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.pepa.info/php-html-css/nette/tweaking-your-forms/</feedburner:origLink></item>
	</channel>
</rss>
