Přístup k prvkům pole komponenty

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

Ahoj,
mám vytvořenou komponentu, jejíž subkomponentou je formulář. Vše včetně vykreslení funguje dobře. Poslední věcí, kterou bych chtěl udělat je, aby se mi při editaci vyplnil aktuální čas do inputu (momentálně se tahá z DB, což ztrácí smysl, protože tím si vytáhnu čas, kdy byl formulář vytvořen, ne kdy byl editován).

Presenter, komponenta + osblužné metody:

<?php

namespace AdminModule;


use Nette\Application\UI\Form;


class ArticlesPresenter extends BasePresenter {



 public function createComponentAddArticle() {

	/**
	 * Create article form
	 * @return Nette\Application\UI\Form
	 */
      $form = new Form();
      $form->addText('title', 'Název článku: ')
		->setRequired('Zadej název článku!');
      $publish = array(
	  '1' => 'Ano',
	  '0' => 'Ne');
      $form->addRadioList('published','Zveřejněno: ',$publish)
	    ->setRequired('Má být článek zveřejněn?')
	    ->getSeparatorPrototype()->setName(NULL);
      $form->addTextArea('content', 'Text: ')
		->setRequired('Článek musí obsahovat nějaký text');
      $form->addText('author', 'Autor: ')
	        ->setDefaultValue($this->user->identity->username);
      $form->addText('datetime','Datum')
	      ->setValue(date("d.m.y h:i"));
      $form->addSubmit('submit','Odeslat')
	      ->getControlPrototype()
      ->onClick('CKEDITOR.instances["'.$form['content']->getHtmlId().'"].updateElement()');
      $form->addSelect('categories_id','Kategorie', $this->articles->getArticleCategories()->fetchPairs('id', 'name'))
	->setPrompt('Všechny články');
      $form->onSuccess[] = $this->addEditArticleSuceeded;
      return $form;

  }
   /**
	 *
	 * Get param from form, if $id is available call edit form
	 * else create new article
	 */
  public function addEditArticleSuceeded($form)
  {
     $values = $form->getValues();
     $postId = $this->getParameter('id');
  if($postId) {
  $this->template->articles = $this->articles->editArticle($values);
  $this->flashMessage('Příspěvek byl úspěšně editován.');
  }
   else {
    $this->template->articles = $this->articles->addArticle($values);
       $this->flashMessage('Příspěvek byl úspěšně publikován.');
   }

   $this->redirect('Homepage:default');
  }
	/**
	 * Function for render edit form, data based on id
	 * addArticle is component, data in array
	 */

   public function renderEdit($id) {


     $this['addArticle']->setValues($this->articles->fetchSingle($id));


    }

}

Díky.
Šaman
Člen | 2666
+
0
-

Nejjednodušší bude vyhodit čas z toho pole, které v renderEdit nastavuješ. Načti si hodnoty, unsetni čas a pak teprve nastav setValues.

Freestyler
Člen | 50
+
0
-

A to je právě to, vůbec netuším jak přistoupit k jednotlivým prvkům z pole, když se jedná o komponentu, šlo by mě lehce nakopnout?

Díky :).

Šaman napsal(a):

Nejjednodušší bude vyhodit čas z toho pole, které v renderEdit nastavuješ. Načti si hodnoty, unsetni čas a pak teprve nastav setValues.

Šaman
Člen | 2666
+
0
-

Ale o komponentu vůbec nejde, pracuješ jen s polem (resp. IRow, pokud to máš nad Nette\Database)

<?php
public function renderEdit($id) {
	$values = $this->articles->fetchSingle($id);
	unset($values['datetime']);
	$this['addArticle']->setValues($values);
}
?>
Freestyler
Člen | 50
+
0
-

To by šlo ve starším nette, ale teď ActiveRow is read-only. Koukal jsem, že to jde udělat přes update, ale ten syntax mi hlava moc nebere :(..

EDIT: jde mi v podstatě jen o to, abych po setValues zavolal new DateTime a nacpal výsledek do datetime inputu.

Šaman napsal(a):

Ale o komponentu vůbec nejde, pracuješ jen s polem (resp. IRow, pokud to máš nad Nette\Database)

<?php
public function renderEdit($id) {
	$values = $this->articles->fetchSingle($id);
	unset($values['datetime']);
	$this['addArticle']->setValues($values);
}
?>

Editoval Freestyler (31. 7. 2014 23:52)

Zax
Člen | 370
+
0
-

Formulářové prvky jsou taky komponenty, nehledáš tedy náhodou prostě a jednoduše tohle?

$this['addArticle']['datetime']->setValue(new \DateTime);

Omlouvám se jestli ne, já teď vstával…

Editoval Zax (1. 8. 2014 0:03)

Šaman
Člen | 2666
+
0
-

Hm, takže to trochu kecá, že podporuje ArrayAccess. No nic, tak si to převeď na pole.

<?php
public function renderEdit($id) {
	$values = $this->articles->fetchSingle($id)->toArray();
	unset($values['datetime']);
	$this['addArticle']->setValues($values);
}
?>

@Zax: Jj, to by mu pomohlo taky, ale pak se to bude zbytečně nastavovat třikrát. Nejprve aktuálním časem při vytvoření formu, podruhé časem v databázi a potřetí opět aktuálním časem. Imho bych radši poladil to, aby se nastavilo je co chce.

Editoval Šaman (1. 8. 2014 0:12)

Freestyler
Člen | 50
+
0
-

Funguje perfektně, díky!

Šaman napsal(a):

Hm, takže to trochu kecá, že podporuje ArrayAccess. No nic, tak si to převeď na pole.

<?php
public function renderEdit($id) {
	$values = $this->articles->fetchSingle($id)->toArray();
	unset($values['datetime']);
	$this['addArticle']->setValues($values);
}
?>

@Zax: Jj, to by mu pomohlo taky, ale pak se to bude zbytečně nastavovat třikrát. Nejprve aktuálním časem při vytvoření formu, podruhé časem v databázi a potřetí opět aktuálním časem. Imho bych radši poladil to, aby se nastavilo je co chce.