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-08-04

Wyświetlenie okienka potwierdzającego po kliknięciu w link

Czasem przed wykonaniem pewnej akcji (np. przed usunięciem pozycji) chcemy wyświetlić okienko potwierdzające czy na pewno wykonać daną czynność. Aby to zrobić wystarczy dodać do linka atrybut onclick:

Twig:
Usuń
Javacript:
function confirmDelete(id) {
    return confirm("Czy na pewno usunąć wybraną pozycję (" + id + ")?");
}

2015-08-02

Zmiana formatu daty w Joomla! 3.4.3

Załóżmy, że utworzyliśmy artykuł w piątek, 24 lipiec 2015. Jak widać odmiana miesiąca nie jest prawidłowa - można się pobawić i stworzyć funkcję, która prawidłowo (po Polsku) odmienia miesiące. Ja jednak na potrzeby swojego projektu zmienię po prostu format daty - z piątek, 24 lipiec 2015 na piątek, 24-07-2015.
Aby tego dokonać wystarczy zmienić jedną linię w pliku language/overrides/pl-PL.override.ini:

DATE_FORMAT_LC3="l, d F Y"

na 

DATE_FORMAT_LC3="l, d-m-Y"

2015-06-21

Przeniesienie Redmine (2.0) na inny serwer (Ubuntu 14.04)

Na starej maszynce wykonujemy kopię katalogu, w którym znajduje się Redmine (u mnie to katalog redmine katalogu domowym) oraz zrzut bazy (u mnie bazą jest PostgreSQL). Następnie dane przenosimy na docelowy serwer i jedziemy wg poniższej instrukcji:
sudo apt-get install make
sudo apt-get install postgresql
sudo apt-get install postgresql-server-dev-9.3

# utworzenie w bazie usera redmine
psql -U postgresql template1
create user redmine with password 'twoje_haselko';
alter user redmine with superuser;
# wczytanie kopii bazy
\i backup/redmine/day/redmine-2015.03.21.15.28.sql

# wychodzimy z bazy i instalujemy kolejne rzeczy
sudo apt-get install ruby1.9.3 libmysqlclient-dev
sudo apt-get install libmagickcore-dev libmagickwand-dev
sudo gem install bundler
sudo gem install json -v '1.7.3'
sudo gem install pg -v '0.13.2'
cd redmine/redmine-2.0/
bundle install --without development test

# odpalenie redmine
bundle exec ruby script/rails server webrick -e production

# sprawdzenie czy wszystko smiga wchodzac przez http://ip-serwera:3000
Jeśli wszytko ładnie działa to możemy zabrać się za instalację Apache2 oraz Passengera:
sudo apt-get install apache2
sudo gem install passenger
sudo apt-get install libapache2-mod-passenger
Dodajemy PassengerDefaultUser www-data (tylko tę linię) do pliku /etc/apache2/mods-available/passenger.conf - cały plik powinien wyglądać mniej więcej tak:

  PassengerDefaultUser www-data
  PassengerRoot /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini
  PassengerDefaultRuby /usr/bin/ruby

Tworzymy plik /etc/apache2/sites-available/redmine i wpisujemy w nim:
[VirtualHost *:80]
    ServerName redmine.lh
    DocumentRoot /home/user/redmine/redmine-2.0/public
    ServerAdmin twoj@mail.pl
    LogLevel warn
    ErrorLog /var/log/apache2/redmine_error
    CustomLog /var/log/apache2/redmine_access combined
    [Directory /home/user/redmine/redmine-2.0/public]
       Options Indexes FollowSymLinks MultiViews
       AllowOverride None
       Order allow,deny
       allow from all
       RailsBaseURI /redmine
       PassengerResolveSymlinksInDocumentRoot on
    [/Directory]
[/VirtualHost]
Zamień znaki [] na <>.

sudo ln -s /etc/apache2/sites-available/redmine /etc/apache2/sites-enabled/redmine
sudo a2enmod passenger
sudo service apache2 restart

2015-06-19

Instalacja Nginx zamiast Apache2

Nadszedł czas na coś nowego - zrezygnowałem z Apache2 na rzecz Nginx'a. Z Nginxem dobrze działa PHP FPM, który daje kilka ciekawych opcji - np: możliwość użycia eventu Symfony o nazwie kernel.terminate.


Jak zainstalować Nginx'a i PHP FPM pod Mintem (lub Ubuntu)?

# zatrzymujemy apache'a
sudo service apache2 stop

# usuwamy apache'a z autostartu
sudo update-rc.d apache2 disable

# instalujemy nginx'a
sudo apt-get update
sudo apt-get install nginx
sudo service nginx start
sudo service nginx status

# instalujemy PHP FPM
sudo apt-get install php5-fpm

# zmieniamy cgi.fix_pathinfo z 1 na 0
sudo mc -e /etc/php5/fpm/php.ini -> cgi.fix_pathinfo=0

# restartujemy PHP FPM
sudo service php5-fpm restart

Po kilku tygodniach pracy z lokalnie zainstalowanym Nginx'em mam nieodparte wrażenie, że jest on szybszy i lżejszy niż Apache2.