Autor wpisu: widmogrod, dodany: 21.04.2010 14:26, tagi: php, zend_framework
W dniu dzisiejszym pracowałem nad generowaniem plików PDF w swojej aplikacji. Wybrałem do tego celu Zend_Pdf dlatego że backend jest oparty na Zend Framework.
Współprace z tą biblioteką mogę ocenić na 4/6. Przyjemnie. Jednak brakuje w niej kilku kluczowych elementów jednym z nich jest możliwość zawijania długiego tekstu. W sposób natywny ZF nie ma zaimplementowanej takiej metody.
Poniżej przedstawiam prostą funkcję, która w szybki i sprawny sposób zawinie (przełamie) przekazany tekst po określonej długości znaków.
/** * Zawin tekst po określonej długości znaków. * * @param Zend_Pdf_Page $page * @param string $text * @param int $x * @param int $y * @param int $width * @param string $brake * @param bool $cut * @return void */ function drawTextWrap($page, $text, $x, $y, $width, $brake = "\n", $cut = true) { // przygotuj tekst $text = wordwrap($text, $width, $brake, $cut); $token = strtok($text, $brake); $fontSize = $page->getStyle()->getFontSize(); // rysuje każdą linię tekstu niżej od poprzedniej // o wysokośc (wielkość) czcionki while (false !== $token) { $y -= $fontSize; $page->drawText($token, $x, $y); $token = strtok("\n"); }; }
Jeżeli ktoś pracował z Zend_Pdf to wytłumaczenie jak użyć w/w kawałek kodu jest zbyteczne. Pozdrawiam.
Autor wpisu: batman, dodany: 20.04.2010 20:23, tagi: javascript, jquery
Autor wpisu: Piotr Śliwa, dodany: 18.04.2010 12:46, tagi: php
Niedawno w ofercie wydawnictwa helion pojawiła się ciekawa książka - Czyty Kod (ang. "Clean code", autor Robert C. Martin). Książka ta opisuje techniki oraz zasady pisania czystego, czytelnego oraz modyfikowalnego kodu. Kilka zasad z tej książki w mojej opinii jest dosyć kontrowersyjnych, ale książka sama w sobie porusza bardzo ważną kwestię, a przede wszystkim jest ona naprawdę dobra.
Głównymi przesłaniami tej książki to:
- waga nazewnictwa klas, funkcji, zmiennych składowych, zmiennych lokalnych i wszystkich pozostałych bytów (pakietów, przestrzeni nazw itp.)
- wszystkie byty (klasy, funkcje, struktury danych itp.) powinny być maksymalnie proste i krótkie. Powinny przedstawiać jedną rzecz, realizować jedną czynność, której istota jest zawarta w opisowej nazwie (punkt pierwszy)
Od tych dwóch zaleceń wywodzi się szereg innych dotyczących zasad budowania klas, funkcji, zależności między modułami i wiele innych. Nie będę ich tutaj oczywiście przytaczał, zainteresowanych odsyłam do tej pozycji.
Idąc śladami autora tej książki, przebuduję mój kod który już wcześniej zamieściłem w notce "Wielostronicowe formularze". Napisałem testy jednostkowe do tej klasy (pisząc plugin, testów nie napisałem ;]), po każdej wprowadzonej zmianie odpalałem testy aby sprawdzić czy klasa nadal działa tak jak powinna.
Nazewnictwo
Pierwszą rzeczą którą zrobiłem to zmiany nazw niektórych metod oraz składowych: - zmiana get/setPage() na get/setCurrentPageNumber, validatePage na validatePageNumber - zmiana getPages() na getNumberOfForms() - zmiana składowej globalNamespace na useGlobalNamespace, analogicznie zmiana nazwy metod dostępowychZawahałem się przy metodzie setForms, okazało się że nazwa tej metody wprowadza w błąd, gdyż nie ustawia ona formularzy, a jedynie nadpisuje formularze dla pierwszych stron (błąd logiczny - jeśli przekazaliśmy mniejszą liczbę formularzy niż było ich wcześniej, to na końcu tablicy zostaną formularze z przed wywołania metody). Zdecydowałem się na napisanie dodatkowej funkcji o nazwie addForms, która dopisuje tablicę formularzy. Metoda setForms, tak jak nazwa wskazuje, nadpisuje wcześniej dodane formularze.
Wprowadziłem również inne drobne zmiany nazw (np. zmiennych lokalnych) i wydają się już one być dobre, teraz czas zająć się metodami.
Metody / funkcje
Najważniejsze jest to aby metoda operowała na jednym poziomie abstrakcji, realizowała jedną czynność i była maksymalnie krótka. Na pierwszy rzut oka większość metod spełnia te warunki, ale jest kilka które należałoby poprawić.Na pierwszy ogień poszła metoda addForm.
[PHP]
- public function addForm(sfForm $form)
- {
- $index = count($this->forms);
- $form->setOption('page', $index+1);
- $this->forms[$index] = $form;
- if(!$this->isUseGlobalNamespace() && $key = $this->getFormKeyName($form, true))
- {
- $format = $form->getWidgetSchema()->getNameFormat();
- $format = sprintf($this->getNameFormat(), substr($format, 0, $k = strpos($format, '['))).substr($format, $k);
- $form->getWidgetSchema()->setNameFormat($format);
- }
- else
- {
- $form->getWidgetSchema()->setNameFormat($this->getNameFormat());
- }
- }