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ęte przez gutenbergus, Nov 04 2011 18:35
#1
Napisany 04 November 2011 - 18:35

#2
Napisany 04 November 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
Napisany 04 November 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
Napisany 05 November 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
Napisany 05 November 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
Napisany 05 November 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
#7
Napisany 06 November 2011 - 11:41

Kamil, dzięki za pomoc i dokładne wyjaśnienia.
#8
Napisany 12 December 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?
#10
Napisany 12 December 2011 - 19:31

Super, dzięki, działa. A co zrobić, żeby można było zawęzić wyświetlanie tylko do jednego hotelu?
Próbuję 'panelLayout' => 'filter,sort,search,limit' ale bez rezultatu
Próbuję 'panelLayout' => 'filter,sort,search,limit' ale bez rezultatu
#12
Napisany 13 December 2011 - 11:25

O ja głupi głupi... Już wszystko jasne. Chodziło o to, że po wpisaniu "filter" nie pojawiał się ten Panel u góry. Trzeba było jeszcze zdefiniować pola ktore mają służyć jako filtr
'filter' => true
Dzięki za patronat
'filter' => true
Dzięki za patronat

0 użytkowników czyta ten temat
0 użytkowników, 0 gości, 0 anonimowych użytkowników