ZendFramework

Прикручиваем свои сообщения к Zend Validate Email

Posted in Development, PHP, ZendFramework on August 11th, 2009 by Yaroslav Vorozhko – Be the first to comment

Валидацией email адресов в ZF занимается Zend_Validate_Email. Кто не знает, email состоит из двух частей, имени и хоста. Хост проверяется с помощью Zend_Validate_Hostname и все эти вещи выполняются в background, т.е. мы не получем каких либо нотификаций о происходящих там процессах.

Так, вот Thomas Weidner разобрался с этой проблемой и предлагает свое решение валидиции email.

Zend Mail как вложить изображение в письмо

Posted in Tips And Tricks, ZendFramework on August 11th, 2009 by Yaroslav Vorozhko – Be the first to comment

Есть два варианта добавить картинку в почтовое html сообщение.
1. Использовать удаленный сервер для загрузки сообщения.
2. Вложить сообщение в письмо и ссылаться на него в html документе.
Первый способ очень простой и не требует программирования:

PHP:
  1. <img src="http://somededicateserver.com/images/logo.gif" />

Второй способ сложнее и для его реализации нам необходимо сначала добавить изображение в сообщение, а потом в сообщении сделать ссылку на это изображение.
Пример, добавляем изображение в вложения письма:

PHP:
  1. $html = $this->_request->getParam('html','');//в html у нас храниться исходный HTML код сообщения
  2. $mail = new Zend_Mail('UTF-8');
  3. //убедитесь, что файл существует и доступен для чтения
  4. $filename = '/path/htdocs/img/logo.gif';
  5. if (is_readable($filename)) {
  6.   $mail->setType(Zend_Mime::MULTIPART_RELATED);   
  7.   $at = $mail->createAttachment(file_get_contents($filename))
  8.   $at->type = 'image/gif'
  9.   $at->disposition = Zend_Mime::DISPOSITION_INLINE
  10.   $at->encoding = Zend_Mime::ENCODING_BASE64
  11.   $at->id = 'cid_' . md5_file($filename);
  12.   $html = str_replace('file://attached_image''cid:' . $at->id$html);   
  13. }
  14. $mail->setBodyHtml($html, 'UTF-8', Zend_Mime::ENCODING_8BIT);

Внутри html сообщения у нас есть специальная строка (file://attached_image), ссылка на изображение:

PHP:
  1. <img src="file://attached_image" />

которая, после обработки, будет заменена на вложенное в письмо изображение, и будет иметь следующий вид:

PHP:
  1. <img src="cid:cid_4b3fdb60e9422ce97926cc8d3b601188" />

Все, отправляем письмо и проверяем результат.

Как установить кодировку по умолчанию для Zend View ?

Posted in Tips And Tricks, ZendFramework on July 30th, 2009 by Yaroslav Vorozhko – 2 Comments

Как установить кодировку по умолчанию для Zend View ?

Первый способ, если вы используете Zend_Application:
В application.ini:
resources.view.encoding = "ISO-8859-1"

И второй вы можете вручную установить ее для объекта Zend_View:
$view = new Zend_View();
$view->setEncoding("ISO-8859-1");
$viewRenderer =
Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
$viewRenderer->setView($view);

ZF FAQ: установка кодировки при подключении к БД

Posted in Tips And Tricks, ZendFramework on July 28th, 2009 by Yaroslav Vorozhko – Be the first to comment

Привет!
Вопрос: Как установить кодировку utf8 при подключении к базе данных?

В версии Zend Framework 1.8, если вы используете Zend_Application, кодировка устанавливается через конфигурационный файл.

PHP:
  1. [production]
  2. resources.db.adapter = "pdo_mysql"
  3. resources.db.params.host = "localhost"
  4. resources.db.params.username = "YOURUSER"
  5. resources.db.params.password = "YOURPASS"
  6. resources.db.params.dbname = "YOURDB"
  7. resources.db.params.charset = utf8
  8. resources.db.isDefaultTableAdapter = true

В версии 1.7, кодировку можно установить при явном подключении к БД или при использовании конфигурационного файла, ниже приведен пример как установить кодировку явно.

PHP:
  1. $config = Zend_Registry::get('dbConfig');
  2.  
  3. $db = Zend_Db::factory($config->db->adapter, $config->db->config->toArray());
  4. Zend_Db_Table::setDefaultAdapter($db);
  5. Zend_Registry::getInstance()->set('db', $db);
  6.        
  7. $db->query("set names utf8");
  8. $db->query("set time_zone = '+0:00'");

ZF FAQ: Минимальный bootstrap.php

Posted in Tips And Tricks, ZendFramework on July 27th, 2009 by Yaroslav Vorozhko – Be the first to comment

Сегодня открываю в своем блоге раздел Zend Framework FAQ. Куда соотвественно буду писать различные вопросы-ответы по теме программирования в Zend Framework.

Итак, вопрос:

Каким должен быть минимальный bootstrap.php?

Ответ:

Создайте файл application/Bootstrap.php

и его содержимое как минимум должно быть таким:

PHP:
  1. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  2. {
  3. }

Класс Bootstrap появился с версией 1.8. Поэтому при переходе с 1.7 на 1.8 учтитывайте это.

Авто редирект из http в https в Zend Framework

Posted in Development, PHP, Tips And Tricks, ZendFramework on July 1st, 2009 by Yaroslav Vorozhko – Be the first to comment

Привет,
Следующий Helper решает проблему редиректа из http страници на https.
Скажем надо перейти от http://mysite.com/action/param/ на https://mysite.com/action/param/

PHP:
  1. class My_Helper_SslSwitch extends Zend_Controller_Action_Helper_Abstract
  2.     {
  3.         public function direct()
  4.         {
  5.             if (!isset($_SERVER['HTTPS']) || !$_SERVER['HTTPS']) {
  6.                 $request    = $this->getRequest();
  7.                 $url        = 'https://'
  8.                             . $_SERVER['HTTP_HOST']
  9.                             . $request->getRequestUri();
  10.                 $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
  11.                 $redirector->gotoUrl($url);
  12.             }
  13.         }
  14.     }

Автор хелпера Matthew Weier O'Phinney

Далее в bootstrap добавляем путь к Helper в include_path
и вызываем его, таким образом мы переводим весь сайт на использование https.

PHP:
  1. Zend_Controller_Action_HelperBroker::addPrefix('My_Helper');
  2. $ssl = new My_Helper_SslSwitch();
  3. $ssl->direct();

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

PHP:
  1. $this->_helper->sslSwith();

В данном случае мы используем объект _helper для создания объекта sslSwith и вызова метода direct().
Note: Метод direct() вызыватеся автоматически для всех Action Helpers.

Проверка существования таблицы в базе данных с ZendFramework

Posted in MySQL, Tips And Tricks, ZendFramework on April 19th, 2009 by Yaroslav Vorozhko – Be the first to comment

Существует несколько способов проверить наличие таблицы в базе данных с помощью zendframework.

Первый и самый простой это использовать функцию listTables из Zend_db, но у этой функции есть ограничение, она получает список таблиц только текущей базы данных.

Например вам надо узнать существует ли таблица my_table в подключении к текущей базе данных:

$db = $this->getAdapter();

$tables = $db->listTables();

if (in_array('my_table', $table)){

//todo something with table

}

listTables() возвращает массив имен всех таблиц в текущей базе данных.

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

Пример:

$db = $this->getAdapter();

$sql = "show tables from any_db like 'my_table' ";

if ( $db->fetchOne($sql) ){

//todo something with table

}

fetchOne() вернет строку с именем таблицы, если таблица будет найдена, если ничего не будет найдено, то будет возвращена пустая строка.

С помощью приема с show tables можно проверять на существование одной и более таблиц, что делает этот прием более универсальным.