Используем плагины
Плагин 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>
Комментариев нет:
Отправить комментарий