Autor Zpráva
piiiiiiiip
Profil
Dobrý den. Chci se zeptat jestly někdo neví jak dát do formuláře checkbox když používím nette a bootstrap3.
Zkoušel jsem :
$form->addCheckbox('test', 'Test');
ale to vypíše jen label. Nefunguje mi ani checkboxlist a radiolist.
Taps
Profil
Mas to i v prikladech...jinak github.com/nette/forms/blob/master/examples/bootstrap3-rendering.php
piiiiiiiip
Profil
To mi nefungovalo.


Call to undefined function App\CoreModule\Presenters\makeBootstrap3()
Taps
Profil
Mas aktualni verzi nette?
piiiiiiiip
Profil
Ne, mám 2.3
Taps
Profil
Tak ja pouzivam aktualni verzi a nemam zadny problem.
Zechy
Profil
Taps:
To nebude aktuální verzí, dle chyby to evidentně špatně implementoval ten příklad.

piiiiiiiip:
A jak si ten příklad implementoval? Ukaž kod.
piiiiiiiip
Profil
class TestPresenter extends BaseCorePresenter 
{
function makeBootstrap3(Form $form)
{
    $renderer = $form->getRenderer();
    $renderer->wrappers['controls']['container'] = NULL;
    $renderer->wrappers['pair']['container'] = 'div class=form-group';
    $renderer->wrappers['pair']['.error'] = 'has-error';
    $renderer->wrappers['control']['container'] = 'div class=col-sm-9';
    $renderer->wrappers['label']['container'] = 'div class="col-sm-3 control-label"';
    $renderer->wrappers['control']['description'] = 'span class=help-block';
    $renderer->wrappers['control']['errorcontainer'] = 'span class=help-block';
    $form->getElementPrototype()->class('form-horizontal');
    $form->onRender[] = function ($form) {
        foreach ($form->getControls() as $control) {
            $type = $control->getOption('type');
            if ($type === 'button') {
                $control->getControlPrototype()->addClass(empty($usedPrimary) ? 'btn btn-primary' : 'btn btn-default');
                $usedPrimary = TRUE;
            } elseif (in_array($type, ['text', 'textarea', 'select'], TRUE)) {
                $control->getControlPrototype()->addClass('form-control');
            } elseif (in_array($type, ['checkbox', 'radio'], TRUE)) {
                $control->getSeparatorPrototype()->setName('div')->addClass($type);
            }
        }
    };
}
 protected function createComponentTestForm()
    {
$form = $this->formFactory->create();
makeBootstrap3($form);
 . . .
Zkoušel jsem to takto a to i v továrničce.
Zechy
Profil
<?php
class TestPresenter extends BaseCorePresenter 
{
function makeBootstrap3(Form $form)
{
    $renderer = $form->getRenderer();
    $renderer->wrappers['controls']['container'] = NULL;
    $renderer->wrappers['pair']['container'] = 'div class=form-group';
    $renderer->wrappers['pair']['.error'] = 'has-error';
    $renderer->wrappers['control']['container'] = 'div class=col-sm-9';
    $renderer->wrappers['label']['container'] = 'div class="col-sm-3 control-label"';
    $renderer->wrappers['control']['description'] = 'span class=help-block';
    $renderer->wrappers['control']['errorcontainer'] = 'span class=help-block';
    $form->getElementPrototype()->class('form-horizontal');
    $form->onRender[] = function ($form) {
        foreach ($form->getControls() as $control) {
            $type = $control->getOption('type');
            if ($type === 'button') {
                $control->getControlPrototype()->addClass(empty($usedPrimary) ? 'btn btn-primary' : 'btn btn-default');
                $usedPrimary = TRUE;
            } elseif (in_array($type, ['text', 'textarea', 'select'], TRUE)) {
                $control->getControlPrototype()->addClass('form-control');
            } elseif (in_array($type, ['checkbox', 'radio'], TRUE)) {
                $control->getSeparatorPrototype()->setName('div')->addClass($type);
            }
        }
    };
}
 protected function createComponentTestForm()
    {
$form = $this->formFactory->create();
$this->makeBootstrap3($form);

// ....
}

On ten příklad od Grudla totiž není ve třídě, proto tam volá tu funkci jako každou jinou. Ty to ale máš zapsané ve třídě, tudíž musíš volat metodu makeBootstrap3 přes $this. Jinak se PHP pokouší volat funkci ve stejném jmenném prostoru.

Btw. Je lepší vytvářet formuláře jako komponenty a né přímo v presenteru, nikdy nevíš, jestli ten formulář nebudeš muset volat na 10 místech.
piiiiiiiip
Profil
Tet mi to vrací chybu: Cannot read an undeclared property Nette\Application\UI\Form::$onRender.


Tak je to vyřešeno. V CSS (nainstalován s bootstrapem) je checkbox display: none;

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: