Added user profile editing support

This commit is contained in:
Polonkai Gergely 2012-07-09 17:29:37 +02:00
parent 0fad11ffd0
commit 8a55e32303
12 changed files with 775 additions and 24 deletions

13
TODO
View File

@ -2,19 +2,6 @@ Article
public public
roles who can access it roles who can access it
UserData
user id
real name
real name public?
self description
email public?
msn address
msn address public?
google talk address
google talk address public?
skype
skype public?
UserForumViewed UserForumViewed
it should contain records that show the last viewed post in each forum topic it should contain records that show the last viewed post in each forum topic

View File

@ -3,8 +3,38 @@
<head> <head>
<title>Kék Rózsák{% block title %}{% endblock %}</title> <title>Kék Rózsák{% block title %}{% endblock %}</title>
<link rel="stylesheet" type="text/css" href="{{ asset('css/kekrozsak_front.css') }}" /> <link rel="stylesheet" type="text/css" href="{{ asset('css/kekrozsak_front.css') }}" />
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
</head> </head>
<body> <body>
<div id="top-line-wrapper">
<div id="top-line">
{% if app.user %}
<div id="profil-gomb">
<span id="profil-mutato">[avatar] {{ app.user.displayName }}</span>
<div id="profil-box">
<div id="profil-belso">
[avatar]
{{ app.user.displayName }}<br />
Jogosultság<br />
<dl>
<dt>Csoportjaim</dt>
<dt>Kedvenc Fórum-témáim</dt>
<dt>Üzenetek</dt>
</dl>
</div>
<div id="profil-szerkesztes"><a href="{{ path('KekRozsakFrontBundle_profile_edit') }}">Profil szerkesztése</a></div>
</div>
</div>
{% endif %}
<div id="search-box">
<input type="text" />
<button type="submit">Keresés</button>
</div>
</div>
<div id="top-line-padding"></div>
</div>
<div id="wrapper"> <div id="wrapper">
<div id="menu"> <div id="menu">
<ul> <ul>
@ -42,8 +72,25 @@
</div> </div>
{% endfor %} {% endfor %}
</div> </div>
</div>{# div#content-wrapper #}
</div>{# div#wrapper #}
<div id="bottom-line-wrapper">
<div id="bottom-line-padding"></div>
<div id="bottom-line"{% if app.environment == 'dev' %} style="bottom: 40px;"{% endif %}>
</div> </div>
</div> </div>
<script type="text/javascript">
$('#profil-mutato').click(function() {
if ($('#profil-box').is(':visible'))
{
$('#profil-box').hide();
}
else
{
$('#profil-box').show();
}
});
</script>
</body> </body>
</html> </html>

View File

@ -4,6 +4,8 @@ namespace KekRozsak\FrontBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use KekRozsak\FrontBundle\Form\Type\UserType;
class DefaultController extends Controller class DefaultController extends Controller
{ {
public function homepageAction() public function homepageAction()
@ -26,4 +28,42 @@ class DefaultController extends Controller
'article' => $article 'article' => $article
)); ));
} }
public function profileEditAction()
{
$user = $this->get('security.context')->getToken()->getUser();
$oldPassword = $this->getDoctrine()->getRepository('KekRozsakFrontBundle:User')->findOneById($user->getId())->getPassword();
$form = $this->createForm(new UserType(), $user);
$saveSuccess = false;
$request = $this->getRequest();
if ($request->getMethod() == 'POST')
{
$form->bindRequest($request);
if ($form->isValid())
{
if ($user->getPassword() != '')
{
$user->setPassword($this->get('security.encoder_factory')->getEncoder($user)->encodePassword($user->getPassword(), $user->getSalt()));
}
else
{
$user->setPassword($oldPassword);
}
if ($user->getUserData()->getUserId() === null)
{
$user->getUserData()->setUser($user);
}
$em = $this->getDoctrine()->getEntityManager();
$em->persist($user);
$em->flush();
// $saveSuccess = true
}
}
return $this->render('KekRozsakFrontBundle:Default:userprofile.html.twig', array(
'form' => $form->createView(),
'saveSuccess' => $saveSuccess,
));
}
} }

View File

@ -334,4 +334,31 @@ class User implements UserInterface, AdvancedUserInterface
{ {
return $this->last_login_at; return $this->last_login_at;
} }
/**
* @var KekRozsak\FrontBundle\Entity\UserData
*/
private $user_data;
/**
* Set user_data
*
* @param KekRozsak\FrontBundle\Entity\UserData $userData
* @return User
*/
public function setUserData(\KekRozsak\FrontBundle\Entity\UserData $userData = null)
{
$this->user_data = $userData;
return $this;
}
/**
* Get user_data
*
* @return KekRozsak\FrontBundle\Entity\UserData
*/
public function getUserData()
{
return $this->user_data;
}
} }

View File

@ -0,0 +1,391 @@
<?php
namespace KekRozsak\FrontBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* KekRozsak\FrontBundle\Entity\UserData
*/
class UserData
{
/**
* @var KekRozsak\FrontBundle\Entity\User
*/
private $user;
/**
* Set user
*
* @param KekRozsak\FrontBundle\Entity\User $user
* @return UserData
*/
public function setUser(\KekRozsak\FrontBundle\Entity\User $user = null)
{
$this->user = $user;
$this->user_id = $user->getId();
return $this;
}
/**
* Get user
*
* @return KekRozsak\FrontBundle\Entity\User
*/
public function getUser()
{
return $this->user;
}
/**
* @var integer $user_id
*/
private $user_id;
/**
* @var string $realName
*/
private $realName;
/**
* @var boolean $realNamePublic
*/
private $realNamePublic;
/**
* Set user_id
*
* @param integer $userId
* @return UserData
*/
public function setUserId($userId)
{
$this->user_id = $userId;
return $this;
}
/**
* Get user_id
*
* @return integer
*/
public function getUserId()
{
return $this->user_id;
}
/**
* Set realName
*
* @param string $realName
* @return UserData
*/
public function setRealName($realName)
{
$this->realName = $realName;
return $this;
}
/**
* Get realName
*
* @return string
*/
public function getRealName()
{
return $this->realName;
}
/**
* Set realNamePublic
*
* @param boolean $realNamePublic
* @return UserData
*/
public function setRealNamePublic($realNamePublic)
{
$this->realNamePublic = $realNamePublic;
return $this;
}
/**
* Get realNamePublic
*
* @return boolean
*/
public function getRealNamePublic()
{
return $this->realNamePublic;
}
/**
* @var text $selfDescription
*/
private $selfDescription;
/**
* @var boolean $emailPublic
*/
private $emailPublic;
/**
* Set selfDescription
*
* @param text $selfDescription
* @return UserData
*/
public function setSelfDescription($selfDescription)
{
$this->selfDescription = $selfDescription;
return $this;
}
/**
* Get selfDescription
*
* @return text
*/
public function getSelfDescription()
{
return $this->selfDescription;
}
/**
* Set emailPublic
*
* @param boolean $emailPublic
* @return UserData
*/
public function setEmailPublic($emailPublic)
{
$this->emailPublic = $emailPublic;
return $this;
}
/**
* Get emailPublic
*
* @return boolean
*/
public function getEmailPublic()
{
return $this->emailPublic;
}
/**
* @var string $msnAddress
*/
private $msnAddress;
/**
* @var boolean $msnAddressPublic
*/
private $msnAddressPublic;
/**
* @var string $googleTalk
*/
private $googleTalk;
/**
* @var boolean $googleTalkPublic
*/
private $googleTalkPublic;
/**
* @var string $skype
*/
private $skype;
/**
* @var boolean $skypePublic
*/
private $skypePublic;
/**
* Set msnAddress
*
* @param string $msnAddress
* @return UserData
*/
public function setMsnAddress($msnAddress)
{
$this->msnAddress = $msnAddress;
return $this;
}
/**
* Get msnAddress
*
* @return string
*/
public function getMsnAddress()
{
return $this->msnAddress;
}
/**
* Set msnAddressPublic
*
* @param boolean $msnAddressPublic
* @return UserData
*/
public function setMsnAddressPublic($msnAddressPublic)
{
$this->msnAddressPublic = $msnAddressPublic;
return $this;
}
/**
* Get msnAddressPublic
*
* @return boolean
*/
public function getMsnAddressPublic()
{
return $this->msnAddressPublic;
}
/**
* Set googleTalk
*
* @param string $googleTalk
* @return UserData
*/
public function setGoogleTalk($googleTalk)
{
$this->googleTalk = $googleTalk;
return $this;
}
/**
* Get googleTalk
*
* @return string
*/
public function getGoogleTalk()
{
return $this->googleTalk;
}
/**
* Set googleTalkPublic
*
* @param boolean $googleTalkPublic
* @return UserData
*/
public function setGoogleTalkPublic($googleTalkPublic)
{
$this->googleTalkPublic = $googleTalkPublic;
return $this;
}
/**
* Get googleTalkPublic
*
* @return boolean
*/
public function getGoogleTalkPublic()
{
return $this->googleTalkPublic;
}
/**
* Set skype
*
* @param string $skype
* @return UserData
*/
public function setSkype($skype)
{
$this->skype = $skype;
return $this;
}
/**
* Get skype
*
* @return string
*/
public function getSkype()
{
return $this->skype;
}
/**
* Set skypePublic
*
* @param boolean $skypePublic
* @return UserData
*/
public function setSkypePublic($skypePublic)
{
$this->skypePublic = $skypePublic;
return $this;
}
/**
* Get skypePublic
*
* @return boolean
*/
public function getSkypePublic()
{
return $this->skypePublic;
}
/**
* @var string $phoneNumber
*/
private $phoneNumber;
/**
* @var boolean $phoneNumberPublic
*/
private $phoneNumberPublic;
/**
* Set phoneNumber
*
* @param string $phoneNumber
* @return UserData
*/
public function setPhoneNumber($phoneNumber)
{
$this->phoneNumber = $phoneNumber;
return $this;
}
/**
* Get phoneNumber
*
* @return string
*/
public function getPhoneNumber()
{
return $this->phoneNumber;
}
/**
* Set phoneNumberPublic
*
* @param boolean $phoneNumberPublic
* @return UserData
*/
public function setPhoneNumberPublic($phoneNumberPublic)
{
$this->phoneNumberPublic = $phoneNumberPublic;
return $this;
}
/**
* Get phoneNumberPublic
*
* @return boolean
*/
public function getPhoneNumberPublic()
{
return $this->phoneNumberPublic;
}
}

View File

@ -0,0 +1,79 @@
<?php
namespace KekRozsak\FrontBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
class UserDataType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('emailPublic', null, array(
'label' => 'Publikus legyen az e-mail címed?',
'help' => 'Ha bejelölöd, a kör többi tagja láthatja az e-mail címedet.',
'required' => false,
));
$builder->add('realName', null, array(
'label' => 'Valódi neved',
'help' => 'A valódi, polgári neved. Nem kötelező mező, akkor érdemes megadni, ha szeretnéd, hogy a többi tag megtalálhasson különféle közösségi oldalakon.',
));
$builder->add('realNamePublic', null, array(
'label' => 'Publikus legyen a valódi neved?',
'help' => 'Ha bejelölöd, a kör többi tagja láthatja a valódi neved.',
'required' => false,
));
$builder->add('selfDescription', null, array(
'label' => 'Rövid leírás Magadról',
'help' => 'Írj ide egy rövid leírást saját magadról. Ez mindenképpen megjelenik majd a profilodon, így a többiek tudhatják, hogy mivel is foglalkozol.',
));
$builder->add('msnAddress', null, array(
'label' => 'MSN címed',
'help' => 'Egy MSN cím, amin elérhető vagy.'
));
$builder->add('msnAddressPublic', null, array(
'label' => 'Publikus legyen az MSN címed?',
'help' => 'Ha bejelölöd, a kör többi tagja láthatja az MSN címedet.',
'required' => false,
));
$builder->add('googleTalk', null, array(
'label' => 'Google Talk címed',
'help' => 'Itt egy olyan GMail-es e-mail címet adhatsz meg, amin elérhető vagy a GMail csevegőben.',
));
$builder->add('googleTalkPublic', null, array(
'label' => 'Publikus legyen a Google Talk címed?',
'help' => 'Ha bejelölöd, a kör többi tagja láthatja a Google Talk címedet.',
'required' => false,
));
$builder->add('skype', null, array(
'label' => 'Skype neved',
'help' => 'Egy Skype név, amin elérhető vagy.',
));
$builder->add('skypePublic', null, array(
'label' => 'Publikus legyen a Skype neved?',
'help' => 'Ha bejelölöd, a kör többi tagja láthatja a Skype nevedet.',
'required' => false,
));
$builder->add('phoneNumber', null, array(
'label' => 'Telefonszámod',
'help' => 'Egy telefonszám, amin elérhető vagy. Programszervezéseknél jól jöhet.',
));
$builder->add('phoneNumberPublic', null, array(
'label' => 'Publikus legyen a telefonszámod?',
'help' => 'Ha bejelölöd, a kör többi tagja láthatja a telefonszámodat.',
'required' => false,
));
}
public function getName()
{
return 'user_data';
}
public function getDefaultOptions()
{
return array(
'data_class' => 'KekRozsak\FrontBundle\Entity\UserData'
);
}
}

View File

@ -4,11 +4,13 @@ namespace KekRozsak\FrontBundle\Form\Type;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
use KekRozsak\FrontBundle\Form\Type\UserDataType;
class UserType extends AbstractType class UserType extends AbstractType
{ {
protected $_registration; protected $_registration;
public function __construct($registration) public function __construct($registration = false)
{ {
$this->_registration = $registration; $this->_registration = $registration;
} }
@ -17,12 +19,14 @@ class UserType extends AbstractType
{ {
$builder->add('username', null, array( $builder->add('username', null, array(
'label' => 'Felhasználónév', 'label' => 'Felhasználónév',
'read_only' => (!$this->_registration),
'help' => 'Ezt fogod használni az oldalra való bejelentkezéshez. Jelszavadhoz hasonlóan kezeld bizalmasan! Jelentkezés után nem lehet megváltoztatni!', 'help' => 'Ezt fogod használni az oldalra való bejelentkezéshez. Jelszavadhoz hasonlóan kezeld bizalmasan! Jelentkezés után nem lehet megváltoztatni!',
)); ));
$builder->add('password', 'repeated', array( $builder->add('password', 'repeated', array(
'type' => 'password', 'type' => 'password',
'second_name' => 'confirm', 'second_name' => 'confirm',
'invalid_message' => 'A két jelszó nem egyezik meg!', 'invalid_message' => 'A két jelszó nem egyezik meg!',
'required' => ($this->_registration),
'options' => array( 'options' => array(
'label' => 'Jelszó', 'label' => 'Jelszó',
'help' => 'Ezt fogod használni az oldalra való bejelentkezéshez. Soha ne add meg senkinek!', 'help' => 'Ezt fogod használni az oldalra való bejelentkezéshez. Soha ne add meg senkinek!',
@ -30,16 +34,26 @@ class UserType extends AbstractType
)); ));
$builder->add('email', null, array( $builder->add('email', null, array(
'label' => 'E-mail cím', 'label' => 'E-mail cím',
'help' => 'Ezen az e-mail címen értesítünk majd, ha felvételt nyersz a körbe.',
)); ));
$builder->add('displayName', null, array( $builder->add('displayName', null, array(
'label' => 'Név', 'label' => 'Név',
'help' => 'Ezen a néven fog szólítani a közösség. Bármikor megváltoztathatod, de az egyértelműség kedvéért ezt mindig jelezd a többiek felé!', 'help' => 'Ezen a néven fog szólítani a közösség. Bármikor megváltoztathatod, de az egyértelműség kedvéért ezt mindig jelezd a többiek felé!',
)); ));
$builder->add('agree', 'checkbox', array( if (!$this->_registration)
'property_path' => false, {
'label' => ' ', $builder->add('user_data', new UserDataType(), array(
'help' => 'A Jelentkezés gomb megnyomásával kijelentem, hogy a Kék Rózsa okkultista kör Házirendjét elolvastam, és azt felvételem esetén magamra nézve teljes mértékben elfogadom.', 'label' => 'Egyéb adatok',
)); ));
}
else
{
$builder->add('agree', 'checkbox', array(
'property_path' => false,
'label' => ' ',
'help' => 'A Jelentkezés gomb megnyomásával kijelentem, hogy a Kék Rózsa okkultista kör Házirendjét elolvastam, és azt felvételem esetén magamra nézve teljes mértékben elfogadom.',
));
}
} }
public function getName() public function getName()

View File

@ -41,3 +41,11 @@ KekRozsak\FrontBundle\Entity\User:
manyToMany: manyToMany:
roles: roles:
targetEntity: Role targetEntity: Role
oneToOne:
user_data:
targetEntity: UserData
mappedBy: user
joinColumns:
id:
referencedColumnName: user_id
cascade: [ 'persist' ]

View File

@ -0,0 +1,71 @@
KekRozsak\FrontBundle\Entity\UserData:
type: entity
table: user_data
id:
user_id:
type: integer
fields:
emailPublic:
type: boolean
nullable: false
default: false
realName:
name: real_name
type: string(100)
nullable: true
default: null
realNamePublic:
name: real_name_public
type: boolean
nullable: true
default: false
selfDescription:
name: self_description_public
type: text
nullable: true
default: null
msnAddress:
name: msn
type: string(100)
nullable: true
default: null
msnAddressPublic:
name: msn_public
type: boolean
nullable: false
default: false
googleTalk:
name: google_talk
type: string(100)
nullable: true
default: null
googleTalkPublic:
name: goole_talk_public
type: boolean
nullable: false
default: false
skype:
type: string(100)
nullable: true
default: null
skypePublic:
name: skype_public
type: boolean
nullable: false
default: false
phoneNumber:
name: phone_number
type: string(30)
nullable: true
phoneNumberPublic:
name: phone_number_public
type: boolean
nullable: false
default: false
oneToOne:
user:
targetEntity: User
inversedBy: user_data
joinColumns:
user_id:
referencedColumnName: id

View File

@ -31,3 +31,8 @@ KekRozsakFrontBundle_forum_new_post:
_controller: KekRozsakFrontBundle:Forum:postList _controller: KekRozsakFrontBundle:Forum:postList
requirements: requirements:
_method: POST _method: POST
KekRozsakFrontBundle_profile_edit:
pattern: /profil
defaults:
_controller: KekRozsakFrontBundle:Default:profileEdit

View File

@ -0,0 +1,14 @@
{% extends '::main_template.html.twig' %}
{% form_theme form 'KekRozsakFrontBundle:Form:user_form.html.twig' %}
{% block title %} - Profil szerkesztése{% endblock %}
{% block content %}
<h3>Felhasználói profil</h3>
<p>Az itt megadott adataidat szigorúan kezeljük, azt más számára kizárólag hatósági felszólításra adjuk ki.</p>
<p>A publikusnak megjelölt adataidat csak a kör tagjai láthatják, míg a nem publikusnak megjelölteket kizárólag az oldal adminisztrátorai.</p>
<form method="post" action="{{ path('KekRozsakFrontBundle_profile_edit') }}">
<table>
{{ form_widget(form) }}
</table>
<button type="submit">Mentés</button>
</form>
{% endblock content %}

View File

@ -4,7 +4,7 @@
} }
body { body {
margin: 15px 0 0 0; margin: 0;
background-color: black; background-color: black;
background-image: url('../images/rose_bg.png'); background-image: url('../images/rose_bg.png');
background-repeat: no-repeat; background-repeat: no-repeat;
@ -12,9 +12,77 @@ body {
background-position: right bottom; background-position: right bottom;
} }
#top-line {
position: fixed;
left: 0;
top: 0;
width: 100%;
background-color: #152967;
color: #c4d3ff;
height: 32px;
border-bottom: 1px solid #1b3586;
}
#top-line-padding {
height: 33px;
clear: both;
}
#top-line #search-box {
float: right;
padding: 5px;
}
#top-line #profil-gomb {
float: left;
padding: 5px;
}
#bottom-line-padding {
height: 33px;
}
#profil-box {
position: fixed;
left: 5px;
top: 32px;
width: 300px;
height: 400px;
background-color: #c4d3ff;
border: 2px solid #152967;
color: #152967;
display: none;
}
#profil-belso {
position: relative;
padding: 5px;
}
#profil-box dt {
font-weight: bold;
}
#profil-szerkesztes {
position: absolute;
bottom: 5px;
right: 5px;
}
#bottom-line {
position: fixed;
left: 0;
bottom: 0;
width: 100%;
background-color: #152967;
color: #c4d3ff;
height: 32px;
border-top: 1px solid #1b3586;
}
#wrapper { #wrapper {
background-color: #000000; background-color: #000000;
width: 900px; width: 960px;
margin-left: auto; margin-left: auto;
margin-right: auto; margin-right: auto;
} }
@ -68,8 +136,8 @@ body {
#content-outline { #content-outline {
color:#3366ff; color:#3366ff;
text-align: justify; text-align: justify;
width: 680px; width: 740px;
float: right; float: left;
} }
#content { #content {
@ -77,7 +145,7 @@ body {
} }
#hirek { #hirek {
float: left; float: right;
color: #aaaacc; color: #aaaacc;
width: 215px; width: 215px;
} }