Nette 2.1 vlastní control

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

Zdravím.

Snažím se vytvořit vlastní control do formuláře – GPS souřadnice (latitude a longitude) s budoucím rozšířením na mapy.cz → vybrání bodu na mapě.

zatím by mi stačil pouze textbox pro latitude a longitude který by odeslal data.
Bohužel získávání vyplněných dat mi nefunguje.

Registraci controlu jsem zkopíroval z funkčních doplňků.

Volání controlu:

$form->addGMapPoint('souradnice', 'Souradnice:');

funguje. Vygeneruje formulář:

<tr>
	<th><label for="frm-competitionEditForm-souradnice">Souradnice:</label></th>
	<td><div><input type="text" name="latitude" id="latitude" value="0"><input type="text" name="longitude" id="longitude" value="0"></div></td>
</tr>

Ale nevím jak při odesílání získávat data z políčka latitude a longitude :-(

Kód mého controlu:

namespace test\NetteForms;

use Nette\Forms\Controls\BaseControl;
use Nette\Utils\Html;

class GMapPoint extends BaseControl
{
    public function __construct( $label = NULL )
    {
        parent::__construct( $label );
        $this->control->type = 'text';
    }

    public function getValue()
    {
        dump( $this->getHttpData() );
        return array( "latitude" => $this->value, "longitude" => $this->value );
    }

    public function getControl()
    {
        $container = Html::el( 'div' );
        $container->add( (string) $this->getTextboxControl( "latitude" ) );
        $container->add( (string) $this->getTextboxControl( "longitude" ) );
        return $container;
    }

    public function getTextboxControl( $name )
    {
        $control = clone parent::getControl();
        $control->id = $name;
        $control->name = $name;
        $control->value = 0;

        return $control;
    }

}

Používám Nette 2.1.

dump( $this->getHttpData() ); vrací NULL

Díky za rady

David Matějka
Moderator | 6445
+
0
-

koukni na stavajici controly – to nacitani se tam resi v prepsane metode loadHttpData

motorcb
Člen | 552
+
0
-

@matej21:
bohužel se mi to nedaří:

class GMapPoint extends BaseControl
{
...
    public function loadHttpData()
    {
        parent::loadHttpData();
        dump( $this->getHttpData() );
        dump( $this->value );
    }

vždy vrací NULL :-(

David Matějka
Moderator | 6445
+
0
-

bude asi problem s vytvarenim toho controlu – hlavne nazvu.. zkus dat do getTextboxControl:

....
$control->name .= "[$name]";
...
motorcb
Člen | 552
+
0
-

@matej21:

Díky za info, ale stále nefunguje:

class GMapPoint extends BaseControl
{

    public function __construct( $label = NULL )
    {
        parent::__construct( $label );
        $this->control->type = 'text';
    }

    public function loadHttpData()
    {
        parent::loadHttpData();
        echo "test2";
        dump( $this->getHttpData() );
        dump( $this->value );
        $this->value = $this->value ? array( (int) array_shift( $this->value ), (int) array_shift( $this->value ) ) : FALSE;
    }

    public function getControl()
    {
        $container = Html::el( 'div' );
        $container->add( (string) $this->getTextboxControl( "latitude" ) );
        $container->add( (string) $this->getTextboxControl( "longitude" ) );
        return $container;
    }

    public function getTextboxControl( $name )
    {
        $control = clone parent::getControl();
        $control->id = $name;
        $control->name .= "[$name]";
        $control->value = 0;

        return $control;
    }
}

Oba dump stále vrací NULL

David Matějka
Moderator | 6445
+
0
-

koukni do kodu, jestli se generuje spravny name; koukni, jestli se odesilaji spravny data atd :) na to prijdes..

motorcb
Člen | 552
+
0
-

@matej21:

Kód vypadá takto:

<tr>
	<th><label for="frm-competitionEditForm-souradnice">Souradnice:</label></th>
	<td>
	   <div>
		<input type="text" name="souradnice[latitude]" id="latitude" value="0">
		<input type="text" name="souradnice[longitude]" id="longitude" value="0">
	   </div>
	</td>
</tr>

koukni do kodu, jestli se generuje spravny name; koukni, jestli se odesilaji spravny data atd :) na to prijdes..

Rád bych se podíval zda se odesílají správná data, ale jak?
Nenapadá mne nic co bych mohl vyzkoušet, sám na to nepřijdu. Nemůže to být BUG v Nette 2.1?

David Matějka
Moderator | 6445
+
0
-

tak uz to mam :)

$this->getHttpData(Nette\Forms\Form::DATA_TEXT, '[]');
motorcb
Člen | 552
+
0
-

@matej21:
Perfektní, to je přesně ONO. Díky

Máš u mne pivo :-)

motorcb
Člen | 552
+
0
-

Tak mám ještě jeden zádrhel :-(

Jak nastavím hodnotu texboxu latitude a longitude v controlu souradnice přes setDefaults?

$aDefaultValues = array(
    'souradnice' => array(
        'latitude' => 10,
        'longitude' => 20,
    ),
);
$form->setDefaults( $aDefaultValues );
class GMapPoint extends BaseControl
{

    public function __construct( $label = NULL )
    {
        parent::__construct( $label );
        $this->control->type = 'text';
    }

    public function loadHttpData()
    {
        $data = $this->getHttpData( Form::DATA_TEXT, '[]' );
        $this->value = array("latitude" => $data[0], "longitude" => $data[1] );
    }

    public function setValue($value)
    {
        echo "volam setValue";
        dump( $value );
        $this->value = array("latitude" => $value['latitude'], "longitude" => $value['longitude'] );
    }

    public function getControl()
    {
        $container = Html::el( 'div' );
        $container->add( (string) $this->getTextboxControl( "latitude" ) );
        $container->add( (string) $this->getTextboxControl( "longitude" ) );
        return $container;
    }

    public function getTextboxControl( $name )
    {
        $control = clone parent::getControl();
        $control->id = $name;
        $control->name .= "[$name]";

        return $control;
    }
}

metoda setValue se volá (ovšem volá se 2×, nejprve s parametrem NULL a následně s mými parametry: array (2) latitude ⇒ 10 longitude ⇒ 20)

Jenže jak nastavím z metody setValue hodnoty texboxů latitude a longitude?

nevěděl by někdo?
Díky

David Matějka
Moderator | 6445
+
0
-

uloz si to do $this->value a pak si to odsud vytahni pri volani getTextboxControl

motorcb
Člen | 552
+
0
-

@matej21:
Opět skvělá rada, díky. Dlužím ti další pivo :-)