Pokazywanie postów oznaczonych etykietą symfony. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą symfony. Pokaż wszystkie posty

2015-08-25

Symfony2 - debugowanie skryptów uruchamianych z konsoli

Istnieje możliwość debugowania kodu odpalanego z konsoli (app/console). Aby móc cieszyć się takim dobrodziejstwem wystarczy:

w php.ini (dla cli) wpisać:

xdebug.remote_enable=1

przed poleceniem app/console wpisać:

SERVER_PORT=9000 SERVER_NAME='PHPSTORM' php -dxdebug.remote_autostart=On app/console test

2015-08-06

Symfony2 - FOSJsRoutingBundle

Za pomocą bundla FOSJsRoutingBundle można korzystać z routingu Symfony w javascriptowym kodzie. Poniżej krótki przykład:

PHP:

 /**
  * @Route("/ks", options={"expose" = true}, name="nfz.raport_wykbadpoz_kolumny_standardowe")
  * @Template("raport/kolumny_standardowe.html.twig")
  *
  * @return array
  */
 public function kolumnyStandardoweAction()
 {
  $ar_kolumny_standardowe = $this->raportWykbadpozManager->getKolumnyStandardowe();
  return compact('ar_kolumny_standardowe');
 }

JavaScript:

$.wczytajKolumnyStandardowe = function(url){
    var kolumny_standardowe = $("#kolumny_standardowe");

    $.post(Routing.generate("nfz.raport_wykbadpoz_kolumny_standardowe"), {}, function(data){
        kolumny_standardowe.html(data);
    });
};
Należy pamiętać o options={"expose" = true} w annotacjach. Więcej informacji na githubie.

2015-08-05

Symfony2 form - wynik w innej akcji i w nowym oknie

W Symfony po submicie formularza wracamy do tej samej akcji (w naszym przypadku do indexAction()). Aby to zmienić wystarczy dodać odpowiednią opcję przy tworzeniu obiektu formularza (form). Istnieje również możliwość otworzenia wyniku w nowym oknie. Całość można zobaczyć w poniższym kodzie:

 /**
  * @Route("/", name="nfz.raport_wykbapoz")
  * @Template()
  *
  * @return array
  */
 public function indexAction()
 {
  //...
  $form = $this->createForm('nfz_raport_wykbadpoz', $object, [
   'action' => $this->generateUrl('nfz.raport_wykbadpoz_wynik'),
   'attr' => [
    'target' => '_blank'
   ]
  ]);

  return [
   'form' => $form->createView()
  ];
 }

 /**
  * @Route("/wynik", name="nfz.raport_wykbadpoz_wynik")
  * @Template()
  *
  * @param Request $request
  * @return array
  */
 public function wynikAction(Request $request)
 {
  //zabezpieczenie malutkie
  if($request->getMethod() != 'POST') {
   return new RedirectResponse($this->generateUrl('nfz.raport_wykbapoz'));
  }

  //utworzenie obiektu formularza
  $form = $this->createForm('nfz_raport_wykbadpoz');
  //pobranie danych z submitowanego formularza
  $form->handleRequest($request);

  //walidacja formularza
  if($form->isValid()){
   //pobranie danych z formularza
   $data = $form->getData();
  }
  //...
  return [];
 }

Widać tutaj, że funkcja kontrolera wynikAction() przchwytuje dane z submitowanego w indexAction() formularza.

2015-04-03

Symfony2 i generowanie plików PDF

KnpSnappyBundle

Do generowania plików PDF w Symfony2 wiele osób poleca bundla o nazwie KnpSnappyBundle. Wykorzystuje on jednak wkhtmltopdf (open source'owe konsolowe narzędzie do tworzenia plików PDF na podstawie HTML), które trzeba dodatkowo zainstalować na serwerze produkcyjnym (wraz z wieloma innymi bibliotekami). To według mnie spora wada tego bundla ale jeszcze do przeskoczenia. Większym minusem wkhtmltopdf jest to, że PDF'y na różnych maszynach generują różne pliki PDF. Różnice są niby niewielkie ale przy mojej pracy zupełnie dyskwalifikujące to rozwiązanie.

PdfBundle

PdfBundle autorstwa Piotra Śliwy eliminuje wady wcześniej omówionego bundla. Nie trzeba na serwerze instalować osobnych  systemowych narzędzi i na każdej maszynie wydruk wygląda identycznie. PdfBundle korzysta z biblioteki PHPPfd tego samego autora. PHPPfd tworzy pliki PDF (lub pliki graficzne) na podstawie plików XML co może być to istotną wadą dla niektórych użytkowników. Dla mnie jednak jest to rozwiązanie niemal idealne.

PdfBundle - problem z img

Podczas pracy trafiłem na problem, który zawieszał całego Apache'a przy próbie wygenerowania pliku PDF z dużym plikiem jgp:

    
        
    

Aby pozbyć się problemu wystarczy element dynamic-page zmienić na page - czyli:

    
        
    

2015-01-14

Doctrine i Symfony - wyświetlenie SQL'a z parametrami

Wyświetlić utworzonego SQL'a możemy za pomocą polecenia:
$qb->getQuery()->getSQL();

a parametry tegoż zapytania za pomocą polecenia:
$qb->getParameters();

Wcześniej oczywiście tworzymy obiekt $qb oraz zapytanie - np:
$qb = $this->createQueryBuilder('l')
 ->where('l.del = :del')
 ->andWhere('l.wysw = :wysw')
 ->andWhere('lower(l.nazwisko) LIKE lower(:szukana) OR lower(l.nrpwz) LIKE lower(:szukana)')
 ->orderBy('l.nazwisko')
 ->setParameters(array(
  'del' => 'false',
  'wysw' => 'true',
  'szukana' => '%' . $szukana . '%'
 ));

Wynik zapytania pobieramy w poniższy sposób:
$qb->getQuery()->getResult();

2015-01-13

Doctrine Symfony PostgreSQL - LIKE i OR

Przykład zapytania SQL z klauzulą LIKE:
$qb = $this->createQueryBuilder('k')
 ->where('k.kod_res_8 = :kod_res_8')
 ->andWhere('lower(k.ulica) LIKE lower(:ulica)')
 ->setParameter('kod_res_8', $kod_res_8)
 ->setParameter('ulica', $ulica . '%')
 ->setMaxResults(1);

Przykład zapytania SQL z klauzulą LIKE i OR:
$qb = $this->createQueryBuilder('j')
 ->where('j.del = :del')
 ->andWhere('j.wysw = :wysw')
 ->andWhere('lower(j.nazw) LIKE lower(:szukana) OR lower(j.regon) LIKE lower(:szukana)')
 ->orderBy('j.nazw')
 ->setParameters(array(
  'del' => 'false',
  'wysw' => 'true',
  'szukana' => '%' . $szukana . '%'
 ));

return $qb->getQuery()->getResult();

2014-05-30

[php][symfony] FOSUserBundle - modyfikacja routingu

Cel


Zmienić ścieżkę logowania z:

moja_witryna.lh/login
na:

moja_witryna.lh/xyz_login

Rozwiązanie


Aby tego dokonać wystarczą dwa proste kroki przedstawione poniżej.

Usuwamy domyślny routing fos_user_security i dajemy własny


W pliku routing.yml modyfikujemy zapis

fos_user_security:
    resource: "@FOSUserBundle/Resources/config/routing/security.xml"

na:

fos_user_security_login:
    pattern: /xyz_login
    defaults: { _controller: FOSUserBundle:Security:login }

fos_user_security_check:
    pattern: /xyz_login_check
    defaults: { _controller: FOSUserBundle:Security:check }

fos_user_security_logout:
    pattern: /xyz_logout
    defaults: { _controller: FOSUserBundle:Security:logout }

Modyfikujemy security.yml


Zmieniamy:

firewalls:
        main:
            pattern: ^/
            form_login:
                provider: fos_userbundle
                csrf_provider: form.csrf_provider
            logout:       true
            anonymous:    true

na:

firewalls:
        main:
            pattern: ^/
            form_login:
                provider: fos_userbundle
                csrf_provider: form.csrf_provider
                login_path: fos_user_security_login
                check_path: fos_user_security_check
            logout:
                path: fos_user_security_logout
            anonymous:    true