v @layout.latte používám proměnnou $id (id spotřebiče) v javascriptu. TRACY hlásí Undefined variable: id

Karel Chramosil
Člen | 114
+
0
-

Část kódu v javasciptu:

<script>
        var ida = 0;
        var url = window.location.href;
        var id_url = url.split("/").pop();
        id_url = parseInt(id_url);
        //console.log(id_url);
        if (id_url > 0) {
            ida = {$id};
        } else {
            ida = 1;
        }
....
				// přesměruje na stránku  název spotřebiče
                case 'název spotřebiče':
                    Read_text('Vybráno, 1-název spotřebiče');
                    window.location.href = aktualni_url_1+"/revize/www/spotrebic/default/" + ida;
                    break;

....

</script>

chyby při spuštění kódu UserPresenter se zobrazí chyby:

57: ida = {$id};

// C:\xampp7_4\htdocs\revize\temp\cache\latte\Presenters-templates-@layout.latte--0a76d5322e.php:659
659: echo LR\Filters::escapeJs($id) /* line 57 */;

Zde je část kódu která nefunguje:

<?php
/**
 * Presenter, který zajišťuje změnu hesla uživatele.
 */

namespace App\Presenters;

use App\Model\User;
use Nette;
use Nette\Application\UI\Form;
use Nette\Security\Passwords;
use Nette\Utils\DateTime;

final class UserPresenter extends SecuredPresenter
{
	/**
	 * Továrna na vytvoření formuláře pro změnu hesla.
	 * @return Nette\Application\UI\Form
	 */

    private $database;
    /** @var Passwords */
    /** @var id */
    private $passwords;
    private $id;

	public function __construct(
	    Nette\Database\Explorer $database,
	    Nette\Security\Passwords $passwords
	) {
		$this->database = $database;
		$this->passwords = $passwords;
	}

    public function actionDefault($id = 1)
    {
        $this->template->id =  $id;
    }

    protected function startup()
    {
        parent::startup();
        //nasatvení menu
        $this->template->fl_pomoc = false;
        $this->template->fl_spotrebic = false;
        $this->template->fl_revize = false;
        $this->template->fl_statistiky = false;
        $this->template->fl_nastaveni = false;

        //menu uživatel
        $this->template->fl_muj_ucet = true;
        $this->template->fl_user_jmeno = false;
        $this->template->fl_user_adresa = false;
        $this->template->fl_user_adresa2 = false;
        $this->template->fl_user_firma = false;
        $this->template->fl_pasvord = true;
        $this->template->fl_user_list = false;

        //menu spotrebic
        $this->template->fl_spotrebic_edit = false;
    }

	protected function createComponentPasswordForm(): Form
	{
		$form = new Form();
		$form->addPassword('oldPassword', 'Staré heslo:', 42)
		//$form->addText('oldPassword', 'Staré heslo:', 42);
			->addRule(Form::FILLED, 'Je nutné zadat staré heslo.');
		$form->addPassword('newPassword', 'Nové heslo:', 42)
		//$form->addText('newPassword', 'Nové heslo:', 42);
			->addRule(Form::MIN_LENGTH, 'Nové heslo musí mít alespoň %d znaků.', 5);
		$form->addPassword('confirmPassword', 'Potvrzení hesla:', 42)
		//$form->addText('confirmPassword', 'Nové heslo:', 42);
			->addRule(Form::FILLED, 'Nové heslo je nutné zadat ještě jednou pro potvrzení.')
			->addRule(Form::EQUAL, 'Zadaná nové hesla se musejí shodovat.', $form['newPassword']);
		$form->addSubmit('set', 'Změnit heslo');
		$form->onSuccess[] = [$this, 'passwordFormSubmitted'];
	return $form;
	}

Pokouším se proměnou $id zpracovat i když ji nepotřebuji, ale nedaří se mne to.
Nemáte nápad jak situaci řešit. Zlobí pouze dva formuláře s hesly.

Předem děkuji za rady.

Karel Chramosil

Karel Chramosil
Člen | 114
+
-1
-

Už jsem problém vyřešil zavoláním fukce v funkci startup():

  $this->actionDefault($this->id);

Stejně děkuji.

Marek Bartoš
Nette Blogger | 1263
+
0
-

Action se volá automaticky, nevolej ji přímo. Spíš to vypadá, že máš i jiné akce mimo default, a tak se ti actionDefault nezavolá vždy.
Btw, když potřebuješ pomoct, dávej celý relevantní kód. Sice máš v ukázce a v tvém řešení private $id, ale v ukázce ho nikde nepoužíváš.

Karel Chramosil
Člen | 114
+
0
-

Nejsem tak dobrý, nechci se přít, ale actionDefault se nezavolala.

<?php
/**
 * Presenter, který zajišťuje změnu hesla uživatele.
 */

namespace App\Presenters;

use App\Model\User;
use Nette;
use Nette\Application\UI\Form;
use Nette\Security\Passwords;
use Nette\Utils\DateTime;

final class UserPresenter extends SecuredPresenter
{
	/**
	 * Továrna na vytvoření formuláře pro změnu hesla.
	 * @return Nette\Application\UI\Form
	 */

    private $database;
    /** @var Passwords */
    private $passwords;
    private $id;

	public function __construct(
	    Nette\Database\Explorer $database,
	    Nette\Security\Passwords $passwords
	) {
		$this->database = $database;
		$this->passwords = $passwords;
        $this->id = 0;
	}

    public function actionDefault($id)
    {
        $this->template->id =  $id;
    }

    protected function startup()
    {
        parent::startup();
        $this->actionDefault($this->id);

        //nasatvení menu
        $this->template->fl_pomoc = false;
        $this->template->fl_spotrebic = false;
        $this->template->fl_revize = false;
        $this->template->fl_statistiky = false;
        $this->template->fl_nastaveni = false;

        //menu uživatel
        $this->template->fl_muj_ucet = true;
        $this->template->fl_user_jmeno = false;
        $this->template->fl_user_adresa = false;
        $this->template->fl_user_adresa2 = false;
        $this->template->fl_user_firma = false;
        $this->template->fl_pasvord = true;
        $this->template->fl_user_list = false;

        //menu spotrebic
        $this->template->fl_spotrebic_edit = false;
    }

	protected function createComponentPasswordForm(): Form
	{
		$form = new Form();
		$form->addPassword('oldPassword', 'Staré heslo:', 42)
		//$form->addText('oldPassword', 'Staré heslo:', 42);
			->addRule(Form::FILLED, 'Je nutné zadat staré heslo.');
		$form->addPassword('newPassword', 'Nové heslo:', 42)
		//$form->addText('newPassword', 'Nové heslo:', 42);
			->addRule(Form::MIN_LENGTH, 'Nové heslo musí mít alespoň %d znaků.', 5);
		$form->addPassword('confirmPassword', 'Potvrzení hesla:', 42)
		//$form->addText('confirmPassword', 'Nové heslo:', 42);
			->addRule(Form::FILLED, 'Nové heslo je nutné zadat ještě jednou pro potvrzení.')
			->addRule(Form::EQUAL, 'Zadaná nové hesla se musejí shodovat.', $form['newPassword']);
		$form->addSubmit('set', 'Změnit heslo');
		$form->onSuccess[] = [$this, 'passwordFormSubmitted'];
	return $form;
	}

	/**
	 * Zpracuje odeslaný formulář. Mění heslo uživatele.
	 * @param Nette\Application\UI\Form $form
	 */
	public function passwordFormSubmitted(Form $form)
	{
		$values = $form->getValues();
		$user = $this->getUser();

		$row = $this->database->table('user')
			->where('username', $user->getIdentity()->username)
			->fetch();

		if (!$this->passwords->verify($values->oldPassword, $row->password)) {
			$this->flashMessage('Staré heslo není platné.');
	        $this->redirect('User:');
		}


        $password = $this->passwords->hash($values->newPassword); // Zahashuje heslo
        $remonte_host  = $_SERVER['HTTP_HOST'];
        $remonte_port = $_SERVER['REMOTE_PORT'];
        $heslo_kdy = DateTime::from(1); //+1 vteřina
        $heslo_kdy = $heslo_kdy->format('Y-m-d H:m:s');
        try {
		    $row = $this->database->table('user')
                ->WHERE('id = ?', $user->getId());
			if($row){
                $this->database->table('user')
                    ->get($user->getId())
                    ->update(array(
                    'password'=>$password,
                    'remonte_host'=> $remonte_host,
                    'remonte_port'=> $remonte_port,
                    'zapsal_id'=>$user->getId(),
                    'heslo_kdy'=>$heslo_kdy
                    ));
                $this->flashMessage('Heslo bylo změněno.', 'success');
                $this->redirect('Homepage:');
            } else  {
                $this->flashMessage( 'Staré heslo není platné.', 'success');
            }
		} catch (NS\AuthenticationException $e) {
			$form->addError('Nelze se připojit do databáze.',  'success');
		}
	}
}

id používám v jiných častí programu, ale musel jsem jej ošetřit.

Hezký den

Pepino
Člen | 256
+
+1
-

@KarelChramosil a voláš vůbec adresu /user/default/ ?

Editoval Pepino (2. 6. 2023 20:16)

m.brecher
Generous Backer | 864
+
+3
-

@KarelChramosil

Omlouvám se za off topic, ale startup() presenteru by se měl používat pouze pro logické řízení, např. autorizaci přístupu. Ty ve startup() předáváš data do šablony. Pro tohle je určená metoda beforeRender():

public function beforeRender()
{
    parent::beforeRender();
	$this->template->something = $something;
    // .....
}

Editoval m.brecher (2. 6. 2023 22:59)