Cannot modify header information

Bei der Umsetzung für ein CRM-Projekt erhielt ich die Fehlermeldung „Cannot modify header information – headers already sent by…“.
Die einschlägige Google-Suche brachte folgende Ergebnisse:

The problem? White space after the closing ?> PHP tag. You can have as many carriage returns as you like, but don’t try a space.

This error occurs if there is any output before calling header() function. The most common and mostly „invisible“ mistake is having whitespaces at the beginning or the end of one or more of your files. Make sure there are none before opening < ?php or after closing ?> tags.

Das war’s aber nicht, die Lösung war die UTF-Codierung des Quellcodes:

Another very common problem is extra whitespace at the *start* of php files – especially editors inserting invisibly UTF BOM bytes. If you want to make a maintenance tool, it would be good to check for this issue too.

In diesem Fall ist die PHP-Datei in UTF-8-Codierung abgepeichert und enthält ein “Byte Order Mark” (kurz: BOM). Das BOM-Steuerzeichen wird von PHP falsch erkannt, weshalb man für diese Datei “UTF-8 ohne BOM” als Kodierung wählen muss.

Danach funktioniert’s!




SQL mit CakePHP und der Bedingung NOT IN

$this->set('agents',$this->Contract->User->find('list',array(
			'fields' => array('User.id','User.username'),
			'conditions' => array(
						'User.active =' => '1',
						'NOT' => array(
							'User.username' => array('admin',$this->Auth->user('username'))
							))
			))
);

Which produces the following:

SELECT `User`.`id`, `User`.`username` FROM `users` AS `User` WHERE  `User`.`active` = 1 AND NOT (`User`.`username` IN ('admin', 'user'))

Quelle: http://cakebaker.42dh.com/2007/04/26/how-to-use-not-in-in-a-condition/

Ganz schön komfortabel aber auch tricky, wenn man diesen Weg nicht kennt 😉




fpdf in CakePHP

Nach http://bakery.cakephp.org/articles/sdevore_myopenid_com/2007/01/27/pdf-helper-using-fpdf sollte es gar nicht so schwierig sein, fpdf in cakephp zu nutzen.
Ist es aber doch ein bischen…

Umgesetzt auf cakephp 1.2.x

// Dateiname: \views\helpers\pdf.php
< ?php   
//vendor('fpdf/fpdf.php');  
//App::import('Vendor', 'Fpdf', array('file' => 'fdpf'.DS.'fpdf.php'));
App::import('Vendor', 'Fpdf', array('file' => 'fdpf/fpdf.php'));

if (!defined('PARAGRAPH_STRING')) define('PARAGRAPH_STRING', '~~~');

class pdfHelper extends FPDF {

	// to avoid warnings ...

	var $helpers = array(); 

	// Variablen
	var $fontCustomer = "";
	var $title = "";

Mehr Informationen zu den Warnings.

// Dateiname: \vendors\fdpf\fpdf.php
// ORIGINAL: function FPDF($orientation='P', $unit='mm', $format='A4')
// Anpassung laut http://cakephp.1045679.n5.nabble.com/FPDF-in-cakephp-1-2-td1298891.html
// Ansonsten Fehlermeldungen
function FPDF($w, $orientation='P', $unit='mm', $format='A4')
// Dateiname: \controllers\presses_controller.php

function displaypdf($id = null) {
		if (!$id) {
			$this->Session->setFlash(__('Invalid Press.', true));
			$this -> render('blank');
			//$this->redirect(array('action'=>'index'));
		}
		$this->set('press', $this->Press->read(null, $id));

        $this->layout = 'pdf'; //this will use the pdf.ctp layout in views/layouts
        //$this->set('data','hello world!');
        //$this->render();
    }
// Dateiname: C:\xampp\htdocs\cake\hoecker\views\layouts\pdf.ctp
< ?php  
header("Content-type: application/pdf");  
echo $content_for_layout;  
?>

Es wird das cakephp-Modell „Press“ benutzt.

// Dateiname: C:\xampp\htdocs\cake\hoecker\views\presses\displaypdf.ctp
< ?php 
	$id = $press['Press']['id']; // zur späteren Nutzung

	// Explizites Initiieren 
	$pdf->setup(null, 'Portrait','mm','A4');

	$pdf->AddFont('franklin', '', 'franklinbook.php'); // Standard Hausschrift
	$pdf->fontCustomer = 'franklin';

	$pdf->title='Cool !!'; //zwingend bevor die erste Seite erzeugt wird! 

	$pdf->FirmaName = 'Meine Firma GmbH';

	$pdf->AddPage(); 

	$pdf->SetFont('franklin','',24);

	//debug($press);
    $pdf->Cell(40,10,$press['Press']['name'],0,1);
	$pdf->Cell(40,10,$press['Press']['id'],0,1); 

    echo $pdf->fpdfOutput();
?>



CakePHP 2.0.0-RC1 Hot and fresh

Heiss und Frisch aus dem Ofen!

Heute morgen habe ich – mal wieder – nach dem Release Candidate von CakePHP gegoogelt. Und nun ist er endlich da, gestern auf dem CakeFest in Manchester wurde er veröffentlicht!

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.0.0-RC1[1]. 2.0.0-RC1 marks the beggining of the release candidate process for 2.0.0. From this point forward no additional new features or backwards incompatabile changes will be made to CakePHP 2.0. We plan on having 3 RC releases, and if there are no outstanding large issues we will release the final version.

http://bakery.cakephp.org/articles/markstory/2011/09/04/cakephp_2_0_0-rc1_hot_and_fresh

Seit dem CakePHP 2.0-dev release vom 26. Dezember 2010 hat es eine unendlich Zeit gedauert – gefühlt für einen Bäcker 😉

Einen guten Überblick über die Neuerung gibt CakePHP 2.0 – It’ll rock your world, Under the hood of CakePHP 2.0 und 2.0 New FeaturesCakePHPcakephp.

Und die Dokumentation ist auch schon im Kochbuch.

 

Update: Es ist nun auch 2.0.0-RC2 erschienen.

 

 

 

 

 

http://bakery.cakephp.org/articles/markstory/2011/09/04/cakephp_2_0_0-rc1_hot_and_fresh




Die Turbo-Backstube

In vielen Unternehmen werden Daten in manueller Form auf Papier oder in einfach strukturierten Excel-Tabellen erfasst und weiterverarbeitet. Eingabe- und Übertragungsfehler sind vorprogrammiert, doch der Einsatz einer Software-Anwendung erscheint auf den ersten Blick aufwendig und teuer. Insbesondere dann, wenn keine Standardanwendung zur Verfügung steht, die mit geringem Customizing-Aufwand und geringen Lizenzkosten genutzt werden kann. Dass dennoch eine Individuallösung innerhalb kurzer Zeit und mit begrenzten finanziellen und personellen Ressourcen umgesetzt werden kann, zeigt dieses Beispiel.

In einer Case Study beschreiben mein Kollege Thomas Recke und ich, wie mit CakePHP und MySQL ein Buchungssystem für 900 Mitarbeiter in nur sechs Wochen umgesetzt wurde. Der Artikel ist druckfrisch erschienen im Entwickler Magazin 5/2010 und steht wie gewohnt als Download zur Verfügung.