Skocz do zawartości

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!
Zdjęcie

dane z drugiej tabeli


  • Zaloguj się, aby dodać odpowiedź
11 odpowiedzi w tym temacie

#1
gutenbergus

gutenbergus

    Znawca

  • Zarejestrowani
  • PipPipPipPip
  • 189 postów
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?
  • 0

#2
Kamil

Kamil

    Contao ambassador

  • Administratorzy
  • 1 538 postów
  • Strona www:zobacz
  • LokalizacjaLidzbark Warminski
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:

// 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.
  • 0

Codefog - Contao web development


#3
gutenbergus

gutenbergus

    Znawca

  • Zarejestrowani
  • PipPipPipPip
  • 189 postów
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ą?
  • 0

#4
Kamil

Kamil

    Contao ambassador

  • Administratorzy
  • 1 538 postów
  • Strona www:zobacz
  • LokalizacjaLidzbark Warminski
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.
  • 0

Codefog - Contao web development


#5
gutenbergus

gutenbergus

    Znawca

  • Zarejestrowani
  • PipPipPipPip
  • 189 postów
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:

<?
$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)
);
?>

  • 0

#6
Kamil

Kamil

    Contao ambassador

  • Administratorzy
  • 1 538 postów
  • Strona www:zobacz
  • LokalizacjaLidzbark Warminski
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ść.
  • 0

Codefog - Contao web development


#7
gutenbergus

gutenbergus

    Znawca

  • Zarejestrowani
  • PipPipPipPip
  • 189 postów
Kamil, dzięki za pomoc i dokładne wyjaśnienia.
  • 0

#8
gutenbergus

gutenbergus

    Znawca

  • Zarejestrowani
  • PipPipPipPip
  • 189 postów
Witajcie, mam jeszcze pytanie odnośnie tego wątku.

$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?
  • 0

#9
Kamil

Kamil

    Contao ambassador

  • Administratorzy
  • 1 538 postów
  • Strona www:zobacz
  • LokalizacjaLidzbark Warminski
Jesteś tu zmuszony użyc label_callback, przykład użycia masz w system/modules/backend/dca/tl_user.php
  • 0

Codefog - Contao web development


#10
gutenbergus

gutenbergus

    Znawca

  • Zarejestrowani
  • PipPipPipPip
  • 189 postów
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
  • 0

#11
Kamil

Kamil

    Contao ambassador

  • Administratorzy
  • 1 538 postów
  • Strona www:zobacz
  • LokalizacjaLidzbark Warminski
Nie bardzo rozumiem - chcesz przypisać danemu userowi tylko jeden hotel?
  • 0

Codefog - Contao web development


#12
gutenbergus

gutenbergus

    Znawca

  • Zarejestrowani
  • PipPipPipPip
  • 189 postów
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 :D
  • 0




Użytkownicy przeglądający ten temat: 2

0 użytkowników, 2 gości, 0 anonimowych użytkowników