пятница, 4 апреля 2008 г.

Создадим приложение для публикации новостей


  • Создадим приложение для публикации новостей.

    Требуется

    Авторизация

    Информация о пользователе

    Публикация анонса

    Помещение в публикацию изображения

    Просмотр публикации целиком


Установки для базы данных


   

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

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