ArhiISP

Статус
  • Активный

Последние сообщения ArhiISP

  • Верстка и оформлениесмешение блоков в ie 6.0 в остальных нормально все • 29 октября 2010 г. 8:15

    выложу скрин, как выглядит.
    выложу скрин, как выглядит.
  • Верстка и оформлениесмешение блоков в ie 6.0 в остальных нормально все • 29 октября 2010 г. 1:25

    ну это понятно, что уже почти никто не использует, но все же встречаются еще… да уже и интересно, что с ним не так, что все так разъезжается….
    ну это понятно, что уже почти никто не использует, но все же встречаются еще…
    да уже и интересно, что с ним не так, что все так разъезжается….
  • Верстка и оформлениесмешение блоков в ie 6.0 в остальных нормально все • 29 октября 2010 г. 1:19

    добрый вечер. есть дизайн http://wooohooo.ru/состоящий из 3х блоков, во всех браузерах все хорошо, а вот в ие 6.0 блоки как попало располагаются, правый улетает внизу, левый залазит на центральный никак не пойму в чем проблема.в заранее благодарен за помощь.css /** * Global elements */...
    добрый вечер.
    есть дизайн http://wooohooo.ru/
    состоящий из 3х блоков, во всех браузерах все хорошо, а вот в ие 6.0 блоки как попало располагаются, правый улетает внизу, левый залазит на центральный никак не пойму в чем проблема.
    в заранее благодарен за помощь.


    css

        /**
    * Global elements
    */


    body {
    color : #454545;
    background : #FFFFFF;
    font-family : Verdana, Arial, Helvetica, sans-serif;
    font-size : 0.75em;
    text-align:center;
    }

    #wrap {
    width:960px;
    text-align:left;
    margin:0 auto;
    background: #F7F5F5;
    position : relative;
    margin-top:20px;

    }

    #top {
    margin:0 auto;
    width:1000px;
    height:20px;
    background : url(../images/top.gif) no-repeat 0px center #F5F9FB;
    text-align:right;
    color : #000000;
    font-size : 0.8em;

    }


    h1 { font-size : 1.7em; margin-top : 0; }
    h2 { font-size : 1.5em; }
    h3 { font-size : 1.3em; }
    h4 { font-size : 1.1em; }
    h5 { font-size : 1.0em; }
    h1, h2, h3, h4, h5 { font-family : Georgia, serif; color : #f22; }

    img { border : 0; }
    form { margin : 0; }

    a { color : #f22; background : none; text-decoration : underline; }
    a:hover { color : #fff; background : #f22; text-decoration : none; }


    /**
    * Setup the 3 column layout
    */

    body { margin : 0; padding : 0 0px; min-width : 0px; }

    #header, #footer, #nav { margin : 0 0px 0 0px;}


    .column { float : left; position : relative; }
    #content-container { width : 660px; margin-left :150px;background : #F7F5F5; }
    #left-container { width : 150px; margin-left : -660px; right : 150px;background : #F7F5F5; }
    #right-container { width : 150px; margin-right : 0px; background : #F7F5F5;}

    #footer { clear : both; }

    * html #left-container { left : 0px; }


    /**
    * Style the main page areas
    */
    #header {
    background : url(../images/logo.gif) no-repeat 0px center #FFFFFF;
    height : 90px;
    text-align:right;
    margin:0 auto;
    width:1000px;

    }
    #header img { display : none; }

    #content-container { background : #F7F5F5; }

    #content {

    padding : 10px;
    line-height : 1.8em;
    }

    #breadcrumbs {
    font-size : 0.8em;
    color : #ccc;
    margin-bottom : 10px;
    }

    #breadcrumbs a { color : #aaa; }
    #breadcrumbs a:hover { background : #aaa; color : #fff; }

    #left-container .box, #right-container .box {
    margin : 0 10px 10px 10px;
    padding : 10px;
    border : 1px solid #eee;
    background : #CBCACA;
    font-size : 0.9em;
    line-height : 1.6em;
    }

    #footer {
    color : #7C7C7C;
    font-size : 0.8em;
    width :960px;
    text-align:center;
    margin:0 auto;
    background : url(../images/footer.gif) no-repeat 0px center #fff;
    height : 25px;

    }

    #footer .footleft{
    text-align:left;
    float: left;
    margin: 5px 0px 0px 10px;
    }
    #footer .footright{
    text-align:right;
    float: right;
    margin: 5px 10px 0px 0px;
    }

    #top .topright{
    text-align:center;
    margin: 0px 20px 0px 0px;
    color:#7C7C7C;
    }

    #topmenu{
    text-align:left;
    float: left;
    margin: 15px 0px 0px 0px;


    }

    #lmenuf{
    text-align:left;
    float: left;
    margin: 15px 0px 0px 40px;
    height:22px;
    width:10px;
    background : url(../images/lmenuf.gif) no-repeat;
    }

    #rmenuf{
    text-align:left;
    float: left;
    margin: 15px 0px 0px 0px;
    height:22px;
    width:10px;
    background : url(../images/rmenuf.gif) no-repeat;
    }



    #search2{
    text-align:right;
    float: right;
    margin: 17px 30px 0px 0px;
    }



    шаблон разметки


    <!DOCTYPE html 
    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" lang="ru" xml:lang="ru">

    <head>
    <title>{$title|escape} </title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

    <link rel="stylesheet" href="/css/styles.css" type="text/css" media="all" />

    </head>

    <body>
    <div id="top">
    <div class="topright">
    </div>
    </div>

    <div id="header"></div>
    <div id="nav">
    <div id="lmenuf"></div>
    <div id="topmenu">
    пункты меню
    </div>
    <div id="rmenuf"></div>
    <div id="search2">
    поиск
    </div>
    </div>

    <div id="wrap">

    <div id="content-container" class="column">
    <div id="content">
    <div id="breadcrumbs">
    пути
    </div>
    <h1>
    заголовок
    </h1>






    </div>
    </div>

    <div id="left-container" class="column">

    <div class="vneshniy-box">
    <div class="zagolovok-box">
    <div class="zagolovok-plus-box">
    Контакты:
    </div>
    </div>
    <div class="content-boxsmall">
    <h4>Поддержка: </h4>
    <h4>Предложения: </h4>
    </div>
    </div>


    </div>

    <div id="right-container" class="column">

    <div class="vneshniy-box">
    <div class="zagolovok-box">
    <div class="zagolovok-plus-box">
    Кабинет
    </div>
    </div>
    <div class="content-box">

    </div>
    </div>

    </div>
    </div>
    <div id="footer">
    <div class="footleft">Copyright © 2010 Все права защищены. Копирование запрещено.</div>
    <div class="footright"> </div>
    </div>
    </body>
    </html>

  • PHP для идиотовтормозит сайт, оптимизация zend + smarty • 10 октября 2010 г. 3:56

    что бы не плодить темы, еще хочу спросить…что значит эта ошибка? "Fatal error: Class EmailLogger contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Zend_Log_FactoryInterface::factory) in ХХХ/EmailLogger.php on line 41 (причем 41 это к...
    что бы не плодить темы, еще хочу спросить…
    что значит эта ошибка?
    "Fatal error: Class EmailLogger contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Zend_Log_FactoryInterface::factory) in ХХХ/EmailLogger.php on line 41 (причем 41 это конец файла, последняя скобка)

    EmailLogger.php
    <?php
    class EmailLogger extends Zend_Log_Writer_Abstract
    {
    protected $_email;
    protected $_events = array();

    public function __construct($email)
    {
    $this->_formatter = new Zend_Log_Formatter_Simple();
    $this->setEmail($email);
    }

    public function setEmail($email)
    {
    $validator = new Zend_Validate_EmailAddress();
    if (!$validator->isValid($email))
    throw new Exception('Invalid e-mail address specified');

    $this->_email = $email;
    }

    protected function _write($event)
    {
    $this->_events[] = $this->_formatter->format($event);
    }

    public function shutdown()
    {
    if (count($this->_events) == 0)
    return;

    $subject = sprintf('Web site log messages (%d)',
    count($this->_events));

    $mail = new Zend_Mail();
    $mail->addTo($this->_email)
    ->setSubject($subject)
    ->setBodyText(join('', $this->_events))
    ->send();
    }
    }


    файл index.ini


    <?php 

    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','Breadcrumbs','FCKeditor','EmailLogger'));


    // создание регистратора событий
    $logger = new Zend_Log(new Zend_Log_Writer_Null());

    try {
    $writer = new EmailLogger($_SERVER['SERVER_ADMIN']);
    $writer->addFilter(new Zend_Log_Filter_Priority(Zend_Log::CRIT));
    $logger->addWriter($writer);

    //загрузка конфигурационной информации
    $configFile = '';
    if (isset($_SERVER['APP_CONFIG_FILE']))
    $configFile = basename($_SERVER['APP_CONFIG_FILE']);

    if (strlen($configFile) == 0)
    $configFile = 'settings.ini';

    $configSection = '';
    if (isset($_SERVER['APP_CONFIG_SECTION']))
    $configSection = basename($_SERVER['APP_CONFIG_SECTION']);

    if (strlen($configSection) == 0)
    $configSection = 'production';

    $config = new Zend_Config_Ini('../' . $configFile, $configSection);
    Zend_Registry::set('config', $config);


    // $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));

    $logger->addWriter(new Zend_Log_Writer_Stream($config->logging->file));
    $writer->setEmail($config->logging->email);
    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);
    $db->getConnection();
    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);


    // определение маршрута для домашних страниц пользователей
    $route = new Zend_Controller_Router_Route('user/:username/:action/*',
    array('controller' => 'user',
    'action' => 'index')
    );

    $controller->getRouter()->addRoute('user', $route);

    // назначение маршрута для просмотра записей блога
    $route = new Zend_Controller_Router_Route(
    'user/:username/view/:url/*',
    array('controller' => 'user',
    'action' => 'view')
    );
    $controller->getRouter()->addRoute('post', $route);

    // назначение маршрута для просмотра ежемесяных архивов
    $route = new Zend_Controller_Router_Route(
    'user/:username/archive/:year/:month/*',
    array('controller' => 'user',
    'action' => 'archive')
    );
    $controller->getRouter()->addRoute('archive', $route);


    // определение маршрута для подборок по меткам
    $route = new Zend_Controller_Router_Route('user/:username/tag/:tag/*',
    array('controller' => 'user',
    'action' => 'tag'));

    $controller->getRouter()->addRoute('tagspace', $route);

    $controller->throwExceptions(true);
    $controller->dispatch();
    }
    catch (Exception $ex) {
    $logger->emerg($ex->getMessage());

    header('Location: /error.html');
    exit;
    }



  • PHP для идиотовтормозит сайт, оптимизация zend + smarty • 8 октября 2010 г. 18:43

    кешер байткода (eAccelerator),эм… а можно ли по подробнее, или ссылочку где почитать, у меня есть доступ как я понял к моему локальному( для моих сайтов) пхп.ини, уже писал в нем следующееregister_globals= Offmagic_quotes_gpc= Offdisplay_errors= Offlog_errors= Onmax_execution_time= 120memor...
    кешер байткода (eAccelerator),

    эм… а можно ли по подробнее, или ссылочку где почитать, у меня есть доступ как я понял к моему локальному( для моих сайтов) пхп.ини, уже писал в нем следующее

    register_globals= Off
    magic_quotes_gpc= Off
    display_errors= Off
    log_errors= On
    max_execution_time= 120
    memory_limit= 256M
    upload_max_filesize= 20M
    post_max_size= 20M

    Спустя 70 сек.
    не оттуда цитату взял) выше подразумевалась цитат

    ArhiISP, если есть доступ к php.ini - можно прописать свои расширения. Найди только соответствующие бинарники
  • PHP для идиотовтормозит сайт, оптимизация zend + smarty • 8 октября 2010 г. 15:23

    VPS пока достаточно дорогое решение для меня) поэтому eAccelerator ом как я полагаю вопспользоваться не смогу.А вот по поводу склейки всех нужных файлов зенда в один, вот где то читал, читал что не помогает, где то пишут, что помогает. Скажите, кто пробовал, и был ли прирост от этого?
    VPS пока достаточно дорогое решение для меня) поэтому eAccelerator ом как я полагаю вопспользоваться не смогу.
    А вот по поводу склейки всех нужных файлов зенда в один, вот где то читал, читал что не помогает, где то пишут, что помогает. Скажите, кто пробовал, и был ли прирост от этого?
  • PHP для идиотовтормозит сайт, оптимизация zend + smarty • 8 октября 2010 г. 10:50

    обсирать надо аргументированно. про хостинг от mario ничего не могу сказать — верю на слово. сам пользуюсь уже давно timeweb ( <- реферал) и очень доволен. а по теме для Zend+Smarty я бы посоветовал искать VPS пошустрее. нелёгкая такая упряжка :))) а как ее облегчить? отказ от смарти даст ли ...

    обсирать надо аргументированно.
    про хостинг от mario ничего не могу сказать — верю на слово. сам пользуюсь уже давно timeweb ( <- реферал) и очень доволен. а по теме для Zend+Smarty я бы посоветовал искать VPS пошустрее. нелёгкая такая упряжка :)))

    а как ее облегчить? отказ от смарти даст ли прирост, если все пустить через zend овский View ?
  • PHP для идиотовтормозит сайт, оптимизация zend + smarty • 8 октября 2010 г. 0:08

    хочется, чтобы не было жутких задержек) если дело в хостинге, то что ж делать, придется поменять:(а так по коду, в глаза ничего не бросается, из-за чего могут быть задержки именно при обращении к бд?
    хочется, чтобы не было жутких задержек) если дело в хостинге, то что ж делать, придется поменять:(
    а так по коду, в глаза ничего не бросается, из-за чего могут быть задержки именно при обращении к бд?
  • PHP для идиотовтормозит сайт, оптимизация zend + smarty • 8 октября 2010 г. 0:02

    databaseobject.php[man]<?php    /**     * DatabaseObject     *     * Abstract class used to easily manipulate data in a database table     * via simple load/save/delete methods     */    abstract class DatabaseObject    {        const TYPE_TIMESTAMP = 1;        const TYPE_BOOLEAN   = 2;       ...
    databaseobject.php

    [man]
    <?php
       /**
        * DatabaseObject
        *
        * Abstract class used to easily manipulate data in a database table
        * via simple load/save/delete methods
        */
       abstract class DatabaseObject
       {
           const TYPE_TIMESTAMP = 1;
           const TYPE_BOOLEAN   = 2;

           protected static $types = array(self::TYPE_TIMESTAMP, self::TYPE_BOOLEAN);

           private $_id = null;
           private $_properties = array();


           protected $_db = null;
           protected $_table = '';
           protected $_idField = '';

           public function __construct(Zend_Db_Adapter_Abstract $db, $table, $idField)
           {
               $this->_db = $db;
               $this->_table = $table;
               $this->_idField = $idField;
           }

           public function load($id, $field = null)
           {
               if (strlen($field) == 0)
                   $field = $this->_idField;

               if ($field == $this->_idField) {
                   $id = (int) $id;
                   if ($id <= 0)
                       return false;
               }

               $query = sprintf('select %s from %s where %s = ?',
                                join(', ', $this->getSelectFields()),
                                $this->_table,
                                $field);

               $query = $this->_db->quoteInto($query, $id);

               return $this->_load($query);
           }

           protected function getSelectFields($prefix = '')
           {
               $fields = array($prefix . $this->_idField);
               foreach ($this->_properties as $k => $v)
                   $fields[] = $prefix . $k;

               return $fields;
           }

           protected function _load($query)
           {
               $result = $this->_db->query($query);
               $row = $result->fetch();
               if (!$row)
                   return false;

               $this->_init($row);

               $this->postLoad();

               return true;
           }

           public function _init($row)
           {
               foreach ($this->_properties as $k => $v) {
                   $val = $row[$k];

                   switch ($v['type']) {
                       case self::TYPE_TIMESTAMP:
                           if (!is_null($val))
                               $val = strtotime($val);
                           break;
                       case self::TYPE_BOOLEAN:
                           $val = (bool) $val;
                           break;
                   }

                   $this->_properties[$k]['value'] = $val;
               }
               $this->_id = (int) $row[$this->_idField];
           }


           public function save($useTransactions = true)
           {
               $update = $this->isSaved();

               if ($useTransactions)
                   $this->_db->beginTransaction();

               if ($update)
                   $commit = $this->preUpdate();
               else
                   $commit = $this->preInsert();

               if (!$commit) {
                   if ($useTransactions)
                       $this->_db->rollback();
                   return false;
               }

               $row = array();

               foreach ($this->_properties as $k => $v) {
                   if ($update && !$v['updated'])
                       continue;

                   switch ($v['type']) {
                       case self::TYPE_TIMESTAMP:
                           if (!is_null($v['value'])) {
                               if ($this->_db instanceof Zend_Db_Adapter_Pdo_Pgsql)
                                   $v['value'] = date('Y-m-d H:i:sO', $v['value']);
                               else
                                   $v['value'] = date('Y-m-d H:i:s', $v['value']);
                           }
                           break;

                       case self::TYPE_BOOLEAN:
                           $v['value'] = (int) ((bool) $v['value']);
                           break;
                   }

                   $row[$k] = $v['value'];
               }

               if (count($row) > 0) {
                   // perform insert/update
                   if ($update) {
                       $this->_db->update($this->_table, $row, sprintf('%s = %d', $this->_idField, $this->getId()));
                   }
                   else {
                       $this->_db->insert($this->_table, $row);
                       $this->_id = $this->_db->lastInsertId($this->_table, $this->_idField);
                   }
               }

               // update internal id

               if ($commit) {
                   if ($update)
                       $commit = $this->postUpdate();
                   else
                       $commit = $this->postInsert();
               }

               if ($useTransactions) {
                   if ($commit)
                       $this->_db->commit();
                   else
                       $this->_db->rollback();
               }

               return $commit;
           }

           public function delete($useTransactions = true)
           {
               if (!$this->isSaved())
                   return false;

               if ($useTransactions)
                   $this->_db->beginTransaction();

               $commit = $this->preDelete();

               if ($commit) {
                   $this->_db->delete($this->_table, sprintf('%s = %d', $this->_idField, $this->getId()));
               }
               else {
                   if ($useTransactions)
                       $this->_db->rollback();
                   return false;
               }

               $commit = $this->postDelete();

               $this->_id = null;

               if ($useTransactions) {
                   if ($commit)
                       $this->_db->commit();
                   else
                       $this->_db->rollback();
               }

               return $commit;
           }

           public function isSaved()
           {
               return $this->getId() > 0;
           }

           public function getId()
           {
               return (int) $this->_id;
           }

           public function getDb()
           {
               return $this->_db;
           }

           public function __set($name, $value)
           {
               if (array_key_exists($name, $this->_properties)) {
                   $this->_properties[$name]['value'] = $value;
                   $this->_properties[$name]['updated'] = true;
                   return true;
               }

               return false;
           }

           public function __get($name)
           {
               return array_key_exists($name, $this->_properties) ? $this->_properties[$name]['value'] : null;
           }

           protected function add($field, $default = null, $type = null)
           {
               $this->_properties[$field] = array('value'   => $default,
                                                  'type'    => in_array($type, self::$types) ? $type : null,
                                                  'updated' => false);
           }

           protected function preInsert()
           {
               return true;
           }

           protected function postInsert()
           {
               return true;
           }

           protected function preUpdate()
           {
               return true;
           }

           protected function postUpdate()
           {
               return true;
           }

           protected function preDelete()
           {
               return true;
           }

           protected function postDelete()
           {
               return true;
           }

           protected function postLoad()
           {
               return true;
           }

           public static function BuildMultiple($db, $class, $data)
           {
               $ret = array();

               if (!class_exists($class))
                   throw new Exception('Undefined class specified: ' . $class);

               $testObj = new $class($db);

               if (!$testObj instanceof DatabaseObject)
                   throw new Exception('Class does not extend from DatabaseObject');

               foreach ($data as $row) {
                   $obj = new $class($db);
                   $obj->_init($row);

                   $ret[$obj->getId()] = $obj;
               }

               return $ret;
           }
       }[/man]

    Спустя 63 сек.

    предположу - хостинг.


    а не подскажите достаточно надежный хостинг по доступной цене?)
  • PHP для идиотовтормозит сайт, оптимизация zend + smarty • 7 октября 2010 г. 23:59

    Добрый вечер, изучаю сайтостроение. делаю тестовый сайтик по урокам Practical Web 2.0 Applications with PHPвыкладываю его для теста на wooohooo.ru. сайт строится на zend + smartyсейчас столкнулся с тем, что пока нет обращений к базе данных, сайт вроде бы нормально работает, но как идет обращение ...
    Добрый вечер, изучаю сайтостроение. делаю тестовый сайтик по урокам Practical Web 2.0 Applications with PHP
    выкладываю его для теста на wooohooo.ru. сайт строится на zend + smarty
    сейчас столкнулся с тем, что пока нет обращений к базе данных, сайт вроде бы нормально работает, но как идет обращение к базе, сразу же видны очень сильные задержки. в чем может быть проблема? хостинг? код? в заранее благодарен. увидеть торможение можно как на этапе логина, так и на этапе просмотра опубликованных сообщений (чтоб не регится, сразу можно зайти под логином "ИСП" пароль "224224") в кратце о коде.

    index.php


    <?php 

    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','Breadcrumbs','FCKeditor'));


    //загрузка конфигурационной информации
    $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();


    из AccountController функция

            public function loginAction()
    {
    // if a user's already logged in, send them to their account home page
    $auth = Zend_Auth::getInstance();

    if ($auth->hasIdentity())
    $this->_redirect('/account');

    $request = $this->getRequest();

    // определение страницы, которую изначально запрашивал пользователь
    $redirect = $request->getPost('redirect');
    if (strlen($redirect) == 0)
    $redirect = $request->getServer('REQUEST_URI');
    if (strlen($redirect) == 0)
    $redirect = '/account';

    // инициализация сообщения об ошибке
    $errors = array();

    // обработка входа, если запрос сделан путем отправления формы
    if ($request->isPost()) {

    // получение данных из формы и их проверка
    $username = $request->getPost('username');
    $password = $request->getPost('password');

    if (strlen($username) == 0)
    $errors['username'] = 'Не введен Логин';
    if (strlen($password) == 0)
    $errors['password'] = 'Не введен Пароль';

    if (count($errors) == 0) {

    // настройка параметров адаптера аутентификации
    $adapter = new Zend_Auth_Adapter_DbTable($this->db,
    'users',
    'username',
    'password',
    'md5(?)');

    $adapter->setIdentity($username);
    $adapter->setCredential($password);

    // попытка аутентификации пользователя
    $result = $auth->authenticate($adapter);

    if ($result->isValid()) {
    $user = new DatabaseObject_User($this->db);
    $user->load($adapter->getResultRowObject()->user_id);

    // регистрации попытки входа в журнал
    $user->loginSuccess();

    // запись личных данных пользователя в сеанс
    $identity = $user->createAuthIdentity();
    $auth->getStorage()->write($identity);

    // перенаправление пользователя на запрашиваемую им страницу
    $this->_redirect($redirect);
    }

    // регистрация неудачной попытки входа в журнале
    DatabaseObject_User::LoginFailure($username,
    $result->getCode());
    $errors['username'] = 'Не верный логин или пароль';
    }
    }

    $this->view->errors = $errors;
    $this->view->redirect = $redirect;
    }



    user.php из датабейзобжект

    <?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('UTF-8');
    $mail->setHeaderEncoding(Zend_Mime::ENCODING_BASE64);

    // помещение адреса доставки и полного имени в строку "кому"
    $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();
    }

    public function createAuthIdentity()
    {
    $identity = new stdClass;
    $identity->user_id = $this->getId();
    $identity->username = $this->username;
    $identity->user_type = $this->user_type;
    $identity->first_name = $this->profile->first_name;
    $identity->last_name = $this->profile->last_name;
    $identity->email = $this->profile->email;

    return $identity;
    }

    public function loginSuccess()
    {
    $this->ts_last_login = time();
    unset($this->profile->new_password);
    unset($this->profile->new_password_ts);
    unset($this->profile->new_password_key);
    $this->save();

    $message = sprintf('Successful login attempt from %s user %s',
    $_SERVER['REMOTE_ADDR'],
    $this->username);

    $logger = Zend_Registry::get('logger');
    $logger->notice($message);
    }
    static public function LoginFailure($username, $code = '')
    {
    switch ($code) {
    case Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND:
    $reason = 'Unknown username';
    break;
    case Zend_Auth_Result::FAILURE_IDENTITY_AMBIGUOUS:
    $reason = 'Multiple users found with this username';
    break;
    case Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID:
    $reason = 'Invalid password';
    break;
    default:
    $reason = '';
    }

    $message = sprintf('Failed login attempt from %s user %s',
    $_SERVER['REMOTE_ADDR'],
    $username);

    if (strlen($reason) > 0)
    $message .= sprintf(' (%s)', $reason);

    $logger = Zend_Registry::get('logger');
    $logger->warn($message);
    }



    public function fetchPassword()
    {
    if (!$this->isSaved())
    return false;

    // генерация новых параметров пароля
    $this->_newPassword = Text_Password::create(8);
    $this->profile->new_password = md5($this->_newPassword);
    $this->profile->new_password_ts = time();
    $this->profile->new_password_key = md5(uniqid() .
    $this->getId() .
    $this->_newPassword);

    // сохранение нового файла в профиле и отправка сообщения.
    $this->profile->save();
    $this->sendEmail('user-fetch-password.tpl');

    return true;
    }

    public function confirmNewPassword($key)
    {
    // проверка наличия правильных временных данных
    if (!isset($this->profile->new_password)
    || !isset($this->profile->new_password_ts)
    || !isset($this->profile->new_password_key)) {

    return false;
    }

    // проверка подтверждения пароля в течении суток
    if (time() - $this->profile->new_password_ts > 86400)
    return false;

    // проверка правильности ключа
    if ($this->profile->new_password_key != $key)
    return false;

    // все правильно принимаем новый пароль для учетной записи

    // пропускаем локальный уровень, новый пароль уже в md5
    parent::__set('password', $this->profile->new_password);

    unset($this->profile->new_password);
    unset($this->profile->new_password_ts);
    unset($this->profile->new_password_key);

    // сохранение учетных данных и профиля пользователя
    return $this->save();
    }





    }
    ?>






  • PHP для идиотовпроблемы с кодировкой • 4 октября 2010 г. 14:42

    а все, и это решилось, если кому интересно, необходимо было добавить $mail->setHeaderEncoding(Zend_Mime::ENCODING_BASE64);
    а все, и это решилось, если кому интересно, необходимо было добавить $mail->setHeaderEncoding(Zend_Mime::ENCODING_BASE64);
  • PHP для идиотовпроблемы с кодировкой • 4 октября 2010 г. 14:34

    только странно, у автора письма появилось "=?UTF-8?Q??=" хотя данные о авторе хранятся в файле конфига [development]email.from.name="Администрация wooohooo.ru"email.from.email="[email protected]"
    только странно, у автора письма появилось "=?UTF-8?Q??="

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

    [development]

    email.from.name="Администрация wooohooo.ru"
    email.from.email="[email protected]"
  • PHP для идиотовпроблемы с кодировкой • 4 октября 2010 г. 14:25

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

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

  • PHP для идиотовпроблемы с кодировкой • 4 октября 2010 г. 14:17

    содержимое файла шаблона.{$user->profile->first_name}, Спасибо за регистрацию.Уважаемый  {$user->profile->first_name},Регистрация выполнена успешно. Детали Вашего аккаунта:   Форма входа:  http://wooohooo.ru/account/login   Логин: {$user->username}    Пароль:  {$user->_newPasswo...
    содержимое файла шаблона.
    {$user->profile->first_name}, Спасибо за регистрацию.
    Уважаемый  {$user->profile->first_name},

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

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

    С уважением,

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


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


    Спустя 44 сек.

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

    это утф8? :D


    это я на всякий случай файл, несколько раз кодировку менял, и разок перекодировать галочку не поставил, а просто изменил кодировку.
  • PHP для идиотовпроблемы с кодировкой • 4 октября 2010 г. 14:12

    Добрый день. По книге Practical Web 2.0 Applications with PHP, by Quentin Zervaas пытаюсь сделать сайт при помощи zend framework + smarty. Проблема в следующем, когда происходит регистрация пользователя, по окончанию на почту высылается письмо с логином и паролем, так вот в этом письме вместо ки...
    Добрый день. По книге 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, файлы пхп тоже в ней. В заранее благоддарен