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)