суббота, 15 марта 2008 г.

Используем плагины

Используем плагины


Плагин sfThumbnail создает значки определенного размера для публикуемых изображений:


symfony plugin-install http://plugins.symfony-project.com/sfThumbnailPlugin


$ php symfony clear-cache


Применим установленный плагин sfThumbnail к нашему классу Photo. Добавим в Photo.php:


// in lib/model/Photo.php

public function setFilePath($value)

{

parent::setFilePath($value);

$this->generateThumbnail($value);

}

public function generateThumbnail($value)

{

parent::setFilePath($value);

$uploadDir = sfConfig::get('sf_upload_dir');

$thumbnail = new sfThumbnail(150, 150);

$thumbnail->loadFile($uploadDir.'/'.$this->getFilePath());

$thumbnail->save($uploadDir.'/thumbnail/'.$this->getFilePath(), 'image/png');

}


Это позволит создавать значки размером 150x150px от оригинального размера файла и сохранять из в каталог uploads/thumbnail/ . В классе generateThumbnail используется класс sfConfig для получения пути к директории uploads.


$ cd web/uploads

$ mkdir thumbnail

$ chmod 777 thumbnail


Также необходимо отредактировать файл _photo.php :


// in apps/prod/modules/photo/templates/_photo.php

<?php echo image_tag('/uploads/thumbnail/'.$photo->getFilePath()) ?>


Теперь можно загрузить изображение.


Для обеспечения безопасности в приложении необходима авторизация. Эту задачу решает плагин sfGuard Установим его:


$symfony plugin-install http://plugins.symfony-project.com/sfGuardPlugin


Разрешим его использование, отредактировав файл apps/prod/config/settings.yml:


// apps/prod/config/settings.yml

all:

.actions:

login_module: sfGuardAuth

login_action: signin

.settings:

enabled_modules: [default, sfGuardAuth, sfGuardUser]


Кроме того, неоюходимо помень наследование в классе myUser, изменив myUser.class.php:


//apps/prod/lib/myUser.class.php

class myUser extends sfGuardSecurityUser

{

}


Сообщим symfony, что все действия в модуле photo теперь требуют авторизации. В modules/photo/config/ :


// apps/prodd/modules/photo/config/security.yml

all:

is_secure: on


В sfGuardPlugin входит модуль управления пользователями, что дает возможность создавать и управлять пользователями. Для его включения тредуется пересоздать все

propel-build-all

Если в базе есть данные, которые нужно сохранить, перед пересборкой их надо бекаптровать:


>symfony propel-dump-data prod testdata.yml

>symfony cc

>symfony propel-build-all-load prod


Смотрим результат

http://localhost/prod_dev.php/photo.


sfGuardPlugin создает бюджет id: admin, password: admin.


Для создания новых пользователей, вызовите URL: http://localhost/prod_dev.php/sfGuardUser.


Для анонимных посетителей, необходимо добавить страницу


$symfony init-module prod public


Получим каталог public/ в apps/prod/modules/, содержащий:


actions/

config/

lib/

template/

validate/


Отредактируем apps/prod/modules/public/actions/actions.class.php.

// actions/actions.class.php

public function executeIndex()

{

$c = new Criteria();

$c->addDescendingOrderByColumn(PhotoPeer::CREATED_AT);

$this->photos = PhotoPeer::doSelect($c);

}


Эти три строки соответствуют SQL запросу:


SELECT * FROM photo ORDER BY created_at;


//в apps/prod/modules/public/templates/indexSuccess.php

<div id="main">

<h1>My pictures</h1>

<?php foreach($photos as $photo): ?>

<div class="photo">

<?php echo link_to(

image_tag('/uploads/thumbnail/'.$photo->getFilePath()),

'public/photo?id='.$photo->getId(),

'class=image title='.$photo->getDescription()

) ?>

"<?php echo $photo->getDescription() ?>"

on <?php echo $photo->getCreatedAt('d/m') ?>,

tagged <?php echo $photo->getTagsString() ?>

</div>

<?php endforeach; ?>

<div id="footer">

powered by <?php echo link_to('symfony', 'http://www.symfony-project.com') ?>

</div>

</div>


Если нелюходимо подключать стили в каждую страницу, необходимо изменить метод preExecute в actions.class.php:


// apps/prod/actions/actions.class.php

public function preExecute()

{

$this->getResponse()->addStylesheet('frontend');

}


http://localhost/prod_dev.php/public/index.


Для запрета вызывать изображения по их идентификатору, изменим executePhoto():


// apps/prod/actions/actions.class.php

public function executePhoto()

{

$photo = PhotoPeer::retrieveByPk($this->getRequestParameter('id'));

$this->forward404unless($photo);

$this->photo = $photo;

}


Создадим шаблон photoSuccess.php в кпталоге templates/ :


// apps/prod/modules/public/templates/photoSuccess.php

<div id="main">

<?php echo link_to('back to the photo list', 'public/index',

'style=display:block;float:right;') ?>

<h1>Picture details</h1>

<a href="/uploads/<?php echo $photo->getFilePath() ?>" title="click for the full-size version">

<?php echo image_tag('/uploads/'.$photo->getFilePath(), 'width=100%') ?>

</a><br/>

<p>

"<?php echo $photo->getDescription() ?>"

published on <?php echo $photo->getCreatedAt('d/m') ?>,

tagged <?php echo $photo->getTagsString() ?>

</p>

<div id="footer">

powered by <?php echo link_to('symfony', 'http://www.symfony-project.com') ?>

</div>

</div>


Комментариев нет: