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!
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 »
#1
Napisano 03 lipca 2014 - 23:51
#2
Napisano 04 lipca 2014 - 06:26
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
Codefog - Contao web development
#3
Napisano 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.
Również z jednym lub większą ilością słów kluczowych: DCA, inputType, select
Rozszerzenia Contao →
Developer's corner →
Contao >= 3.3.2, problem z parametrem 'sql' w definicji DCA->fieldNapisany przez Mozan, 11 lip 2014 DCA, sql |
|
Użytkownicy przeglądający ten temat: 0
0 użytkowników, 0 gości, 0 anonimowych użytkowników