1

Temat: Jak przenieść zmienną do layout'u

witam,

jak przenieść zmienną do layoutu, ale nie do konkretnego widoku, tylko do plikow z fodleru layouts.

Mam kontoler products i w nim funkcje index- czyli strona glowna, ale jak przenieść zmienną stamtad do plikow z layoutu.

Przepraszam, za chaotyczny opis, ale mam nadzieje, ze zrozumiecie.

Z gory dzieki.

pozdr.

2

Odp: Jak przenieść zmienną do layout'u

w kontrolerze wystarczy chyba najprostrze:
$this>set('dupay', $this->Panienki->findAll());

i w layoucie:
echo $dupy;

ale z tego co wiem nie powinno sie tam nic umieszczac tylko robic elementy i dopiero w nich zmienne ;/

3

Odp: Jak przenieść zmienną do layout'u

niestety nie dziala mi w ten sposob.
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'cie.

Ale moze powiem co chce zrobic.
Chce zrobic licznik odwiedzin i mecze sie z tym juz 3 dzien.
Poszukalem na necie behavior

<?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(&$Model, $settings = array())
    {
        $default = array('incrementFieldName' => array('views'));

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

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

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

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

    function beforeDelete(&$model)  {}

    function afterDelete(&$model)  {}

    function onError(&$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(&$model, $id, $incrementValue=1, $field=null)
    {
        $answer = false;
        
        if (empty($field))
        {
            $field = $this->__settings[$model->alias]['incrementFieldName'];
        }
        
        // Save the internal variables for the model
        $recursiveLevel = $model->recursive ;        
        $data = $model->data;
        
        $model->recursive = -1;
        
        $model->data = $model->findById((int)$id, array('id', $field));
        
        if (!empty($model->data))
        {
            $counter = (int)$model->data[$model->alias][$field] + (int)$incrementValue;
            
            $conditions = array($model->alias.'.id'=>$id);
            
            $fields = array($field=>$counter);
        
            // Issue updateAll as it won'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->updateAll($fields, $conditions);
        }
        
        // restore the variables back to original
        $model->data = $data;
        $model->recursive = $recursiveLevel;
        
        return $answer;
    }
}
?>

Problem w tym ze nie bardzo wiem jak go uzywac.
Uzywam go tak

<?php
class ProductsController extends AppController {
   
    
    var $name = "Products";
    
    //var $components = array("Licznik");
    
    function index() {
    
    $this->Product->bind("Content");
    $this->Product->Content->doIncrement(1, 1, 'content'); 
      $licznik = $this->Product->Content->find('all',array("conditions"=>array("id"=>"1")));

    $this->set('licznik',$licznik[0]['Content']['content']);
    
    
    $this->layout = "produkty";


    
    
    }    
    

    
    
    

    
}
?>

Content to model od tabeli z licznikiem oraz konfiguracja.
Robiac w ten sposob dostep do licznika mam tylko w widoku index kontrolera products. na innych podstronach go nie ma

pozdr.

4

Odp: Jak przenieść zmienną do layout'u

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.

5

Odp: Jak przenieść zmienną do layout'u

nie umiem tego zrobic.
jak odwolac sie w app_controller.php do modelu "Content" bo tam trzymam m.in. licznik?

z gory dzieki za pomoc

6

Odp: Jak przenieść zmienną do layout'u

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

var $uses = array('Content',.....inne modele....)

a pozniej w funkcji beforeRender() tworzysz zapytanie do modelu Content. Najlepiej (trzymajac sie zasady MVC) zapytanie przerzucic do modelu Content
a wiec, robisz np tak

// app_controller.php
function beforeRender() {
  $this->set('licznik', $this->Content->_getLicznik(...zmienne jakie potrzebujesz..));
  // od tego momentu w layoucie bedziesz mial dostepna zmienna 'licznik'...
}
// models/content.php
function _getLicznik(..zmienne..) {

  // cialo funckji - wyciagniecie danych z tabeli contents
  $licznik = $this->find(....)
  return $licznik; 
}

mam nadzieje ze to Ci pomoze
pozdrawiam

7

Odp: Jak przenieść zmienną do layout'u

juby, działa!!!!!

wielkie dzięki smile

pozdr.

8

Odp: Jak przenieść zmienną do layout'u

jeszcze jedna rzecz przyszla mi na mysl aby to zoptymalizowac...skoro potrzebuejsz tego na kazdej podstronie, moze zmienna $licznik wrzucisz sobie  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

// app_controller.php
function beforeRender() {
  // sprawdz czy 'licznik' jest juz w bazie
  if(!$this->Session->check('licznik')) {
    $licznik = $this->Content->_getLicznik(...zmienne jakie potrzebujesz..);
    $this->Session->write('licznik', $licznik);
  }
}

od tego momentu masz zmienna licznik w sessji. Aby odwolac sie do tej zmiennej w kontrolerze wystarczy

//dodowlny kontroler
$licznik = $this->Session->read('licznik');

a w widokach poprzez

  //dowolny widok, layout, element..
  echo $session->read('licznik');

tym sposobem oszczedzaj tyle zapytan do bazy danych ile razy odswierzysz strone lub zmienisz widok ;-)