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

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

  • ArhiISP

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

    Spritz 4 октября 2010 г. 6: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(&#39;member&#39; => &#39;Member&#39;,
    &#39;administrator&#39; => &#39;Administrator&#39;);

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

    public function __construct($db)
    {
    parent::__construct($db, &#39;users&#39;, &#39;user_id&#39;);

    $this->add(&#39;username&#39;);
    $this->add(&#39;password&#39;);
    $this->add(&#39;user_type&#39;, &#39;member&#39;);
    $this->add(&#39;ts_created&#39;, time(), self::TYPE_TIMESTAMP);
    $this->add(&#39;ts_last_login&#39;, 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(&#39;user-register.tpl&#39;);
    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 &#39;password&#39;:
    $value = md5($value);
    break;

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

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


    public function usernameExists($username)
    {
    $query = sprintf(&#39;select count(*) from %s where username = ?&#39;,
    $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(&#39;email/&#39; . $tpl);

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

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

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

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

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

    }
    ?>


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

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

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

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

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

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

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

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

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

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

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

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

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

    С уважением,

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


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


    {+++44+++}

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

    это утф8? :D


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

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

    Spritz 4 октября 2010 г. 6: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(&#39;email/&#39; . $tpl);

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

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

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

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

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

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

  • ArhiISP

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

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

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

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

    [development]

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

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

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

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

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

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


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

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

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