Niezalogowany [ logowanie ]
Subskrybuj kanał ATOM Kanał ATOM    Subskrybuj kanał ATOM dla tagu php Kanał ATOM (tag: php)

Autor wpisu: Kamil Adryjanek, dodany: 26.10.2011 21:43, tagi: symfony, php

Default symfony 1.4 file validator can validate only some basic file attributes. Sometimes we need more, for example we want to prevent small images from being uploaded. Code below presents my custom sfImageFileValidator which allows you to apply some dimensions constraints to image file validation, e.g. max_height or max_width.

&lt;/p&gt;<br />
&lt;p&gt;&amp;lt;?php&lt;/p&gt;<br />
&lt;p&gt;/**&lt;br /&gt;<br />
 * sfImageFileValidator allows you to apply constraints to image file upload, it extend the sfFileValidator functions.&lt;br /&gt;<br />
 *&lt;br /&gt;<br />
 * @author     Kamil Adryjanek &amp;lt;kamil.adryjanek@gmail.com&amp;gt;&lt;br /&gt;<br />
 */&lt;br /&gt;<br />
class sfImageFileValidator extends sfValidatorFile&lt;br /&gt;<br />
{&lt;br /&gt;<br />
    /**&lt;br /&gt;<br />
     * Configures the current validator.&lt;br /&gt;<br />
     *&lt;br /&gt;<br />
     * Available options:&lt;br /&gt;<br />
     *&lt;br /&gt;<br />
     *  * max_height:             The maximum file height in pixels&lt;br /&gt;<br />
     *  * min_height:             The minimum file height in pixels&lt;br /&gt;<br />
     *  * max_width:              The maximum file width in pixels&lt;br /&gt;<br />
     *  * min_width:              The minimum file width in pixels&lt;br /&gt;<br />
     *&lt;br /&gt;<br />
     * Available error codes:&lt;br /&gt;<br />
     *&lt;br /&gt;<br />
     *  * max_height&lt;br /&gt;<br />
     *  * min_height&lt;br /&gt;<br />
     *  * max_width&lt;br /&gt;<br />
     *  * min_width&lt;br /&gt;<br />
     *&lt;br /&gt;<br />
     * @param array $options   An array of options&lt;br /&gt;<br />
     * @param array $messages  An array of error messages&lt;br /&gt;<br />
     *&lt;br /&gt;<br />
     * @see sfValidatorBase&lt;br /&gt;<br />
     */&lt;br /&gt;<br />
    public function configure($options = array(), $messages = array())&lt;br /&gt;<br />
    {&lt;br /&gt;<br />
        parent::configure($options, $messages);&lt;/p&gt;<br />
&lt;p&gt;        $this-&amp;gt;addOption(&amp;amp;#039;max_height&amp;amp;#039;);&lt;br /&gt;<br />
        $this-&amp;gt;addOption(&amp;amp;#039;min_height&amp;amp;#039;);&lt;br /&gt;<br />
        $this-&amp;gt;addOption(&amp;amp;#039;max_width&amp;amp;#039;);&lt;br /&gt;<br />
        $this-&amp;gt;addOption(&amp;amp;#039;min_width&amp;amp;#039;);&lt;/p&gt;<br />
&lt;p&gt;        $this-&amp;gt;addMessage(&amp;amp;#039;max_height&amp;amp;#039;, &amp;amp;#039;File is too high (maximum is %max_height% pixels, %height% given).&amp;amp;#039;);&lt;br /&gt;<br />
        $this-&amp;gt;addMessage(&amp;amp;#039;min_height&amp;amp;#039;, &amp;amp;#039;File is too short (minimum is %min_height% pixels, %height% given).&amp;amp;#039;);&lt;br /&gt;<br />
        $this-&amp;gt;addMessage(&amp;amp;#039;max_width&amp;amp;#039;, &amp;amp;#039;File is too wide (maximum is %max_width% pixels, %width% given).&amp;amp;#039;);&lt;br /&gt;<br />
        $this-&amp;gt;addMessage(&amp;amp;#039;min_width&amp;amp;#039;, &amp;amp;#039;File is too thin (minimum is %min_width% pixels, %width% given).&amp;amp;#039;);&lt;br /&gt;<br />
    }&lt;/p&gt;<br />
&lt;p&gt;    /**&lt;br /&gt;<br />
     * This validator always returns a sfValidatedFile object.&lt;br /&gt;<br />
     *&lt;br /&gt;<br />
     * The input value must be an array with the following keys:&lt;br /&gt;<br />
     *&lt;br /&gt;<br />
     *  * tmp_name: The absolute temporary path to the file&lt;br /&gt;<br />
     *  * name:     &lt;div style=&quot;display: none&quot;&gt;&lt;a href='http://viagralowestprice.com/'&gt;buy viagra uk&lt;/a&gt;&lt;/div&gt; The original file name (optional)&lt;br /&gt;<br />
     *  * type:     The file content type (optional)&lt;br /&gt;<br />
     *  * error:    The error code (optional)&lt;br /&gt;<br />
     *  * size:     The file size in bytes (optional)&lt;br /&gt;<br />
     *&lt;br /&gt;<br />
     * @see sfValidatorBase&lt;br /&gt;<br />
     */&lt;br /&gt;<br />
    protected function doClean($value)&lt;br /&gt;<br />
    {&lt;br /&gt;<br />
        if (!is_array($value) || !isset($value[&amp;amp;#039;tmp_name&amp;amp;#039;])) {&lt;br /&gt;<br />
            throw new sfValidatorError($this, &amp;amp;#039;invalid&amp;amp;#039;, array(&amp;amp;#039;value&amp;amp;#039; =&amp;gt; (string) $value));&lt;br /&gt;<br />
        }&lt;/p&gt;<br />
&lt;p&gt;        // get image dimensions&lt;br /&gt;<br />
        list($wi&amp;lt;div style=&amp;quot;display: none&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;http://isidoreguest.devhub.com/blog/1440105-how-do-you-know-when-your-sons-father-wants-you-back/&amp;quot;&amp;gt;How To Make Ex Want You Back Leave The Girl&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;dth, $height) = getimagesize($value[&amp;amp;#039;tmp_name&amp;amp;#039;]);&lt;/p&gt;<br />
&lt;p&gt;        // check file height&lt;br /&gt;<br />
        if ($this-&amp;gt;hasOption(&amp;amp;#039;max_height&amp;amp;#039;) &amp;amp;&amp;amp; $this-&amp;gt;getOption(&amp;amp;#039;max_height&amp;amp;#039;) &amp;lt; (int) $height) {&lt;br /&gt;<br />
            throw new sfValidatorError($this, &amp;amp;#039;max_height&amp;amp;#039;, array(&amp;amp;#039;max_height&amp;amp;#039; =&amp;gt; $this-&amp;gt;getOption(&amp;amp;#039;max_height&amp;amp;#039;), &amp;amp;#039;height&amp;amp;#039; =&amp;gt; (int) $height));&lt;br /&gt;<br />
        }&lt;/p&gt;<br />
&lt;p&gt;        if ($this-&amp;gt;hasOption(&amp;amp;#039;min_height&amp;amp;#039;) &amp;amp;&amp;amp; $this-&amp;gt;getOption(&amp;amp;#039;min_height&amp;amp;#039;) &amp;gt; (int) $height) {&lt;br /&gt;<br />
            throw new sfValidatorError($this, &amp;amp;#039;min_height&amp;amp;#039;, array(&amp;amp;#039;min_height&amp;amp;#039; =&amp;gt; $this-&amp;gt;getOption(&amp;amp;#039;min_height&amp;amp;#039;), &amp;amp;#039;height&amp;amp;#039; =&amp;gt; (int) $height));&lt;br /&gt;<br />
        }&lt;/p&gt;<br />
&lt;p&gt;        <div style="display: none"><a href='http://online-cialis-buy.com/'>cialis vs levitra</a></div> // check file width&lt;br /&gt;<br />
        if ($this-&amp;gt;hasOption(&amp;amp;#039;max_width&amp;amp;#039;) &amp;amp;&amp;amp; $this-&amp;gt;getOption(&amp;amp;#039;max_width&amp;amp;#039;) &amp;lt; (int) $width) {&lt;br /&gt;<br />
            throw new sfValidatorError($this, &amp;amp;#039;max_width&amp;amp;#039;, array(&amp;amp;#039;max_width&amp;amp;#039; =&amp;gt; $this-&amp;gt;getOption(&amp;amp;#039;max_width&amp;amp;#039;), &amp;amp;#039;width&amp;amp;#039; =&amp;gt; (int) $width));&lt;br /&gt;<br />
        }&lt;/p&gt;<br />
&lt;p&gt;        if ($this-&amp;gt;hasOption(&amp;amp;#039;min_width&amp;amp;#039;) &amp;amp;&amp;amp; $this-&amp;gt;getOption(&amp;amp;#039;min_width&amp;amp;#039;) &amp;gt; (int) $width) {&lt;br /&gt;<br />
            throw new sfValidatorError($this, &amp;amp;#039;min_width&amp;amp;#039;, array(&amp;amp;#039;min_width&amp;amp;#039; =&amp;gt; $this-&amp;gt;getOption(&amp;amp;#039;min_width&amp;amp;#039;), &amp;amp;#039;width&amp;amp;#039; =&amp;gt; (int) $width));&lt;br /&gt;<br />
        }&lt;/p&gt;<br />
&lt;p&gt;        // check other options&lt;br /&gt;<br />
        return parent::doClean($value);&lt;br /&gt;<br />
    }&lt;br /&gt;<br />
}&lt;br /&gt;<br />
?&amp;gt;&lt;/p&gt;<br />
&lt;p&gt;

How to use this code?

&lt;/p&gt;<br />
&lt;p&gt;&amp;lt;?php&lt;/p&gt;<br />
&lt;p&gt;class PhotoForm extends sfForm&lt;br /&gt;<br />
{&lt;br /&gt;<br />
    public function configure()&lt;br /&gt;<br />
    {&lt;/p&gt;<br />
&lt;p&gt;        //...&lt;/p&gt;<br />
&lt;p&gt;        $this-&amp;gt;widgetSchema[&amp;amp;#039;photo&amp;amp;#039;] = new sfWidgetFormInputFileEditable(array(&lt;br /&gt;<br />
            &amp;amp;#039;label&amp;amp;#039; =&amp;gt; &amp;amp;#039;User photo&amp;amp;#039;,&lt;br /&gt;<br />
            &amp;amp;#039;file_src&amp;amp;#039; =&amp;gt; &amp;amp;#039;/uploads/photos/&amp;amp;#039;.$this-&amp;gt;getObject()-&amp;gt;getPhoto(),&lt;br /&gt;<br />
            &amp;amp;#039;is_image&amp;amp;#039; =&amp;gt; true,&lt;br /&gt;<br />
            &amp;amp;#039;edit_mode&amp;amp;#039; =&amp;gt; !$this-&amp;gt;isNew(),&lt;br /&gt;<br />
            &amp;amp;#039;template&amp;amp;#039; =&amp;gt; &amp;amp;#039;&amp;lt;div&amp;gt;%file%&amp;lt;br /&amp;gt;%input%&amp;lt;br /&amp;gt;%delete% %delete_label%&amp;lt;/div&amp;gt;&amp;amp;#039;,&lt;br /&gt;<br />
        ));&lt;/p&gt;<br />
&lt;p&gt;        $this-&amp;gt;validatorSchema[&amp;amp;#039;photo&amp;amp;#039;] = new sfImageFileValidator(array(&lt;br /&gt;<br />
                &amp;amp;#039;required&amp;amp;#039;        =&amp;gt; true,&lt;br /&gt;<br />
                &amp;amp;#039;mime_types&amp;amp;#039;    =&amp;gt; array(&amp;amp;#039;image/jpeg&amp;amp;#039;, &amp;amp;#039;image/png&amp;amp;#039;, &amp;amp;#039;image/gif&amp;amp;#039;, &amp;amp;#039;image/pjpeg&amp;amp;#039;),&lt;br /&gt;<br />
                &amp;amp;#039;max_size&amp;amp;#039;        =&amp;gt; &amp;amp;#039;1048576&amp;amp;#039;,&lt;br /&gt;<br />
                &amp;amp;#039;min_height&amp;amp;#039;    =&amp;gt; &amp;amp;#039;640&amp;amp;#039;,&lt;br /&gt;<br />
                &amp;amp;#039;min_width&amp;amp;#039;        =&amp;gt; &amp;amp;#039;480&amp;amp;#039;,&lt;br /&gt;<br />
                &amp;amp;#039;path&amp;amp;#039;            =&amp;gt; sfConfig::get(&amp;amp;#039;sf_upload_dir&amp;amp;#039;).&amp;amp;#039;/photos&amp;amp;#039;,&lt;br /&gt;<br />
            ), array(&lt;br /&gt;<br />
                &amp;amp;#039;required&amp;amp;#039;        =&amp;gt; &amp;quot;Photo is required!&amp;quot;,&lt;br /&gt;<br />
                &amp;amp;#039;min_height&amp;amp;#039;    =&amp;gt; &amp;quot;Custom message for height vaidation.&amp;quot;,&lt;br /&gt;<br />
                &amp;amp;#039;min_width&amp;amp;#039;        =&amp;gt; &amp;quot;File is too thin (minimum is %min_width% pixels, %width% given).&amp;quot;&lt;br /&gt;<br />
        ));&lt;/p&gt;<br />
&lt;p&gt;        $this-&amp;gt;validatorSchema[&amp;amp;#039;photo_delete&amp;amp;#039;] = new sfValidatorPass();&lt;/p&gt;<br />
&lt;p&gt;        //…&lt;/p&gt;<br />
&lt;p&gt;    }&lt;br /&gt;<br />
}&lt;/p&gt;<br />
&lt;p&gt;?&amp;gt;&lt;br /&gt;<br />

How To Make Ex Want You Back Leave The Girl zp8497586rq

Autor wpisu: singles, dodany: 24.10.2011 23:00, tagi: php

W ciągu ostatnich 2 lat byłem na kilku konferencjach, jednakże większość z nich powiązana była z frontendem. Nie udało mi się jednak zaliczyć PHPCona w roku 2010 – a biorąc pod uwagę moje zainteresowania – wydarzenia teoretycznie dla mnie najważniejszego. Stąd też w tym roku nie omieszkałem opuścić największej i chyba jedynej czysto PHPowej konferencji w naszym kraju. Mowa oczywiście PHPCon tekst który właśnie czytacie jest relacją z tego wydarzenia. Jak większość moich relacji, postaram się zawrzeć w niej istotne dla mnie rzeczy z nadzieją, że organizatorzy przeczytają ten tekst i wyciągną ewentualne wnioski.

Prezentacje

Dzięki temu, że była tylko jedna ścieżka, mogę krótko opisać każdą prezentację i wyrazić swoje zdanie na ich temat. Piszę z pamięci, bo na stronie eventu można znaleźć tylko prezentacje gości z zagranicy (z jednym wyjątkiem). Przypadek? Chyba nie do końca – chodzi tutaj raczej o poziom Polska/zagranica. Ale o tym na końcu wpisu.

Jednakże, nie chciałbym powtarzać opinii, które bedę zamieszczał na stronie eventu, tak więc zainteresowanych moim zdaniem zapraszam na joind.in.

Miejscówka

Tutaj mam spory dylemat z oceną. Może zaczniemy od tego co na plus. Hotel w górach, co owocowało ładnymi widokami i przyjemnym powietrzem. Bardzo wygodne łóżka, basen na miejscu, cały hotel dla nas, tak więc nocne imprezy nikomu nie przeszkadzały (a byłem raczej tym śpiącym niż imprezującym). Na minus – umiejscowienie hotelu na mapie Polski. Dojazd? Tragiczny. Pociągiem z Poznania można było dojechać z 4 przesiadkami, albo ekspresem z jedną przesiadką – w Warszawie… Samolot? Zapomnijcie. Dodatkowo roboty drogowe wokół Kielc. Dla kilku znanych mi osób, dojazd był największą przeszkodą w uczestnictwie w konferencji. Hotel? Widać, że lata swojej świetności ma za sobą. Sala wykładowa to po prostu sala taneczna, z rozstawionymi niewygodnymi krzesłami, z kiepskim nagłośnieniem. Aczkolwiek na miejscu prowadzone były prace remontowe, tak więc bardzo możliwe, że za rok będzie w lepszym stanie.

I przy okazji mała uwaga dla organizatorów – pod koniec konferencji, jak sami słyszeliście, kilka osób szukało transportu do Kielc. Mam propozycję – następnym razem, jeśli lokalizacja się nie zmieni (a niestety w to wątpie), proponuję wynajęcie małego prywatnego busa, który przetransportowałby chętnych na/z dworca w Kielcach – wcale się nie zdziwię, gdyby zainteresowanym nie będzie przeszkadzała nawet opłata za taką usługę.

WiFi

WiFi działało lepiej niż się spodziewałem (kiedy już udało się znaleźć dobre miejsce), aczkolwiek brak jakiegokolwiek szyfrowania powodował, że miałem opory przed swobodnym korzystaniem z takiej sieci. Sieci w pokojach (przynajmniej u mnie) nie było.

Jedzenie

Jedzenie smaczne, pod dostatkiem (w trakcie śniadania czy też kolacji), łącznie z barem, gdzie można było kupić piwo (czy tez przywieźć własne, kupione nie na terenie hotelu). Jednakże, w porównaniu do innych konferencji, nie było stale dostępnej kawy, herbaty czy też ciastek. Odnośnie kawy, cytat kolegi który pija takowy napój:

pierwszego dnia żeby dostać kawę, trzeba było zapłacić 6zł (+2zł za mleko). potem drugiego dnia, do śniadania, była już wysypana w .. misce i można było sobie nałożyć łyżkę i zalać.

A w ciągu dnia?

no to jedynie kupić mozna było, nie znalezlismy nigdzie indziej zrodla kawy :)

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

Autor wpisu: batman, dodany: 24.10.2011 08:00, tagi: php

Najpopularniejszym językiem do tworzenia aplikacji internetowych jest niewątpliwie PHP. To w tym języku powstały najpopularniejsze fora, systemy blogów oraz cms-y. Mimo powolnego rozwoju, braku wyraźnych planów na przyszłość oraz mocno rozdrobnionej społeczności programistów i twórców, PHP zdołał utrzymać dominującą pozycję na rynku, a nawet przyciągnąć uwagę takich gigantów jak Microsoft.

Ostatnie kilka tygodni przyniosło wiele ciekawych informacji dotyczących samego języka oraz powiązanych z nim technologii. Powstało wiele narzędzi, światło dzienne ujrzały kolejne chmury dedykowane PHP, a sam język wkrótce czeka duża aktualizacja.

PHP 5.4

PHP w wersji 5 został wydany w roku 2004. Przez kolejne pięć lat niewiele się zmienił, aż do wydania wersji 5.3, która była małą rewolucją. Ekipa odpowiedzialna za język przyspieszyła prace, ponieważ już w 2011 roku pojawiła się beta kolejnej wersji PHP, oznaczonej numerem 5.4. Ze wszystkich wprowadzonych zmian najbardziej cieszą mnie:

  • wbudowany serwer deweloperski,
  • traits,
  • <?= działający zawsze, niezależnie od ustawienia short_open_tag.

Pełną listę zmian pierwszej bety znajdziecie pod adresem http://www.php.net/releases/NEWS_5_4_0_beta1.txt.

Narzędzia

W dziedzinie narzędzi mamy wysyp aplikacji od IDE/edytorów począwszy, przez system “paczkujący”, na nowych frameworkach kończąc.

Zacznijmy od IDE/edytorów:

  • Adobe Flash Builder for PHP – Adobe wraz z Zendem wypuściły IDE pozwalające tworzyć aplikacje, których frontend budowany jest we Fleksie, a backend w PHP. Miałem okazję brać udział w testach wersji pre release i szczerze przyznam, że narzędzie to robi wrażenie.
  • WebMatrix 2 – druga wersja (jeszcze w fazie beta) narzędzia wydanego przez Microsoft, służącego do “bezkodowego” tworzenia aplikacji. Narzędzie powstało z myślą o ludziach niekoniecznie technicznych, ale wymagający użytkownicy również będą z niego zadowoleni. Spośród wielu wprowadzonych zmian, na uwagę zasługuje podpowiadanie składni PHP oraz niektórych aplikacji w nim stworzonych, np. WordPressa.
  • PhpStorm 3 – wprawdzie jest to wersja EAP (Early Access Program), ale już teraz wiadomo jakie nowe funkcjonalności się pojawią. A będą to m.in. wbudowany profiler Xdebug, wykrywanie zduplikowanego kodu oraz tworzenie diagramów UML.
  • Zend Studio 9 – również w fazie beta, znalazło się w zestawieniu ponieważ w połączeniu z chmurą Zenda (o czym za chwilę) powoduje, iż tworzenie aplikacji PHP, a następnie ich wdrażanie, jest bardziej niż proste.

Kolejną podkategorią narzędzi są frameworki. Tutaj tylko (albo aż) dwie pozycje:

  • Symfony 2 – pisałem już na blogu o tym frameworku, więc nie będę się powtarzał. Napiszę jedynie, iż framework ten nie przypadł mi do gustu.
  • Zend Framework 2 – mocno spóźniony i niedokończony, ale w końcu dostępny. Z pierwszych nieśmiałych prób korzystania z niego, można wywnioskować, że za kilka miesięcy będzie to dobry, jeśli nie najlepszy framework PHP. Jednak za porządne testowanie wezmę się dopiero wtedy, gdy wszystkie komponenty będą już przygotowane.

Wraz z premierą ZF2 pojawił się ciekawy projekt o nazwie ZF packages. Jest to system paczek możliwych do zainstalowania w naszej aplikacji przy pomocy pyrus, następcy pear. Daje to nadzieje na pojawienie się w PHP systemu paczek z prawdziwego zdarzenia. Dlaczego? Ponieważ pieczę na nimi będzie sprawowała firma od PHP i Zend Frameworka.

Chmura

Niezaprzeczalnym hitem ostatnich lat w dziedzinie hostowania aplikacji, jest chmura. Na tym polu PHP również dobrze się trzyma, zdobywając kolejne przyczółki.

  • Windows Azure – tworzenie, wdrażanie oraz utrzymywanie aplikacji PHP w chmurze Microsoftu jest bardziej niż proste, co niejednokrotnie udowodnił Maarten Balliauw, twórca Windows Azure SDK dla języka PHP.
  • PHPFog – chmura dedykowana językowi PHP, zbudowana w oparciu o infrastrukturę Amazona
  • Azure+ – kolejna chmura dedykowana PHP. W odróżnieniu od PHPFog, została zbudowana na platformie Windows Azure.
  • Zend Developer Cloud Platform – najmłodsza chmura dedykowana PHP wyszła spod igły firmy Zend i wszystko wskazuje na to, że będzie najlepszą pod względem możliwości chmurą dedykowaną temu językowi. Dzięki integracji z Zend Studio (od wersji 9), deploy aplikacji do chmury odbywa się automatycznie. Jeśli nie chcemy/nie możemy korzystać z Zend Studio, wówczas mamy możliwość wdrażania aplikacji przy pomocy Gita lub przy pomocy protokołu SFTP. Po przeprowadzeniu pierwszych testów jest pod ogromnym wrażeniem. Od momentu zalogowania się na konto, do utworzenia aplikacji opartej o Zend Framework upłynęło tylko kilka minut. Więcej czasu zajęło mi generowanie kluczy i konfigurowanie klienta Git.

Podsumowanie

Pojawiające się narzędzia i projekty bazujące na PHP pokazują, iż język zaczyna być postrzegany nie tylko w kontekście domowych stron oraz programistów “hello world”. Obawiam się, że kolejne projekty paradoksalnie pogorszą sprawę, wprowadzając jeszcze większą fragmentację świata PHP. Z drugiej jednak strony może dojść do sytuacji, w której rynek sam się oczyści i z chaosu frameworków, edytorów oraz innych narzędzi, wyłoni się garstka najlepszych, dla których reszta będzie nic nieznaczącym tłem.

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

Autor wpisu: Wojciech Sznapka, dodany: 23.10.2011 13:44, tagi: php, symfony, symfony2

Generally, it’s not a good idea to unit test protected or private methods, but in some cases it could be useful. Of course we don’t want to change our class contract, and expose those methods as a public ones, just becasue we want to test them with PHPUnit. This case can’t be solved with Proxy-Object [...]

Autor wpisu: Piotr Śliwa, dodany: 21.10.2011 20:16, tagi: php, symfony

Ukończyłem pierwszą wersję PHPPdf o której pisałem kilka dobrych miesięcy temu, przy okazji zaliczając nieznaczny poślizg z terminem ;) Główne cechy biblioteki:

  • obsługa podstawowych tagów HTML oraz podstawowych stylów (składnia ustawiania stylów różni się od HTMLa, niektóre nazwy atrybutów również się różnią - szczegóły w dokumentacji dostępnej w repozytorium na githubie
  • dokument źródłowy w formatach XML oraz Markdown
  • obsługa arkuszy styli w formacie XML
  • podstawowe funkcjonalności HTML (niektóre różnią się w zachowaniu): opływ elementów (float), wyrównanie tekstu (+ justrowanie), obramowanie, tła, marginesy, paddingi itp.
  • odnośniki wewnętrzne (do elementów wewnątrz dokumentu) oraz zewnętrzne (url)
  • obsługa czcionek ttf oraz wbudowanych
  • automatycznie lub wymuszone łamanie strony, "niełamalne" elementy, powtarzalne nagłówki i stopki, numeracja stron
  • podział strony na kolumny, automatyczne lub wymuszone łamanie kolumny
  • obsługa zakładek i adnotacji
  • obsługa złożonych znaków wodnych
  • możliwość wykorzystania istniejącego dokumentu jako szablonu
  • integracja z Symfony2 za pomocą bundla PdfBundle
  • i w wiele innych ;)

Do czego ta biblioteka się nie nadaje:

  • bezpośrednie konwertowanie kodu HTML do PDFa - są do tego zadania naprawdę świetne, lepsze biblioteki, np. program wkhtmltopdf. Poza tym PHPPdf nie jest kompatybilny z HTML'em, zadaniem tej biblioteki nie jest dostarczenie narzędzia zamieniającego kod HTML na PDFa.

Do czego ta biblioteka jest przeznaczona:

  • tworzenia złożonych dokumentów pdf, nad których wyglądem, strukturą i układem powinniśmy mieć możliwie jak największą kontrolę, czego, ze względu na specyfikę formatu PDF i HTML, nie do końca zapewnia nam HTML oraz CSS, a tym samym biblioteki konwertujące kod HTML do PDF.

Projekt jest hostowany na githubie. Dokumentacja w języku polskim oraz angielskim znajduje się w odpowiednich plikach README, przykładowe dokumenty znajdują się we folderze "examples" (należy uruchomić plik index.php z przeglądarki lub cli.php z konsoli). Bundle integrujące PHPPdf z Symfony2 znajduje się również na githubie.

Biblioteka działa na wersji php 5.3+, obecnie korzysta z Zend_Pdf, jednakże w przyszłości może to ulec zmianie.

Autor wpisu: Łukasz Socha, dodany: 20.10.2011 15:46, tagi: oop, php, mvc

pobierz w .pdf(przeznaczone do wydruku)

Tworząc różnego rodzaju aplikacje natrafiamy na poważny problem utrzymania dobrej organizacji kodu – przejrzystej oraz łatwej w rozbudowie. Z pomocą przychodzą nam wzorce projektowe, które wymuszają na nas pewną organizację kodu aplikacji. W świecie aplikacji www najbardziej popularny jest wzorzec MVC. Jego ideę pokażę w praktyce – pisząc prosty system artykułów.

Żeby w pełni zrozumieć ideę tego wzorca projektowego czytelnik musi mieć solidne podstawy znajomości PHP oraz potafić programować obiektowo.

Trochę teorii…

Model-View-Controller został zaprojektowany w 1979 roku przez norweskiego programistę Trygve Reenskaug pracującego wtedy nad językiem Smalltalk w laboratoriach Xerox i początkowo nosił nazwę Model-View-Editor.

Ideą tego wzorca jest rozdzielenie kodu odpowiedzialnego za przetworzenie danych od kodu odpowiedzialnego za ich wyświetlanie.

Model-View-Controller zakłada podział aplikacji na trzy główne części:

  • Model – jest pewną reprezentacją problemu bądź logiki aplikacji.
  • Widok – opisuje, jak wyświetlić pewną część modelu w ramach interfejsu użytkownika.
  • Kontroler – przyjmuje dane wejściowe od użytkownika i reaguje na jego poczynania, zarządzając aktualizacje modelu oraz odświeżenie widoków.

Brzmi strasznie, ale w praktyce okazuje się, że to wcale nie jest takie trudne …

No to zaczynamy!

Na samym początku stwórzmy szkielet katalogów:

config/
controller/
model/
view/
templates/

Mając hierarchię katalogów stwórzmy szkielet plików wzorca MVC:

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

Autor wpisu: Wojciech Sznapka, dodany: 18.10.2011 21:54, tagi: php, symfony, symfony2

Today I needed to add a custom class to textarea field, to achieve TinyMCE field rendering (with help of http://symfony2bundles.org/stfalcon/TinymceBundle). It wasn’t such straightforward like I thought… I tried: But it threw exception, that attribute „class” is undefined, so I need to solve it in other way. Thank god I use Twig, so I tried [...]
Wszystkie wpisy należą do ich twórców. PHP.pl nie ponosi odpowiedzialności za treść wpisów.