PHP Sammelthread: Zend Framework und alles was dazugehört

Bin auch für CamelCase.

Hab aber grade mal wieder ein Problem. Ich möchte ein Formular dynamisch per JavaScript erweitern und weitere Textfelder hinzufügen. Ich habe aber kA, wie.

Ich muss die Daten ja als Array erhalten, aber Zend_Form macht das nicht mit.

Ich habs so versucht:

PHP:
$subForm = new Zend_Form_SubForm();
$this->addSubForm($subForm, 'name');

$n1 = new Zend_Form_Element_Text('name');
$n1->setIsArray(true)->setBelongsTo('name');
$subForm->addElement($n1);

//   ["name"]=>   array(1) {     ["name"]=>     NULL   }
// auch wenn ich übrerall was verschiedenes Eingebe, keine Chance.

Ich habe noch einiges mehr rumexperimentiert, mit ohne setIsArray() oder setBelongsTo() und ohne das SubForm, aber nichts funktioniert.
Ohne SubForm überschreiben sich die Eingaben bzw. werden sogar ignoriert.

Wo liegt mein Denkfehler? :roll:
 
@flaschenkind
Auch ohne SubForm + setBelongsTo probiert? setIsArray muss bleiben.

@ll
Das ZF beachtet überall das default encoding am System nicht. Für Zend_View hab ich das jetzt umgestellt, aber das ZF hat für manuelle Umstellung eindeutig zu viele Klassen:ugly:
Gibt es eine andere Möglichkeit, das ZF-weit umzustellen?
 
@ll
Das ZF beachtet überall das default encoding am System nicht. Für Zend_View hab ich das jetzt umgestellt, aber das ZF hat für manuelle Umstellung eindeutig zu viele Klassen:ugly:
Gibt es eine andere Möglichkeit, das ZF-weit umzustellen?
was heisst es beachtet das Default-Encoding nicht?

In sovielen Klassen kann man das Encoding gar nicht umstellen, das ist nur eine hand voll, muss aber für jede Komponente, die du nutzt, einzeln gemacht werden.
Kannst ja mal in der Zend Mailingliste vorschlagen für das Zf 2.0 eine globale Einstellung des Zeichensatzes einzuführen.
 
was heisst es beachtet das Default-Encoding nicht?

In der php.ini/ini_set encoding verändern.

In sovielen Klassen kann man das Encoding gar nicht umstellen, das ist nur eine hand voll, muss aber für jede Komponente, die du nutzt, einzeln gemacht werden.

Naja, so übern Daumen in fast allen, wo I/O passiert, was schon einige sind, oder?

Kannst ja mal in der Zend Mailingliste vorschlagen für das Zf 2.0 eine globale Einstellung des Zeichensatzes einzuführen.

Jaah, Mailingliste. Das System hab ich noch nie verstanden:ugly:

Und v.a.: Welcher von den vielen? :-?
 
In der php.ini/ini_set encoding verändern.
das Zend Framework verwendet die iconv- und mbstring-Bibiliotheken welche eigene Ini-Direktiven für den Zeichensatz haben ;)
Falls du die Zeichensatzdirektive "default_charset" meinst, ja, also eigentlich hat die in PHP auch keine wirkliche Bedeutung :biggrin:


Naja, so übern Daumen in fast allen, wo I/O passiert, was schon einige sind, oder?
hält sich in Grenzen. Also wirklich relevant sind ja nur Zend_Db, Zend_View und Zend_Form.
Am besten UTF-8 verwenden, dann funktioniert alles ohne einstellen :D
(Bei Zend_Http finde ich nichtmal eine Möglichkeit den Zeichensatz einzustellen)

Jaah, Mailingliste. Das System hab ich noch nie verstanden:ugly:

Und v.a.: Welcher von den vielen? :-?
Ne Mailingliste ist wie ein Forum bei dem du Mails schreibst um etwas zu posten, die meisten haben aber auch ein Webfrontend, ich verwende eigentlich nur das Web-Frontend.
In die General Liste rein: https://framework.zend.com/archives
 
begrüße! hier mal die nestedset library von mir, an der ich in letzter zeit gearbeitet habe..

https://pastebin.de/9134

danke nochmal an sebmaster, der mir mit seinem snippet wohl einige stunde an debugging und rumprobieren gespart hat ;)

vielleicht kann ja jemand was damit anfangen.. ich habe die library so aufgebaut, dass sie einigermaßen flexibel ist.. für normale auslese operationen gibt es deswegen jeweils zwei methoden.. eine gibt jeweils nur ein select objekt zurück, das dann erweitert werden kann.. die andere methode ist dafür gedacht, von außen aufgerufen zu werden.. für den fall der fälle habe ich die methoden, die den select zurückgeben auf public gelassen..

so ist es möglich, beim methodenaufruf noch weitere spalten zum auslesen (standardmäßig werden nur level, num_childs, etc ausgelesen.. zusätzliche spalten können auch in der klassenvariable $_columns festgelegt werden), ein where statement oder ähnliches anzuhängen.. mögliche optionen sind: where, having, order, limit, columns.. also einfach zb:

PHP:
$tree->getTree(array(
                  App_Db_Tree::COLUMNS => array('foo', 'bar'),
                  App_Db_Tree::WHERE => 'active = 1'
));

ist bestimmt nicht perfekt, eventuell verbuggt und womöglich auch nicht vollständig.. aber für meine zwecke reicht es erstmal.. aus performance gründen könnte man es noch erweitern, dass level und parent direkt in der tabelle gespeichert werden..

über kritik oder sonstige kommentare würde ich mich freuen ;)
 
Zuletzt bearbeitet:
Beim ersten drübersehen:
Dein Code sollte nicht selbst Transaktionen starten und/oder abbrechen, wenn die Anwendung aussenrum schon eine Transaktion nutzt, entstehen da sehr doofe Probleme.

Ansonsten: Viel Code den man durchsehen und verstehen müsste, bräuchte man viel Zeit :biggrin:
 
hehe.. dass es jemanden gibt, der art und weise, wie ich transaktionen verwendet habe nicht zufrieden ist dachte ich mir schon fast :D da habe ich in meiner restlichen anwendung auch noch keine richtige lösung dafür.. wobei mir der ansatz hier: https://www.stevehollis.com/2010/03/practical-nested-transactions-with-zend_db-and-mysql/ recht gut gefällt.. den werde ich bei gelegenheit eventuell mal implementieren..

dass es viel code ist, ist klar.. ich erwarte auch definitiv von niemandem, dass er sich das genauer anschaut ;) wollte den code einfach mal reinstellen, falls sich jemand dafür interessiert..
 
danke nochmal an sebmaster, der mir mit seinem snippet wohl einige stunde an debugging und rumprobieren gespart hat ;)

Jah, das hat mich auch einige Stunden/Tage Arbeit gekostet:ugly:

Danke für die Klasse. Möglw. werde ich die auch mal verwenden, aber erst muss ich mich da reinlesen, wofür ich atm die Zeit nicht habe:roll:
 
Mal wieder ne Frage. Ich habe diesmal das verlangen, bei Zend_Form Elementen je nach Validator verschiedene Meldungen auszugeben.

Meine Element wird wie folgt erstellt:
PHP:
$username->setLabel('Username')
               ->setRequired()
               ->addValidator(new Zend_Validate_Alnum())
               ->addValidator(new Zend_Validate_Db_NoRecordExists(array(
                     'table' => 'users',
                     'field' => 'username',
               )));

Wie bekomm ich jetzt die Fehlermeldungen zugewiesen?
Wenn ich $username->setErrorMessages() nutze, werden beide angegebenen Meldungen ausgegeben.
Über den $options-Array von addValidator() gibt es auch keine Möglichkeit, wie ich das sehe.

Eine Möglichkeit, die ich kenne, ist die Validatoren vorher zu definieren und dann $validator->setMessage() zu nutzen. Das möchte ich aber vermeiden und lieber die Validatoren direkt "im" Element deklarieren.
 
der 3. Parameter von addValidator ist ein Array mit Optionen, mit dem key "messages" müsstest du also dynamisch Übersetzungen für den Validator hinzufügen können ;)
(das Array von messages wird als Parameter an die setMessage-Methode von Zend_Validator_Abstract übergeben)
 
der 3. Parameter von addValidator ist ein Array mit Optionen, mit dem key "messages" müsstest du also dynamisch Übersetzungen für den Validator hinzufügen können ;)
Klappt aber nicht :-? Der nimmt immer die Standard Messages

PHP:
$username->addValidator(new Zend_Validate_Alnum(), true, array('messages' => array('notAlnum' => 'Fehler')));
// bzw.
$username->addValidator(new Zend_Validate_Alnum(), true, array('messages' => array('Fehler')));
// bzw.
$username->addValidator(new Zend_Validate_Alnum(), true, array('messages' => 'Fehler'));
Und trotzdem gibt er mir folgendes aus:

  • '!' contains characters which are non alphabetic and no digits
 
also eigentlich hätte es so sein müssen:
PHP:
$username = $this->createElement('text', 'username');
$username->addValidator('Alnum', true, array('messages' => array(
	'alnumInvalid' => 'Fehler!',
	'notAlnum' => 'Fehler!',
	'alnumStringEmpty' => 'Fehler!',
)));
		
var_dump($username->isValid('ice-breaker'));
var_dump($username->getMessages());

Beim Debuggen habe ich jedoch herausgefunden, dass scheinbar immer die Errormeldungen aus dem Translator geladen werden, zumindest scheint es mir so, sehr komisch.

Alternativ kannst du natürlich den Holzhammerweg gehen und es folgendermaßen machen:
PHP:
$username = $this->createElement('text', 'username');
$username->addValidator('Alnum')->setErrorMessages(array('Fehler!'));
		
var_dump($username->isValid('ice-breaker'));
var_dump($username->getMessages());
 
also eigentlich hätte es so sein müssen:
[...]
Beim Debuggen habe ich jedoch herausgefunden, dass scheinbar immer die Errormeldungen aus dem Translator geladen werden, zumindest scheint es mir so, sehr komisch.
Jo, finde ich auch sehr komisch. Ich habs ja auch ähnlcih gehabt.

Alternativ kannst du natürlich den Holzhammerweg gehen und es folgendermaßen machen:
Ne, ich möchte je nach Validator ne eigene Fehlermeldung ausgeben, da ich z.B. noch den Db_NoRecordExists Validator nutze, und da will ich auch sagen, dass es den Username schon gibt ;)
 
Ne, ich möchte je nach Validator ne eigene Fehlermeldung ausgeben, da ich z.B. noch den Db_NoRecordExists Validator nutze, und da will ich auch sagen, dass es den Username schon gibt ;)

Ein Validator testet immer nur eine Sache, von daher ist es doch kein Problem.

Validator-Chain eines Usernames:
  • Not-Empty (Error-Message: Username muss eingegeben werden)
  • Alnum (Error-Message: Username muss alphanumerisch sein)
  • NoRecordExists (Error-Message: Username bereits vorhanden)
 
addValidator() gibt aber das Form-Element zurück und nicht den Validator. Das setErrorMessages() wird dann auf das Element angewendet und gilt dann global für alle Fehler, die auftreten. So seh ich das zumindest.

Man müsste also den Validator vorher seperat deklarieren und dann die Fehler-Meldung zuweisen, was mir irgendwie nicht gefällt :-?

PHP:
$validator = new Zend_Validate_Alnum();
$validator->setMessage('Fehler');
$validator2 = new Zend_Validate_Db_NoRecordExists('tabelle', 'feld');
$validator2->setMessage('eintrag existiert');

$username->addValidator($validator)->addValidator($validator2);
 
addValidator() gibt aber das Form-Element zurück und nicht den Validator. Das setErrorMessages() wird dann auf das Element angewendet und gilt dann global für alle Fehler, die auftreten. So seh ich das zumindest.
ups, stimmt

Man müsste also den Validator vorher seperat deklarieren und dann die Fehler-Meldung zuweisen, was mir irgendwie nicht gefällt :-?
es seidenn du löst das Problem, warum die Validation-Messages scheinbar aus dem Translator geladen werden.