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
+
0
-

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.

  1. 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
+
0
-

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);
Landsman
Člen | 152
+
0
-

@Antik To je k tomu bodu č. 2?
v 1. chci, aby s přidáním containeru se selectem se vždy provedl unset již použitého optionu z $attr.

Máme nějaký blaík parametrů a parametr by měl být v produktu vždy unikátní.

Editoval Landsman (9. 9. 2016 23:00)

Martk
Člen | 661
+
0
-

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)