Показаны сообщения с ярлыком php. Показать все сообщения
Показаны сообщения с ярлыком php. Показать все сообщения

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

Создание фотоальбома

Создание фотоальбома


Спроектируем 3 таблицы



propel:

photo:

id: ~

file_path: varchar(50)

description: longvarchar

created_at: ~

tag:

photo_id: ~

name: varchar(50)

photocomment:

photo_id: ~

author: varchar(50)

body: varchar(50)

created_at: ~

Построим их


$symfony propel-build-all


Чистим кеш


$symfony clear-cache


Генерируем панель админа


$symfony propel-init-admin frontend photo Photo


смотрим


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


Редактируем представление


открываем generator.yml из apps/prod/modules/photo/config/ и добавляем следующий код:



generator:

class: sfPropelAdminGenerator

param:

model_class: Photo

theme: default

list:

display: [file_path, description, created_at]

object_actions:

_edit:

name: Edit picture properties


Для создания возможности выбора файла и навигащии по системе, модифицируем generator.yml:



generator:

class: sfPropelAdminGenerator

param:

model_class: Photo

theme: default

list:

display: [file_path, description, created_at]

object_actions:

_edit:

name: Edit picture properties

edit:

display: [file_path, description]

fields:

file_path:

type: admin_input_file_tag


Создаем механизм обработкм для выбранного файла. Вначале модифицируем схему, добавляя колонку _photo:



generator:

class: sfPropelAdminGenerator

param:

model_class: Photo

theme: default

list:

display: [_photo, description, created_at]

object_actions:

_edit:

name: Edit picture properties

edit:

display: [_photo, file_path, description]

fields:

file_path:

type: admin_input_file_tag


Создаем _photo.php в /apps/prod/modules/photo/templates следующего содержания:


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


Модифицируем модель


выполнив команду propel-build-all, мы генерирум два файла вкаталоге lib/model/ - Photo.php и PhotoPeer.php.Содержимое lib/model/Photo.php:


<?php

/**

* Subclass for representing a row from the 'photo' table.

*

*

*

* @package lib.model

*/

class Photo extends BasePhoto

{

}


Нам необходимо иметь возможность добавлять файлы и удалять файлы. Для этого модифицируем Photo class:


// in lib/model/Photo.php

class Photo extends BasePhoto

{

public function getTagsString()

{

$tags = array [9]();

foreach ($this->getTags() as $tag)

{

$tags[] = $tag->__toString();

}

return implode(' ', $tags);

}


public function setTagsString($tagPhrase)

{

// remove old tags

$this->deleteTags();


// set new tags

$tagNames = explode(' ', $tagPhrase);

foreach($tagNames as $tagName)

{

$tag = new Tag();

$tag->setPhoto($this);

$tag->setName($tagName);

$tag->save();

}

}


public function deleteTags()

{

$c = new Criteria();

$c->add(TagPeer::PHOTO_ID, $this->getId());

TagPeer::doDelete($c);

}

}


Здесь мы использовали метод __toString из класса Tag , который следут модифицировать:


// in lib/model/Tag.php

class Tag extends BaseTag

{

public function __toString()

{

return $this->getName();

}

}


Модифицируем модель :


// apps/prod/modules/photo/config/generator.yml

generator:

class: sfPropelAdminGenerator

param:

model_class: Photo

theme: default

list:

display: [_photo, description, tags_string, created_at]

object_actions:

_edit:

name: Edit picture properties

edit:

display: [_photo, file_path, description, tags_string]

fields:

file_path:

type: admin_input_file_tag

tags_string:

name: Tags

type: input_tag


 


пятница, 29 февраля 2008 г.

Продолжаем строить Blog на Symfony

Модифицируем главный шаблон приложения layout.php


Открываем и редактируем главный шаблон приложения prod/apps/blog/templates/layout.php:


<div id="container" style="width:600px;margin:0 auto;border:1px solid grey;padding:10px">    
<div id="navigation" style="display:inline;float:right">
<ul>
<li><?php echo link_to('List of posts', 'post/list') ?></li>
<li><?php echo link_to('List of comments', 'comment/list') ?></li>
</ul>
</div>
<div id="title">
<h1><?php echo link_to('Мой дневник на symfony', '@homepage') ?></h1>
</div>
<div id="content" style="clear:right">
<?php echo $sf_data->getRaw('sf_content') ?>
</div>
</div>

Если уже готов дизайн, замените это на вашу структуру, положив изображения в prod/www/images, а css в prod/www/css.


Изменим служебную часть проекта, оазместив в конфигурационном файле prod/apps/blog/config/view.yml:


default:

   http_metas:

      content-type: text/html


metas:

   title: The best weblog ever

   robots: index, follow

   description: symfony project

   keywords: symfony, project

   language: en


stylesheets: [main]


javascripts: []


has_layout: on

layout: layout


Создаем главный модуль main:


c:\xampp\htdocs\prod> symfony init-module frontend main  

Редактируем prod/apps/blog/modules/main/actions/actions.class.php и убираем содержимое метода executeIndex():


public function executeIndex()  {  }   

Редактируем шаблон prod/apps/blog/modules/main/templates/indexSuccess.php, например так:



<h1>Привет. Вы можете оставить запись в моем личном дневнике</h1>
<p>Вы <?php echo rand(1000,5000) ?>-й посетитель на сегодня.</p>

Скажем symfony какое действие ей выполнять первым, отредактировав prod/apps/blog/config/routing.yml:


homepage:
url: /
param: { module: main, action: index }

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


http://localhost/blog_dev.php/