- Создадим приложение для публикации новостей.
Требуется
Авторизация
Информация о пользователе
Публикация анонса
Помещение в публикацию изображения
Просмотр публикации целиком
Установки для базы данных
all:
propel:
class: sfPropelDatabase
param:
dsn: mysql://root@localhost/prod
Спроектируем 3 таблицы
author:
_attributes: { phpName: Author }
id:
first_name: varchar(30)
last_name: varchar(30)
email: varchar(75)
website: varchar(100)
birthday: date
years_experience: integer
article:
_attributes: { phpName: Article }
id:
author_id:
title: varchar(255)
teaser: longvarchar
body: longvarchar
file_path: varchar(50)
file_attachment: varchar(255)
created_at: ~
tag:
article_id: ~
name: varchar(50)
name: varchar(50)
Построим модель и таблицы
$symfony propel-build-all
Чистим кеш
$symfony clear-cache
Создаем приложение
$symfony init-app frontend
Генерируем панель админа
$symfony propel-init-admin frontend author Author
$symfony propel-init-admin frontend article Article
смотрим
http://localhost/frontend_dev.php/author
http://localhost/frontend_dev.php/article
Создаем автора
Редактируем представление
открываем generator.yml из apps/frontend/modules/article/config/
generator:
class: sfPropelAdminGenerator
param:
model_class: Article
theme: default
и добавляем следующий код:
list:
display: [title, created_at]
object_actions:
_edit:
name: Edit article
чтобы выбрать картинку
edit:
display: [file_path, title, created_at]
fields:
file_path:
type: admin_input_file_tag
Создаем несколько новостей
generator:
class: sfPropelAdminGenerator
param:
model_class: Article
theme: default
list:
display: [title, created_at]
object_actions:
_edit:
name: Edit article
edit:
display: [_img, file_path, title, created_at, teaser, body]
fields:
file_path:
type: admin_input_file_tag
tags_string:
name: Tags
type: input_tag
Для того чтобы это работало, нужно создать часть шаблона
_img.php
<?php echo image_tag('/uploads/'.$article->getFilePath()) ?>
Скорректировать класс Article
Article.php
<?php
/**
* Subclass for representing a row from the 'article' table.
*
*
*
* @package lib.model
*/
class Article extends BaseArticle
{
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->setArticle($this);
$tag->setName($tagName);
$tag->save();
}
}
public function deleteTags()
{
$c = new Criteria();
$c->add(TagPeer::ARTICLE_ID, $this->getId());
TagPeer::doDelete($c);
}
}
Скорректировать класс Tag
Tag.php
<?php
/**
* Subclass for representing a row from the 'tag' table.
*
*
*
* @package lib.model
*/
class Tag extends BaseTag
{
public function __toString()
{
return $this->getName();
}
}
Создаем модуль для анонимных посетителей
<?php
/**
* public actions.
*
* @package prod
* @subpackage public
* @author Your name here
* @version SVN: $Id: actions.class.php 2692 2006-11-15 21:03:55Z fabien $
*/
class publicActions extends sfActions
{
/**
* Executes index action
*
*/
public function executeIndex()
{
//$this->forward('default', 'module');
$c = new Criteria();
$c->addDescendingOrderByColumn(ArticlePeer::CREATED_AT);
$this->articles = ArticlePeer::doSelect($c);
}
}
И соответствующий ему шаблон
<div id="main">
<h1>News and articles</h1>
<?php foreach($articles as $article): ?>
<?php echo $article->getCreatedAt('d/M/Y') ?>
<div class="article">
<?php echo link_to(
image_tag('/uploads/'.$article->getFilePath()),
'public/article?id='.$article->getId(),
'class=image title='.$article->getTitle()
) ?>
<?php echo $article->getTeaser() ?>
<?php echo link_to('read more... ', 'public/article?id='.$article->getId(),
'style=display:block;float:right;') ?>
</div>
<?php endforeach; ?>
<div id="footer">
powered by <?php echo link_to('symfony', 'http://www.symfony-project.com') ?>
</div>
</div>
Создаем стиль для этого шаблона
body
{
text-align:center;
color:#333;
font-family: sans-serif;
margin:0px 0;
background-color: #FBFFC0;
}
p{
font-size:.9em;
line-height:1.3em;
margin:20px auto;
}
#footer{
background-color: #94C6FF;
width:100%;
line-height:50px;
clear:both;
}
a{
font-weight:bold;
color:#000;
cursor: pointer;
}
.article
{
color:#666;
float:left;
}
Добавляем этот стиль
default:
http_metas:
content-type: text/html
metas:
title: symfony project
robots: index, follow
description: symfony project
keywords: symfony, project
language: en
stylesheets: [main, art]
javascripts: []
has_layout: on
layout: layout
Комментариев нет:
Отправить комментарий