Textarea problém při update záznamů  – nastavení hodnoty v latte

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Jakub Kontra
Člen | 30
+
0
-

Zdravím, hledal jsem jak po Fóru jak nastavit hodnotu v latte do textarea ale nenašel. Mohl by mi někdo poradit? Jelikož Textarea nemá value

<textarea></textarea>

zkoušel jsem logicky

{input textearea}{$bla->blaa/}{/input}

, ale to taky nefungovalo

Díky za radu.

Ot@s
Backer | 476
+
0
-

Očekávané {input nazev_textarea value=>"Obsah textarea"} nefunguje, nicméně toto by mělo jít:

{* uvnitr makra {form} *}
<?php $form['nazev_textarea']->setDefaultValue("vychozi obsah");?>
{input nazev_textarea}

PS: pokud k výše uvedenému nemáš důvod (na 99% určitě ne), tak (výchozí) hodnotu definuj při tvorbě v samotné továrničce formuláře, tj. $form->addTextarea('nazev_textarea', 'Vzkaz:')->setDefaultValue("vychozi obsah");

Grelek
Člen | 233
+
0
-

Pokud chceš natahat data z databáze, použij toto:

public function renderEdit()
{
        $this['formular']->setDefaults(array(
                'title' => $this->MODEL->getData()->title,
                'perex' => $this->MODEL->getData()->perex,
        ));
}

Jinak normálně v komponentě:

public function createComponentFormular()
{
	$form = new Form();
	$form->addText('name', 'Jméno')
		->setDefaultValue('Hodnota');
	// ...
}
Jakub Kontra
Člen | 30
+
0
-

add.latte


{block title}Přidat pojem{/block}
{block head}
<script type="text/javascript">
	bkLib.onDomLoaded(function() { nicEditors.allTextAreas() });
</script>

{/block}
{block content}

<h2>Přidat pojem</h2>

{form addForm class=>"artnok-form"}

<!-- Jednoduché vykreslení chyb -->
<ul class="errors" n:if="$form->hasErrors()">
        <li n:foreach="$form->errors as $error">{$error}</li>
</ul>
	<div n:foreach="$flashes as $flash" class="flash {$flash->type}">{$flash->message}</div>


<label><span class="headline">{label item /}</span>
		{input item} <span class="sub-info">
	</label>
		<label><span class="headline">Obsah novinky</span>
		<textarea name="textarea"></textarea>
	</label>
	<label><span class="headline">Obsah novinky</span>
		<textarea name="textarea"></textarea>
	</label>

	<label><span class="headline">{label vysvetleni /}</span>
		{input vysvetleni} <span class="sub-info">
	</label>


	<div style="margin-top:20px;">
		{input sub}
		<input type="reset" class="btn btn btn-danger" name=""  value="Reset">
	</div>





{/form addForm}

UPDATE FORM


{block title}Přidat novinku{/block}
{block head}
<script type="text/javascript">
	bkLib.onDomLoaded(function() { nicEditors.allTextAreas() });
</script>

{/block}
{block content}

{dump $termRow}

<h2>Přidat novinku</h2>

{form addForm class=>"artnok-form"}

<!-- Jednoduché vykreslení chyb -->
<ul class="errors" n:if="$form->hasErrors()">
        <li n:foreach="$form->errors as $error">{$error}</li>
</ul>
	<div n:foreach="$flashes as $flash" class="flash {$flash->type}">{$flash->message}</div>


<label><span class="headline">{label item /}</span>
		{input item value=>$termRow->title}
	</label>

		<label><span class="headline">Obsah novinky</span>
		<textarea name="textarea"></textarea>
	</label>

	<label><span class="headline">{label vysvetleni /}</span>
		{input vysvetleni }
	</label>

 	{!$termRow->explanation|escape|nl2br}

	<div style="margin-top:20px;">
		{input sub}
		<input type="reset" class="btn btn btn-danger" name=""  value="Reset">
	</div>





{/form addForm}

TERMS PRESENTER


    public function actionDefault()
    {
        $this->terms = \isdozory\Models\Terms::getAll();

    }

    public function renderDefault()
    {
        $this->template->terms = $this->terms;

    }

    public function actionDelete($id = null)
    {
        if(!$id == null)
        {

            if(\isdozory\Models\Terms::deleteById($id))
            $this->flashMessage('Success', 'success');
            $this->redirect('Pricelist:default');


        }

    }

    public function actionUpdate($id = null)
    {
        if(!$id == null)
        {
            $this->termRow = \isdozory\Models\Terms::findById($id);
        }

    }

    public function renderUpdate()
    {
        $this->template->termRow = $this->termRow;
    }


    /**
     * @return \Nette\Application\UI\Form
     */
    protected function createComponentAddForm()
    {
        $form = new \Nette\Application\UI\Form;

        $form->addText('item', 'Název položky:')
             ->addRule(\Nette\Application\UI\Form::MIN_LENGTH, 'Název položky nesmí být prázdný', 1);



        $form->addTextArea('vysvetleni', 'Vysvětlení:')
             ->addRule(\Nette\Application\UI\Form::MIN_LENGTH, 'Hodnota nesmí být prázdná', 1);

        $form->addSubmit('sub')
             ->setAttribute('class', 'btn btn-success')
             ->setAttribute('value', 'Odeslat');

        $form->onSuccess[] = callback($this, 'processAddForm');

        return $form;
    }

    /**
     * @param \Nette\Application\UI\Form
     */
    public function processAddForm( \Nette\Application\UI\Form $form )
    {
        $values = $form->getValues();

         // todo update


        if($this->presenter->getAction() == 'add'){
            \isdozory\Models\Terms::addRow($values->item, $values->vysvetleni);
        }elseif($this->presenter->getAction() == 'update'){
            \isdozory\Models\Terms::updateRow($values->item, $values->vysvetleni, $this->getParam('id') );
        }

        $this->flashMessage('Success', 'success');
        $this->redirect('Terms:default');
    }

Jak by to tedy mělo být napsáno podle Best Experience?
Díky

Grelek
Člen | 233
+
0
-

Vše by jsi měl řešit v presenteru, ne v Latte.

A už jsem ti to psal. Tak znovu…

Pokud data taháš z databáze (například pro úpravu nějakých informací, co já vím…), tak takhle:

public function actionDefault() // samozřejmě tam může být i render
{
	$this['add']->setDefaults(array(
		'item' => $this->model->getData()->item,
		// ...
	));
}

Pokud chceš pouze nastavit výchozí hodnotu pro políčko, použij toto:

// vytvoření komponenty formuláře
$form->addText('item', 'Název položky:')
	->setDefaultValue('Hodnota');

A na závěr jeden tip: Před definici třídy zapiš use Nette\Application\UI\Form a v třídě potom už používej pouze Form() nebo Form.