The SSH host key has changed on 8 April, 2022 to this one: SHA256:573uTBSeh74kvOo0HJXi5ijdzRm8me27suzNEDlGyrQ

Added user profile editing support

master
Polonkai Gergely 10 years ago
parent 0fad11ffd0
commit 8a55e32303
  1. 13
      TODO
  2. 47
      app/Resources/views/main_template.html.twig
  3. 40
      src/KekRozsak/FrontBundle/Controller/DefaultController.php
  4. 27
      src/KekRozsak/FrontBundle/Entity/User.php
  5. 391
      src/KekRozsak/FrontBundle/Entity/UserData.php
  6. 79
      src/KekRozsak/FrontBundle/Form/Type/UserDataType.php
  7. 26
      src/KekRozsak/FrontBundle/Form/Type/UserType.php
  8. 8
      src/KekRozsak/FrontBundle/Resources/config/doctrine/User.orm.yml
  9. 71
      src/KekRozsak/FrontBundle/Resources/config/doctrine/UserData.orm.yml
  10. 5
      src/KekRozsak/FrontBundle/Resources/config/routing.yml
  11. 14
      src/KekRozsak/FrontBundle/Resources/views/Default/userprofile.html.twig
  12. 78
      web/css/kekrozsak_front.css

13
TODO

@ -2,19 +2,6 @@ Article
public
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
it should contain records that show the last viewed post in each forum topic

@ -3,8 +3,38 @@
<head>
<title>Kék Rózsák{% block title %}{% endblock %}</title>
<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>
<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="menu">
<ul>
@ -42,8 +72,25 @@
</div>
{% endfor %}
</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>
<script type="text/javascript">
$('#profil-mutato').click(function() {
if ($('#profil-box').is(':visible'))
{
$('#profil-box').hide();
}
else
{
$('#profil-box').show();
}
});
</script>
</body>
</html>

@ -4,6 +4,8 @@ namespace KekRozsak\FrontBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use KekRozsak\FrontBundle\Form\Type\UserType;
class DefaultController extends Controller
{
public function homepageAction()
@ -26,4 +28,42 @@ class DefaultController extends Controller
'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,
));
}
}

@ -334,4 +334,31 @@ class User implements UserInterface, AdvancedUserInterface
{
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;
}
}

@ -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;
}
}

@ -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'
);
}
}

@ -4,11 +4,13 @@ namespace KekRozsak\FrontBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use KekRozsak\FrontBundle\Form\Type\UserDataType;
class UserType extends AbstractType
{
protected $_registration;
public function __construct($registration)
public function __construct($registration = false)
{
$this->_registration = $registration;
}
@ -17,12 +19,14 @@ class UserType extends AbstractType
{
$builder->add('username', null, array(
'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!',
));
$builder->add('password', 'repeated', array(
'type' => 'password',
'second_name' => 'confirm',
'invalid_message' => 'A két jelszó nem egyezik meg!',
'required' => ($this->_registration),
'options' => array(
'label' => 'Jelszó',
'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(
'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(
'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é!',
));
$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.',
));
if (!$this->_registration)
{
$builder->add('user_data', new UserDataType(), array(
'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()

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

@ -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

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

@ -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 %}

@ -4,7 +4,7 @@
}
body {
margin: 15px 0 0 0;
margin: 0;
background-color: black;
background-image: url('../images/rose_bg.png');
background-repeat: no-repeat;
@ -12,9 +12,77 @@ body {
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 {
background-color: #000000;
width: 900px;
width: 960px;
margin-left: auto;
margin-right: auto;
}
@ -68,8 +136,8 @@ body {
#content-outline {
color:#3366ff;
text-align: justify;
width: 680px;
float: right;
width: 740px;
float: left;
}
#content {
@ -77,7 +145,7 @@ body {
}
#hirek {
float: left;
float: right;
color: #aaaacc;
width: 215px;
}

Loading…
Cancel
Save