Niezalogowany [ logowanie ]
Subskrybuj kanał ATOM Kanał ATOM

Autor wpisu: Piotr Śliwa, dodany: 31.03.2011 21:50, tagi: php

Od kilku miesięcy po cichu tworzę nową bibliotekę do generowania dokumentów pdf napisaną w php. Planowałem, że pierwsza w pełni funkcjonalna wersja wyjdzie w pierwszym kwartale 2011, jednak tego terminu na pewno nie dotrzymam ;) Jest jeszcze dosyć dużo do zrobienia, aby nadawała się do bezstresowego użycia.

Biblioteka zamienia kod xml zbliżony do html'a na dokument pdf. W pierwszej stabilnej wersji będzie obsługiwała m. in.:

  • powtarzalne nagłówki i stopki stron z dynamicznymi elementami (np. numeracją stron)
  • odpowiedniki html'owych tagów: div, p, b, img, span, strong, br, table, tr, td, p, h1, h2, h3, h4 i kilka innych.
  • obsługę atrybutów podobnych do tych z css, w tym: float, text-align, margin, padding, różne typy obramowań i tła, obsługa wielu czcionek w różnych stylach (bold, italic, normal)
  • łamanie stron, unikanie łamania stron dla wybranych elementów
  • obsługa arkuszy stylów (jako dokument xml)

Biblioteka jest pisana pod php5.3+ (do uruchomienia testów wymagana jest wersja php5.3.2+), wykorzystuje komponent Zend_Pdf z ZF 1.11. Będzie otwarta na rozszerzenia, zmianę konfiguracji, wyłączania zbędnych rzeczy, których się nie używa.

Zainteresowanych odsyłam na github.com, tam znajduje się kod źródłowy wraz ze szczątkową dokumentacją oraz, jak na razie, jednym przykładem (katalog examples). Projekt ma dwie gałęzie: master - w miarę stabilna wersja kodu, dev - najświeższy lecz niekoniecznie kompletny kod. Obecna wersja jest wersją developerską, jednakże proste rzeczy można już w niej zaimplementować. Podstawowe funkcjonalności, które jeszcze nie są, ale będą zaimplementowane w pierwszej stabilnej wersji, to odpowiedniki html'owych atrybutów colspan oraz rowspan dla wierszy tabel, listy (odpowiedniki tagów ul, li), podział strony na kolumny. Zostanie również niebawem przepisany mechanizm formatowania tekstu, który obecnie ma sporo ograniczeń.

Komentarze i konstruktywna krytyka mile widziane.

Autor wpisu: sokzzuka, dodany: 31.03.2011 13:01, tagi: php

We wczorajszym wpisie Dan Birken przedstawił propozycję dodania do biblioteki standardowej języka php funkcji str_slice($string, $start, $end = null);. Funkcja ta była by alternatywą dla substr dla tych osób, dla których argumenty przekazywane do substr wydają się niezbyt logiczne czy też niewygodne.

Przy okazji rozpoczęła się dyskusja o wprowadzeniu innych funkcji łańcuchów znaków, które często używane są w różnych projektach np. startsWith($search) czy endsWith($search).

Osobiście chętnie widziałbym te funkcje w php oraz gdzieś w dalekiej przyszłości zmianę string z typu prostego na obiekt, oczywiście w sposób transparentny dla starszego kodu.

Jakie jest Wasze zdanie ?

Autor wpisu: batman, dodany: 31.03.2011 08:00, tagi: zend_framework

Pracując nad jednym z ostatnich projektów, kolejny raz natknąłem się na dosyć powszechny problem. Zdecydowana większość akcji renderuje podobny widok, różniący się kilkoma drobnymi szczegółami. Niestety przeniesienie powtarzających się elementów do layoutu nie wchodzi w grę, ponieważ zależą od aktualnego stanu aplikacji, który znany jest dopiero w akcji. Nie pozostaje więc nic innego jak skorzystanie z helperów widoku lub partiali. Ponieważ oba podejścia nie do końca mi odpowiadają, zacząłem szukać innego rozwiązania, aż w końcu natknąłem się na trzyetapowe layouty (3 step layouts), które nazwałem (nie bez powodu) zagnieżdżonymi.

Cała sztuczka polega na utworzeniu dodatkowej (trzeciej) warstwy znajdującej się nad layoutem. Warstwa ta nazwana wrapperem, zawiera stałe elementy takie jak nagłówek i stopka. Drugą warstwą jest standardowy layout, a ostatnią widok. Najciekawszy w tym podejściu jest fakt, iż wszystko dzieje się w obrębie Zend Frameworka i nie wymaga dodatkowych bibliotek ani nadpisywania gotowych funkcjonalności. Wszystko zapewnia nam Zend_Layout.

Ponieważ dokładny opis rozwiązania znajduje się na stronie jego autora, przedstawię tylko najważniejsze jego elementy.

Zaczniemy od konfiguracji.

; application/configs/application.ini

resources.layout.layoutPath = APPLICATION_PATH "/views/layouts"
resources.layout.layout = wrapper

Następnie musimy przygotować wrapper.

<?php /* application/views/layouts/wrapper.phtml */ ?> 

<?php echo $this->doctype()."\n"; ?>
<html>
    <head>
        <?php echo $this->headTitle(); ?>
        <?php echo $this->headMeta(); ?>
        <?php echo $this->headLink(); ?>
        <?php echo $this->headStyle(); ?>
    </head>
    <body>
        <?php /* NESTED LAYOUT SUPPORT */ ?>
        <?php if($this->layout()->nestedLayout): ?>
            <?php $this->layout()->setLayout($this->layout()->nestedLayout); ?>
        <?php else: ?>
            <?php $this->layout()->setLayout('default'); ?>
        <?php endif;?>
        <?php echo $this->layout()->render();  ?> 

        <?php /* OUTPUT JAVASCRIPT */ ?>
        <?php echo $this->headScript(); ?>
        <?php echo $this->inlineScript(); ?>
    </body>
</html>

A na końcu layout.

<?php /* application/views/layouts/default.phtml */ ?> 

<div class="container">
    <div class="header">
        <h1>My Application</h1>
    </div>
    <div class="body">
        <?php echo $this->layout()->content; ?>
    </div>
    <div class="footer">
        <p>Copyright 2011</p>
    </div>
</div>

Reszta wygląda tak samo jak w przypadku klasycznego dwuetapowego podejścia, czyli przekazanie w akcji danych do widoku i ich wyświetlenie. Z poziomu widoku lub akcji mamy możliwość sterowania zarówno wrapperem jak i layoutem.

Dokładny opis działania przedstawionego powyżej sposobu znajdziecie pod adresem http://3engineers.clariondoor.com/creating-3-step-layouts-with-zendlayout. Oprócz wspomnianych trzech warstw, autor opisuje w jaki sposób automatycznie ładować layout w zależności od modułu oraz dodaje kolejną (czwartą) warstwę layoutu.

Autor wpisu: batman, dodany: 30.03.2011 08:00, tagi: css

W Internecie pojawia się coraz więcej ciekawych zastosowań nowoczesnych technologii. Ostatnim przykładem na jaki się natknąłem, są animowane opisy zdjęć wykonane bez grama JavaScript. Co więcej kod HTML to zaledwie trzy znaczniki, a CSS to kilkanaście wierszy. W efekcie uzyskujemy rewelacyjnie wyglądający efekt animowanego opisu zdjęcia, pojawiającego się po najechaniu kursorem myszy na zdjęcie.

Rozwiązanie to działa we wszystkich nowych przeglądarkach. Problem występuje jedynie w przypadku IE9, który nie obsługuje animacji i od razu wyświetla opis.

Demo znajdziecie pod adresem http://css-tricks.com/examples/SlideinCaptions/, natomiast opis jak i dlaczego to działa oraz pliki źródłowe tutaj – http://css-tricks.com/slide-in-image-captions/.

Autor wpisu: sokzzuka, dodany: 29.03.2011 09:36, tagi: php

Niniejszym publikuje odpowiedź Saveura na mój poprzedni tekst, zapraszam do komentowania ! Wyszła mi z tego nie lada odpowiedź.

Najpierw odniosę się do tego co mnie najbardziej uderzyło i z czym nie zgadzam się najmocniej, mianowicie (choć Ty Wojciechu tego nie powiedziałeś, oczywiście):

W Internecie panują takie same zasady wypowiedzi, jak w „realu”. Jeśli w „prawdziwym życiu” nie powiedziałbyś czegoś, to nie powinieneś tego robić również w sieci. (batman)

Nie prawda. Internet to nie “prawdziwe życie” i panują tutaj zupełnie inne zasady. W normalnym życiu każdy z nas ma maski – nie powiem dlaczego tak jest, nie jestem psychologiem, ale tak właśnie jest. Inaczej zachowujesz się w gronie znajomych, co innego mówisz w towarzystwie swoich kumpli z którymi grasz w piłkę co tydzień, inny będziesz w pracy, a jeszcze inny na obiadku z teściami. Nie jesteś tą samą osobą zawsze i wszędzie. Gdyby próbować oceniać moją osobę na podstawie męskiego spotkania przy kielichu, gdzie raz na jakiś czas muszę się mocno sponiewierać dla zdrowia psychicznego, powiedzielibyście, że jestem szowinistyczną, zbereźną świnią! Ale czy taki jestem? Czy tak będę się zachowywał na spotkaniu biznesowym?

Przykłady z mojego życia – pracowałem kiedyś w pewnej firmie, w której była pewna sekretarka/asystentka szefa czy jak to ładnie po angielsku mówili “office manager”. Miałem z nią wspaniałe relacje, które polegały na ciągłym flirtowaniu i aluzjach dotyczących seksu. Jeżeli osoba trzecia by na to spojrzała, powiedziałaby, że conajmniej łączył nas soczysty romans a na pewno, pomyślała by, że jestem kasanową, że ho ho. Czy jestem kasanową? Wierzcie mi, że nie. W tej samej firmie, było również dwóch programistów, z którymi podczas jednego dnia potrafiłem wymienić z dwieście kur** i usłyszeć opowieści o tym czym mnie kto zrobił. Czy to oznacza, że ja (i owi koledzy) jesteśmy nie okrzesaną hołotą? Nie. To był tylko nasz sposób na pracę w ciężkich warunkach. Do dziś utrzymujemy świetny kontakt.

W “prawdziwym świecie” mamy maski, jesteśmy różnymi ludźmi w różnych sytuacjach. W internecie bardzo wielu rzeczy nie powiem, nie dlatego, że się ich wstydzę, a dlatego, że zostaną zupełnie inaczej odebrane. Prowadząc z Tobą dyskusję nie wiem jak to odbierzesz, nie widzisz mojej gestykulacji, nie słyszysz barwy głosu, Ty sam czytasz moje wypowiedzi tak jak chcesz je przeczytać. Mało tego, w rzeczywistości nasza wymiana zdań będzie trwała 10 minut, w internecie, będzie rozwleczona na kilka dni (tygodni?). Wstaniesz następnego ranka w skowronkach i przeczytasz moją odpowiedź zupełnie inaczej, niż na przykład dzień później po awanturze którą zrobiła Ci Twoja kobieta.

Mało tego, rozmowa na żywo ma to do siebie, że jest teraz i między nami. Rozmowa w internecie, zostanie zachowana na wieki wieków. Dwa lata później ktoś przeczyta moją wypowiedź, i na jej podstawie mnie oceni, ale nie przeczyta 5 poprzednich stron na forum w których prowadziliśmy dyskusję. Tak samo nie będzie wiedział, że na tym forum siedzieliśmy już dwa lata, i kochamy się tak a nie inaczej, albo, że to taka gra między nami.

Nie stwierdzam tutaj, że mamy nie dyskutować w internecie – wręcz przeciwnie, jak najbardziej mamy rozmawiać, ale z dystansem, nie zachowują się jak dzieci czy obrażalskie paniusie. Podyskutujmy, pokażmy że jesteśmy ludźmi, niech emocję włączą się do dyskusji, ja chce widzieć, że rozmawiam z człowiekiem który kocha to co robi, ale na końcu, miejmy tyle rozumu, by wiedzieć, że nie zgadzamy się tylko w tym jednym temacie, i możemy dalej być świetnymi kolegami. I tak samo, jeżeli jesteśmy pracodawcami (zakładając, że Wojciech ma rację i pracodawcy są tak głupi i zatrudniają ludzi na podstawie internetowych wypowiedzi bez kontekstu) bierzmy pod uwagę, że ten człowiek jest inny w gronie przyjaciół, inny w pracy a jeszcze inny w barze z kumplami i nie oceniajmy go na podstawie jego miłości do danej partii politycznej, bądź tolerancji dla aborcji.

tutaj rozpoczyna się następny problem…

Jałowość dyskusji

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

Autor wpisu: Michal Wachowski, dodany: 29.03.2011 00:00, tagi: framework, php

Już od jakiegoś czasu nosiłem się z napisaniem nowego frameworka. Stary, choć całkiem przyjemny w użyciu miał swoje wady. I tak od myśli do czynu, w wolnych chwilach zabrałem się do tworzenia.Część pierwsza - ogólne założenia i inne ciekawe rzeczy.

Autor wpisu: Tomasz Kowalczyk, dodany: 27.03.2011 22:15, tagi: javascript, css

JavaScript to chyba najbardziej dynamicznie rozwijający się język programowania pod względem powstającej bazy kodu i przydatnych narzędzi wspomagających. Przyjrzyjmy się kilku ciekawym bibliotekom, jakie możemy wdrożyć do naszych projektów bez zbędnego wysiłku, a ku uciesze klientów. Linkdump: Zbiór przydatnych bibliotek JavaScript. 1. d3.js Data-Driven Documents. Biblioteka wspomagająca przetwarzanie stron internetowych opartych na dużych zbiorach danych. [...]
Wszystkie wpisy należą do ich twórców. PHP.pl nie ponosi odpowiedzialności za treść wpisów.