php array to xml
Potrzebowałem funkcje, która na podstawie tablicy stworzy nam plik xml. Samo napisanie funkcji jest banalne, ale problem następuje w przypadku, gdy mamy nie unikalne klucze w tablicy. Solucją jest przekazanie do funkcji tablicy zawierającej nazwe nieunikalnych kluczy.
-
<?php
-
/**
-
* Tworzy obiekt xml na podstawie tablicy
-
*
-
* @param array $aXml Wejściowa tablica
-
* @param SimpleXMLElement $oXml
-
* @param array $aElements tablica non-unique elementów
-
* @return SimpleXMLElement
-
*/
-
{
-
static $aArray;
-
-
{
-
$aArray = $aElements;
-
}
-
-
{
-
foreach( $aXml as $k => $v )
-
{
-
{
-
{
-
{
-
foreach( $v as $kk => $vv )
-
{
-
$oXml->addChild( $k, $vv );
-
}
-
}
-
else
-
{
-
$oXml->addChild( $k );
-
}
-
}
-
else
-
{
-
$oXml->addChild( $k );
-
}
-
arrayToXml( $aXml[$k], $oXml->$k );
-
}
-
else
-
{
-
{
-
$oXml->addChild( $k, $v );
-
}
-
else
-
{
-
//Tutaj można coś zrobić dla kluczy numerycznych
-
}
-
}
-
}
-
}
-
return $oXml;
-
}
-
?>
I jeszcze link, gdzie jest lepiej sformatowane (durny wp) http://cpaste.com/2403
2 commentsBlondynka…
Ostatnio będąc w Rzeszowie przekonałem się, że kawały o blondynkach nie są wyssane z palca...
:D
2 commentsKoniec prac jak makaron
No i znowu długo nic nie pisałem :) SparkleWorks jest prawie ukończone. Pracuje sie na nim całkiem przyjemnie, a nawet bardziej niż całkiem :> Koniec prac jeszcze nie nastąpił i wiele jest jeszcze do poprawienia, ale 2 projekt już na nim kończę :) Do opublikowania sie jeszcze nie nadaje, bo w niektórych miejscach, aż wstyd kod pokazać taki śmietnik jest :| Ale kiedyś myślę znajdę czas i zapnę wszystko na ostatni guzik :D Wtedy pewnie ujrzy światło dzienne... Ale kiedy to nastąpi, to tego nie wiedzą nawet najstarsi górale ;)
Na koniec mały przyklad. Pamiętam jak w Symfony męczyłem sie jak połączyć repopilacje formularza z validatorami. W SparkleWorks to zabawa.
Kontroler:
-
<?php
-
class ShipmentCompaniesModule extends swAppController
-
{
-
-
public function executeAdd()
-
{
-
$this->oShipmentCompany = null;
-
$this->sAction = 'Create';
-
}
-
-
-
-
public function executeEdit()
-
{
-
$oShipmentCompaniesQuery = new Shipment_companiesModel();
-
$this->oShipmentCompany = $oShipmentCompaniesQuery->getByPK( $this->request()->Get( 'id', 'Int' ) );
-
-
$this->sAction = 'Update?id='.$this->oShipmentCompany->getId();
-
$this->setView( 'Add' );
-
}
-
-
-
public function executeCreate()
-
{
-
$oShipmentCompaniesQuery = new Shipment_companiesModel();
-
$oShipmentCompaniesQuery->setInfo( $this->request()->Post( 'info', 'String' ) );
-
$oShipmentCompaniesQuery->setName( $this->request()->Post( 'name' ) );
-
$oShipmentCompaniesQuery->setTelephone( $this->request()->Post( 'telephone', 'Int' ) );
-
$oShipmentCompaniesQuery->insert();
-
-
return 'Nowa firma wysyłkowa została utworzona.';
-
}
-
-
-
-
public function executeUpdate()
-
{
-
$oShipmentCompaniesQuery = new Shipment_companiesModel();
-
$oShipmentCompaniesQuery->addWhere( Shipment_companiesModel::ID, $this->request()->Get( 'id', 'Int' ) );
-
$oShipmentCompaniesQuery->setInfo( $this->request()->Post( 'info', 'String' ) );
-
$oShipmentCompaniesQuery->setName( $this->request()->Post( 'name' ) );
-
$oShipmentCompaniesQuery->setTelephone( $this->request()->Post( 'telephone', 'Int' ) );
-
$oShipmentCompaniesQuery->update();
-
-
return 'Zmiany zostały zapisane.';
-
}
-
}
-
?>
Szablon:
Validator:
-
<?xml version="1.0" encoding="UTF-8"?>
-
<validators enabled="true" module="ShipmentCompanies" action="Create" method="POST" errorAction="ShipmentCompanies/Add" foreign="false">
-
-
<name type="string">
-
<minlenght>3</minlenght>
-
<maxlenght>255</maxlenght>
-
<lenghterror>Musi miec dlugosc od {{minLenght}} do {{maxLenght}} znaków.</lenghterror>
-
</name>
-
-
<info type="string">
-
<minlenght>5</minlenght>
-
<lenghterror>Musi miec dlugosc od {{minLenght}} znaków.</lenghterror>
-
</info>
-
-
<telephone type="int">
-
<typeerror>Muszą być same liczby</typeerror>
-
<minlenght>8</minlenght>
-
<lenghterror>Telefon jest za krótki. Min długość to {{minLenght}} znaków.</lenghterror>
-
</telephone>
-
-
</validators>
Proste nie :D
9 commentsI po sesji :)
Koniec sesji już nastąpił. Wczoraj ostatnie zaliczenie z fizyk: wyklady i ćwiczenia. Pierwsze jak sie dowiedziałem zdane na 4 a drugie na 3. Nie mniej jestem strasznie zadowolony bo raczej nie będe miał poprawek :) Oczekuje jeszcze tylko na wyniki z Podstaw informatyki. Tak czy inaczej w końcu mam spokój z uczelnią :D
2 commentsKonferencja Kierunek 2.0
Chciałbym zaprosić wszystkich, którzy w dniu 15 czerwca będą w Rzeszowie na konferencje pt. Kierunek 2.0 – czyli praktycznie wszystko o najnowszych trendach w sieci i co z tego wynika…
W dalszej częsci więcej informacji.
Read more
Filter Functions ‘n’ array
Dzisiaj dopisywałem pare rzeczy do klasy validujacej formularze. Jakie było moje zdziwienie, gdy pozornie proste rzeczy nie chca dzialac. Chodzi mianowicie o funkcje filter_var i pochodne od niej. Problem jest w przekazywaniu tablic jako zmienne.
Manual napisał:
Value to filter, arrays are filtered recursively.
Ok wszystko sie zgadza. Ale dlaczego do cholery nie dopisali, ze w przypadku uzywania tablic trzeba dodac stałą FILTER_FORCE_ARRAY ? A ja tyle czasu straciłem przez to :|
No commentsObjectToArray()
Kiedys chciałem napisac klase do cache'owania obiektow simplexml. Jednak jak sie okazało w praktyce, jest to niemozliwe. To co mnie trzymało przy simplexml to wygoda dostepu do danych w nim zawartych. Napisałem, wiec sobie mala funkcje przeksztalcajaca obiekt w wielowymiarowa tablice. Wygoda praktycznie taka sama jak przy obiekcie, a dodatkowo mozemy calosc ladnie poddac serializacji :)
Tararam:
-
<?php
-
/**
-
* Dokonuje konwersji z object na array rekursywnie
-
*
-
* @param object $z
-
* @return aray
-
*/
-
function objToArray(&$z)
-
{
-
{
-
foreach( $z as $k=>$v )
-
{
-
{
-
$z[$k] = objToArray( $z[$k] );
-
}
-
}
-
}
-
else
-
{
-
objToArray( $z );
-
}
-
return $z;
-
}
-
?>
16 comments
Moje __autoload() :)
W miare jak SparkleWorks sie rozrasta, coraz trudniej zapanowac nad wszystkimi klasami. Na poczatku wszystko wczytywałem sobie recznie przez include. Było znosnie... ale gdy doszły mi automatycznie generowane klasy modelu, to pisanie
-
include(sciezka/model.class.php;
-
$o = new Model()
byłoby niesamowicie meczace. Naturalną rzaczą jest, ze pomyslalem o __autoload()
Na poczatku było samo generowanie mapy. Jednak postanowiłem troche rozszerzyc. Do standardowej mapy mozemy dorzucic inne pliki lub tez cale foldery. Wszystko oczywiscie w XMLu :) Teraz moze zaden pozytek, ale z czasem jak zajdzie potrzeba dolaczenia innych bibliotek to bedzie juz to z głowy :)
-
<?xml version="1.0" encoding="UTF-8"?>
-
<filemap enabled="false">
-
<files enabled="true">
-
<class name="auto" enabled="true">E:\auto.php</class>
-
<class name="test" enabled="true">E:\www\test.php</class>
-
</files>
-
<dirs enabled="true">
-
<dir recursive="true" enabled="true" suffix="class.php">E:\system\classes</dir>
-
</dirs>
-
</filemap>
Wyjasniac chyba nie trzeba :)
Pod adresem klasa dla zainteresowanych. Z gory mowie ze jest to czesc SparkleWorks, wiec pewne wstawki z frameworka sa :) Jest to tez wersja robocza, tak wiec nie wszystko jest cacy, ale z gory dzieki za wskazowki :)
Zbliża się koniec prac
Powoli zblizam sie do końca prac związanych z SparkleWorks. Teraz jeszcze prace kosmetyczne, dodanie tu i tam wyjątków, komentarzy. Oczywiscie cała funkcjonalnosc jaka sobie wymysliłem nie została zrobiona. Gdybym na to czekał to nigdy pewnie bym go nie ukończył. Do zrobienia na poźniej pozostanie Cache, jakis generator administracji oraz inne przydatne rzeczy. Ale to już po pierwszym wydaniu. Uporządkuje kod i zabieram sie do konkretnej roboty. Jako pierwsze na igien podzie chyba strona kółka KOS. Narazie tylko jeszcze nie wiem jaką funkcjonalnośc musi posiadać, ale jak tylko bede miał plan działania to sie zabieram za realizacje. Mysle ze bedzie to sama przyjemnosc, wykorzystac w akcji SparkleWorks :)
A co do licencji... Jak by ktoś pytał to jeszcze się nie zdecydowałem :P
II semestr
NARESZCIE
Od wczoraj jestem już pełnowartościowym studentem II semestru. Ostatnia rzecz która mnie zatrzymywała to był egzamin warunkowy z Podstaw Informatyki. Ocena całkiem przyzwoita: 4.5 :) Jeszcze tego samego dnia zdobyłem wpis i złozyłem index.
Uffff.... Co za ulga :D
No comments
Obsługa bazy danych cd.
Moje wahania co do budowy klasy zarzadzajacej bazą danych już sie skonczyły. Większośc jest gotowa. Do tabel odwołujemy sie przez
-
$o->getPole()
a do złączonych
-
$o->joinedTable->getPole()
. Dzięki temu łatwo było zaimplementować dodatkowe funkcje - jak na razie tylko sprawdzające (reszta wkrótce). Np. jesli dodamy w WHERE pole, ktorego nie ma w tabeli to zamiast czekać na bład bazy danych, sami go wczesniej wyłapiemy :)
Inne smaczki sa przy zapytaniach UPDATE i INSERT. W setterach nastepuje sprawdzanie czy podana przez nas wartosc jest takiego typu jakiego oczekujemy, czy np. nikt nie starał sie wsadzić string'a do int'a itp. Przyda sie pewnie też bajer jak sprawdzanie czy dodalismy wszystkie wartosci. Tzn. Niektore pola sa wymagane jak np. tytuł, a inne (id ktory jest auto_increment) nie. Jesli czegoś nam zabraknie to przy wykonaniu polecenia tez bedzie stosowny bład. Całość oczywiście jest bardzo ładnie generowana automatycznie na pdst. XMLa. Np. taki schemat
-
<?xml version="1.0" encoding="UTF-8"?>
-
-
<database name="sw">
-
<table name="def"><column name="id" type="int" size="10" primary="true" />
-
<column name="author_id" type="int" size="10" required="true" />
-
<column name="cat_id" type="int" size="10" required="true" />
-
<column name="title" type="varchar" size="255" required="true" />
-
<column name="deleted" type="bool" />
-
<foreigntable>author</foreigntable>
-
<foreigntable>cat</foreigntable></table>
-
<table name="author"><column name="id" type="int" size="11" primary="true" />
-
<column name="name" type="varchar" size="255" />
-
<column name="title" type="varchar" size="255" /></table>
-
<table name="cat"><column name="id" type="int" size="11" primary="true" />
-
<column name="name" type="varchar" size="255" /></table>
-
</database>
wygeneruje nam 9(!) plików z kodem PHP :)
Mam do tego jeszcze cache, ale zastanawiam sie nad jego sensem. Wprawdzie przy pobieraniu 5000 tys. rekordów jakas róznica w czasie była, ale niewielka.
Obsługa bazy danych
Znowu zawitały ciche dni na blogu :) Spowodowane było to róznymi sprawami (głównie natury uczelnianej). Na razie wszystko sie uspokoiło, wiec coś trzeba skrobnąć. Na chwile obecną męcze sie z klasa do wykonywania polecen na bazie danych. Mam juz praktycznie głowny szkielet oparty na wzorcu AcitveRecord, ale myśle że to za mało. Tzn. zależy pod jakim względem za mało ;) Sama klasa do obsługi zapytan SELECT i UPDATE to niecałe 500 lini kodu bez komentarzy i obsługi wyjątków (gdyz takowej jeszcze nie przygotowałem :/). Mało nie jest. Dużo?... Tez nie.
Do pol w tabeli w przypadku zwykłego select odwołujemy sie po prostu
. Do pol z JOINem
. Z racji jednak, że bardzo przyzwyczaiłem sie do podpowiadania składni w Eclipse (dzięki NuLLowi [tak sie to odmienia;) ?]) przydałyby sie metody typu
jak w propel'u :) Wiąże sie to jednak ze znaczną rozbudową kodu i troche wiekszą zasobożernością. No bo dla 20 rekordów trzeba 20 nowych rozbudowanych obiektów... Jeszcze musze to przemyśleć (czekam na komentarze :>). Samo generowanie klas trudne nie będzie przy pomocy xml'a, którego bardzo polubiłem, odkąd się z nim zapoznałem. Niech jakies yml'e się chowają :D
2 commentsclass_exists() oraz __autoload()
Jeśli używacie funkcji class_exists() a jest w skrypcie zdefiniowana funkcja __autoload() to przy użyciu class_exists() jest automatycznie uruchamiane __autoload(). Aby temu zapobiec należy dodać parametr false do class_exists().
Może zaoszczedzi to komuś szukania ;-)
unserialize() i SimpleXML Object
Chciałem sobie napisać mała klase do obsługi cache SimpleXML. Cel był taki, aby przy każdym rządaniu nie parsować pliku za pomocą simplexml_load_file(), tylko zrobić unserialize() poprzednio zserializowanego obiektu. serialize() przebiegło bez problemu. Gorzej niestety w drugą stronę. Wykonanie unserialize() na zserializowanym obiekcie skutkuje takim o to błedem
Warning: unserialize() [function.unserialize]: Node no longer exists in ....
Tak wiec pomysł z klasą cache został pogrzebany :|
5 commentsVISTA - TAK!
Jednak stało sie to co myślałem... Zostaje przy VISCiE(r) :) Miałem notatke napiać juz dawno temu, ale jakos nie miałem czasu ani chęci. Co mnie przekonało? Trudno by wymienić coś konkretnego. Na moja decyzje składa sie wiele czynników. Wsród plusów oczywiście nie brakuje wad. Nie działa na nim poprawnie całe oprogramowanie jakie miałem w XP, a mianowicie: foobar, nhc, konnekt sie coś krzaczy. Nie chciało działać eclipse, ale po aktualizacji zadziałało :) Ale na wszystko znalazłem zamienniki: starszy foobar za foobara, RMclock zamiast nhc (konekt pozostał). Aby zadziałał nowy foobar musze zainstalowac na nowo wtyczki, czyli buszowanie po internecie i sciaganie nowych wersji. Nie chce mi sie wiec pozostaje przy starszej, rozkraczonej wersji bo mi sie config zrypał :|
Czysta VISTA, bez uruchomionych programów zajmuje około 250 MB RAMU, tak wiec nie jest źle. Tyle samo co opera + eclipse :D Z wydajnością jest ok, przydałby sie tylko szybszy HDD, ale da sie przezyć :) Wynika to też z tego, że podstawowa partycja musi być formatu NTFS, który jest wolniejszy od FATa.
Tak wiec jeśli ktoś zapyta o VISTE to ja jestem na T A K :)