• No results found

Symfony 2 Tutorial. Model. Neues Bundle erstellen: php app/console generate:bundle --namespace=blogger/blogbundle

N/A
N/A
Protected

Academic year: 2021

Share "Symfony 2 Tutorial. Model. Neues Bundle erstellen: php app/console generate:bundle --namespace=blogger/blogbundle"

Copied!
10
0
0

Loading.... (view fulltext now)

Full text

(1)

Symfony 2 Tutorial

Neues Bundle erstellen:

php app/console generate:bundle --namespace=Blogger/BlogBundle

Eintrag erfolgt in app/AppKernel.php und app/config/routing.yml.

Model

Available types: array, object, boolean, integer, smallint, bigint, string, text, datetime, datetimetz, date, time, decimal, float.

php app/console doctrine:generate:entity entity="BloggerBlogBundle:Post"

--fields="category_id:integer title:string(255) content:text created_at:datetime updated_at:datetime" php app/console doctrine:generate:entity entity="BloggerBlogBundle:Tag"

--fields="name:string(255) created_at:datetime"

php app/console doctrine:generate:entity entity="BloggerBlogBundle:Category" --fields="name:string(255) created_at:datetime"

(2)

Relations

Post: src/Blogger/BlogBundle/Entity/Post.php use Doctrine\Common\Collections\ArrayCollection; /** * @ORM\Entity * @ORM\Table(name="post") * @ORM\Entity(repositoryClass="Blogger\BlogBundle\Entity\PostRepository") * @ORM\HasLifecycleCallbacks */ /** * @ORM\ManyToOne(targetEntity="Category") * @ORM\JoinColumn(name="category_id", referencedColumnName="id") *

* @var Category $category */ protected $category; /** * @ORM\ManyToMany(targetEntity="Tag") * @ORM\JoinTable(name="post_tag", * joinColumns={@ORM\JoinColumn(name="post_id", referencedColumnName="id")}, * inverseJoinColumns={@ORM\JoinColumn(name="tag_id", referencedColumnName="id")} * ) *

* @var ArrayCollection $tags */

protected $tags;

/**

* Constructs a new instance of Post. */

public function __construct() {

$this->created_at = $this->updated_at = new \DateTime("now"); $this->tags = new ArrayCollection();

}

/**

* Invoked before the entity is updated. *

* @ORM\PreUpdate */

public function preUpdate() {

$this->updated_at = new \DateTime("now"); }

(3)

Category: src/Blogger/BlogBundle/Entity/Category.php use Doctrine\Common\Collections\ArrayCollection; /** * Blogger\BlogBundle\Entity\Category * * @ORM\Table(name="category") * @ORM\Entity(repositoryClass="Blogger\BlogBundle\Entity\CategoryRepository") */ /** * * @ORM\OneToMany(targetEntity="Post", mappedBy="category") *

* @var ArrayCollection $posts */

protected $posts;

public function __construct() {

$this->posts = new ArrayCollection(); $this->created_at = new \DateTime("now"); }

public function __toString() { return $this->name; }

Tag: src/Blogger/BlogBundle/Entity/Tag.php use Doctrine\Common\Collections\ArrayCollection; /** * Blogger\BlogBundle\Entity\Tag * * @ORM\Table(name="tag") * @ORM\Entity(repositoryClass="Blogger\BlogBundle\Entity\TagRepository") */ /** * * @ORM\ManyToMany(targetEntity="Post", mappedBy="tags") *

* @var ArrayCollection $posts */

protected $posts;

public function __construct() {

$this->posts = new ArrayCollection(); $this->created_at = new \DateTime("now"); }

(4)

Generating Getters and Setters¶

php app/console doctrine:generate:entities Blogger

Creating the Database Tables/Schema¶

php app/console doctrine:schema:update –force

CRUD creation:

php app/console generate:doctrine:crud

BloggerBlogBundle:Post BloggerBlogBundle:Category BloggerBlogBundle:Tag

Formulare ausmisten (unnötige Felder entfernen) src/Blogger/BlogBundle/Form/

(5)

Templating

src/Blogger/BlogBundle/Resources/views/Default/layout.html.twig

<!DOCTYPE HTML> <html>

<head>

{% set bundlepath = 'bundles/bloggerblog/' %}

<meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>symfony2 tutorial</title>

{% block stylesheets %}

<link href="{{ asset( bundlepath ~ 'css/main.css') }}" type="text/css" rel="stylesheet" /> {% endblock %}

{% block javascripts %}

<script src="{{ asset( bundlepath ~ 'js/jquery-1.7.1.min.js') }}" type="text/javascript"></script> <script src="{{ asset( bundlepath ~ 'js/main.js') }}" type="text/javascript"></script>

{% endblock %} </head> <body> <div id="wrapper"> <div id="header"> <h1>Tutorial</h1> <ul>

<li><a href="{{ path('post') }}">Posts verwalten</a></li>

<li><a href="{{ path('category') }}">Kategorien verwalten</a></li> <li><a href="{{ path('tag') }}">Tags verwalten</a></li>

</ul> </div>

<div id="page-body">

{% block body %}{% endblock %} </div> <div id="footer"> {% include 'BloggerBlogBundle:Default:footer.html.twig' %} </div> </div> </body> </html> src/Blogger/BlogBundle/Resources/views/Default/footer.html.twig

(6)

src/Blogger/BlogBundle/Resources/views/Category/index.html.twig

{% extends 'BloggerBlogBundle:Default:layout.html.twig' %} {% block javascripts %}

{{ parent() }}

<script src="{{ asset( bundlepath ~ 'js/XXXXXX.js') }}" type="text/javascript"></script> {% endblock %} {% block body %} ………. ………. ………. {% endblock %}

Install assets

(7)

Using relations

src/Blogger/BlogBundle/Resources/views/Post/index.html.twig <th>CategoryName</th> <td>{{ entity.getCategory }}</td> <tr class=“taglist“> <td colspan="8"> Tags:

{% for tag in entity.getTags %}

<a href="{{ path('tag_show', { 'id': tag.id }) }}">{{ tag.name }}</a> {% endfor %}

</td> </tr>

src/Blogger/BlogBundle/Resources/views/Tag/show.html.twig

<h2>Posts mit dem Tag „{{ entity.name }}“</h2> <table class="tagposts">

<tr>

<th>id</th> <th>Post title</th> </tr>

{% for post in entity.getPosts %} <tr>

<td>{{ post.id }}</td>

<td><a href="{{ path('post_show', { 'id': post.id }) }}">{{ post.title }}</a></td> </tr>

{% endfor %} </table>

src/Blogger/BlogBundle/Resources/views/Category/show.html.twig

<h2>Posts mit der Katgorie {{ entity.name }}</h2> <table class="categoryposts">

<tr>

<th>id</th> <th>Post title</th> </tr>

{% for post in entity.getPosts %} <tr>

<td>{{ post.id }}</td>

<td><a href="{{ path('post_show', { 'id': post.id }) }}">{{ post.title }}</a></td> </tr>

{% endfor %} </table>

(8)

String Translation

app/config/config.yml framework: #esi: ~ translator: { fallback: de } /** * @Route("/") * @Template() */

public function rootAction() { $request = $this->getRequest(); $session = $request->getSession(); $lang = $this->getRequest()->getPreferredLanguage(array('de','en')); $session->setLocale($lang); return $this->redirect($this->generateUrl('index')); } /**

* @Route("{_locale}/index/", name="index", requirements={"_locale"="de|en"}) * @Method("GET")

* @Template() */

public function indexAction() { echo $this->get('translator')->trans('Willkommen'); return array(); } src/Blogger/BlogBundle/Resources/views/Default/index.html.twig {% extends 'BloggerBlogBundle:Default:layout.html.twig' %} {% block body %}

{% trans %}Willkommen{% endtrans %} {% endblock %} src/Blogger/BlogBundle/Resources/translations/messages.en.php <?php return array( 'Willkommen' => 'Welcome' ); ?>

Parameter

use Symfony\Component\HttpFoundation\Response; /**

* @Route("/parameter/{id}/{id2}", name="parameter", requirements={"id" = "\d+"}, defaults={"id2" = "kein wert"}) * @Method("GET")

* @Template() */

public function parameterAction($id, $id2) {

return new Response('Parameter1: '.$id. ' Parameter2: '.$id2); }

(9)

Minify JavaScripts and Stylesheets with YUI Compressor

apt-get install yui-compressor

src/Blogger/BlogBundle/Resources/views/Default/layout.html.twig

{% stylesheets '@BloggerBlogBundle/Resources/public/css/*' output='css/compressed.css' filter='?yui_css' %}

<link rel="stylesheet" href="{{ asset_url }}" type="text/css" media="screen" />

{% endstylesheets %}

{% javascripts '@BloggerBlogBundle/Resources/public/js/*' output='js/compressed.js' filter='?yui_js' %}

<script src="{{ asset_url }}"></script> {% endjavascripts %}

Also in dev mode filter='yui_css' filter='yui_js' app/config/config.yml # Assetic Configuration assetic : debug: "%kernel.debug%" use_controller: false

# Uncomment the following line if your java bin is # in a different location # java: /usr/bin/java filters : cssrewrite: ~ yui_css : jar: /usr/share/yui-compressor/yui-compressor.jar yui_js : jar: /usr/share/yui-compressor/yui-compressor.jar

(10)

Google Closure Compiler

apt-get install sun-java6-jdk sun-java6-plugin update-java-alternatives -s java-6-sun

Once either one is done, run the

sudo update-java-alternatives -s java-6-sun

command and finally add the line “/usr/lib/jvm/java-6-sun” to the top of the /etc/jvm file

(

gksudo gedit /etc/jvm

). Save and exit. To test your Java(TM) setup in the terminal type:-

mkdir /usr/share/closure-compiler cd /usr/share/closure-compiler wget http://closure-compiler.googlecode.com/files/compiler-latest.zip . unzip compiler-latest.zip src/Blogger/BlogBundle/Resources/views/Default/layout.html.twig {% javascripts '@BloggerBlogBundle/Resources/public/js/*' output='js/compressed.js' filter='closure' %}

<script src="{{ asset_url }}"></script> {% endjavascripts %} app/config/config.yml # Assetic Configuration assetic: debug: %kernel.debug% use_controller: false # java: /usr/bin/java filters: cssrewrite: ~ closure: jar: /usr/share/closure-compiler/compiler.jar

References

Related documents