Niezalogowany [ logowanie ]
Subskrybuj kanał ATOM Kanał ATOM

Autor wpisu: Śpiechu, dodany: 16.03.2012 16:06, tagi: php

Pomysł na wpis dał mi kilka dni temu Facebook, a dokładniej ich totalnie niekonsekwentne oznaczenia co się kiedy wydarzyło na naszej tablicy. Raz jest to 23 minut(y) temu, raz 7 godz. temu, jeszcze inaczej około godziny temu. Być może różne ekipy robią osobno opisy czasu i stąd różnice. Postanowiłem dla sportu zmierzyć się z problemem. Powstało takie coś jak Timespan Smarty Modifier.

Opis jak to zainstalować, wymagania i sposób użycia możecie sobie przeczytać w moim kaleczonym angielskim w GitHubie. Tutaj chciałbym się skupić jak to działa. Najwygodniejszym sposobem korzystania z biblioteki jest poprzez modyfikator w szablonach Smarty, a więc {$jakaśZmienna|naszModyfikator}.

Przede wszystkim sama nazwa pliku musi nazywać się modifier.nazwa.php, za to funkcja smarty_modifier_nazwa($argument). Pierwszy argument automatycznie dostaje wartość zmiennej, dla której wywołujemy modyfikator. Jeśli chcemy, następne podajemy po dwukropku. Drobna uwaga: nigdy niczego nie „echujemy”, tylko zwracamy poprzez return. Chodzi o łańcuchowe łączenie modyfikatorów.

Z uwagi na to, że całość rozrosła się do ponad 400 linii kodu, nie ma sensu wszystkiego tutaj przytaczać. Skupię się na najważniejszych rzeczach.

Całość ma formę klasy abstrakcyjnej rozszerzanej przez poszczególne języki. Na podstawie zadeklarowanego języka skrypt próbuje znaleźć sobie właściwą klasę (fragm. modifier.timespan.php):

$className = 'Spiechu\TimeSpan\TimeSpan' . strtoupper($lang);
   if (class_exists($className)) {
      $timeSpan = new $className();
 
      // sprawdz czy klasa rozszerza AbstractTimeSpan
      if (!($timeSpan instanceof Spiechu\TimeSpan\AbstractTimeSpan)) {
         $timeSpan = new Spiechu\TimeSpan\TimeSpanEN();
      }
   } else {
 
      // jesli nie ma takiego jezyka lub klasa niewlasciwa uzywam angielskiego
      $timeSpan = new Spiechu\TimeSpan\TimeSpanEN();
   }

Potem tylko konfigurujemy klasę i zwracamy wynik:

$timeSpan->setStartDate($date)->showSuffix($suffix);
return $timeSpan->getTimeSpan();

W klasie AbstractTimeSpan z kolei mamy trochę logiki związanej z obliczaniem interwału:

$curDate = new \DateTime('now');
$diff = $curDate->diff($this->_startDate); //otrzymujemt obiekt DateInterval

Począwszy od największej jednostki (rok) odpytujemy $diff która z jego zmiennych publicznych jest większa od 0 oraz za pomocą metod isHalfUnit($actualUnit, $fullUnit), almostFullUnit($actualUnit, $fullUnit) sprawdzamy czy może przekroczyliśmy połowę obecnej jednostki, większej jednostki oraz czy nie można jej zaokrąglić do następnej całej.

Klasy rozszerzające implementują m.in. metodę getUnit($howMany, $unitSymbol, $half). Liczebniki angielskie są tak trudne, że potrzeba na nie aż 1 linijki:

if ($howMany > 1) $howMany = 2;
return $this->_units[$howMany][$unitSymbol];

Jeśli mowa o $this->_units to wygląda to tak:

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

Autor wpisu: d3ut3r, dodany: 14.03.2012 02:27, tagi: javascript, jquery

Podczas realizacji jednego z ostatnich projektów, używałem selektora :contains jak się okazało selektor ten nie jest wrażliwy na wielkość znaków czyli dla niego kot i KOT to to samo niestety nie o to chodziło mojemu klientowi :)

W internecie natknąłem się na ciekawe rozwiązanie definiujące własny selektor :Contains dzięki czemu mogłem używać standardowego :contains jak i nowego :Contains. Poniżej znalezione rozwiązanie:

jQuery.expr[':'].Contains = function(a,i,m){
    return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0;
};

Autor wpisu: singles, dodany: 12.03.2012 21:25, tagi: internet

Dokładnie rok temu, 12 marca 2011 w sieci pojawił się blog o nazwie „Works for me”, która wzieła się od ulubionej odpowiedzi szanującego się programisty na zgłoszenie o błędzie aplikacji – mianowicie „u mnie działa” (zwana też Standardową Odpowiedzią Administratora #1).

Minął rok, czas na podsumowanie tego, co działo się z blogiem jak i wokół niego.

Liczby

W momencie pisania tego wpisów liczik postów wskazuje 41. Czy to dużo, czy mało? Średnio wychodzi prawie jeden post tygodniowo, czego nie uważam za wynik zły. Starałem się, aby moje artykuły były wartościowe, pisane w momencie, kiedy czułem, że mam coś ciekawego do przekazania – czy mi się udało? Ocena należy do Was.

Do tego dochodzą 273 komentarze (no i 2436 komentarze wyfiltrowane przez antyspam, ale to raczej nie jest powód do dumy). Niektóre posty były bardzo obszerne w komentarze (zwłaszcza te z serii „Oddam książkę za darmo” ;), inne mniej, aczkolwiek nie mogę narzekać na ich poziom, co także uważam za plus. No i prawie w ogóle nie ma w nich flame’u ;]

Analytics

Najpopularniejsze wpisy wg Google Analytics z ostatniego roku to:

Z ciekawszych rzeczy – z jakich haseł wyszukiwania ludzie trafiali do mnie na bloga? Pomijam milczeniem fakt, że „php” pojawia się po raz pierwszy w haśle na pozycji czwartej;) Jednakże, moi faworyci to:

  • oddam ksiażki za darmo 2011 (+ kilkanaście różnych odmian tego hasła) – widać „popularna” akcja się z tego zrobiła dzięki Batmanowi :)
  • kim jest tantek celik
  • jak zostać programistą php i jak nie zostać programistą php – ex aequo
  • jeden by wszystkimi rządzić – współczuje fanom Tolkiena zetknęcia z tematem o CASSISisie

A, no i oczywiście:

  • mój pierwszy raz – no dobra, tutaj współczuje jeszcze bardziej niż w poprzednim punkcie :]

No dobra, ale wyjdźmy do ludzi

Ci, którzy czytają mojego bloga regularnie, zauważyli pewnie zmniejszenie częstotliwości publikowania przeze mnie wpisów. Przyznaje się bez bicia. Jednakże, wydaje mi się, że mam usprawiedliwienie. I nie chodzi wcale o sprawy prywante. Nie chodzi o zmianę pracy. Nie chodzi o inne aspekty. Głównym powodem takiego stanu rzeczy jest meet.php.

Coś, o czym myślałem od dawna, coś co dzięki współpracy z Danielem oraz pomocy wszystkich zaangażowanych (prelegentów oraz ludzi którzy pomagają z własnej, nieprzymuszonej woli) udało się wprowadzić w życie. Coś, z czego – jeśli chodzi o „developerską” część mojego życia – jestem do tej pory najbardziej dumny. Dziękuję Danielowi, dziekuję prelegentom, dziękuję ludziom, którzy pomagają nam za każdym razem, dziękuję uczestnikom!

2012?

Co będzie w 2012? Bloga nie porzucam, troche się za nim stęskniłem – postaram się napisać coś na dniach. Ogólnie plany na 2012 są. A co z tego wyjdzie, czas pokaże :)

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

Autor wpisu: bigzbig, dodany: 12.03.2012 18:32, tagi: javascript

Facebook to dla developera wieczne utrapienie. Ciągłe zmiany w interfejsie, w API, dodawanie coraz to nowych funkcjonalności czy choćby permanentny redesign zmuszają do bezustannego poprawiania napisanych aplikacji. Pisząc aplikacje na facebook średnio raz na pół roku muszę być przygotowany na to, że połowę rzeczy, które nauczyłem się ostatnio implementować teraz będę musiał zrobić w zupełnie [...]

Autor wpisu: bastard13, dodany: 12.03.2012 12:20, tagi: oop, php

na wstępie słów kilka

Znowu dłuższa przerwa w publikowaniu czegokolwiek. Na szczęście dobiegła końca i mam nadzieję, że w ciągu najbliższych kilku-kilkunastu tygodni uda mi się dokończyć wszystkie zaległe wpisy, na które pomysły dojrzewały, lecz z braku czasu nie mogły się doczekać realizacji:(O czym dzisiaj? O stałych. A czym są te stałe? Kiedy ich używać, a kiedy nie? O tym dalej:)Czytaj więcej »

Autor wpisu: Jakub, dodany: 10.03.2012 17:51, tagi: php/mysql

Paginacja to przypisywanie liczb do kolejnych wyświetlanych stron. Może posłużyć jako numeracja listy użytkowników, produktów lub zdjęć. Znacznie zwiększa czytelność strony oraz sprawia, że jest ona bardziej przyjazna użytkownikowi. Aby uniknąć niejasności, pokażę strukturę bazy danych na której będziemy pracować w dalszej części artykułu (maksymalnie uproszczona):

12345create table data(     id int auto_increment,     value varchar(120),     primary key(id) )

Na początku musimy połączyć się z bazą danych. W tym celu posłużymy się biblioteką PDO, która jest niemal wymogiem przy dzisiejszych standardach. Jeżeli masz z tym styczność pierwszy raz, zalecam zajrzeć do manuala.

1234// laczenie z baza danych $db = new PDO('mysql:host=dbhost;dbname=dbname', 'dbuser', 'dbpass'); // wlaczamy raportowanie bledow $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Następnie musimy zliczyć ilość wszystkich wierszy w naszej bazie danych, za pomocą zapytania oraz jego przetworzeniu:

1$countData = $db->query("SELECT count(*) FROM data")->fetchColumn();

Przyszła kolej na zdefiniowanie kilku niezbędnych zmiennych. Ilość wyników na pojedynczej stronie:

1$results = 5;

Liczba wszystkich stron, na które rozdzielane będą wyniki z bazy danych. Otrzymujemy to dzięki podzieleniu wszystkich wyników, poprzez ilość wyników na pojedynczej stronie oraz zaokrągleniu wyniku w górę. Aby to ułatwić, użyjemy funkcji ceil:

1$pages = ceil($countData/$results);

Numer strony na której się znajdujemy, będzie pobierany z parametru GET o nazwie page. Jeżeli adres nie będzie go zawierał, będzie to oznaczać iż znajdujemy się na pierwszej stronie.

1$page = isset($_GET['page']) ? $_GET['page'] : 1;

Te zmienne posłużą nam przy tworzeniu linków do przedniej i następnej strony:

12$next = $page + 1; $back = $page - 1;

Troszkę matematyki, a mianowicie wiersz od którego zapytanie ma zacząć pobierać wyniki:

1$start = $page * $results - $results;

Wreszcie główne zapytanie, w którym podajemy powyższe parametry $start oraz $results:

1$getData = $db->query("SELECT * FROM data LIMIT $start, $results")->fetchAll();

Wyniki wyświetlamy za pomocą pętli foreach:

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

Autor wpisu: zleek, dodany: 08.03.2012 09:24, tagi: zend_framework, php

Podczas przygotowywania formularzy z wykorzystaniem Zend_Form zachodzi czasami konieczność przekazania do formularza zmiennej lub zmiennych, które będą warunkowały odpowiednie wygenerowanie formularza. Przykładem może tutaj być przedstawienie innego formularza dla kobiety i innego dla mężczyzny. Powstaje wówczas konieczność “poinformowania” formularza o płci użytkownika. Stworzenie jakiejś dodatkowej metody i wywołanie jej na instancji formularza nie przyniesie zamierzonego [...]
Wszystkie wpisy należą do ich twórców. PHP.pl nie ponosi odpowiedzialności za treść wpisów.