Hardcoded thoughts… mostly in C# or php

pieczenie edit-in-place

(zasadniczo to to o CakePHP i $ajax::editor(); będzie...)
Ku memu zadowoleniu wreszcie w tym semestrze zaczął się przedmiot o wspaniałej nazwie "Aplikacje Internetowe". Miałem nadzieję, że czegoś się nauczę, dowiem, itp. Niestety - wyszło tak, jak się spodziewałem. Poziom materiału dostosowany jest do tych, którzy w temacie są kompletnie zieloni, więc na zajęciach nie pozostaje nic innego do roboty, niż się nudzić... lub nie chodzić wogóle na nie. Mniejsza. Zaliczenie ćwiczeń i labolatoriów w formie projektu. Miałem więc nadzieję, na szybkie zaliczenie i wpis grubo przed sesją, trochę się jednak przeliczyłem. Pewną przeszkodą była mała awaria dysku, jednak przede wszystkim mocno się znudziłem wybraną aplikacją (coś ala FlySpray). Dziś już mocno z przymusu usiadłem i postanowiłem dorobić kolejne ficzery (no bo aplikacja teamu Tas + Klap musi się świecić) - padło na przyuważony jakiś czas temu Edit-in-place - znaczy się edytowanie pojedynczego rekordu bezpośrednio po kliknięciu na nim - beż żadnych przeładowań etc. Pure AJAX ;). Trochę mnie szlag trafiał, gdy tylko zacząłem zastanawiać się nad najłatwiejszym wpisaniem tego w kod i użyciem w Cake'u. Ale tak na wszelki wypadek postanowiłem w googlu sprawdzić, czy ktoś już tego przede mną nie robił. No i proszę. Nie dość, że robił, to jeszcze bezpośrednio zaimplementował w (już) mym ulubionym frameworku. Jednak jako, że sama kontrolka nie jest jeszcze w manualu opisana, opiszę tu pokrótce, jak skorzystać z ustrojstwa.

Coby sobie ułatwić pracę opiszę to na własnym przykładzie - tu szło o edycję Kategorii (Categories), konkretnie jej nazwy (w bazie pole name). Mamy więc kontroler (controllers/categories_controller.php):

PHP:
  1. class CategoriesController extends AppController{
  2. var $helpers = array ('Html', 'Ajax', 'Javascript', 'Text');
  3.  
  4. function index(){
  5. $this->set("data", $this->Category->findAll());
  6. }
  7.  
  8. function edit($id)
  9. {
  10. if (!empty($this->params['form'])) // tu nie $this->params['data'], jak to zwykle jest przy formach!!!!
  11. {
  12. $this->Category->id = $id;
  13. $this->Category->saveField('name',$this->params['form']['value']); // nadpisanie wartości pola
  14. }
  15. $this->set('categ', $this->Category->findById($id));
  16. $this->layout = "ajax"; // ustawienie generowanego layoutu na "AJAXowy"
  17. }
  18. }

Oraz widow wyświetlający wszystkie kategorie (views/categories/index.thtml):

PHP:
  1. foreach ($data as $row)
  2. {
  3. $item = $row['Category'];
  4. <div id="categ_'.$item["id"].'">';
  5. <div id="categ_'.$item[">print $item['name'];
  6. print '';</div>
  7. print $ajax->editor('categ_'.$item["id"], '/categories/edit/'.$item["id"], array());
  8. //ot, cała filozofia generowania edit-in-place w CakePHP...
  9. }

Całość ma już prawie szanse działać. Pozostaje tylko jeszcze jeden widok (views/categories/edit.thtml):

PHP:
  1. <?PHP echo $categ['Category']['name']; ?>

I to zasadniczo wszystko. Pozostaje chyba tylko kontrola danych wchodzących (klasa Sanitize) i dodanie w domyślnym widoku odnośników do bibliotek prototype i script.aculo.us (najnowsza wersja - obecnie wraz z prototype.js 1.5.0-rc0) - CakePHP korzysta bowiem w całości z tego.

No comments yet. Be the first.

Leave a reply