Vytvoření vlastního controlu

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

Zdravím,
chci vytvořit vlastní control ( text input a vedle button). Tlačítkem se otevře CKFinder pro vybrání fotky a po vybraní se url obrázku vloží do text inputu. Momentálně jsem se nějak prokousal tou hierarchií tříd komponent modelu a controlů a dal dohromady tohle a snad by to mělo fungovat.
Dělal jste někdo něco podobného a případně jak jste to řešil? Napadá mě totiž, jestli bych to neměl dělat nějak přes ty kontejnery, že by ImageSelector byl kontejner pro button a text input a zároveň fungoval jako control. Ten příklad dole má taky jeden zádrhel a to, že nejde volat tu metodu exportRules ze třídy BaseControl, protože je privátní, což mě právě přívádí k tomu, že tam je něco špatně, protože bych musel měnit rozsah viditelnosti u metody z frameworku.

<?php
use Nette\Forms\Controls\BaseControl,
        Nette\Utils\Html;

class ImageSelector extends BaseControl {

    public function __construct($caption = NULL) {
        parent::__construct($caption);
        $this->control = Html::el('div')->add($this->control)->add(Html::el('input type=button value=Vybrat'));
    }

    public function getControl()
    {
        $this->setOption('rendered', TRUE);

	$control = clone $this->control;

        $name = $this->getHtmlName();

        $text = $control[0];
        $button = $control[1];

	$text->name = $name;
	$text->disabled = $this->disabled;
	$text->id = $this->getHtmlId();
	$text->required = $this->isRequired();
        $text->value = $this->getValue();

        $button->name = $name . '_button';

        /*
	$rules = BaseControl::exportRules($this->rules);
	$rules = substr(json_encode($rules), 1, -1);
	$rules = preg_replace('#"([a-z0-9]+)":#i', '$1:', $rules);
	$rules = preg_replace('#(?<!\\\\)"([^\\\\\',]*)"#i', "'$1'", $rules);
         *
         */
	//$text->data('nette-rules', $rules ? $rules : NULL);

	return $control;
    }
}
?>