Witajcie
Posługując się tutorialem z blogu Kamila rozpocząłem przygodę z rozszerzeniami.
Mam katalog ofert. Generalnie wszystko działa. Się listuje i edytuje. Ale oferta musi należeć do dwóch grup kategorii - obowiązkowo do każdej z nich. Jak wyświetlić podczas edycji rekordu jego przynależność do kategorii przy pomocy pola typu select?
Witamy na polskim forum Contao
Zarejestruj się teraz, aby skorzystać ze wszystkich funkcji forum. Kiedy się zalogujesz, będziesz mógł tworzyć tematy, pisać posty, rozdawać punkty reputacji, korzystać z prywatnych wiadomości i zarządzać swoim profilem. Jeśli posiadasz już konto, zaloguj się - w przeciwnym wypadku zarejestruj się już teraz!
Zarejestruj się teraz, aby skorzystać ze wszystkich funkcji forum. Kiedy się zalogujesz, będziesz mógł tworzyć tematy, pisać posty, rozdawać punkty reputacji, korzystać z prywatnych wiadomości i zarządzać swoim profilem. Jeśli posiadasz już konto, zaloguj się - w przeciwnym wypadku zarejestruj się już teraz!

dane z drugiej tabeli
Rozpoczęty przez gutenbergus, lis 04 2011 18:35
#2
Napisano 04 listopada 2011 - 21:25

Mój tutorial opisuje sytuację, gdzie rekord jest przypisany do tylko jednej kategorii. Jeśli chcesz natomiast przypisać do rekordu kilka kategorii, musisz zmienić podejście. Możesz zrobić kategorie jako osobny moduł (w żaden sposób nie powiązany w kodzie z rekordami), a wtedy w rekordzie utworzyć pole:
Ewentualnie można pokombinować coś z DCA onload_callback i wartością root.
// SQL `categories` blob NULL // DCA $GLOBALS['TL_DCA']['tl_rekord']['fields']['categories'] = array ( 'label' => &$GLOBALS['TL_LANG']['tl_rekord']['categories'], 'inputType' => 'checkbox', 'foreignKey' => 'tl_kategoria.title', 'eval' => array('mandatory'=>true, 'multiple'=>true, 'tl_class'=>'clr') );Wówczas będziesz mógł do rekordu przypisać tyle kategorii, ile tylko sobie zamarzysz. Tylko wtedy, żeby wyświetlić odpowiednie rekordy we front endzie będziesz je musiał odpowiednio przefiltrować po stronie PHP (a nie bazy danych).
Ewentualnie można pokombinować coś z DCA onload_callback i wartością root.
Codefog - Contao web development
#3
Napisano 04 listopada 2011 - 23:21

kurcze, no nie chce mi to działać. Pole select pokazuje się puste. Tu jest plik sql, a tutaj dca/tl_HD_oferty.php. Pewnie coś jeszcze trzeba skonfigurować. Generalnie chodzi o to, że pola hotel i category powinny pobierać się z odpowiednich tablic. Nie chcę, by były edytowalne - na razie nie chcę
. Może macie pomysł dlaczego dane się nie wyświetlają?

#4
Napisano 05 listopada 2011 - 08:26

Category jest polem text, więc dopóki go nie uzupełnisz, nie będzie ono miało żadnej wartości (i tym samym nie pobierze się z zewnętrznej tabeli). Natomiast pole hotel powinno pobierać dane w postaci tablicy [id] => [wartość], gdzie
'foreignKey' => 'tl_HD_hotele.hotel' // co znaczy 'foreignKey' => 'tl_tabela.pole_do_pobrania'Sprawdź proszę czy rzeczywiście istnieje pole hotel w tabeli tl_HD_hotele, które to pobierasz.
Codefog - Contao web development
#5
Napisano 05 listopada 2011 - 17:39

No masakra, za cholerę nie chciało ruszyć. Już nie miałem siły. Wziąłem czystą instalację contao, wgrałem, odpliłem, iiii....... działa.
No nie wiem o co chodziło, ale jest ok.
Ale teraz Kamil powiedz, czy używając wersji z 'foreignKey' można jakoś kontrolować kolejność wyświetlania pozycji w polu select?
Przy okazji znalazłem inny sposób, któryspełnia moje potrzeby (nie muszę mieć edycji wartości z pól select). W dca stworzyć zmienną do, której można wpisać potrzebne wartości i tę zmienną przyporządkować do 'options'. Kod będzie wyglądał tak:
No nie wiem o co chodziło, ale jest ok.
Ale teraz Kamil powiedz, czy używając wersji z 'foreignKey' można jakoś kontrolować kolejność wyświetlania pozycji w polu select?
Przy okazji znalazłem inny sposób, któryspełnia moje potrzeby (nie muszę mieć edycji wartości z pól select). W dca stworzyć zmienną do, której można wpisać potrzebne wartości i tę zmienną przyporządkować do 'options'. Kod będzie wyglądał tak:
<? $optArray = array('1' => 'pozycja 1', '2' = > 'pozycja 2'); // i dalej w ustawieniach pol w module $GLOBALS['TL_DCA']['tl_rekord']['fields']['categories'] = array ( 'label' => &$GLOBALS['TL_LANG']['tl_rekord']['categories'], 'inputType' => 'select', 'options' => $optArray, 'eval' => array('mandatory'=>true) ); ?>
#6
Napisano 05 listopada 2011 - 18:38

Kolejności zmienić nie można, natomiast możesz zamiast tego użyć options_callback. Odnośnie twojego kodu, można to odrazu zrobić tak:
$GLOBALS['TL_DCA']['tl_rekord']['fields']['categories'] = array ( 'label' => &$GLOBALS['TL_LANG']['tl_rekord']['categories'], 'inputType' => 'select', 'options' => array('1', '2'), 'reference' => &$GLOBALS['TL_LANG']['tl_rekord']['categories'], 'eval' => array('mandatory'=>true) ); # /languages/en/tl_rekord.php $GLOBALS['TL_LANG']['tl_rekord']['categories']['1'] = 'pozycja 1'; $GLOBALS['TL_LANG']['tl_rekord']['categories']['2'] = 'pozycja 2';I tak to się robi prawidłowo według filozofii Contao. Plusem jest, że takie rozwiązanie obsługuje wielojęzyczność.
Codefog - Contao web development
#8
Napisano 12 grudnia 2011 - 17:06

Witajcie, mam jeszcze pytanie odnośnie tego wątku.
w polu fields tablicy label są 3 elementy. Dwa z nich ('imgSmall','title') pochodzą z tablicy którą opisuje cytowany plik DCA. Trzeci element "hotel" to numer hotelu. Nazwy hoteli znajdują się w tablicy tl_hotele.id. Czy można to jakoś ożenić by na liście wyświetlało się to jako nazwa hotelu a nie jego id?
$GLOBALS['TL_DCA']['tl_HD_oferty'] = array ( 'config' => array ( 'dataContainer' => 'Table', 'switchToEdit' => true ), 'list' => array ( 'sorting' => array ( 'mode' => 1, 'fields' => array('language', 'title'), 'flag' => 11, 'panelLayout' => 'sort,search,limit' ), 'label' => array( 'fields' => array('imgSmall','title','hotel'), 'format' => '<img src="%s" width="22" /> %s - [%s]' ), .... ....
w polu fields tablicy label są 3 elementy. Dwa z nich ('imgSmall','title') pochodzą z tablicy którą opisuje cytowany plik DCA. Trzeci element "hotel" to numer hotelu. Nazwy hoteli znajdują się w tablicy tl_hotele.id. Czy można to jakoś ożenić by na liście wyświetlało się to jako nazwa hotelu a nie jego id?
Użytkownicy przeglądający ten temat: 1
0 użytkowników, 1 gości, 0 anonimowych użytkowników