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

Autor wpisu: Jaroslaw Mężyk, dodany: 13.11.2007 19:45, tagi: php

Ostatnie miesiące to przede wszystkim wytężona praca nad nowym projektem, który wczoraj miał swoją premierę. Ten projekt to połączenie oprogramowania CRM z Contact Center w modelu ASP (Application Service Provider). Ten projekt to serwisowa.pl. serwisowa.pl to nie tylko oprogramowanie pozwalające zarządzać bazą danych klientów i ich sprzętu, ale także system wychodzący poza internet i integrujący w [...]

Autor wpisu: Splatch, dodany: 09.11.2007 00:52, tagi: php

Integracja między językami czy też platformami to kwestia poruszana nie od dzisiaj. Na poziomie platform funkcjonuje od dłuższego czasu CORBA i Web Services z trio SOAP + WSDL + XML Schema na czele. Integracja systemów napisanych w tym samym języku sprowadza się zwykle do wykorzystania serializacji, która jest najszybsza i najwygodniejsza. Gorzej jeśli idzie o połączenie dwóch języków - w moim przypadku PHP i Javy. Zend ma swój mostek, który umożliwia na zintegrowanie Javy i PHP, jest też dodatkowe rozszerzenie do PHP, które pozwala na wykorzystanie Javy w PHP, jednakże moje oczekiwania nie był aż tak wielkie. Potrzebowałem po prostu odczytać dane specyficzne dla PHP - powiedzmy informacje o jakiejś klasie. Standardowo taka operacja wymagała stworzenia parsera, co jest zadaniem powiedzmy, nie na moje siły i umiejętności.. stąd też postanowiłem sobie nieco uprościć pracę. :)

Wspólny, najwygodniejszy format (zarówno w odczycie i zapisie danych) z jednej i drugiej strony to oczywiście XML. Problem w tym, jaki format ma być wykorzystany. Nie da się przecież bezpośrednio odwzorować obiektu z PHP do Javy głównie z racji na dynamikę. Jeśli w PHP ktoś dorzuci pole do obiektu, poprzez proste $someUser->city = 'Białystok' to Java bazująca tylko na statycznych, zadeklarowanych polach w klasie nie odczyta tej informacji. Serializacja w postaci specyficznej dla PHP również wiąże się ze stworzeniem parsera po stronie Javy by to wszystko obsługiwać i dodatkowo coś co by później mapowało obiekty z Javy do XMLa w postaci przyjaznej dla PHP. Wyjściem z całej sytuacji okazały się funkcje wddx_*. Po prostu strzał w dziesiątkę. WDDX to standard może nie najnowszy, ale dosyć spójny, i co najważniejsze umożliwiający przesyłanie złożonych obiektów bez zbytniej walki. Po chwili poszukiwań znalazłem DTD, zatem ze strony Javy wystarczy odpalić JAXB i jesteśmy na miejscu.

Przykładowy skrypt PHP, który uzyskuje informacje o konfiguracji Agavi:

PLAIN TEXT PHP:
  1. <?php
  2. include_once 'E:/htdocs/shop/agavi/agavi.php';
  3. $value = wddx_serialize_value(AgaviConfig::export());
  4.  
  5. $value = "<?xml version='1.0' encoding='utf-8' ?>\n<!DOCTYPE wddxPacket SYSTEM 'wddx.dtd'>\n" . $value;
  6.  
  7. echo $value;

A teraz część wyniku, który PHP wyświetla w konsoli:

PLAIN TEXT XML:
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <!DOCTYPE wddxPacket SYSTEM 'wddx.dtd'>
  3. <wddxpacket version='1.0'>
  4.     <header />
  5.     <data>
  6.         <struct>
  7.             <var name='core.minimum_php_version'>
  8.                 <string>5.1.0</string>
  9.             </var>
  10.             <var name='core.agavi_dir'>
  11.                 <string>E:\htdocs\shop\agavi</string>
  12.             </var>
  13.             <!-- i tak dalej -->
  14.         </struct>
  15.     </data>
  16. </wddxpacket>

Teraz kod Javy, który odczytuje sobie informacje.. (nawiasy kwadratowe przy listach podyktowane błędami w skrypcie, który koloruje składnię)

PLAIN TEXT JAVA:
  1. // odpalamy interpreter PHP
  2.         Runtime runtime = Runtime.getRuntime();
  3.         Process exec = runtime.exec("php -q E:/agavi-ide/org.codehouse.bridge/src/org/codehouse/bridge/test2.php");
  4.  
  5.         // podnosimy kontekst JAXB
  6.         JAXBContext context = JAXBContext.newInstance( ObjectFactory.class);
  7.         // deserializujemy XML wygenerowany przez PHP
  8.         WddxPacket object = (WddxPacket) context.createUnmarshaller().unmarshal(exec.getInputStream());
  9.  
  10.         // odczytujemy informacje
  11.         for ( Object stc : object.getData().getWDDXData()) {
  12.             // spodziewamy się informacji o typie złożonym
  13.             if (stc instanceof Struct) {
  14.                 List[generated.Var] vara = (( Struct) stc).getVar();
  15.                 for (Var value : vara) {
  16.                     // pozostaje nam tylko odczytanie zserializowanej wartości
  17.                     List[ Object] configurationValue = value.getWDDXData();
  18.                     System.out.println(value.getName() + ": " + ((generated. String) configurationValue.get(0)).getvalue());
  19.                 }
  20.             }
  21.         }

Wynik działania poniższego kodu to:

PLAIN TEXT CODE:
  1. core.minimum_php_version: 5.1.0
  2. core.agavi_dir: E:\htdocs\shop\agavi
  3. exception.default_template: E:\htdocs\shop\agavi/exception/templates/shiny.php
  4. agavi.name: Agavi
  5. agavi.major_version: 0
  6. agavi.minor_version: 11
  7. agavi.micro_version: 0
  8. agavi.status: DEV
  9. agavi.branch: trunk
  10. agavi.version: 0.11.0-DEV
  11. agavi.release: Agavi 0.11.0-DEV
  12. agavi.url: http://www.agavi.org
  13. agavi_info: Agavi 0.11.0-DEV (http://www.agavi.org)

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

Autor wpisu: Splatch, dodany: 06.11.2007 23:44, tagi: php

Agavi module configuration editor

Czas jakiś temu udało mi się stworzyć pierwszy działający edytor w oparciu o Eclipse. Kilka informacji co pod spodem:

  • SharedHeaderFormEditor - ładny tekstowy nagłówek oraz możliwość dodawania zakładek
  • FormPage i FormToolkit - użyte do stworzenia układu, który widać na załączonym obrazku
  • JFace Databinding - zapewnia propagowanie zmian z formularza do obiektów
  • JAXB 2 - mapowanie plików XML do odpowiednich klas
  • JFace - table viewer i parę innych dodatków

Całość ogólnie jest prosta niczym konstrukcja cepa, w działaniu sprawia się dobrze. Jak tylko ogarnę kod postaram się opisać krok po kroku jak można coś podobnego stworzyć na własny użytek.

Splatch wraca do gry i będzie grać wysoko! ;-)

Autor wpisu: stormfly, dodany: 28.10.2007 01:49, tagi: php

Historia tak naprawdę z przypadku. Potrzebowałem dodać nową funkcjonalność do jednego z serwisów, które tworzę. Chodziło o przypomnienie / odzyskanie hasła przez użytkownika, które zazwyczaj wysyłane jest na podany przy rejestracji adres e-mail. Jak wiemy, dobry / leniwy / sprytny...

Autor wpisu: nospor, dodany: 22.10.2007 17:37, tagi: php

Pisząc wszelkiego rodzaju wyszukiwarki korzystamy z formularzy, w których wprowadzamy warunki wyszukiwania. Sprawa komplikuje się trochę, gdy użyjemy stronicowania znalezionych wyników. Przechodząc na kolejną stronę znalezionych wyników, tracimy warunki wyszukiwania (dane z formularza). Aby temu zapobiedz, należy zapamiętać stan wyszukiwania. Można to zrobić na dwa sposoby: Zapisać dane wyszukiwania w sesji Przenosić dane wyszukiwania w url

Autor wpisu: nospor, dodany: 10.10.2007 16:04, tagi: php

Liczenie ile minęło dni między jedną datą a drugą to dość częsty "problem" piszących w php. Samo policzenie dni bez rozróżniania na dni robocze jest banalnie proste: [php][/php] Jednak wyliczenie dni roboczych to już większa sprawa. By ułatwić sobie i Wam życie, napisałem funkcję, która wylicza liczbę dni roboczych. Pierwotnie funkcja nie uwzględniała świąt ruchomych jednak użytkownik kajko84 dopisał do tego i święta ruchome. Ja to trochę zoptymalizowałem i mamy w pełni funkcjonalną funkcję do wyliczania liczby roboczych.

Autor wpisu: Zyx, dodany: 04.10.2007 16:14, tagi: php

Opracowanie rozwiązań mających służyć przez długie lata bez konieczności wprowadzania większych zmian lub wywalania dotychczasowych osiągnięć na śmietnik jest czasochłonne. Niezbędna jest umiejętność planowania oraz przewidywania. Obecnie tworzę taki właśnie skrypt, który ma z założenia wytrzymać w użyciu dłużej, niż rok. Nie poprzestaję jedynie na elastycznej strukturze, lecz staram się także wdrożyć rozwiązania przyszłościowe bądź dostępne wyłącznie tzw. "garstce wybrańców". W tym wpisie pragnę omówić kilka z nich.
Wszystkie wpisy należą do ich twórców. PHP.pl nie ponosi odpowiedzialności za treść wpisów.