<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Forum CakePHP.org.pl - Jak przenieść zmienną do layout'u]]></title>
	<link rel="self" href="http://forum.cakephp.org.pl/feed/atom/topic/42/"/>
	<updated>2009-02-17T12:29:27Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.cakephp.org.pl/topic/42/jak-przeniesc-zmienna-do-layoutu/</id>
		<entry>
			<title type="html"><![CDATA[Odp: Jak przenieść zmienną do layout'u]]></title>
			<link rel="alternate" href="http://forum.cakephp.org.pl/post/186/#p186"/>
			<content type="html"><![CDATA[<p>jeszcze jedna rzecz przyszla mi na mysl aby to zoptymalizowac...skoro potrzebuejsz tego na kazdej podstronie, moze zmienna $licznik wrzucisz sobie&nbsp; raz do sesji, pozniej za kazdym razem bedziesz sprawdzal sobie czy taka zmienna w sessji istnieje, jezeli tak nie musisz znowy odpytywac bazy danych za kazdym odswierzeniem, zmiana strony..czyli<br /></p><div class="codebox"><pre><code>// app_controller.php
function beforeRender() {
  // sprawdz czy &#039;licznik&#039; jest juz w bazie
  if(!$this-&gt;Session-&gt;check(&#039;licznik&#039;)) {
    $licznik = $this-&gt;Content-&gt;_getLicznik(...zmienne jakie potrzebujesz..);
    $this-&gt;Session-&gt;write(&#039;licznik&#039;, $licznik);
  }
}</code></pre></div><p>od tego momentu masz zmienna licznik w sessji. Aby odwolac sie do tej zmiennej w kontrolerze wystarczy <br /></p><div class="codebox"><pre><code>//dodowlny kontroler
$licznik = $this-&gt;Session-&gt;read(&#039;licznik&#039;);</code></pre></div><p>a w widokach poprzez<br /></p><div class="codebox"><pre><code>  //dowolny widok, layout, element..
  echo $session-&gt;read(&#039;licznik&#039;);</code></pre></div><p>tym sposobem oszczedzaj tyle zapytan do bazy danych ile razy odswierzysz strone lub zmienisz widok ;-)</p>]]></content>
			<author>
				<name><![CDATA[juby]]></name>
				<uri>http://forum.cakephp.org.pl/user/20/</uri>
			</author>
			<updated>2009-02-17T12:29:27Z</updated>
			<id>http://forum.cakephp.org.pl/post/186/#p186</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Jak przenieść zmienną do layout'u]]></title>
			<link rel="alternate" href="http://forum.cakephp.org.pl/post/178/#p178"/>
			<content type="html"><![CDATA[<p>juby, działa!!!!!</p><p>wielkie dzięki <img src="http://forum.cakephp.org.pl/img/smilies/smile.png" width="15" height="15" alt="smile" /></p><p>pozdr.</p>]]></content>
			<author>
				<name><![CDATA[gaw]]></name>
				<uri>http://forum.cakephp.org.pl/user/95/</uri>
			</author>
			<updated>2009-02-15T11:41:43Z</updated>
			<id>http://forum.cakephp.org.pl/post/178/#p178</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Jak przenieść zmienną do layout'u]]></title>
			<link rel="alternate" href="http://forum.cakephp.org.pl/post/177/#p177"/>
			<content type="html"><![CDATA[<p>aby odwlolac sie do modelu Content w app_controlerze, na poczatku deklarujesz ze w app_controlerze bedziesz chcial korzystac z modfelu Content, a wiec piszesz <br /></p><div class="codebox"><pre><code>var $uses = array(&#039;Content&#039;,.....inne modele....)</code></pre></div><p>a pozniej w funkcji beforeRender() tworzysz zapytanie do modelu Content. Najlepiej (trzymajac sie zasady MVC) zapytanie przerzucic do modelu Content<br />a wiec, robisz np tak <br /></p><div class="codebox"><pre><code>// app_controller.php
function beforeRender() {
  $this-&gt;set(&#039;licznik&#039;, $this-&gt;Content-&gt;_getLicznik(...zmienne jakie potrzebujesz..));
  // od tego momentu w layoucie bedziesz mial dostepna zmienna &#039;licznik&#039;...
}</code></pre></div><div class="codebox"><pre><code>// models/content.php
function _getLicznik(..zmienne..) {

  // cialo funckji - wyciagniecie danych z tabeli contents
  $licznik = $this-&gt;find(....)
  return $licznik; 
}</code></pre></div><p>mam nadzieje ze to Ci pomoze<br />pozdrawiam</p>]]></content>
			<author>
				<name><![CDATA[juby]]></name>
				<uri>http://forum.cakephp.org.pl/user/20/</uri>
			</author>
			<updated>2009-02-15T10:59:48Z</updated>
			<id>http://forum.cakephp.org.pl/post/177/#p177</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Jak przenieść zmienną do layout'u]]></title>
			<link rel="alternate" href="http://forum.cakephp.org.pl/post/174/#p174"/>
			<content type="html"><![CDATA[<p>nie umiem tego zrobic.<br />jak odwolac sie w app_controller.php do modelu &quot;Content&quot; bo tam trzymam m.in. licznik?</p><p>z gory dzieki za pomoc</p>]]></content>
			<author>
				<name><![CDATA[gaw]]></name>
				<uri>http://forum.cakephp.org.pl/user/95/</uri>
			</author>
			<updated>2009-02-14T12:52:25Z</updated>
			<id>http://forum.cakephp.org.pl/post/174/#p174</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Jak przenieść zmienną do layout'u]]></title>
			<link rel="alternate" href="http://forum.cakephp.org.pl/post/172/#p172"/>
			<content type="html"><![CDATA[<p>jezeli chcesz miec dostep od zmiennych na kazdej podstronie renederowanej przerzuc funkcje do app_controllera.php , do funkcji beforeRender(). Zmienna bedzie widoczna wszedie: w layocie jak i w widoku.</p>]]></content>
			<author>
				<name><![CDATA[juby]]></name>
				<uri>http://forum.cakephp.org.pl/user/20/</uri>
			</author>
			<updated>2009-02-14T12:48:38Z</updated>
			<id>http://forum.cakephp.org.pl/post/172/#p172</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Jak przenieść zmienną do layout'u]]></title>
			<link rel="alternate" href="http://forum.cakephp.org.pl/post/168/#p168"/>
			<content type="html"><![CDATA[<p>niestety nie dziala mi w ten sposob.<br />obchodze to tak, ze robie tak jak mowisz w akcji kontrolera, nastepnie w widoku deklaruje drugi raz w ten sam sposob a potem juz odczytuje w layout&#039;cie.</p><p>Ale moze powiem co chce zrobic.<br />Chce zrobic licznik odwiedzin i mecze sie z tym juz 3 dzien.<br />Poszukalem na necie behavior<br /></p><div class="codebox"><pre><code>&lt;?php 
/**
 * Increment Behavior Class file
 * 
 * @author Ketan Patel
 * @license    http://www.opensource.org/licenses/mit-license.php The MIT License
 * @version 1
 *
 */

/**
 * Increment Behavior to allow incrementing a single field by given amount.
 *
 */
class IncrementBehavior extends ModelBehavior {

    var $__settings = array();
    
    /**
     * Initiate behavior for the model using specified settings. Available settings:
     *
     * - incrementFieldName: (string) The name of the field which needs to be incremented
     * 
     *
     * @param object $Model Model using the behaviour
     * @param array $settings Settings to override for model.
     * @access public
     */
    function setup(&amp;$Model, $settings = array())
    {
        $default = array(&#039;incrementFieldName&#039; =&gt; array(&#039;views&#039;));

        if (!isset($this-&gt;__settings[$Model-&gt;alias]))
        {
            $this-&gt;__settings[$Model-&gt;alias] = $default;
        }

        $this-&gt;__settings[$Model-&gt;alias] = am($this-&gt;__settings[$Model-&gt;alias], ife(is_array($settings), $settings, array()));
    }
    
    function beforeFind(&amp;$model, $query) {}

    function afterFind(&amp;$model, $results, $primary)  {}
    
    function beforeSave(&amp;$model)  {}

    function afterSave(&amp;$model, $created) {}

    function beforeDelete(&amp;$model)  {}

    function afterDelete(&amp;$model)  {}

    function onError(&amp;$model, $error)  {}
    
    //Custom Method for a Behavior
    /**
     * doIncrement method will allow user to increment
     * a given field by calling this function from its model.
     *
     * @param ModelObject $model
     * @param integer $id - Record Id for which the $field is to be incremented
     * @param integer (optional) $incrementValue, default is 1
     * @param string $field (optional) - If not supplied then field name which was provided 
     *                                      during initialization is used, otherwise
     *                                      it is overwritten with the supplied argument.
     * @return boolean
     */
    function doIncrement(&amp;$model, $id, $incrementValue=1, $field=null)
    {
        $answer = false;
        
        if (empty($field))
        {
            $field = $this-&gt;__settings[$model-&gt;alias][&#039;incrementFieldName&#039;];
        }
        
        // Save the internal variables for the model
        $recursiveLevel = $model-&gt;recursive ;        
        $data = $model-&gt;data;
        
        $model-&gt;recursive = -1;
        
        $model-&gt;data = $model-&gt;findById((int)$id, array(&#039;id&#039;, $field));
        
        if (!empty($model-&gt;data))
        {
            $counter = (int)$model-&gt;data[$model-&gt;alias][$field] + (int)$incrementValue;
            
            $conditions = array($model-&gt;alias.&#039;.id&#039;=&gt;$id);
            
            $fields = array($field=&gt;$counter);
        
            // Issue updateAll as it won&#039;t call any other methods like beforeSave and such in the Model or the 
            // Behavior methods. Just a step for saving callbacks which are not required.    
            $answer = $model-&gt;updateAll($fields, $conditions);
        }
        
        // restore the variables back to original
        $model-&gt;data = $data;
        $model-&gt;recursive = $recursiveLevel;
        
        return $answer;
    }
}
?&gt;</code></pre></div><p>Problem w tym ze nie bardzo wiem jak go uzywac.<br />Uzywam go tak<br /></p><div class="codebox"><pre><code>&lt;?php
class ProductsController extends AppController {
   
    
    var $name = &quot;Products&quot;;
    
    //var $components = array(&quot;Licznik&quot;);
    
    function index() {
    
    $this-&gt;Product-&gt;bind(&quot;Content&quot;);
    $this-&gt;Product-&gt;Content-&gt;doIncrement(1, 1, &#039;content&#039;); 
      $licznik = $this-&gt;Product-&gt;Content-&gt;find(&#039;all&#039;,array(&quot;conditions&quot;=&gt;array(&quot;id&quot;=&gt;&quot;1&quot;)));

    $this-&gt;set(&#039;licznik&#039;,$licznik[0][&#039;Content&#039;][&#039;content&#039;]);
    
    
    $this-&gt;layout = &quot;produkty&quot;;


    
    
    }    
    

    
    
    

    
}
?&gt;</code></pre></div><p>Content to model od tabeli z licznikiem oraz konfiguracja.<br />Robiac w ten sposob dostep do licznika mam tylko w widoku index kontrolera products. na innych podstronach go nie ma</p><p>pozdr.</p>]]></content>
			<author>
				<name><![CDATA[gaw]]></name>
				<uri>http://forum.cakephp.org.pl/user/95/</uri>
			</author>
			<updated>2009-02-05T10:39:08Z</updated>
			<id>http://forum.cakephp.org.pl/post/168/#p168</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Jak przenieść zmienną do layout'u]]></title>
			<link rel="alternate" href="http://forum.cakephp.org.pl/post/167/#p167"/>
			<content type="html"><![CDATA[<p>w kontrolerze wystarczy chyba najprostrze:<br />$this&gt;set(&#039;dupay&#039;, $this-&gt;Panienki-&gt;findAll());</p><p>i w layoucie:<br />echo $dupy; </p><p>ale z tego co wiem nie powinno sie tam nic umieszczac tylko robic elementy i dopiero w nich zmienne ;/</p>]]></content>
			<author>
				<name><![CDATA[duke_piotr]]></name>
				<uri>http://forum.cakephp.org.pl/user/31/</uri>
			</author>
			<updated>2009-02-05T09:54:12Z</updated>
			<id>http://forum.cakephp.org.pl/post/167/#p167</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Jak przenieść zmienną do layout'u]]></title>
			<link rel="alternate" href="http://forum.cakephp.org.pl/post/166/#p166"/>
			<content type="html"><![CDATA[<p>witam,</p><p>jak przenieść zmienną do layoutu, ale nie do konkretnego widoku, tylko do plikow z fodleru layouts.</p><p>Mam kontoler products i w nim funkcje index- czyli strona glowna, ale jak przenieść zmienną stamtad do plikow z layoutu.</p><p>Przepraszam, za chaotyczny opis, ale mam nadzieje, ze zrozumiecie.</p><p>Z gory dzieki.</p><p>pozdr.</p>]]></content>
			<author>
				<name><![CDATA[gaw]]></name>
				<uri>http://forum.cakephp.org.pl/user/95/</uri>
			</author>
			<updated>2009-02-04T21:11:52Z</updated>
			<id>http://forum.cakephp.org.pl/post/166/#p166</id>
		</entry>
</feed>

