[Javascript/jQuery] Values ausgewählter Checkboxen ermitteln

Szenario: Ich hab ein Formular, ähnlich wie Folgendes, und möchte per Javascript ermitteln, welche Objekte alle ausgewählt sind. Die Werte der ausgewählten Checkboxen möchte ich später bspw. an eine URL semikolongetrennt anhängen. Die Auswertung, welche Checkboxen aktiviert sind oder nicht, soll ohne Absenden des Formulars geschehen.

<form>
    <input type="checkbox" id="checkbox_1" value="1001"/>
    <input type="checkbox" id="checkbox_2" value="1011"/>
    <input type="checkbox" id="checkbox_3" value="1015"/>
</form>

Folgendes Javascript prüft dabei die Checkboxen beim Ändern mittels jQuery und trägt den Wert der Checkbox in ein Array ein.
Wird die Checkbox abgewählt, soll der Wert wieder aus dem Array gelöscht werden.

checkedArray = new Array();
$("[id^=checkbox_]").change(function() {
    if($(this).is(":checked")) {
        checkedArray.push($(this).val());
    } else {
        for(var i=0; i<checkedArray.length;i++ )
        {
            if(checkedArray[i]== $(this).val()) {
                checkedArray.splice(i,1);
            }
        }
    }
});

Das entstandene Array kann in einer weiteren Javascript-Funktion genutzt werden um bspw. an eine URL benötigte URL-Parameter anzuhängen. Über die Funktion .join() werden die Values des Arrays mittels dem übergebenen Separator verkettet und als String ausgegeben.

location.href = meineUrl + checkedArray.join(';');

Interessante Quellen dazu:

Zend_Form mit mehreren Submit-Buttons

Benötigt man für ein Zend Formular mehrere Ausgänge, so bieten sich folgende Lösungen an:

  • Buttons, die per Javascript Aktionen auslösen
  • mehrere Submitbuttons

Variante 2 lässt sich recht einfach umsetzen. Zunächst ein Blick in den interessanten Teil des Formulars:

$delete = new Zend_Form_Element_Submit('delete');
$delete->setLabel('Löschen');

$duplicate = new Zend_Form_Element_Submit('duplicate');
$duplicate->setLabel('Duplizieren');

$submit = new Zend_Form_Element_Submit('submit');
$submit->setLabel('Absenden')

$this->addElements(array($delete, $duplicate, $submit));

Wir haben also drei verschiedene Submitbuttons angelegt und diese dann dem Formular zugewiesen. Als nächstes schauen wir uns die Formularverarbeitung bspw. im Controller an:

$form = new MyNewForm();
if ($this->getRequest()->isPost()) {
    $formData = $this->getRequest()->getPost();

    if ($form->submit->isChecked() 
        && $form->isValid($formData)) {
        // Form valide und Submitbutton wurde gedrückt
    }

    if ($form->delete->isChecked() 
        && $form->isValid($formData)) {
        // Form valide und Delete-Button wurde gedrückt
    }

    if ($form->duplicate->isChecked() 
        && $form->isValid($formData)) {
        // Form valide und Duplicate-Button wurde gedrückt
    }
}

Wir prüfen also zunächst, ob das Formular abgeschickt wurde, danach ob das Formular valide ist und der jeweilige Button gedrückt wurde. Über die Methode isChecked() des jeweiligen Formularelements bekommen wir jetzt recht simpel heraus, ob der Button gedrückt wurde.

[via]

Zend_Db_Select mit fehlender Variable in WHERE-Clause

Nehmen wir folgenden Anwendungsfall an:

$userSelect = new Zend_Db_Select($db);
$userSelect->from('User')
           ->where('Name = ?', $name);

Im Normalfall sollte die Query wie folgt aufgelöst werden:

WHERE Name = 'MeinName'

Für den Fall, dass $name = NULL, also es nicht übergeben wird, erzeugt Zend folgendes Query, welches folglich einen SQL Fehler wirft:

WHERE NAME = ?

Um diesen Fall zu vermeiden, castet man die Variable in den Datentyp, den das Tabellenfeld hat, bspw. in einen String:

->where('Name = ?', (string) $name);

Ist nun $name = NULL, so erhalten wir dennoch eine korrekte Syntax:

WHERE Name = ''

Cheat-Sheet für Zend application.ini

Mittels der application.ini in Zend Framework Projekten kann man seine Zend-Anwendung auf recht simple Art konfigurieren. Doch nur die Wenigsten kennen alle Konfigurationsmöglichkeiten der application.ini. Aus diesem Grund hat Florian Eibeck ein, aus meiner Sicht sehr sinnvolles, Cheat-Sheet für eben diese Konfigurationsdatei bereit gestellt, welche eben alle Möglichkeiten aufzeigt. Aktuell basiert die Datei auf Zend Framework 1.11.11 und wird ständig weiter gepflegt.

Link: Zend Framework: Cheat-Sheet application.ini

PHP – Datum berechnen

Mit PHP das Datum von gestern ermitteln:

$date = date('Y-m-d', time() - 86400);

Die aktuelle Zeit nehmen, davon 86400sec abziehen (entspricht 24h) und dann in das gewünschte Datumsformat casten.

Update: Besser geht das Ganze allerdings über folgendes Codesnippet:

$date = '2012-05-11';
date('Y-m-d', strtotime('-1 days', strtotime($date)));

Update 2:
Wenn ihr auf einen Wochentag bspw. 3 Werktage addieren wollt, funktioniert das analog zur oben beschriebenen Funktion:

$date = '2013-09-05';
date('Y-m-d', strtotime('+3 weekdays', strtotime($date)));

Weitere Funktionalitäten zu strtotime() findet ihr hier:
http://www.php.net/manual/de/datetime.formats.relative.php

Versteckte Dateien in Eclipse und Zend Studio anzeigen

Möchte man im Eclipse oder Zend Studio eine .htaccess Datei bearbeiten, so wird man diese im PHP-Explorer oder im Navigator standardmäßig nicht finden. Da die Datei mit einem „.“ beginnt gilt sie als versteckte Datei und wird ausgeblendet.

Um diese versteckten Dateien dennoch wieder einzublenden, klickt ihr im PHP-Explorer auf das kleine Dreieck und wählt den Menüpunkt „Filters …“ aus. Im sich öffnenden Fenster muss der Haken bei „.* resources“ entfernt werden, damit zukünftig auch die versteckten Dateien angezeigt werden.

Beliebige Texte in Zend Form integrieren

Um einen beliebigen „HTML“-Text in ein Zend-Formular zu integrieren sind folgende zwei Schritte notwendig:

1. Anlegen einer Klasse welche von Zend_Form_Element_Xhtml ableitet und den ViewHelper ‚formNote‘ implementiert:

/**
 * Lädt den View-Helper Zend_View_Helper_FormNote
 */
class MyClass_Form_Element_Note extends Zend_Form_Element_Xhtml
{
    public $helper = 'formNote';
}

2. Instanzieren der angelegten Form_Element-Klasse innerhalb der Zend_Form:

$note = new MyClass_Form_Element_Note('note');
$note->setValue('<p><b>Ich</b> bin ein beliebiger HTML-Text</p>');
$this->addElement($note);

Decorator können ebenfalls wie gewohnt benutzt werden.