Автор Антон Исайкин
Почти все текстовые редакторы под Windows вставляют в самое начало текста так называемые BOM-символы (в народе яЛП) при использовании кодировки UTF-8. Делается это для того чтобы потом самим понять что за кодировка, т.к. для Windows она не родная. Плохо это тем, что при работе Cake сначала подгружаются все используемые файлы, а только потом производится вывод контента в браузер. До вывода контента посылается несколько заголовков. И так и должно быть, сначала заголовки, потом контент. Но т.к. в файлах появляются некие символы, еще до начала конструкции <?, то заголовки уже не распознаются браузером и получается полная чушь. PHP нам говорит, что мы что-то выводим в браузер до последних заголовков, Cake перестает видеть сессии и куки, а нам остается только пожимать плечами, потому что совершенно не понятно о чем речь — открываем файлы блокнотом, а там все чисто!
Решений у этой проблемы несколько:
Но у меня все сложнее, ибо макеты приходят из одного места, а контроллеры пишут разные люди. Поэтому самый простой вариант, который я для себя выбрал — это написать небольшой скрипт, который просто обходит ВСЕ файлы, которые связаны с работой Cake и удаляет лишние символы. Вот код скрипта:
<pre>
<?
function duff($filename) {
echo $filename . ' <-- ';
$symbols = chr(239) . chr(187) . chr(191);
$file = file($filename);
if (isset($file[0]) && strlen($file[0]) > 0 && strpos($file[0], $symbols) === 0) {
$file[0] = str_replace($symbols, '', $file[0]);
$handle = fopen($filename, 'w');
fwrite($handle, join('', $file));
fclose($handle);
echo 'ОБНАРУЖЕН яЛП!';
} else {
echo 'Чисто.';
}
echo "\n";
}
function duif($dir) {
$ext = array('.php', '.ctp');
$files = scandir($dir);
foreach ($files as $file) {
if (!in_array($file, array('.', '..'))) {
if (is_dir($dir . '/' . $file)) {
duif($dir . '/' . $file);
} else {
if (in_array(substr($file, strrpos($file, '.')), $ext)) {
duff($dir . '/' . $file);
}
}
}
}
}
duif('..');
?>
</pre>
Здесь duif() ходит по директориям и отдает на просмотр все файлы с расширениями, указанными в массиве $ext, функции duff(), которая и занимается чисткой. Я положил файлик со скриптом в webroot. Все файлы системы находятся на одном уровне с webroot, поэтому вызывая duif() с параметром '..', я поднимаюсь на уровень выше и прохожу по всему содержимому.
Есть ещё одно (и, по-моему, гораздо более простое) решение
в начале файла APP/webroot/index.php прописать вызов функции
<?php
ob_start();
// Остальной код
А зачем мне складывать содержимое в буфер при каждом выполнении скриптов, если можно один раз при разработке запустить этот скрипт и он разом решит проблему.
В среде разработки от Rapid(К примеру у меня We Builder 2007? ) в properties->files->general выставляем кодировку для новых файлов UTF-8 without BOM