Replicator – select s unikátními options
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- Landsman
- Člen | 152
Ahoj,
rád bych z pole options pro replicator select při každém přidání
unsetnul vybranné optiony.
Jak je ale zjistím?
$tAttr = $translations->addContainer('attributes');
/**
* load all attributes from db to select
*/
$attributesDb = $this->attributeModel->findAllAttributes();
$attr = [];
foreach($attributesDb as $key => $value)
{
$attr[$value->id] = "{$value->title} ($value->unit)";
}
/**
* load saved attributes to product
*/
$dbAttrs = [];
foreach($this->entity->getAttributes() as $aTT)
{
$dbAttrs[] = [
'id' => $aTT->id,
'attribute' => $aTT->attribute->id,
'value' => $aTT->value
];
}
/**
* Ajax replicator redraw
*/
$replicatorBtnAdd = function() use ($form)
{
// todo: unset used attributes in replicator
$presenter = $form->getPresenter();
if ($presenter->isAjax())
{
$presenter->redrawControl('attributes');
$presenter->redrawControl('js');
}
};
$replicatorBtnCallback = function() use ($form)
{
$presenter = $form->getPresenter();
if ($presenter->isAjax())
{
$presenter->redrawControl('attributes');
$presenter->redrawControl('js');
}
};
$replicator = $tAttr->addDynamic('rows', function (Container $attributeRow) use ($attr, $replicatorBtnCallback)
{
$attributeRow->addHidden('id');
$attributeRow->addSelect('attribute', 'Vyber', $attr)
->setPrompt('Vyberte')
//->setRequired()
->setAttribute('class', 'select2');
$attributeRow->addText('value', 'Zadejte hodnotu attributu');
//->setRequired();
$attributeRow->addSubmit("removeRow", "Odebrat vlastnost")
->setValidationScope(FALSE)
->setAttribute('class', 'ajax btn btn-danger btn-block')
->addRemoveOnClick($replicatorBtnCallback);
}, 0);
$replicator->setValues($dbAttrs);
$replicator->addSubmit("addRow", "Přidat vlastnost")
->setValidationScope(FALSE)
->setAttribute('class', 'ajax btn btn-primary btn-block')
->addCreateOnClick($replicatorBtnAdd);
V replicator containeru jsem našel httpPost, ale k němu napřímo přistoupit nemohu.
- Narazil jsem na to, že když odeberu položky, které načítám z db ($replicator->setValues($dbAttrs);) a zkusím přidat novou, nepřidá se, resp. nepřekreslí se ajax. :[ To je feature nebo bug @FilipProcházka ?
díky
Editoval Landsman (9. 9. 2016 13:31)
- Martk
- Člen | 661
Pokud potřebuješ vymazat jen vybrané containery, tak můžeš zkusit tento doplněk (lehké demo jsem udělal tady). Nainstaluj dev verzi, pokud chceš tuto featuru.
Tvůj kód bude po úpravě takto:
$tAttr->addMultiplier('rows', function (Container $attributeRow) use ($attr)
{
$attributeRow->addHidden('id');
$attributeRow->addSelect('attribute', 'Vyber', $attr)
->setPrompt('Vyberte')
//->setRequired()
->setAttribute('class', 'select2');
$attributeRow->addText('value', 'Zadejte hodnotu attributu');
//->setRequired();
}, 0)
->addCreateButton('Přidat vlastnost')
->addRemoveButton('Odebrat vlastnost')
->setValues($dbAttrs);
- Martk
- Člen | 661
Aha, teď jsem pochopil, jak myslíš tu jedničku. Nepomohlo by něco jako (psáno z hlavy podle kódu z třídy Replicator):
$replicatorBtnCallback = function(Replicator $replicator, Container $newContainer) use ($form)
{
$newContainer['attribute']->setItems(...);
// hodnoty z replicatoru zjistis takhle
$values = $replicator->getValues();
$presenter = $form->getPresenter();
if ($presenter->isAjax())
{
$presenter->redrawControl('attributes');
$presenter->redrawControl('js');
}
};
// ...
$replicator->addSubmit("addRow", "Přidat vlastnost")
->setValidationScope(FALSE)
->setAttribute('class', 'ajax btn btn-primary btn-block')
->addCreateOnClick($replicatorBtnAdd);
Editoval Antik (10. 9. 2016 9:23)