Niezalogowany [ logowanie ]
Subskrybuj kanał ATOM Kanał ATOM

Autor wpisu: Marek, dodany: 26.10.2012 23:11, tagi: php, zend_framework

zfZałóżmy, że w pliku application.ini mamy wpis:

; Paginator
paginator.linesperpage = 10

Jak się do niego dostać w aplikacji?

  • w kontrolerze:
$bootstrap = $this->getInvokeArg('bootstrap');
$pConfig = $bootstrap->getOption('paginator');
  •  gdziekolwiek:
$front = Zend_Controller_Front::getInstance();
$bootstrap = $front->getParam('bootstrap');
$pConfig = $bootstrap->getOption('paginator');

Polecenie:

Zend_Debug::dump($pConfig);

Daje wynik:

array(1) {
  ["linesperpage"] => string(2) "10"
}

Autor wpisu: Marek, dodany: 24.10.2012 22:38, tagi: php, zend_framework

zf

Zend Framework ma to do siebie, że gdy obejrzymy zawartość plików jego biblioteki, zauważymy, że nagminnie korzysta z require_once. Pomimo, że wyrażenie to zabezpiecza  przed ponownym załadowaniem tego samego pliku do pamięci, to rozwiązanie ma swoje wady wydajnościowe. Za każdym razem, gdy parser PHP napotyka na swojej drodze require_once, czesze po dysku celem sprawdzenia czy dany plik istnieje. Nieważne, że ten plik został chwilę wcześniej załadowany do pamięci.

W przypadku, gdy w aplikacji opartej o zf używamy autoloadera, choćby poprzez wywołanie:

require_once 'Zend/Loader/Autoloader.php';
Zend_Loader_Autoloader::getInstance();

możemy zakomentować wszystkie wystąpienia w bibliotece Zenda wyrażenia require_once. Służy do tego np. zgrabna komenda:

cd /path/to/ZendFramework/library
find . -name '*.php' -not -wholename '*/Loader/Autoloader.php' \
      -not -wholename '*/Application.php' -print0 | \
      xargs -0 sed --regexp-extended --in-place 's/(require_once)/\/\/ \1/g'

Żeby nie być gołosłownym zrobiłem prosty test programem Apache Benchmark wywołując 10 tysięcy razy aplikację lokalnie utworzoną poprzez

zf create project zf-stat .

Po podlinkowaniu biblioteki frameworka wywołałem dwukrotnie polecenie:

ab -n 10000 localhost/stat-zf/public

Najpierw na „gołej” instancji Zend Framework 1.12.0, za drugim razem po zakomentowaniu require_once w bibliotece.

Zend Framework 1.12.0 z require_once:

Time taken for tests:   2.725 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Non-2xx responses:      10000
Total transferred:      5700000 bytes
HTML transferred:       3150000 bytes
Requests per second:    3669.87 [#/sec] (mean)
Time per request:       0.272 [ms] (mean)
Time per request:       0.272 [ms] (mean, across all concurrent requests)
Transfer rate:          2042.80 [Kbytes/sec] received

Zend Framework 1.12.0 bez require_once:

Time taken for tests:   2.003 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Non-2xx responses:      10000
Total transferred:      5700000 bytes
HTML transferred:       3150000 bytes
Requests per second:    4992.42 [#/sec] (mean)
Time per request:       0.200 [ms] (mean)
Time per request:       0.200 [ms] (mean, across all concurrent requests)
Transfer rate:          2778.98 [Kbytes/sec] received

Jak widać już przy tak trywialnym teście czas jego trwania wzrósł prawie o połowę, żądania wzrosły z liczby 3669.87 do 4992.42,  średni czas żądania spadł z 0.272 ms do 0.200 ms, a transfer wzrósł z 2042.80 [Kbytes/sec] do 2778.98 [Kbytes/sec].

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Autor wpisu: matipl, dodany: 23.10.2012 17:09, tagi: php

php-logoPółtora roku temu przedstawiłem Wam skomplikowany sposób sprawdzenia platformy/mobilnej przeglądarki za pomocą WURFL (Wireless Universal Resource File) w Zend Framework. Rozwiązanie to wymagało wielu zależności i nie było proste w obsłudze.

Tym razem coś o wiele prostszego. Wykorzystamy do tego wbudowaną w PHP funkcję get_browser(). Jedyne co potrzebujemy z zewnątrz jest to biblioteka browscap, która „nauczy” PHP rozpoznawania platform. Oto przepis:

  1. Ściągamy browscap.ini na nasz serwer i zapisujemy jako /etc/php_browscap.ini.
  2. Edytujemy php.ini dodając/od komentując:
    [browscap]
    browscap = /etc/php_browscap.ini
    
  3. Teraz w PHP możemy w prosty sposób rozpoznać platformę, na której otworzona jest nasza strona:
    $browser = get_browser($request['http_user_agent'], true);
    $platform = isset($browser['platform']) ? $browser['platform'] : null;
    
    switch($platform) {
            case 'iOS':
                    $url = 'http://www.matipl.pl/site-for-ios';
                    break;
            case 'Android':
                    $url = 'http://www.matipl.pl/site-for-android';
                    break;
            case 'SymbianOS':
                    $url = 'http://www.matipl.pl/site-for-symbian';
                    break;
            case 'BlackBerry OS':
                    $url = 'http://www.matipl.pl/site-for-bb';
                    break;
            default:
                    $url = 'http://www.matipl.pl/';
                    break;
    }
    

Prawda, że prosto? Co jakiś czas możemy zaktualizować browscap, w którym co jakiś czas pojawia się „obsługa” nowych urządzeń.

PS: W minionym tygodniu ekipa PHP znów połatała błędy. Polecam update do PHP 5.4.8 i PHP 5.3.18.

Autor wpisu: Kamil Adryjanek, dodany: 20.10.2012 13:27, tagi: symfony2, php

Today i would like to share my recent experience on forms and data dependent fields. Playing with Symfony2 forms some time ago i was looking for best solutions of adding fields to forms that depend on the data / Doctrine object – there was nothing about it in the official Symfony documentation. I thought, as many other developers that the best / easiest way is to pass the current object in form constuctor. Today i know it was wrong but what is the recommended solution? Is there any easy way to add / remove form fields?

Imagine a scenario:

Implementing form in the old way i will write code:

<?php

namespace My\AdminBundle\Form;

use My\AdminBundle\Entity\User;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class UserType extends AbstractType
{
    protected $user = null;

    public function __construct(User $user)
    {
      $this->user = $user;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
      $builder
        ->add('firstName', 'text', array('label' => 'First name'))
        ->add('lastName', 'text', array('label' => 'Last name'))
        ->add('email', 'email', array('label' => 'Email address'))
        ;
      // add permissions for none admin users
      if (!$this->user->isAdmin()) {
        $builder
          ->add('permissions', 'entity', array(
        'label'   => 'Access Permisson',
        'class'   => 'AdminBundle:Permission',
        'multiple'  => true,
        'expanded'  => true
      ))
      }
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'My\AdminBundle\Entity\User'
        ));
    }

    public function getName()
    {
        return 'my_adminbundle_usertype';
    }
}

But according to Bernhard Schussek the recommended way of playing with dependent fields in Symfony forms is to add / remove fields using EventListeneres on form events. Using FormEvent we can access our data object ($event->getData()), current form ($event->getForm()) and determine which fields add or remove accoridng to User object.

Yes, it may seem a bit complicated but i will try to show it in UserType example:

<?php

namespace My\AdminBundle\Form;

use My\AdminBundle\Entity\User;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class UserType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
      $builder
        ->add('firstName', 'text', array('label' => 'First name'))
        ->add('lastName', 'text', array('label' => 'Last name'))
        ->add('email', 'email', array('label' => 'Email address'))
        ;
      $formFactory = $builder->getFormFactory();
      // add permissions for none admin users
      $builder->addEventListener(FormEvents::PRE_SET_DATA,
        function (FormEvent $event) use ($formFactory) {
          if (!$event-&gt;getData()->isAdmin()) {
            $event->getForm()->add($formFactory->createNamed(
              'permissions', 'entity', null, array(
                'label'   => 'Access Permisson',
                'class'   => 'AdminBundle:Permission&quot',
                'multiple'  => true,
                'expanded'  => true
            )));
          }
        }
      );
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'My\AdminBundle\Entity\User'
        ));
    }

    public function getName()
    {
        return 'my_adminbundle_usertype';
    }
}

Maybe it’s better, maybe it’s recommended way of adding dependent fields but in my opinion it also quite complicated. What about forms where we have many dependent fields? It’s a lot of code just for one filed. It really needs simplification. list of online casinos

Autor wpisu: bastard13, dodany: 20.10.2012 12:54, tagi: oop

usprawiedliwienie

Na wstępie zaznaczam, że wpis nie jest przede wszystkim o wzorcu Factory (choć pojawia się on tutaj), wątkiem przewodnim nie są również interfejsy (chociaż i one się pojawią:). Najistotniejszym elementem tego wpisu jest próba przedstawienia procesu analizy, dzięki któremu usuwamy zbędne zależności pomiędzy klasami, a powiązania przestają opierać się na konkretnych implementachach. Czytaj więcej »

Autor wpisu: zleek, dodany: 19.10.2012 11:36, tagi: css, xhtml

Bardzo często dostając projekt graficzny od grafika widzimy, że zostały tam zamieszczone niestandardowe czcionki. Pół biedy jak czcionki te są użyte na elementach, które mogą zostać wycięte i wstawione na stronę w postaci grafik. Problem pojawia się wtedy, gdy sam tekst dostarczany do elementów strony występuje przy użyciu takiej czcionki. Jest jednak na to rada. [...]

Autor wpisu: Vokiel, dodany: 12.10.2012 01:30, tagi: php

PHPCon PL 2012

Chciałem zrobić wpis zaraz po powrocie, ale byłem zbyt wyczerpany ;) Chwila moment i już dwa tygodnie minęły od tegorocznego spotkania PHPCon Poland.

Podobnie jak w latach ubiegłych, spotkanie odbyło się w Hotelu „Przedwiośnie” w Mąchocicach Kapitulnych koło Kielc (btw jeszcze raz wielkie dzięki Łukasz za podwózkę!). Tym razem jednak termin wrześniowy (28 – 30 września) zamiast październikowego z drugiej edycji. Moim zdaniem dobry wybór – bez problemu dało się wytrzymać na sobotnim grillu kilka godzin w jednej bluzie (w przeciwieństwie do ubiegłego roku).

Ponownie ilość chętnych przewyższyła możliwości pojemnościowe, rejestracja została zakończona przed czasem – już w połowie sierpnia

Agenda

W tym roku, wzorem lat ubiegłych, także pojawili się zagraniczni prelegenci: Wim Godden, Thijs Feryn oraz Jeffrey A. “jam” McGuire. Nie zabrakło też bardzo dobrych prezenterów z Polski, pełna agenda dostępna jest na stronie.

Szczególną rzeczą, o której warto wspomnieć było głosowanie na prelekcje. Każdy z zalogowanych użytkowników mógł oddać głoś na wybrane przez siebie propozycje, a przez to mieć wpływ na to, co pojawiło się na finalnej wersji wystąpień. Moim zdaniem umożliwienie odbiorcom aktywnego uczestnictwa w wyborze tematów to świetny pomysł. Doskonale pokazuje ideę tego spotkania – zlotu sympatyków i entuzjastów PHP, zorientowanego na odbiorców.

Organizacja

Jestem pełen podziwu dla organizatorów. Na prawdę należą im się słowa uznania. Niska cena, a taka duża konferencja, tyle prezentacji, do tego w pełne wyżywienie w cenie biletu, zakwaterowanie i jeszcze starczyło na gadżety! Co więcej – nawet na piwko od organizatorów na grillu :)

Wi-fi działało, na prawdę. Na innych konferencjach albo prawie nie działa, albo od razu wiadomo, że nie będzie (bo uczestnicy będą siedzieć z nosami w laptopach zamiast słuchać prezentacji). Nie to, że pojechałem tam na darmowy interent ;) czasem dobrze mieć sygnał żeby coś ćwierknąć (chociaż Twitter nie był tam zbyt popularny).

Całość wystąpień nagrywana, kamera na statywie – z bardzo ciekawym obciążnikiem stabilizującym. Prezenterzy z mikrofonami zakładanymi za ucho – duży plus za uwolnienie im rąk, live coding staje się od razu łatwiejszy. Były nawet próby podawania mikrofonu zadającym pytania na koniec wystąpień – niestety nie zawsze udane. Tutaj mała uwaga do prezenterów – powtarzajcie zadane pytanie. Dzięki temu reszta sali usłyszy o co ktoś pytał, a później całość znajdzie się na nagraniu.

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Wszystkie wpisy należą do ich twórców. PHP.pl nie ponosi odpowiedzialności za treść wpisów.