ФорумПрограммированиеPHP для идиотов → проблемы с кодировкой

проблемы с кодировкой

  • ArhiISP

    Сообщения: 15 Репутация: N Группа: Кто попало

    Spritz 4 октября 2010 г. 14:12

    Добрый день. По книге Practical Web 2.0 Applications with PHP, by Quentin Zervaas пытаюсь сделать сайт при помощи zend framework + smarty. Проблема в следующем, когда происходит регистрация пользователя, по окончанию на почту высылается письмо с логином и паролем, так вот в этом письме вместо кириллицы, кракозяблы одни. Хотя в базе данные отображаются корректно. пример можно глянуть на wooohooo.ru

    вот индексный файл, который является точкой входа.




    error_reporting(E_ALL|E_STRICT);
    ini_set('display_errors', 1);
    date_default_timezone_set('Europe/Moscow');

    //путь до установленного фреймворка
    set_include_path('.'.PATH_SEPARATOR . '../libs'
    .PATH_SEPARATOR.'../libs/Pear'
    .PATH_SEPARATOR.get_include_path());


    require_once 'Zend/Loader/Autoloader.php';
    $loader = Zend_Loader_Autoloader::getInstance();
    $loader->registerNamespace(array('CustomControllerAclManager', 'Templater', 'CustomControllerAction'
    , 'DatabaseObject', 'FormProcessor', 'Profile','Text_CAPTCHA'
    ,'Text_Password'));


    //загрузка конфигурационной информации
    $config=new Zend_Config_Ini('../settings.ini','development');
    Zend_Registry::set('config',$config);

    //создание обьекта для системного журнала
    $logger=new Zend_Log(new Zend_Log_Writer_Stream($config->logging->file));
    Zend_Registry::set('logger',$logger);

    //соединение с базой данных
    $params = array('host' => $config->database->hostname,
    'username' => $config->database->username,
    'password' => $config->database->password,
    'dbname' => $config->database->database,
    'driver_options'=> array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8'),
    'profiler' => false);


    $db = Zend_Db::factory($config->database->type, $params);
    Zend_Registry::set('db', $db);
    $db->query("set names utf8");

    //настройка аутентификации пользователей
    $auth = Zend_Auth::getInstance();
    $auth->setStorage(new Zend_Auth_Storage_Session());

    //обработка запроса пользователя
    $controller=Zend_Controller_Front::getInstance();
    $controller->throwExceptions(true);
    $controller->setControllerDirectory($config->paths->base.'/include/Controllers/');
    $controller->registerPlugin(new CustomControllerAclManager($auth));

    //настройка визуализации
    $vr = new Zend_Controller_Action_Helper_ViewRenderer();
    $vr->setView(new Templater());
    $vr->setViewSuffix('tpl');
    Zend_Controller_Action_HelperBroker::addHelper($vr);


    $controller->throwExceptions(true);
    $controller->dispatch();




    вот содержимое файлы user

    <?php
    class DatabaseObject_User extends DatabaseObject
    {
    static $userTypes = array('member' => 'Member',
    'administrator' => 'Administrator');

    public $profile = null;
    public $_newPassword = null;

    public function __construct($db)
    {
    parent::__construct($db, 'users', 'user_id');

    $this->add('username');
    $this->add('password');
    $this->add('user_type', 'member');
    $this->add('ts_created', time(), self::TYPE_TIMESTAMP);
    $this->add('ts_last_login', null, self::TYPE_TIMESTAMP);

    $this->profile = new Profile_User($db);
    }

    protected function preInsert()
    {
    // $this->password = uniqid();
    $this->_newPassword = Text_Password::create(8);
    $this->password = $this->_newPassword;
    return true;
    }

    protected function postLoad()
    {
    $this->profile->setUserId($this->getId());
    $this->profile->load();
    }

    protected function postInsert()
    {
    $this->profile->setUserId($this->getId());
    $this->profile->save(false);
    $this->sendEmail('user-register.tpl');
    return true;
    }

    protected function postUpdate()
    {
    $this->profile->save(false);
    return true;
    }

    protected function preDelete()
    {
    $this->profile->delete();
    return true;
    }

    public function __set($name, $value)
    {
    switch ($name) {
    case 'password':
    $value = md5($value);
    break;

    case 'user_type':
    if (!array_key_exists($value, self::$userTypes))
    $value = 'member';
    break;
    }

    return parent::__set($name, $value);
    }


    public function usernameExists($username)
    {
    $query = sprintf('select count(*) from %s where username = ?',
    $this->_table);

    $result = $this->_db->fetchOne($query, $username);

    return $result > 0;
    }

    static public function IsValidUsername($username)
    {
    $validator = new Zend_Validate_Alnum();
    return $validator->isValid($username);
    }


    public function sendEmail($tpl)
    {
    $templater = new Templater();
    $templater->user = $this;

    // считывается тело сообщения
    $body = $templater->render('email/' . $tpl);

    // извлечение темы из первой строки
    list($subject, $body) = preg_split('/\r|\n/', $body, 2);

    // настройка и отправка сообщения
    $mail = new Zend_Mail();

    // помещение адреса доставки и полного имени в строку "кому"
    $mail->addTo($this->profile->email,
    trim($this->profile->first_name . ' ' .
    $this->profile->last_name));

    // чтение данных администратора из конфигурационной информации
    $mail->setFrom(Zend_Registry::get('config')->email->from->email,
    Zend_Registry::get('config')->email->from->name);

    // добавление темы и тела, отправки
    $mail->setSubject(trim($subject));
    $mail->setBodyText(trim($body));
    $mail->send();
    }

    }
    ?>


    в чем проблема? где я не доуказал, что используется utf-8 кодировка? база данных в кодировке utf-8, файлы пхп тоже в ней. В заранее благоддарен
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 4 октября 2010 г. 14:14, спустя 2 минуты 23 секунды

    // помещение адреса доставки и полного имени в строку "кому"

    это утф8? :D
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 4 октября 2010 г. 14:15, спустя 1 минуту

    mario, да.
    Сапожник без сапог
  • ArhiISP

    Сообщения: 15 Репутация: N Группа: Кто попало

    Spritz 4 октября 2010 г. 14:17, спустя 1 минуту 49 секунд

    содержимое файла шаблона.
    {$user->profile->first_name}, Спасибо за регистрацию.
    Уважаемый  {$user->profile->first_name},

    Регистрация выполнена успешно. Детали Вашего аккаунта:

      Форма входа:  http://wooohooo.ru/account/login
      Логин: {$user->username}
       Пароль:  {$user->_newPassword}

    С уважением,

    Администрация wooohooo.ru


    причем иероглифы не во всем письме, а в частности, в данных, которые выводятся из базы, допустим, если логин ввести на кириллице.


    Спустя 44 сек.

    // помещение адреса доставки и полного имени в строку "кому"

    это утф8? :D


    это я на всякий случай файл, несколько раз кодировку менял, и разок перекодировать галочку не поставил, а просто изменил кодировку.
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 4 октября 2010 г. 14:24, спустя 6 минут 52 секунды

    а так прочтите вот это http://framework.zend.com/manual/en/zend.mail.html
    особенно часть про кодировки (Encoding)
    Спустя 46 сек.

    mario, да.
    а разве не коир? ) или я что то уже путаю….
    Спустя 129 сек.
    попробуйте явно указать кодировку.
    Спустя 57 сек.
     public function sendEmail($tpl)
    {
    $templater = new Templater();
    $templater->user = $this;

    // считывается тело сообщения
    $body = $templater->render('email/' . $tpl);

    // извлечение темы из первой строки
    list($subject, $body) = preg_split('/\r|\n/', $body, 2);

    // настройка и отправка сообщения
    $mail = new Zend_Mail('UTF-8');
    Спустя 136 сек.
    а еще может быть проблема на стороне клиента (хотя я тут очень сильно могу ошибаться)
  • ArhiISP

    Сообщения: 15 Репутация: N Группа: Кто попало

    Spritz 4 октября 2010 г. 14:25, спустя 1 минуту 18 секунд

    http://framework.zend.com/manual/en/zend.mail.html

    да, спасибо большое, проблему решил, как раз прочтя это http://framework.zend.com/manual/en/zend.mail.html
    сейчас лишь появились ???? в поле откого, но это я грешу на не верный формат файла конфига, где хранится эта надпись, сейчас его подправлю, и надеюсь все заработает)

  • ArhiISP

    Сообщения: 15 Репутация: N Группа: Кто попало

    Spritz 4 октября 2010 г. 14:34, спустя 9 минут 12 секунд

    только странно, у автора письма появилось "=?UTF-8?Q??="

    хотя данные о авторе хранятся в файле конфига

    [development]

    email.from.name="Администрация wooohooo.ru"
    email.from.email="[email protected]"
  • ArhiISP

    Сообщения: 15 Репутация: N Группа: Кто попало

    Spritz 4 октября 2010 г. 14:42, спустя 8 минут 20 секунд

    а все, и это решилось, если кому интересно, необходимо было добавить $mail->setHeaderEncoding(Zend_Mime::ENCODING_BASE64);
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 4 октября 2010 г. 14:48, спустя 5 минут 18 секунд


    а все, и это решилось, если кому интересно, необходимо было добавить $mail->setHeaderEncoding(Zend_Mime::ENCODING_BASE64);
    как нистранно там:
    особенно часть про кодировки (Encoding)

    это написано )))

Пожалуйста, авторизуйтесь, чтобы написать комментарий!