Отображаем PDF на Yii при помощи Zend
Рубрика: Мелкие заметки на тему Yii
5 Ноя. 2009
Интеграция Zend/Pdf в Yii Framework...
Введение
Yii является одним из распостраненных PHP фреймворков. В этой статье мы рассмотрим пример интеграции библиотеки для создания PDF файлов из ZendFramework.
Прим. переводчика: статья очень полезна в плане опыта интеграции классов из ZendFramework. При помощи полученного опыта вы можете связать практически любой класс с Yii без малейших проблем.
Программное обеспечение
Для выполнения всего этого я рекомендую закачать упрощенную версию Zend фреймворка (http://framework.zend.com/download/current/). При создании этого урока я использовал версию 1.9.5. Ekstrak ZendFramework-1.9.5-minimal.tar.gz и получил её следующим образом:
$ tar -xzvf ZendFramework-1.9.5-minimal.tar.gz
Прим. переводчика: Автор статьи использует консоль для закачки Zend Framework-а. Далее в уроке — он очень часто будет использовать её и читателям без опыта работы в Linux наверняка будет трудно понять происходящее. Если вы используете Windows — постарайтесь следователь комментариям между примерами кода и у вас всё получится.
Результат выглядел следующим образом:
[bpdp@bpdp-arch software]$ cd ZendFramework-1.9.5-minimal/
[bpdp@bpdp-arch ZendFramework-1.9.5-minimal]$ ls -la
total 32
drwxr-xr-x 4 bpdp users 4096 2009-10-27 00:19 .
drwxr-xr-x 7 bpdp users 4096 2009-10-30 11:19 ..
-rw-r--r-- 1 bpdp users 3438 2009-10-26 20:33 INSTALL.txt
-rw-r--r-- 1 bpdp users 1547 2009-10-26 20:33 LICENSE.txt
-rw-r--r-- 1 bpdp users 6496 2009-10-27 00:19 README.txt
drwxr-xr-x 2 bpdp users 4096 2009-10-26 20:39 bin
drwxr-xr-x 3 bpdp users 4096 2009-10-26 20:38 library
[bpdp@bpdp-arch ZendFramework-1.9.5-minimal]$
После этого я скопировал все содержимое Zend каталога в zax/protected/vendors. (я использую имя zax в качестве корневой папки приложения. У вас она может иметь другое имя или вовсе отсутствовать)
[bpdp@bpdp-arch vendors]$ ls -la
total 12
drwxr-xr-x 3 root root 4096 2009-10-30 09:56 .
drwxr-xr-x 12 root root 4096 2009-10-30 08:49 ..
drwxr-xr-x 59 root root 4096 2009-10-30 09:56 Zend
[bpdp@bpdp-arch vendors]$
Прим. переводчика: Как вы видите — в папку protected/vendors мы перемещаем папку Zend вместе со всем её содержимым.
Для того чтобы использовать PDF в качестве отображения — нам необходимо создать только контроллер. Вот пример создания контроллера PdfviewController:
[root@bpdp-arch zax]# protected/yiic shell
Yii Interactive Tool v1.0 (based on Yii v1.0.10)
Please type 'help' for help. Type 'exit' to quit.
>> controller pdfview
generate PdfviewController.php
mkdir /opt/web/httpd/htdocs/zax/protected/views/pdfview
generate index.php
Controller 'pdfview' has been created in the following file:
/opt/web/httpd/htdocs/zax/protected/controllers/PdfviewController.php
You may access it in the browser using the following URL:
http://hostname/path/to/index.php?r=pdfview
>> [root@bpdp-arch zax]#
После этого немного изменим главный экшинс:
class PdfviewController extends CController
{
public function actionIndex()
{
// подключаем Zend/Pdf
Yii::import('application.vendors.*');
require_once('Zend/Pdf.php');
// создаем новый обьект PDF
$pdf1 = new Zend_Pdf();
// создаем страницу и определяем её размер
$page = new Zend_Pdf_Page(Zend_Pdf_Page::SIZE_A4);
// шрифт по умолчанию
$font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA);
// применяем шрифт. указываем размер
$page->setFont($font, 36);
// вывод текста на странице
$page->drawText('Hello from Yii', 72, 720);
// добавляем странциу в pdf файл
$pdf1->pages[] = $page;
// получим результат всего pdf обьекта
$pdfcontents = $pdf1->render();
// показываем в браузере. п.с. незабудь указать тип содержимого в заголовке
header('Content-Type: application/pdf');
$this->layout = false;
$this->renderText($pdfcontents);
}
Результат (http://server/zax/index.php?r=pdfview) выглядит следующим образом:
Откуда это взялось?
Для того чтобы лучше понять описанный выше код и создавать более сложные PDF – я рекомендую прочитать обширную документацию разработчика по Zend классам. В первую очередь советую ознакомится с Zend_Pdf
Прим. переводчика: Статья является переводом с индонезийского. За что спасибо словарю и Google переводчику. Оригинал статьи - смотрим тут.
Если хотите опубликовать этот материал у себя - пожалуйста, разместите ссылку на страницу откуда вы его взяли.
- Надо было мне как то выводить сообщения об ошибках на экран. Использовать исключения - плохой подход. Поэтому для того чтобы ... "Messager + jQuery"
- Новое сообщение на официальном сайте поддержки Yii информирует нас про утверждение нового дизайна сайта, логотипа и стиля.
Как сообщает разработчик фреймворка, ... "Новый Yii дизайн"
- Сегодня мы разберем как подключать мою «математическую капчу» на обычный движок php магазина. Название движка я не знаю, да и ... "Подключаем yii капчу к сайту на другом движке"

[adm] zolter
Было сказано: Четверг, 05 Ноябрь 2009
Первый мой перевод с индонезийского :) Текста не много, но для себя пару слов запомнил :)

[guest] Гость
Было сказано: Четверг, 05 Ноябрь 2009
Подскажите как соединить две таблицы. Оффициальная дока не помогает, обьязательно таблицы должны быть как ИнноДБ и объявлены внешние ключи?

[guest] Гость
Было сказано: Четверг, 05 Ноябрь 2009
Пока реализовал через DAO, а как реализовать соединение таблиц через AR для меня до сих пор остается загадкой :(

[adm] zolter
Было сказано: Пятница, 06 Ноябрь 2009
А чем relation обычной AR модели не подходит?
Если какие то ошибки - киньте кусок кода, разберемся. Ну и дамп таблиц помог бы

[guest] Гость
Было сказано: Пятница, 06 Ноябрь 2009
Делал все по офф. манам, по логике должно работать. Скажите обязательно ли соединять таблицы внешним ключом и соответственно использовать тип InnoDB? а дальше я попробую сам разобратся, что бы не флудить лишний раз. А еще столкнулся с проблемой разбияния на страницы, почему то дописывается index.php в адрес и еще кажется названия экшена (index), собсно как и на Вашем блоге :)

[adm] zolter
Было сказано: Пятница, 06 Ноябрь 2009
Нет, InnoDB не обязательно. У меня таблицы в MyISAM, и все отлично работает с AR. Внешние ключи не обязательны, и я их в принципе не использую совсем. Удаляю связи скриптово (через бехавиор) если требуется. Насколько мне извесно только примари кей является обязательным, и то утверждать не буду, т.к. у меня в базе все таблицы с примари и автоинкрементом на индексе.
По поводу дописывания index.php - так это в конфиг файле (config/main.php) надо указать showScriptName = false. Т.е. вот так вот :
'urlManager'=>array(
'showScriptName' => false, // что бы не цеплялся index.php к ссылкам
'urlFormat'=>'path',
),

[guest] Гость
Было сказано: Пятница, 06 Ноябрь 2009
Спс большое за ответ и за блог в целом, разобрался)) судя по всему создавался он не зря :)

[adm] zolter
Было сказано: Пятница, 13 Ноябрь 2009
Постараюсь завтра выполнить перевод статьи как использовать префиксы к таблицам в модели. А в общем еще собираюсь начать писать что то крупное по одному из уроков, то думаю сильно я затянул :)

[guest] Anya
Было сказано: Среда, 23 Декабрь 2009
Прекрасная статья!
Но у меня возник вопрос - как распечатать такой pdf файл?
В том смысле, что например на сайте есть статья, а внизу ссылка "Распечатать", нажав на которую сперва формируется pdf файл и сразу же отправляется на печать. Как это реализовать?

[guest] zolter
Было сказано: Среда, 23 Декабрь 2009
Повесьте действие window.print(); на load к примеру или просто на странице в конце (<script>window.print()</script>)формирования pdf сделайте. тогда после вывода на экран - сразу будет пробовать его распечатать

[guest] МОТОРИСТ
Было сказано: Пятница, 02 Июль 2010
А не слишком ли вырастет объем приложения, если туда еще один фреймворк загрузить? Тем более zend.

[guest] Maxx
Было сказано: Пятница, 02 Июль 2010
Вся суть иметь инструмент под руками и возможность им воспользоваться. А увеличение размера это пустяк если PDF или другой класс с Zend-а очень сильно понадобится :)

[guest] Гость
Было сказано: Четверг, 27 Январь 2011
Неплохой пост, но возникает вопрос:как использовать кириллицу?


