Vlastní renderer – specifikace submit buttonu

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

Mám napsán vlastní renderer kde jsem si přepsal wrappers podle potřeby.

class SettingsFormRenderer extends Rendering\DefaultFormRenderer
{
	/** @var array of HTML tags */
	public $wrappers = array(
		'form' => array(
			'container' => NULL,
			'errors' => TRUE,
		),

		'error' => array(
			'container' => 'ul class=error',
			'item' => 'li',
		),

		'group' => array(
			'conainer' => 'fieldset',
			'label' => 'legend',
			'description' => 'p',
		),

		'controls' => array(
			'conainer' => 'table',
		),

		'pair' => array(
			'container' => 'div class=control-group',
			'.required' => 'required',
			'.optional' => NULL,
			'.odd' => NULL,
		),

		'control' => array(
			'container' => 'div class=controls',
			'.odd' => NULL,
			'errors' => FALSE,
			'description' => 'small',
			'requiredsuffix' => '',
			'.required' => 'required',
			'.text' => 'text input-block-level',
			'.file' => 'text',
			'.submit' => 'button',
			'.image' => 'imagebutton',
			'.button' => 'button',
		),

		'label' => array(
			'container' => 'label class=control-label',
			'suffix' => NULL,
			'requiredsuffix' => '',
		),

		'hidden' => array(
			'container' => 'div',
		),

	);
}

Problém je v tom že potřebuji pro input type submit definovat vlastní pravidla a zároveň mít stále možnost vypsat formulář pouze pomocí {control formName}. Pravidly myslím nejenom speciální třídu ale i label a pair. Nějaká rada jak to udělat?

vvoody
Člen | 910
+
0
-

Prepíš metódu renderControl

Marsme
Člen | 75
+
0
-

vvoody napsal(a):

Prepíš metódu renderControl

Moc nevím co tam přesně mám přepsat. Mohl by jsi mě trochu navést. Potřebuji aby se mi vůbec nevypisoval label a aby byl celý pair v čistém divu a input měl class control-input.

vvoody
Člen | 910
+
0
-

Pri input type submit sa ti vypisuje label? Keď nechceš vypísať label tak uprav renderLabel keď parameter control bude submit, vrátiš prázdny string, inak vrátiš návratovú hodnotu metódy ktorú prepisuješ (parent::renderLabel).

Pri buttony sa renderujú cez renderPairMulti, tam parameter je ale už pole, takže si kontroluješ triedu inštancie prvého prvku toho parametra. Ak to bude submit button tak si renderovanie spravíš po svojom, ak nie tak vrátiš pôvodné.

Marsme
Člen | 75
+
0
-

Vyřešil jsem to takhle. Jen se chci zeptat jestli to je správně. Fungovat to funguje.

public function renderPairMulti(array $controls)
	{
		$s = array();
		foreach ($controls as $control) {
			if (!$control instanceof \Nette\Forms\IControl) {
				throw new \Nette\InvalidArgumentException("Argument must be array of IFormControl instances.");
			}

			//if control is instanceof Button, add class
			if ($control instanceof \Nette\Forms\Controls\Button) {
				$element = $control->getControlPrototype();
				$element->class("btn btn-large btn-primary");
			}

			$s[] = (string) $control->getControl();
		}

		$pair = $this->getWrapper('pair container');
		$pair->add($this->getWrapper('control container')->setHtml(implode(" ", $s)));
		return $pair->render(0);
	}