• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

PHP, TWIG - niedostępny parametr $this

Object Storage Arubacloud
0 głosów
210 wizyt
pytanie zadane 27 lipca 2016 w PHP przez niezalogowany

Witam, dostaję taki błąd:

 Uncaught Error: Using $this when not in object context

 

Próbuję w pliku Twig wywołać funkcję w ten sposób:

{{ first_name|add_worker(name, date_birthday, brand) }}

 

Funkcję przekazałem tak jak jest to pokazane w dokumentacji

$filter = new Twig_SimpleFilter('add_worker', array('Worker', 'add_worker'));
$twig->addFilter($filter);

 

Moja classa wygląda tak:

  class Worker{
    private $first_name;
    private $name;
    private $date_birthday;
    private $brand;
    private $db;

    public function __construct($DB_con){
      $this->db = $DB_con;
    }

    public function add_worker(string $first_name, string $name, string $date_birthday, string $brand){

      $this->first_name = $first_name;
      $this->name = $name;
      $this->date_birthday = $date_birthday;
      $this->brand = $brand;

        try{
          $update = $this->db->prepare("INSERT INTO workers (first_name, name, date_birthday, brand) VALUES ('$this->first_name', '$this->name', '$this->date_birthday', '$this->brand')");
          $update->execute();
          return true;
        }
        catch (PDOException $e){
          echo $e->getMessage();
          return false;
        }

    }
[cd...]
}

 

Problem jest parametrem $this, bo jak usunę wszystkie $this i moja funkcja będzie miała np. wyświetlić przekazane parametry przez echo, to działa. 

2 odpowiedzi

+1 głos
odpowiedź 27 lipca 2016 przez xandros Nałogowiec (29,450 p.)
wybrane 27 lipca 2016
 
Najlepsza

Pare zdań:

- rozwiazanie problemu (ale nie jestem w 100% pewien, bo nie umiem w twiga):

 ```$filter = new Twig_SimpleFilter('add_worker', array('Worker', 'add_worker'));```

powinno być ``` $filter = new Twig_SimpleFilter('add_worker', array(new Worker, 'add_worker')); ```

bo odwołujemy się do obiektu, a nie statycznej metody:

http://php.net/manual/en/function.call-user-func.php#example-5697

- Twig jest warstwą prezentacji. To nie on powinien się komunikować z bazą danych, a jakis kontroler, czy coś w tym rodzaju.

- poczytaj o bindowaniu, bo w 20 wierszu wrzucasz wszystkie parametry do query: 

http://php.net/manual/pl/pdostatement.bindparam.php  

http://php.net/manual/pl/pdostatement.bindcolumn.php

http://php.net/manual/pl/pdostatement.bindvalue.php

Also:

komentarz 27 lipca 2016 przez niezalogowany

Bindować, binduję, ale po prostu jak ćwiczę, to tego nie robię bo mi się nie chce. :D Jednak faktycznie - mogłem o tym napisać. 

Dziękuję za pomoc, teraz działa. 

Jednak to mi drukują jedynkę - czyli wartość true. Myślałem, że filtr zwróci wartość true, ale nie będzie tego drukował. 

Teraz nie rozumiem czym różni

{{ first_name|add_worker(name, date_birthday, brand) }} 

od:

{{ worker.add_worker(first_name, name, date_birthday, brand) }}

Bo obie działają poprawnie, a w przypadku drugiej wersji, to nie trzeba bawić z filtrami.

   

 

Jednak rozumiem już gdzie popełniałem błąd jeśli chodzi o filtry. Dzięki

komentarz 27 lipca 2016 przez writen Nałogowiec (29,060 p.)

A nie lepiej jeśli zamiast filtra dodasz sobie po prostu funkcję: http://twig.sensiolabs.org/doc/advanced.html#functions

I będziesz to wywoływał normalnie?

{{ add_worker(first_name, name, date_birthday, brand) }}

 

komentarz 27 lipca 2016 przez niezalogowany
Tak robię, ale chciałem przetestować filtry, ale niestety nadal nie rozumiem czym się różnią od normalnego wywołania.
0 głosów
odpowiedź 27 lipca 2016 przez writen Nałogowiec (29,060 p.)
Może byś jeszcze łaskawie powiedział, której dokładnie linii dotyczy ten błąd.

Filtry to funkcje, które mają operować na przekazanych danych i zwracać przetworzone dane. Czemu w filtrze wykonujesz operacje na bazie danych i czemu twój filter zwraca wartość logiczną zamiast przetworzonej wartości?

Poza tym w jaki sposób wyobrażasz sobie przekazywanie przez Twig do konstruktora twojej klasy parametru zawierającego(zakładam) uchwyt połączenia z bazą?
komentarz 27 lipca 2016 przez niezalogowany

łaskawie? zwykle proszę o pomoc :)

Przeglądarka wskazuje na linie: 

$this->first_name = $first_name;

czyli tam gdzie zaczynam korzystać z parametru $this.

Po prostu chciałem wywołać tą funkcję i myślałem, że do tego właśnie służą filtry. Wiem, że nie do końca rozumiem działanie jeszcze tego wszystkiego, ale staram się to zrobić i nie odpuszczę. 

Mam jeszcze dwie funkcje: public function add_worker_complete oraz public function add_worker_fault, które miały zadziałać w zależności od tego czy funkcja add_worker zwróci wartość true lub false.

Mógłbyś mnie pokierować jak mam wywołać funkcję tak, żeby działała?

komentarz 27 lipca 2016 przez niezalogowany
Dodam, że początkowo miałem tak:

{{ worker.add_worker(first_name, name, date_birthday, brand) }}

i działa poprawnie, ale niestety drukuje 1 (ponieważ zwraca wartość true). Chciałem, żeby niczego nie drukowało i dlatego zacząłem kombinować z filtrami.

Podobne pytania

0 głosów
1 odpowiedź 287 wizyt
pytanie zadane 10 maja 2018 w PHP przez KoruS Obywatel (1,630 p.)
0 głosów
1 odpowiedź 629 wizyt
0 głosów
1 odpowiedź 555 wizyt
pytanie zadane 18 lutego 2020 w PHP przez MAXIM7 Obywatel (1,990 p.)

92,550 zapytań

141,392 odpowiedzi

319,520 komentarzy

61,935 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...