counterCache įrašų skaičiui saugoti

Imkime kaip pavyzdį užduočių valdymo (ToDo) aplikaciją ir norime sužinoti kiek kiekvienoje kategorijoje yra nebaigtų darbų.

  1. CREATE TABLE IF NOT EXISTS `task_categories` (
  2.   `id` int(10) unsigned NOT NULL auto_increment,
  3.   `item_count` int(10) unsigned NOT NULL,
  4.   `name` varchar(32) NOT NULL,
  5.   `created` datetime NOT NULL,
  6.   PRIMARY KEY  (`id`)
  7. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
  8.  
  9. CREATE TABLE IF NOT EXISTS `task_items` (
  10.   `id` int(10) unsigned NOT NULL auto_increment,
  11.   `task_category_id` int(10) unsigned NOT NULL,
  12.   `user_id` int(10) unsigned default NULL,
  13.   `name` varchar(128) NOT NULL,
  14.   `description` text NOT NULL,
  15.   `status` tinyint(3) unsigned NOT NULL,
  16.   `created` datetime NOT NULL,
  17.   PRIMARY KEY  (`id`),
  18.   KEY `task_category_id` (`task_category_id`,`user_id`)
  19. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Taigi, turime du modelius – TaskCategory ir TaskItem.:

  1. class TaskItem extends AppModel {
  2.  var $name = 'TaskItem';
  3.  
  4.  var $belongsTo = array(
  5.   'TaskCategory' => array(
  6.    'className' => 'TaskCategory',
  7.    'foreignKey' => 'task_category_id',
  8.                         'counterCache' => 'items_count',
  9.                         'counterScope' => 'status = 0'
  10.   )
  11.  );
  12. }
  1. class TaskCategory extends AppModel {
  2.  var $name = 'TaskCategory';
  3.  
  4.  var $hasMany = array(
  5.   'TaskItem' => array(
  6.    'className' => 'TaskItem',
  7.    'foreignKey' => 'task_category_id',
  8.    'dependent' => true,
  9.   )
  10.  );
  11. }

Šiuo atveju žiūrim į TaskItem modelyje ‘counterCache’ => ‘items_count’ ir ‘counterScope’ => ’status = 0′ nustatymus. Pirmasis nurodo lentelės lauką kur bus saugojamas įrašų kiekis, antrasis nurodo, jog skaičiuoti tik tuos, kada TaskItem.active lygus 0 (darbas neatliktas).
Viskas, nuo šiol nereiks atskirai skaičiuoti kiekvienos kategorijos neatliktų darbų kiekio papildomomis užklausomis bei funkcijomis. Tuo pačiu gauname optimizuotą sistemą.
ToDo kategorijos

MySQL procedūrų naudojimas CakePHP

Pačiam dar neteko naudoti, bet pastebėjau gerą įrašą ta tema. Pirmiausia duomenų bazės nustatymuose (config/database.php) nustatom tvarkyklę:

  1. 'driver' => 'mysqli'

Procedūra iškviečiama $this->query() pagalba:

  1. function findAd($site) {
  2.  $advert = $this->query('CALL display_ad("'.$site.'");');
  3.  return $advert;
  4. }

Toliau šią funkciją panaudojam kontroleryje:

  1. function show($site = null){
  2.  $advert = $this->Advert->findAd($site);
  3.  $this->set('advert', $advert[0]);
  4. }
Data 2009.04.03 Komentarai 0 Kategorija CakePHP Žymės ,

table td parametrų nustatymas per $html->tableCells()

Kartais formuojant rezultatų lentelę tenka stulpeliui nustatyti atskirą klasę, stilių. Tai galima padaryti tokiu būdu:

  1. $html->tableCells(array(
  2.      'Komentaras',
  3.      array('Viso', array('class' => 'itemscount'))
  4. ));

Nuo 1.2 versijos Ticket #2406

Data 2009.03.27 Komentarai 1 Kategorija CakePHP Žymės ,

CakePHP – lengvesnis formos laukų valdymas su $form->inputs()

Dirbant su CakePHP FormHelper jeigu forma turi daug laukų tampa varginantis darbas, o ir kodas tampa ne toks jau gražus.
Paimkim nedidelį pavyzdį:

  1. <?php
  2.  echo $form->create('Demo');
  3.  echo $form->input('Demo.id');
  4.  echo $form->input('Demo.name');
  5.  echo $form->input('Demo.lastname');
  6.  echo $form->input('Demo.phone');
  7.  echo $form->input('Demo.email');
  8.  echo $form->input('Demo.website');
  9.  echo $form->input('Demo.street');
  10.  echo $form->input('Demo.city');
  11.  echo $form->input('Demo.country');
  12.  echo $form->submit('Done');
  13. ?>

Priklausomai nuo šablono (jeigu forma išdėstyta nestandartiškai ar pan.), galima naudot ir:

  1. <?= $form->create('Demo'); ?>
  2. <?= $form->input('Demo.id'); ?>
  3. <?= $form->input('Demo.name'); ?>
  4. <?= $form->input('Demo.lastname'); ?>
  5. <?= $form->input('Demo.phone'); ?>
  6. <?= $form->input('Demo.email'); ?>
  7. <?= $form->input('Demo.website'); ?>
  8. <?= $form->input('Demo.street'); ?>
  9. <?= $form->input('Demo.city'); ?>
  10. <?= $form->input('Demo.country'); ?>
  11. <?= $form->submit('Done'); ?>

Tačiau jeigu šablonas +/- standartinis, užtenka tik CSS stiliaus formavimui, puikus sprendimas būtų naudoti $html->inputs() $form->inputs()

  1. <?php
  2.  echo $form->create('Demo');
  3.  echo $form->inputs(array(
  4.   'Demo.id',
  5.   'Demo.name' => array('label' => 'Vartotojas'),
  6.   'Demo.lastname',
  7.  
  8.   'Demo.country'
  9.  ));
  10.  echo $form->submit('Done');
  11. ?>

Plačiau FormHelper API

Data 2009.03.24 Komentarai 0 Kategorija CakePHP Žymės ,