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

DCA, field X - inputType = "select" - odświeżenie X po którymś z OpenModal...

DCA inputType select

Najlepsza odpowiedź Mozan, 07 lipca 2014 - 23:39

Dziękuje pięknie :)

 

DcaWizard był tym przykładem którego szukałem.

W moim przypadku potrzebowałem rozszerzyć funkcjonalność inputType = select.

 

Wystarczyło więc:

- w dca dla pola X dodać wizard, który wyświetli odpowiedni link:

public function getWizardLink($dc) {
	$fieldName = "Y";
	$act = 'create';
	$arrLinkParams = array(
		'do'		=> 'XYZ',
		'mode'		=> '2',
		'table'		=> 'tl_XYZ',
		'popup'		=> '1',
		'nb'		=> '1',
		'rt'		=> REQUEST_TOKEN,
		'field'		=> $fieldName,
		'placeId'	=> $dc->id,
		'pid'		=> 1,		// Miejsce w moim XYZ
		'act'		=> $act,
		'id'		=> ''
	);
	$strLinkParams = implode('', array_map(function ($v, $k) { return sprintf("%s=%s&", $k, $v); }, $arrLinkParams, array_keys($arrLinkParams)));

	$arrOptions = array(
		'width'         => 768,
		'title'         => "'" . $titlePopup . "'",
		'url'           => 'this.href',
		'id'            => "'" . $fieldName . "'",
//		'applyLabel'    => "'" . $btnLabel . "'"
	);
	$strOptions = implode(', ', array_map(function ($v, $k) { return sprintf("'%s':%s", $k, $v); }, $arrOptions, array_keys($arrOptions)));

	return ' <a href="contao/main.php?' . $strLinkParams . 
		'" title="' . $title . 
		'" style="padding-left:3px" onclick="' . 
		'Backend.getScrollOffset(); MOJZESTAWJS.openModalWindow({' . $strOptions . '}); return false">' . 
		\Contao\Image::getHtml('alias.gif', $title, 'style="vertical-align:top"') . '</a>';
}

- dodać nowy Widget, który dziedziczy z SelectMenu jako np.: SelectMenuAjax

- dodać do SelectMenuAjax metodę

public function handleAjaxActions($strAction, \DataContainer $dc)

dosłownie - copy/paste z DcaWizard.php, minimalnie ją modyfikując na początku:

// if ($strAction == 'reloadDcaWizard') {
if ($strAction == 'reloadAjaxSelect') {

oraz pod koniec (żeby poprawnie pobierała aktualne wartości zapisane w tabeli dla danego pola)

$arrData = $GLOBALS['TL_DCA'][$dc->table]['fields'][$strField];

switch ($dc->table) {
	case 'tl_XYZ':
		$o = PlaceModel::findByPk($intId);
		$fieldValue = $o->$strField;
		break;
....
}
//$objWidget = new $strClass($strClass::getAttributesFromDca($arrData, $strFieldName, null, $strField, $dc->table, $dc));
$objWidget = new $strClass($strClass::getAttributesFromDca($arrData, $strFieldName, $fieldValue, $strField, $dc->table, $dc));

i przy okazji "wypluwała" wymuszenie odświeżenia select'a (uwielbiam Chosen)

// echo $objWidget->generate();
$ow = $objWidget->generate();
$ow .= "<script>$('ctrl_" . $strField . "').fireEvent('liszt:updated');</script>";
echo $ow;
exit;

- skopiować dcawizard.js do MOJZESTAWJS.js, modyfikując odpowiednio OpenModalWindow()

...
.post({'action':'reloadAjaxSelect', 'name':opt.id, 'REQUEST_TOKEN':Contao.request_token}); 

O duperelach typu autoload.php, config.php nie będę pisał, wystarczy zerknąć do źródeł DcaWizard.

Przejdź do postu »


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

#1
Mozan

Mozan

    Nowy na forum

  • Zarejestrowani
  • Pip
  • 6 postów
Witam serdecznie,
 
Krótkie pytanie, mam nadzieję, że ewentualna odpowiedź będzie równie krótka.
 
Czy jest w ramach Contao >=v3.3.2 w BE funkcjonalność, która pozwoli mi zrealizować coś, co wydaję mi się dość oczywiste.
 
Tabele, DCA:
tl_x.field
tl_y.fields
 
W DCA tl_x mam zdefiniowane pole field, które jest typu "select". Dodatkowo, 'wizard' wywołuje poprawnie tl_y które pozwala mi 
dodać nową wartość - za pomocą Backend.OpenModal...() do tl_y.fields.
 
Wszystko działa poprawnie - ale - po zamknięciu okienka które zostało otwarte za pomocą OpenModal... - pole tl_x.field w BE 
nie ma pojęcia, że zaszła zmiana w DB.
 
Wracam więc do pytania - czy i jeśli jak - jest możliwość odświeżyć tl_x.field po tym jak OpenModal zakończył swoje działanie.
Opcje typu modyfikacja JS.OpenModal - dodaj reload parent window - odpadają - z powodów dość oczywistych - wprowadzone 
dane nie zostały zapisane do DB. (onChange - czy jak to się wabi w eval - też odpada).
 
Chodzi mi o proste Contao style rozwiązanie problemu. 
Jeśli takowego nie ma - może jakiś addon?
 
Dziękuje za każdą formę podpowiedzi.
 

  • 0

#2
Kamil

Kamil

    Contao ambassador

  • Administratorzy
  • 1 538 postów
  • Strona www:zobacz
  • LokalizacjaLidzbark Warminski

Nie wydaje mi się, aby była taka możliwość domyślnie. Trzeba napisać widżet i skrypt JS, który po zamknięciu modala przeładuje tylko dane pole - tak jak na przykład pageTree, fileTree lub rozszerzenie dcaWizard. Myślę, że kopiując to ostatnie i wprowadzając swoje modyfikacje uzykasz zamierzony efekt :)

 

https://github.com/t...rd/tree/develop

 

Plik JS:

https://github.com/t...ts/dcawizard.js

 

Funkcje AJAX:

https://github.com/t.../config.php#L23

https://github.com/t...Wizard.php#L238


  • 0

Codefog - Contao web development


#3
Mozan

Mozan

    Nowy na forum

  • Zarejestrowani
  • Pip
  • 6 postów
✓  Najlepsza odpowiedź

Dziękuje pięknie :)

 

DcaWizard był tym przykładem którego szukałem.

W moim przypadku potrzebowałem rozszerzyć funkcjonalność inputType = select.

 

Wystarczyło więc:

- w dca dla pola X dodać wizard, który wyświetli odpowiedni link:

public function getWizardLink($dc) {
	$fieldName = "Y";
	$act = 'create';
	$arrLinkParams = array(
		'do'		=> 'XYZ',
		'mode'		=> '2',
		'table'		=> 'tl_XYZ',
		'popup'		=> '1',
		'nb'		=> '1',
		'rt'		=> REQUEST_TOKEN,
		'field'		=> $fieldName,
		'placeId'	=> $dc->id,
		'pid'		=> 1,		// Miejsce w moim XYZ
		'act'		=> $act,
		'id'		=> ''
	);
	$strLinkParams = implode('', array_map(function ($v, $k) { return sprintf("%s=%s&amp;", $k, $v); }, $arrLinkParams, array_keys($arrLinkParams)));

	$arrOptions = array(
		'width'         => 768,
		'title'         => "'" . $titlePopup . "'",
		'url'           => 'this.href',
		'id'            => "'" . $fieldName . "'",
//		'applyLabel'    => "'" . $btnLabel . "'"
	);
	$strOptions = implode(', ', array_map(function ($v, $k) { return sprintf("'%s':%s", $k, $v); }, $arrOptions, array_keys($arrOptions)));

	return ' <a href="contao/main.php?' . $strLinkParams . 
		'" title="' . $title . 
		'" style="padding-left:3px" onclick="' . 
		'Backend.getScrollOffset(); MOJZESTAWJS.openModalWindow({' . $strOptions . '}); return false">' . 
		\Contao\Image::getHtml('alias.gif', $title, 'style="vertical-align:top"') . '</a>';
}

- dodać nowy Widget, który dziedziczy z SelectMenu jako np.: SelectMenuAjax

- dodać do SelectMenuAjax metodę

public function handleAjaxActions($strAction, \DataContainer $dc)

dosłownie - copy/paste z DcaWizard.php, minimalnie ją modyfikując na początku:

// if ($strAction == 'reloadDcaWizard') {
if ($strAction == 'reloadAjaxSelect') {

oraz pod koniec (żeby poprawnie pobierała aktualne wartości zapisane w tabeli dla danego pola)

$arrData = $GLOBALS['TL_DCA'][$dc->table]['fields'][$strField];

switch ($dc->table) {
	case 'tl_XYZ':
		$o = PlaceModel::findByPk($intId);
		$fieldValue = $o->$strField;
		break;
....
}
//$objWidget = new $strClass($strClass::getAttributesFromDca($arrData, $strFieldName, null, $strField, $dc->table, $dc));
$objWidget = new $strClass($strClass::getAttributesFromDca($arrData, $strFieldName, $fieldValue, $strField, $dc->table, $dc));

i przy okazji "wypluwała" wymuszenie odświeżenia select'a (uwielbiam Chosen)

// echo $objWidget->generate();
$ow = $objWidget->generate();
$ow .= "<script>$('ctrl_" . $strField . "').fireEvent('liszt:updated');</script>";
echo $ow;
exit;

- skopiować dcawizard.js do MOJZESTAWJS.js, modyfikując odpowiednio OpenModalWindow()

...
.post({'action':'reloadAjaxSelect', 'name':opt.id, 'REQUEST_TOKEN':Contao.request_token}); 

O duperelach typu autoload.php, config.php nie będę pisał, wystarczy zerknąć do źródeł DcaWizard.


  • 1

#4
Kamil

Kamil

    Contao ambassador

  • Administratorzy
  • 1 538 postów
  • Strona www:zobacz
  • LokalizacjaLidzbark Warminski

Brawo :)


  • 0

Codefog - Contao web development






Również z jednym lub większą ilością słów kluczowych: DCA, inputType, select

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

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