March 27th, 2008 by prond
Znalazłem ostatnio bardzo nieprzyjemny bug w CakePHP 1.2 - po zdefiniowaniu relacji belogsTo i hasAndBelongsToMany (przyklad ponizej) dostajemy segmentation fault przy próbie wypieczenia kontrolera.
class Tag extends AppModel {
var $name = 'Tag';
var $useTable = 'tags';
var $validate = array(
'name' => array('required'),
'lft' => array('numeric'),
'rght' => array('numeric')
);
var $hasAndBelongsToMany = array (
'Entry' => array('className' => 'Entry',
'joinTable' => 'entries_tags',
'foreignKey' => 'tag_id',
'associationForeignKey' => 'entry_id',
'unique' => true,
)
);
var $belongsTo = array(
'Parent' => array ( 'className' => 'Tag',
'foreignKey' => 'parent_id',
'conditions' => '',
'fields' => '',
'order' => ''
)
);
var $actsAs = array('Tree');
}
Read the rest of this entry »
Posted in CakePHP | No Comments »
January 3rd, 2008 by prond
Ostatnio pokazała się krótka i zwięzła notka o tym jak stosować motywy w CakePHP 1.2 :
http://www.sanisoft.com/blog/2007/12/29/theming-your-cakephp-apps-v12/
Posted in CakePHP | No Comments »
December 28th, 2007 by prond
Prosty i prymitywny generator plikow .pot dla aplikacji napisanej w CakePHP.
Wystarczy odpalic ten skrypt z katalogu pod którym jest aplikacja.
for file in $(ls app/views); do
xgettext -L PHP --keyword=__:1 --keyword=__d:2 --keyword=__dc:2 --keyword=__n:1,2 --keyword=__dn:2,3 --keyword=__dcn:2,3 -p app/locale/ -o $file.pot app/controllers/${file}_controller.php app/views/$file/*.ctp
done
Posted in CakePHP | No Comments »
December 28th, 2007 by prond
Aplikacje wielojęzykowe przyspażają wielu problemów. Jednym z nich jest sortowanie wyników zapytania.
W MySQL mamy wiele opcji porównywania napisów. Ja najczęściej stosuję utf8_general_ci, ale przy tej opcji “ogonki” lądują na końcu zwracanych wyników (po znakach ASCII). Można jednak w zależości od wybranego języka używać innych COLLATION, np.:
SELECT *
FROM products
ORDER BY name COLLATE utf8_polish_ci
LIMIT 10;
Tutaj “ą” wystąpi przed “b” i tak dalej.
Jako, że najczęściej piszę aplikacje w CakePHP zrobiłem dla tego frameworka mały behavior, który ułatwia mi życie dostosowując COLLATION do aktualnie ustawionego języka.
Read the rest of this entry »
Posted in CakePHP | No Comments »
December 3rd, 2007 by prond
CakePHP 1.2 udostepnia deweloperom bardzo wygodny AuthComponent. Dołączenie go w aplikacji jest na prawdę szybkie i przyjemne. Wystarczy zerknąć na następujące dwa tutoriale :
Wszystko idzie gładko aż do momentu, w którym chcemy zbudować drzewo Acos.
Read the rest of this entry »
Posted in CakePHP | No Comments »
September 18th, 2007 by prond
Byłem ostatnio zmuszony do zbudowania w CakePHP aplikacji,
która miałaby pozwalać na masową edycję stron, produktów, etc.
Szperając na blogach i forach nie udało mi się jednak znaleźć rozwiązania,
które pozwalałoby jednocześnie korzystać ze wszystkich udogodnień CakePHP.
Po paru eksperymentach udało mi się zneleźć dość satysfakcjonujące rozwiązanie.
Przynajmniej nadal mogę korzystać z takich ‘automagicznych’ elementów jak
walidacja i helpera do formularzy.
Kontroler : controllers/pages_controller.php
function addMany($count = 2) {
for ($i=1;$i<=$count;$i++) {
$modelName = "Page{$i}";
$this->{$modelName} = & new Page;
$this->{$modelName}->useTable = "page";
$this->{$modelName}->name = $modelName;
ClassRegistry::addObject("Page{$i}",$this->{$modelName});
}
if (!empty($this->data)) {
for ($i=1;$i<=$count;$i++) {
$modelName = "Page{$i}";
$this->{$modelName}->create($this->data);
$this->{$modelName}->save();
}
}
$languages = $this->Page->Language->generateList();
$this->set('count',$count);
$this->set(compact('languages'));
}
Widok : views/pages/add_many.php
<div class="page">
<form action="" method="post">
<?php for ($i=1;$i<=$count;$i++) : ?>
<fieldset>
<legend><?php __('Add');?> <?php __('Page');?></legend>
<?php
echo $form->input("Page{$i}.language_id");
echo $form->input("Page{$i}.name");
echo $form->input("Page{$i}.urn");
echo $form->input("Page{$i}.description");
echo $form->input("Page{$i}.keywords");
echo $form->input("Page{$i}.published_from");
echo $form->input("Page{$i}.published_to");
echo $form->input("Page{$i}.published");
echo $form->input("Page{$i}.contents");
?>
</fieldset>
<?php endfor; ?>
<?php echo $form->end('Submit');?>
</div>
<div class="actions">
<ul>
<li><?php echo $html->link(__('List', true).' '.__('Pages', true), array('action'=>'index'));?></li>
<li><?php echo $html->link(__('List', true).' '.__('Languages', true), array('controller'=> 'languages', 'action'=>'index')); ?> </li>
<li><?php echo $html->link(__('New', true).' '.__('Language', true), array('controller'=> 'languages', 'action'=>'add')); ?> </li>
</ul>
</div>
Posted in CakePHP | 15 Comments »
August 23rd, 2007 by prond
Domyślnie ‘wypieczony’ w Cake 1.2 kod zapisujący model wygląda następująco:
function add() {
if (!empty($this->data)) {
$this->cleanUpFields();
$this->Page->create();
if ($this->Page->save($this->data)) {
$this->Session->setFlash('The Page has been saved');
$this->redirect(array('action'=>'index'), null, true);
} else {
$this->Session->setFlash('The Page could not be saved. Please, try again.');
}
}
}
Moim zdaniem brakuje w nim rozróżnienia sytuacji, w której pola są nie poprawne od błędu przy zapisie do bazy.
Read the rest of this entry »
Posted in CakePHP | No Comments »