Multicheckboxy zamiast multiselectorów w CakePHP 1.2RC2

Mając zaprojektowaną bazę danych i zdefiniowaną relację wiele-do-wielu, skrypt „bake” generuje kod strony. Relacja wiele-do-wielu przedstawiona jest jako lista „multiselect” – lista wielokrotnego wyboru. Lista ta jest o tyle niewygodna, że chcąc wybrać kilka opcji, trzeba robić to z wciśniętym przyciskiem ctrl. Jeden nieuważny ruch, przypadkowe kliknięcie i cały proces wyboru trzeba powtarzać od nowa.

Można usunąć tą niedogodność zamieniając listę wielokrotnego wyboru na listę checkboxów:

W widoku dodajemy tablicę atrybutów:

echo $form->input('Post.Tag', array('type'=>'select', 
                                    'multiple'=>'checkbox', 
                                    'options'=>$tags, 
                                    'label'=>'Tagi:'
                                                    ));

Można zmienić jeszcze kontroler, aby generował listę tagów, gdzie wartością jest nazwa tagu, kluczem natomiast jest Tag.id – identyfikator w bazie danych. Lista taka służy do tego, aby w widoku były nazwy przy checkboxach, a nie identyfikatory:

$tags = $this->Post->Tag->find('list', array('fields'=>'Tag.name'));
$this->set(compact('tags'));

CakePHP 1.2 RC2, brak mod_rewrite i serwery AGH

Brak modułu przepisującego adresy mod_rewrite w przypadku CakePHP objawia się między innymi brakiem „ładnych” adresów. Tyle przynajmniej wyczytałem w manualu Cake’a (link). Niestety brak wspomnianego modułu apache skutkuje jeszcze błędnym działaniem HtmlHelpera, a konkretniej metody HtmlHelper->link. Po długich poszukiwaniach udało mi się znaleźć rozwiązanie, które wydaje się być skuteczne na serwerze AGH.

Krótki tutorial:

  1. Usuwamy pliki .htaccess z 3 katalogów:
    • /.htaccess (katalog główny aplikacji)
    • /app/.htaccess
    • /app/webroot/.htaccess
  2. Edytujemy plik /app/config/core.php i wyłączamy komentarz linijki:
    Configure::write(’App.baseUrl’, env(’SCRIPT_NAME’));
  3. Przed w/w linią dopisujemy:
    $tmp_base = env('SCRIPT_NAME');
    $len = stripos($tmp_base,"index.php") + 9;
    $tmp_base = substr($tmp_base,0,$len);
  4. Linię
    Configure::write(’App.baseUrl’, env(’SCRIPT_NAME’));

    zamieniamy na:

    Configure::write('App.baseUrl', $tmp_base);

Odnośniki, które wyglądały następująco:
http://student.agh.edu.pl/~twoja-nazwa/posts/index
mają postać:
http://student.agh.edu.pl/~twoja-nazwa/index.php/posts/index
Również metoda HtmlHelper->link poprawnie generuje odnośniki użyte w aplikacji.

Po kilku testach okazało się, że opisana metoda nie działa w 100%. Zainstalowanie aplikacji w ścieżce:
http://student.agh.edu.pl/~twoja-nazwa/aplikacja/
nie przekierowuje się automatycznie na index.php:
http://student.agh.edu.pl/~twoja-nazwa/aplikacja/index.php
Wpisanie w przeglądarkę powyższej ścieżki daje dobry rezultat.
Rozwiązaniem tego problemu jest ręczne wpisanie do pliku /app/config/core.php ścieżki do aplikacji:

Configure::write('App.baseUrl', '/~twoja-nazwa/aplikacja/index.php');

Teraz przekierowanie działa poprawnie.