piątek, 6 lutego 2009

A potem inni gadaja, że CakePHP to kicha

Jakoś mnie tak ruszyło strasznie :) Właśnie w niejakim serwisie www.switchonthecode.com ( pierwszy raz o nim słyszę, może jestem cofnięty ). Pojawiła się któraś już z kolei część tutoriala dotyczącego CakePHP. Jako, że generalnie zupełnie mnie ten tutorial nie interesuje postanowiłem jedynie przewinąć się przez całość, żeby zobaczyć co tam chłopaki klecą. No i się zaczęło. Mógłbym teraz zacząć się uzewnętrzniać ale ograniczę się do fragmentów kodu.
echo $html->tableHeaders(
array(
'Product ID',
'Product',
'Description',
'Price'
)
);

foreach($data as $product)
{
echo $html->tableCells(
array(
array(
$product['Product']['product_id'],
$product['Product']['product_name'],
$product['Product']['product_desc'],
$product['Product']['product_price']
)
)
);
}

Zacznę lajtowo bo to nie jest błąd ale moim zdaniem zupełnie zbyteczna rzecz. Tworzenie table za pomocą helperów. Czy naprawdę jest to tak kosmicznie potrzebne? Super, że CakePHP ma taki helper ( ma go pewnie dlatego, że inne frameworki też taki mają ). Ale po kiego grzyba go używać ? Podobnie jest z helperami do tworzenia linków:
echo $htm->link('gdzieś tam','/cos/tam'); 
- super ale
gdzieś tam // echo Router::url('/cos/tam');
ani nie jest dłuższe ani bardziej skomplikowane - jest za to szybsze! No i jeszcze można wymienić tworzenie obrazków, list, divów i całej reszty. Nie musisz, nie używaj!

echo $form->input('product_name');

Zawsze podawaj nazwę pola wraz z modelem, czyli Product.product_name ( pomijam fakt bezsensownej nazwy pola ). Przy formularzach dotyczących pojedyńczego modelu może wydawać się to bezsensowne ale jak pojawi się pole id i potem w zapytaniu wyciągane będzie pole id innego modelu to będzie płacz.

function add()
{
if(isset($this->data))
{
$this->Product->set($this->data);

if ($this->Product->validates())
{
if($this->Product->save())
$this->Session->setFlash('Data Saved Successfully!');

$this->redirect(array(
'controller' => 'products',
'action' => 'index'
)
);
}
}
}

Zacznijmy od
if(isset($this->data))
. Może się nie znam ale jak w klasie zdefiniowane jest
var $data = array();
to imho
isset($this->data);
wywali TRUE. Dalej przejdźmy do
$this->Product->set($this->data);
osobiście użyłbym metody create, no ale tak też działa. Dalej mamy totalną bzdurę
 if ($this->Product->validates())
. Jeżeli autor tutoriala raczyłby zajrzeć do API to pewnie nie sprawiłoby mu problemu przeczytanie dwu zdaniowego opisu metody save gdzie jest wyraźnie napisane
By default, validation occurs before save.

Nie ma więc najmniejszego sensu dodawanie tej linijki.

Naturalnie nie są to gigantyczne błędy ale uczą one nowych użytkowników złych zasad pisania kodu. Nie da się zrobić tak, żeby ktoś sam nie zagląda do API i book.cakephp.org napisał coś z czego można się czegoś nauczyć.

Dlatego jeszcze raz:

1 komentarze:

Anonimowy pisze...

1. echo $html->tableHeaders(
2. array(
3. 'Product ID',
4. 'Product',
5. 'Description',
6. 'Price'
7. )
8. );
9.
10. foreach($data as $product)
11. {
12. echo $html->tableCells(
13. array(
14. array(
15. $product['Product']['product_id'],
16. $product['Product']['product_name'],
17. $product['Product']['product_desc'],
18. $product['Product']['product_price']
19. )
20. )
21. );
22. }

Bardziej przejrzyste i odporne na błędy w html. Na pierwszy rzut oka widać jakie dane wyświetlam, i jakie są nagłówki (nie muszę "filtrować" w głowie tony kodu HTML żeby je znaleźć)

echo $htm->link('gdzieś tam','/cos/tam');

Bardziej przejrzyste i odporne na błędy, pozatym nie powinno sie uzywać '/cos/tam' ale array() ;) Dzieki temu linki automatycznie korzystają z Route.


1. if ($this->Product->validates())

Ta metoda sprawdza TYLKO czy formularz jest poprawny - dzięki temu mozemy wyswietlic odpowiedni komunikat dla użytkownika.

Metoda $this->Product->save()
Ta metoda sprawdza poprawność zapisu do bazy danych

Chyba widać różnice? To że dane przeszły walidacje to nie znaczy, że się zapiszą, a przydało by się poinformować użytkownika odpowiednim komunikatem.

PS. CakePHP to nie kicha:)