Using FormCollections in ZF2

FormCollection is nice when you have a form with an element that can take multiple values. The ZF2 implementation is not bad, it has some drawbacks ( lack of choosing how to render the element ), but does a decent job in the end. However, the documentation is not very explicit in the implementation. Beside setting up in the php code, some javascript code is also needed.

As as showed in a previous example, styling a FormCollection requires extending the default ZF2 classes. Going forward with a full implementation takes some JS to throw it and it should work ok for if you create something or editing it after that.

Let’s consider the scenario where you have a collection. You start with it empty, you can add new elements, but also you can remove it. The applies for both create and edit pages. So the HTML of an element from the collection will need an input but also a remove button.

For the FormCollection you need to add 3 things: the collection rendered, a button to add new elements and some JS that will take care of adding the remove button to each element.

No addition is needed in the Controller ( where you define the form, do validation etc.). If you populate the form, the Collection renderer will add you in view all the existing elements, however you need to add the remove buttons yourself.

In the Form class ( I use Factory-backed extension, guess it’s a habit from ZF1), the declaration of a Collection element you look like this:

            'type' => 'ZendFormElementCollection',
            'name' => 'element_name',
            'options' => array(

                'count' => 0,
                'should_create_template' => true,
                'allow_add' => true,
                'allow_remove' => true,
                'template_placeholder' => '__element_name__',
                'target_element' => new CustomFieldset('element_name', 'Label')

The CustomFieldset is an extended Fieldset. In the ZF2 docs there is an example of an extended fieldset. Mine is a bit modified, with several parameters for flexibility:

class CustomFieldset extends Fieldset implements InputFilterProviderInterface

    public function __construct($name, $label, $type = 'text')
        $this->setHydrator(new ClassMethodsHydrator())->setObject(new CustomEntity());
            'name' => 'name',
            'type' => $type,
            'attributes' => array(
                'required' => 'required'
            'options' => array(
                'label' => $label
    public function getInputFilterSpecification()
        return array(
            'name' => array(
                'required' => true,


Of course, this is a bit incomplete, if the element needs to be a Select, you should add more code to allow setting possible values, or you can make a different Fieldset.
The CustomEntity would be simple hydrate class, with name and value as properties, their get/set methods and simple getArrayCopy()/populate() methods.
Now we need to get into the view. As I said there are 3 things we need to add. The first 2 are very simple, the collection renderer:

<div id="element_name_div">
	echo $this->formCollection($form->get('element_name_div'));

and the adding button:

<button onclick="return add_field('element_name_div','element_name_div')"
					class="btn btn-primary">Add new element</button>

As you can see, the button will use a js function to add a new element. What will do is take the template generated by formCollection renderer, add the remove button in this HTML code and insert everything it in the container that surrounds the collection. Since we have an form element with multiple values, we need to change the name for each element, by counting how many elements we have ( dynamic added or from default).

function add_field(name,index) {
    var currentCount = $('#'+name+'  input').length ;
    var template = $('#'+name+'  > span').data('template');
    var re = new RegExp("__"+index+"__","g");
    template = $($(template.replace(re, currentCount)));
    c = template.find('div.col-sm-5');
    d = template.find('div.input-group');
	var b = $(' <span class="input-group-btn"><button class="btn btn-default" >remove</button></span>'); (){$(this).parent().parent().parent().remove();});
    $('#'+name+' ').append(template);
    return false;

In my case I use a modified generated HTML for the element ( like I showed in a previous post), if you use the default rendering, the code will be simpler.Here I set an event on the remove button, but you can very well just use an onclick attribute that will call a remove function ( this might be better in case your collection is not allowed to be empty, so you can do a check, see below).
For the editing page, you need to add the remove buttons in case the collection already has some elements. So when document is ready, iterate all elements and insert the button

function remove_button(e)
    return false;

In case you have a collection which has condition that it should have at least one ( or more) elements, you need to modify the remove_button() to check how many children the container div should have. Something like:

function remove_button(e)
	}else {
		  alert('You need at least element!');
	return false;

Please note that how you make the selection remove depends on the HTML structure you have. In my case, the remove button was surounded by 4 tags ( as I was using Bootstrap HTML).

Custom rendering of FormCollection Elements

A problem with ZF2 forms is that you can’t actually configure the rendering of a form element. Same (stupid) story that was in ZF1 it’s in ZF2 as well.  If you want to change the rendering the only (idiot) solution is to extend the original rendering helper and that means override the render() function, put the whole code from the original render() function ( and edit it with your changes). The issue is you copy too much code from the framework itself and you should maintain it.

Problem: need to modify the rendering to adapt the HTML to be compatible for Bootstrap3.

Extend FormCollection and FormRow. Only one thing to change for the extended FormCollection, just set the $defaultElementHelper:

namespace ApplicationFormViewHelper;

use ZendFormViewHelperFormCollection;

class FieldCollection extends FormCollection
    protected $defaultElementHelper = 'fieldRow';


The new FieldCollection will use the view helper called fieldRow:

namespace ApplicationFormViewHelper;

use ZendFormViewHelperFormRow;
use ZendFormElementInterface;

class FieldRow extends FormRow

public function render(ElementInterface $element)
   //.... copy code from FormRow and modify with your changes

To be able to call the new helpers, you need to register then as invokables in Module.php

  public function getViewHelperConfig()
        return array(
            'invokables' => array(
                'fieldCollection' => 'ApplicationFormViewHelperFieldCollection',
                'fieldRow' => 'ApplicationFormViewHelperFieldRow'

My changes were mostly where the markup is created, so in my new FormRow renderer I have something like:

 $markup = '<div class="form-group">'. $labelOpen . $label. $labelClose .
                                    '<div class="col-sm-5"><div class="input-group">'.$elementString .'</div>'.'</div>'.'</div>' ;

and I also set a default class for the label element

 $labelAttributes = array('class'=>'control-label  col-sm-5');

Now in the HTML template we just use

    echo $this->fieldCollection($formElement);

Cafea varsata pe o Filco? No problem!

Please note that this is written in Romanian.


Pe la inceputul anului imi cumparasem un CM Storm QFR Red. Tastatura superba, totusi a trebuit s-o duc in service, am fost unul din “norocosii” care a prins un lot cu probleme. Mai precis dupa ceva vreme ( destul de repede, parca 2 luni) incepea sa nu mai functioneze tasta stanga Alt. Toate bune si frumoase, cei de la PCG mi-au schimbat-o pe garantie.

Intre timp, am avut un drum pana in Anglia si m-am decis sa iau un Filco pe switch-uri Blue.  Asa ca vorbesc cu un amic de acolo, daca tot ajungeam in UK, n-avea rost s-o comand din tara ca sa mai platesc in plus 15 GBP sau cat era transportul.

Dupa vreo luna, adormit ca de obicei dimineata, am reusit sa vars o cana de cafea pe noua si frumoasa mea Filco Majestouch-2 :)). Bine ca cafeaua nu era fierbinte.  Insa cafeaua intrase peste tot. Mai bine de 10 switch-uri balteau de cafea, nici macar nu mai functionau. Si totusi acum tastatura merge bine merci.

Deci ce e de facut in astfel de cazuri? Ei bine, tastatura are nevoie de o baie :)). Apa nu este cea mai mare problema pentru circuite, ci alte ingrediente, care pot coroda circuitele, gen zaharul din sucuri sau , unul din cele mai grave, cafeaua, care am inteles ca are o pasiune nebuna pentru asa ceva.  Cum spuneam cafeaua intrase in toata tastatura, chiar si in switch-uri.

Am dat repede fuga la un service auto care e aproape de mine, luat 2 litri de apa distilata. Desfacut toata tastaura, pana am ramas cu placa de baza in mana si am facut o baie consistenta cu apa distilata.  Cea distilata e cea mai buna, pentru ca nu contine minerale care se pot depune pe circuite. Daca chiar nu aveti apa distilata la indemana, folositi apa de la robinet – cea imbuteliata are un continut mai ridicat de minerale( gen calciu) si este posibil sa se depuna cate ceva in timp ce spalati tastatura. Oricum, sunt mai bine ceva minerale decat zaharul sau particulele de cafea, care fac prapad.

Dupa ce am spalat ( efectiv am SPALAT) placa de baza , bagand la greu si prin switch-uri ( atentie, si dupa spalare unele switch-uri  or sa dea impresia ca nu merg, stati calmi, isi revin dupa ce se usuca), am pus toate componentele la uscat. In 2 zile am asamblat tastatura la loc si merge perfect si in ziua de azi.

Din pacate, nu mai am pozele din timpul operatiunii, singura care am gasit-o e cand deja eram la faza de re-asamblare.


Concluzia finala: ati varsat ceva pe o tastatura mecanica, bagati repede la spalat. Nu lasati sa se usuce ce ati varsat pe ea, posibil sa n-o mai recuperati deloc.

Sphinx demos

Several weeks ago I made 3 sphinx sample codes along with a written article about each Sphinx feature they use.

To keep things short:

Autocomplete and suggest


Geo Search


Also watch Sphinx blog, I post articles on regular basis.

Dealing with Sphinx: encountered a bug?

First reaction of most people when getting a bug, either unexpected result or program crash is to either fill a bug ticket or report it on the forum.

Is this the best way? Well, you need to do something before jumping on reporting a bug: more exactly, be sure you use latest version.

There are a lot of reports with crashes or “this doesn’t work as it supposed to do”. When you ask, what you find? In general they use 2.0.2-beta or 2.0.1 or worst : 0.9.9.

0.9.9 was released THREE years ago. Sphinx doesn’t even support this version, with exception of express request ( read money ). Some linux distributions still come with 0.9.9 in their repositories. Use a package from Sphinx site. A version like 0.9.9 is old, might have bugs, miss a lot of features and the open-source support will never fix a reported bug for it. Same goes for 1.10. Bugs are fixed for latest stable, latest beta and development version. That is 2.0.6 , 2.1.1 and trunk at the moment of writing this post.

You should always have the latest (stable) of Sphinx. Why ? Two reasons : every maintanance release gets fixes and possible speed improvements. Sphinx includes compability backwards so it’s safe to upgrade. A newer version can handle an upgrade indexes created with an older version. Even between releases as 2.0.6 and 2.1.1. Of course, it’s wise to do a backup of the indexes in case something might go wrong. Upgrading is very easy. If you use a binary package, just install the binary package for the newer version. Sphinx itself consists of several executables and a configuration file. The binary packages will not overwrite your config, in case of an upgrade.


Tastaturi mecanice

Please note that this is written in Romanian.

In ultima vreme au inceput sa apara si pe la noi si tot mai multa lume incepe sa fie interesata de ele.

Pe scurt: daca credeai ca tastatura e o chestie simpla, la care in afara de lucruri de estetica (cum arata) si briz-briz-uri gen iluminare,macro,porturi usb, eh , aflta ca te-ai inselat. Pana acum vreo 2-3 luni nu m-a interesat nici pe mine subiectul, nici nu stiam ca se mai fac tastaturi cu contacte mecanice :)) Tastaturile comune, care le vedem peste tot , fie ca incep de la 20lei (alea eftine, vorba aia), fie ca sunt mai scumpe ( cu lumimi, wireless etc.) sunt bazate pe un sistem cu mebrana. In principiu tasta are un piciorus inauntru, care la apasare loveste o membrana care declanseaza un contact electric pe placa tastaturii. Metoda asta – foarte ieftina – are niste dezvavantaje. In primul rand se uzeaza in timp, cateodata foarte repede. A doua problema este ca trebuie sa apesi tasta pana la finalul cursei ( acolo unde are loc declansarea contactului)  – chestie numita “bottom up” si care pentru un typing rapid, e ineficienta ( pentru ca dejtu trebuie sa parcurga toata distanta, iar in plus nu exista nici un feedback care sa-ti spuna ca tasta s-a inregistrat sau nu).

Cea mai tare tastatura ever este considerata IBM modelul M, lansata acum un milion de ani si care se baza pe un contact mecanic si are la baza un principiu bazat pe folosirea unui arc. Astia mai batrini probabil o cunosc. O tastatura grea, care facea mult zgomot ( de ziceai ca e masina de scris )  si era destul de greu de apasat. Inca se mai gaseste pe eBay sau alte parti si de cativa ani o companie ( Unicomp) a inceput sa produca o replica.

Mai nou si mai modern, se folosesc “switch” -uri ( contact) MX , produse de Cherry , firma fost americana , actual germana, care in ultimii ani au gasit gaina de aur cu contactele lor.

MX-urile vin in mai multe variante, in functie de forta de apasare necesara sau feedback-ul oferit. Un ghid exaustiv se afla pe

Ce vreau sa aduc in discutie e un mic ghid pentru cei care vor sa-si cumpere una.

In principiu :

MX Blue –  sunt pentru typing si mai putin gaming , din cauza feedback-ului atat tactil cat si auditiv

MX Brown –  asemanator cu Blue , dar le lipseste feedback-ul auditiv , plus cel tactil nu este asa puternic , potrivite pentru orice , desi mult spun ca e o solutie “good enough” care in final nu face nici o treaba cum trebuie

MX Red –  fara feedback  ( adica liniare) , foarte usor de aparat, tasta se inregistreaza la jumatatea cursei . Potrivite pentru gaming , unii le prefera si pentru typing

MX Black –  la fel ca Red, dar necesita o forta de apasare mai mare. In ultima vreme au inceput sa piarda teren in fata Red-urilor. Potrivite pentru gaming si prea putin pentru typing , din cauza fortei mari de apasare, devin obositoare.

Ce se gaseste la noi pe piata ?  Majoritate sunt Red sau Black , putine Blue sau Brown si alea niste modele neinspirate.

Indiferent de firma, tastaturile astea sunt facute tot in Asia. 2 mari OEM se ocupa de asta : Costar si iOne . Al doilea  se pare ca scartie la calitate, iar lucrul asta poate fi un reper in deciderea achizitionarii.

Cateva detalii de care trebuie tinut cont:

– tastele – material ( adica tipul de plastic) si modul cum sunt printate semnele pe ele.

Metode :

  • pad printing – cea mai uzuala si proasta metoda
  • laser etched –  printare cu laser , rezista foarte bine in timp
  • engraved –  prin gravare , nu place la toata lumea
  • molding –  tasta e compusa din doua bucati de culori diferite , prin suprapunere se obtine semnul, nu prea se gasesc decat la produsele f. scump , pentru ca o metoda costisitoare

Modul de prindere al contactelor

  • direct pe PCB ( placa tastaturi ) , metoda mai ieftina , intalnita si la tastaturile comune, poate duce la uzura placii ( mai ales daca tastatura isi ia pumni )
  • placa de otel –  pe langa faptul ca anuleaza problema celor pe PCB, mai ofera avantajul greutatii ( tastatura sta mai pune pe masa/birou ) . Placa de otel schimba un pic si sunetul la tastare, in special la bottom up

Cele produse de Costar sunt privite ca mult mai bune , atat din cauza ca folosesc materiale mai bune de costructie ( aici ma refer la plastic cat si la sudurile cu cositor ) , dar si controller-ul facut de ei nu face probleme.

O trecere in revista a brand-urilor de tastaturi mecanice:

Filco –  produse de Diatec ( japonezi) ca brand , Costar ca oem . Considerate etalonul in materie. Nu se gasesc la noi , se pot comanda din UE. Vin in format standard , fara briz-briz-uri. Taste de calitate ( laser-etched), MX-uri sunt montate pe placa de otel , PCB este mai bun ca la restul , la fel si la lipituri se acorda o mare atentie, in principiu sunt considerate ca rezista foarte mult in timp. Singura problema ar fi pretul, destul de exaustiv ( 100 lire sterline – 140E). Mai nou au si model tenkeyless ( fara numpad)

Das –  laudate mult, considerate urmatoarele dupa Filco. Totusi cateva chestii : pe partea superioara folosesc un plastic lucios ( magnet de praf ) . In ultima vreme pentru modelul Profesional au facut tastele F1-12 sa fie si media ( sunt chiar iluminate) , dar se pare ca iOne le produce. Preturi ceva mai mici , de pe la 130E, se gasesc in europa

WASD –  o firma americana , face tastaturi custom sau semi-custom – calitate foarte buna , cot la cot cu Filco , iti poti alege culoarea la tasta ( chiar poti sa printezi un model peste toate tastele). Produse de Costar ,  se pot alege tastele fie laser-etched , fie engraved. Preturi : de la 120$ Curand vor scoate un nou model – se pare ca Costar pregateste o placa noua care va suporta si iluminare.  Singura problema e ca se comanda doar din US si cred ca pot ajunge dublu la pret ( daca s-o plati ceva vama pentru ele).

CM Storm – intrati de curand pe aceasta piata, fata de altii au ales sa faca ceva de calitate. Modele Quick Fire Rapid si Trigger sunt produse de Costar ( QFR e considerat clona de Filco iar in mare parte e aproape identica cu un Filco tenkeyless ), iar modelul Quick Fire Pro e produs de iOne ( fata de alte tastaturi facute de iOne , aici s-a tinut mult la calitate , desi au fost raportate probleme) , si modelul TK care ar folosi un alt OEM fata de cei doi. Calitatea este buna ( posed un QFR Red ), din pacate la noi ( si in UE ) nu (prea) se gasesc modele cu Brown sau Blue

Steelseries –  au doua modele destul de ok si ieftine , se gasesc in general doar cu Black-uri

Razer – una din cele mai neinspirate alegeri – si nu o zic eu , o zic multi din afara. Problema e ca au ales sa faca tastatura de gaming folosind contacte Blue ( mai nou exista si pe Brown ). A doua problema e ca le produce iOne si lumea se plange de proasta calitate a tastelor si a controller-ului. Cu toate astea au un pret destul de mic si vin cu iluminare , macro-uri etc.

Rosewill – o firma din SUA care face cam de toate. Au scos cateva modele destul de bune , unele sunt facute de Costar,cel mai cunoscut model de la ei este 9000. O problema comuna este cu portul USB , care nu are o fixare si o sudura foarte buna ( si poate sa iasa de pe placa ). Dar vin cu un pret destul de bun, am vazut un Blue la 80$ si tinand cont ca e aproape un Filco, in principiu merita.

Ducky – un alt producator destul de bun pentru preturile care le au. Au o gama variata , de la tastaturi standard , tenkeyless si iluminate. N-am prea inteles ce OEM folosesc sau daca si le fac ei  , dar in general lumea le lauda. Teoretic ar trebui sa se gaseasca la unele magazine din UK sau tarile scandinave ( atentie la layout)

Qpad/Xarmor/iOne – aceleasi modele de baza , toate facute de iOne , Qpad cred ca se gaseste prin UK

Corsair –  au scos 2 modele , marea problema e ca nu sunt full mecanice , unele taste ( ca F-urile) sunt pe dome ( membrana) si am vazut destule plangeri legate de calitatea lor

Thermaltake  – modelul Meka G1 era produs de Costar ,destul de solid ,  celelalte modele sunt facute de alti producatori

Ozone/Mionix –  ambele au de fapt acelasi model de baza ca si TT Meka G1 , diferente mici s-ar putea sa fie la calitate si briz-uri ( Ozone Strike pare a fi cea mai slab calitativa dpdv al rebranding-ului )

Cherry – pe langa ca fac contacte , au si propriile tastaturi ( fac multe tastaturi industriale ) . Modelul G80-3000 este cel de consumer pe MX , fiind o tastatura standard . Atentie ca alte modele mai ieftine folosesc MY sau ML care nu e tot una cu MX

Leopold –  destul de ok , firma koreana , nu e prea clar unde si cum le fac , unele modele sunt China , altele Taiwan

Logitech –  au deocamdata un singur model , care vine cu Brown-uri , facuta pentru gaming , un pret destul de piperat , in orice caz nu sunt produse de Costar. Personal eu nu mai cumpar Logitech, recomand doar pentru gameri modelul lor.

Tesoro Durantal –  cred ca se gasesc prin UE , la cum arata mai mult ca sigur sunt China ( poate chiar iOne), dar arata destul de bine pentru niste tastaturi de gaming.

Asadar , ce alegem ? Depinde mult si de buget si pentru ce anume. Parerea mea e ca cel mai sa alegeti una “Made in Taiwan” , in general OEM-urile acorda o mai mare atentie calitatii. Un lucru important de luat in considerare este calitatea tastelor, in cazul in care cumva vreti sa vindeti mai tarziu tastatura. Cred ca e mai greu sa vinzi o tastatura cu taste sterse.

Momentan am un CM Storm QFR Red . Nu mai suportam pe asta de o aveam ( una de la Microsoft ieftina care am luat ca ma scotea din minti un Logitech K nu stiu cat wireless) si nici nu mai aveam rabdare pana imi venea una de afara. E prima tastatura mecanica care o am si prima tenkeyless ( care nu e un lucru rau, am momentan un birou un pic cam mic ). E bestiala, desi e mica , e destul de grea ( are aproape un kilogram ) si nu fuge deloc. Red-urile sunt interesante , inca nu m-am obisnuit cu ele , fac bottom up la greu, insa diferenta fara de dome-uri e enorma. Cred ca mult n-o s-o tin si imi voi lua ceva pe Blue ( ma tenta Razer BW – singura de la noi care venea pe Blue , dar prea multe review-uri negative, plus ca arata ca pentru pusti de 14 ani ), as merge pe Filco, WASD , Ducky sau Rosewill.
 – inactive account fee – really? sucks. Here’s why : if you have funds in your account and you didn’t had any activity for 5 months , they will start taking 5$/months as an “inactive account fee”.
It’s not something hidden, there is a full page about it ( at ). I had some money from some freelancing work I’ve done around nov. 2011, but never withdraw them as it was a small number, yet I never though they would do such thing. So from may 2012 they started to take 5$ … in the end , they took me 40$.   I mean , it’s not a big sum , but – still – enough to get drunk in one evening.

How I discovered ? I get from time to time invites to projects, usualy not following them , but today clicked on one to see what’s about, then I remembered I had some dolars there and surprise. I was like WTF.

Interesting , checked , which I used more extensive, to see if they have same thing. Well :

How long can I leave my oDesk earnings in my account?
You can leave your oDesk earnings in your account as long as you want. Your funds can remain in your finance account without any type of penalty or fee.a

So seems Odesk are good guys. They don’t have any penalty for “inactive account”.
I also checked ( now owned by I have 40$ there from sept. 2011 untouched! Not sure if that will change after the transaction to will complete, but I’ll check.

So if you did works on, make sure you withdraw your money, otherwise elance will make sure to take a cut :)