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 |
|
|
Użytkownicy przeglądający ten temat: 1
0 użytkowników, 1 gości, 0 anonimowych użytkowników



Do góry
Zgłoś







