Професионална програма
Loading...
TheRedShoko avatar TheRedShoko 1 Точки

Взимане на информация от form

Как мога да взема информацията от дадена form-a като използвам symfony? Проблемът е там, че разбрах как става, ако е на отделна страница, но в нашият проект Log in & Register са направени чрез изкачащи прозорци, а не в отделни страници

http://prnt.sc/d8kqgm

Тагове:
0
PHP Web 17/11/2016 21:47:36
TheRedShoko avatar TheRedShoko 1 Точки

Някой? 

0
b.yordanov avatar b.yordanov 146 Точки

Ако беше пуснал малко код може би щеше да е по-лесно :)

Пробвай 

$data = $form->getData();

Това ще ти сложи данните от формата в масив и можеш да си попълниш пропъртитата на ентити-то.

Другият вариант е

$form->handleRequest($request);

if($form->isValid()) {

    $em->persist($entity-to);
    $em->flush();

}

на този етап с пълна дезинформация - толкова :)

Успех!

 

0
TheRedShoko avatar TheRedShoko 1 Точки

Въпросът ми е как да разгранича кой от 2та формуляра се използва. За момента имам html-a готов. http://pastebin.com/kCEmmh0v Искам да разгранича коя е register и коя е login, за да може да се изпълняват различни действия.

0
RoYaL avatar RoYaL Trainer 6845 Точки

Нека тогава POST-ват към различни route-ове, така ще имаш по метод за всеки.

0
b.yordanov avatar b.yordanov 146 Точки

Сложи им различни action-и или ако двете форми пращат към същата страница сложи name=" " на събмит бутона
 

 <button type="submit" name="register">Register</button>

 

 <button type="submit" name="login">Login</button>

После 

if($request->request->get("login")) {}  или if($request->request->get("register")) {}

0
Petar_Belberov avatar Petar_Belberov 42 Точки

Здравейте, ще се опитам да обясня проблема по-точно. С TheRedShoko Имаме modul форми - регистрация и логин, които са с отделни view-ta и с различни пътища. Проблемът е, че когато натиснеме логин бутона за излизане на формата то презарежда страницатаи така малко се обезсмисля модула. Ще кача част от кода и една снимка,  за да ви стане по-ясно. Наистина се надяваме на помощта ви, благодарим!

index.view

<div class="buttons">
    <ul class="rotateButtons">
        <li class="rotateButton"><a href="{{ path('security_login') }}" class="round login">Login<span class="round">If you already have an account.</span></a></li>
        <li class="rotateButton"><a href="{{ path('user_register') }}" class="round register">Register<span class="round">If you don't have an account. </span></a></li>
        <li class="rotateButton"><a href="{{ path('print_all_songs') }}" class="round catalog">Catalog<span class="round">Take a look.</span></a></li>
    </ul>
</div>

login.view

<!--Login form-->
<div id="id01" class="modal">

    <form class="modal-content animate" action="{{ path('musicshare_index') }}" method="post" >
        <div class="imgcontainer">
            <span onclick="closeModalFunction()" class="close" title="Close Modal">&times;</span>
            <img src="{{ asset('pictures/remixLogo2.jpg') }}" alt="Avatar" class="avatar">
            <p class="formText">Login</p>
        </div>

        <div class="container">
            <label><b>Username</b></label>
            <input type="text" placeholder="Enter Username" name="_username" required>

            <label><b>Password</b></label>
            <input type="password" placeholder="Enter Password" name="_password" required>
            <input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}"/>
            <button type="submit">Log In</button>
        </div>
    </form>
</div>

<div class="buttons">

    <ul class="rotateButtons">
        <li class="rotateButton"><a href="#" class="round login" onclick="document.getElementById('id01').style.display='block'">Login<span class="round">If you already have an account.</span></a></li>
        <li class="rotateButton"><a href="#" class="round register" onclick="document.getElementById('id02').style.display='block'">Register<span class="round">If you don't have an account. </span></a></li>
        <li class="rotateButton"><a href="#" class="round catalog">Catalog<span class="round">Take a look.</span></a></li>
    </ul>
</div>

<script>
    function closeModalFunction() {
        document.getElementById('id01').style.display='none';
        window.history.replaceState( {} , '/' );
        window.history.back();

    }

</script>
<script type="text/javascript">
    document.getElementById('id01').style.display='block';
</script>

SecurityController - login function

 /**
 * @Route("/login", name="security_login")
 */
public function login()
{
    return $this->render("security/login.html.twig");
}

 

0
11/12/2016 23:06:20
RoYaL avatar RoYaL Trainer 6845 Точки

А какъв се предполага, че трябва да е очакваният резултат :)

0
b.yordanov avatar b.yordanov 146 Точки

Подхода ви е изцяло грешен ако съм разбрал правилно. 

Ако искате да имате 2 форми на 1 страница, който да се скриват или показват при натискане на бутон то и 2те форми трябва да са ренд-нати в едно вю и да са скрити. Тогава при натискане на бутон за логин / регистрация се извикна JS който да покаже правилната форма.

За да не презарежда страницата замени href атрибута от линковете в index с "#"

Ако не съм разбрал правилно, обяснете по-подробно :)

 

 

0
Petar_Belberov avatar Petar_Belberov 42 Точки

b.yordanov е абсолютно прав. Вчера точно това направих, сложих логин формата в Index.view и я зареждам с onclick и тя си излиза без проблем. Самият подход ми беше грешен, защото аз задавах логин-а с различно url и затова презареждаше. На всички сайтове с подобни изкачащи прозорци урл-то не се променя, точно защото най-вероятно са в едно view... Сега обаче регистрацията ми прави проблеми, нея не мога да направя. Когато я преместя в index view и я заредя с onclick Ми излиза следният проблем: "Variable "form" does not exist in musicshare\index.html.twig at line 31.".

index.html

{% extends 'base.html.twig' %}

{% block main %}

    <!--Login form-->
    <div id="id01" class="modal">
        <form class="modal-content animate" action="{{ path('security_login') }}" method="post" >
            <div class="imgcontainer">
                <span onclick="closeModalFunctionLogin()" class="close" title="Close Modal">&times;</span>
                <img src="{{ asset('pictures/remixLogo2.jpg') }}" alt="Avatar" class="avatar">
                <p class="formText">Login</p>
            </div>

            <div class="container">
                <label><b>Username</b></label>
                <input type="text" placeholder="Enter Username" name="_username" required>

                <label><b>Password</b></label>
                <input type="password" placeholder="Enter Password" name="_password" required>

                <input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}"/>

                <button type="submit">Log In</button>
            </div>
        </form>
    </div>

    <!--Registration form-->

    <div id="id02" class="modal">
        {{ form_start(form, {'attr': {'class': 'modal-content animate'}}) }}
        <div class="imgcontainer">
            <span onclick="closeModalFunctionRegister()" class="close" title="Close Modal">&times;</span>
            <img src="{{ asset('pictures/remixLogo2.jpg') }}" alt="Avatar" class="avatar">
            <p class="formText">Registration</p>
        </div>

        <div class="container">
            {{ form_row(form.fullName, { 'attr': {
                'placeholder': 'Enter Name'} }) }}

            {{ form_row(form.username, { 'attr': {
                'placeholder': 'Enter Username'} }) }}

            {{ form_row(form.email, { 'attr': {
                'placeholder': 'Enter Email'} }) }}

            {{ form_row(form.password.first, { 'attr': {
                'placeholder': 'Enter Password'} }) }}

            {{ form_row(form.password.second, { 'attr': {
                'placeholder': 'Confirm Password'} }) }}

            <button type="submit">Register</button>
        </div>
        {{ form_end(form) }}
    </div>



    <div class="buttons">
        <ul class="rotateButtons">
            <li class="rotateButton"><a href="" onclick="document.getElementById('id01').style.display='block'; return false;" class="round login">Login<span class="round">If you already have an account.</span></a></li>
            <li class="rotateButton"><a href="" onclick="document.getElementById('id02').style.display='block'; return false;" class="round register">Register<span class="round">If you don't have an account. </span></a></li>
            <li class="rotateButton"><a href="{{ path('print_all_songs') }}" class="round catalog">Catalog<span class="round">Take a look.</span></a></li>
        </ul>
    </div>

    <script>
        function closeModalFunctionLogin() {
            document.getElementById('id01').style.display='none';
            window.history.replaceState( {} , '/' );

        }

    </script>
    <script>
        function closeModalFunctionRegister() {
            document.getElementById('id02').style.display='none';
            window.history.replaceState( {} , '/' );

        }
    </script>
{% endblock %}

 

0
12/12/2016 13:16:02
Petar_Belberov avatar Petar_Belberov 42 Точки

Пробрах и така но пак не става...

<!--Registration form-->

    <div id="id02" class="modal">
        <form class="modal-content animate" action="{{ path('user_register') }}" method="post" >
            <div class="imgcontainer">
                <span onclick="closeModalFunctionRegister()" class="close" title="Close Modal">&times;</span>
                <img src="{{ asset('pictures/remixLogo2.jpg') }}" alt="Avatar" class="avatar">
                <p class="formText">Registration</p>
            </div>

            <div class="container">
                <label><b>Full Name</b></label>
                <input type="text" placeholder="Enter Full Name" name="form[fullName]" value="" required>

                <label><b>Username</b></label>
                <input type="text" placeholder="Enter Username" name="form[username]" value="" required>

                <label><b>Email</b></label>
                <input type="text" placeholder="Enter Password" name="form[email]" value="" required>

                <label><b>Password</b></label>
                <input type="password" placeholder="Enter Password" name="form[password.first]" value="" required>

                <label><b>Confirm Password</b></label>
                <input type="password" placeholder="Confirm Password" name="form[password.second]" value="" required>


                <button type="submit">Log In</button>
            </div>
        </form>
    </div>

 

0
12/12/2016 16:00:40
b.yordanov avatar b.yordanov 146 Точки

За да използваш формата трябва да я подадеш като параметър към view-то през контролера. 

Т.е. да използваш 2 форми в едно view трябва и двете да са подадени като параметър.

SecurityController {

   public function someAction() {

      $loginForm = $this->createForm()...

      $registrationForm = $this->createForm()...

      return $this->render('view.html', array('login_form' => $loginForm->createView(), 'registration_form' => $registrationForm->createView()));

   }

}

0
b.yordanov avatar b.yordanov 146 Точки

Когато извикваш {{form_start()}} името трябва да отговаря на името на параметъра, който подаваш към вю-то. 

{{form_start(login_form)}}

 

{{form_start(registration_form)}}

0
Petar_Belberov avatar Petar_Belberov 42 Точки

Понеже преди бяха в отделни view-та формите са подадени като параметър в 2 различни контролера, както беше с проекта на който се учиххме, демек SecurityController и UserController. В SecurityController въобще не създавам формата, защото тя си е само за регистрация. А UserControllera е направен така както ми го описваш. Един вид сега трябва да ги вместя 2-те функции в един контролер, така ли?! Ето пример както е в момента:

SecurityController

/**
     * @Route("/login", name="security_login")
     */
    public function login()
    {
       return $this->render("security/login.html.twig");


    }

UserController

/**
     * @Route("/register", name="user_register")
     * @param Request $request
     * @return \Symfony\Component\HttpFoundation\Response
     */
    public function registerAction(Request $request)
    {

        $user = new User();
        $form = $this->createForm(UserType::class, $user);


        // 2) handle the submit (will only happen on POST)
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {

            // 3) Encode the password (you could also do this via Doctrine listener)
            $password = $this->get('security.password_encoder')
                ->encodePassword($user, $user->getPassword());
            $user->setPassword($password);

            $roleRepository = $this->getDoctrine()->getRepository(Role::class);
            $userRole = $roleRepository->findOneBy(['name' => 'ROLE_USER']);

            $user->addRole($userRole);

            // 4) save the User!
            $em = $this->getDoctrine()->getManager();
            $em->persist($user);
            $em->flush();

            // ... do any other work - like sending them an email, etc
            // maybe set a "flash" success message for the user

            return $this->redirectToRoute('security_login');
        }
        return $this->render(
            'user/register.html.twig',
            array('form' => $form->createView())
        );
    }

 

UserType

 $builder
            ->add('username', TextType::class)
            ->add('email', EmailType::class)
            ->add('fullName', TextType::class)
            ->add('password', RepeatedType::class, array(
                    'type' => PasswordType::class,
                    'first_options'  => array('label' => 'Password'),
                    'second_options' => array('label' => 'Repeat Password'),
                )
            );

 

0
12/12/2016 15:45:14
b.yordanov avatar b.yordanov 146 Точки

В UserController правиш например

indexAction() {

      //тук създаваш логин формата по начинът, по който си я създаваш по принцип
      $loginForm = $this->createForm();

      //тук създаваш рег формата по начинът, по който си я създаваш по принцип
      $registrationForm = $this->createForm();

      return $this->render('view.html', array('login_form' => $loginForm->createView(), 'registration_form' => $registrationForm->createView()));

}

SecurityController -> loginAction()-a го махни, не ти трябва

UserController -> Тук вече имаш indexAction() , във вю-то на който подаваш 2те форми като параметри и след това в самото вю си ги извикваш с 

{{form_start(login_form)}} & {{form_start(registration_form)}} - тук съм спестил целия код за формите, сам ще си ги оправяш

Сега след като имаш 2те форми във вю-то трябва да им сетнеш правилния action към който се събмитват - за логин и регистрация.

0
Petar_Belberov avatar Petar_Belberov 42 Точки

Направих регистрацията по следния начин и стана: 

<!--Registration form-->

    <div id="id02" class="modal">
        <form class="modal-content animate" action="{{ path('user_register') }}" method="get" >
            <div class="imgcontainer">
                <span onclick="closeModalFunctionRegister()" class="close" title="Close Modal">&times;</span>
                <img src="{{ asset('pictures/remixLogo2.jpg') }}" alt="Avatar" class="avatar">
                <p class="formText">Registration</p>
            </div>

            <div class="container">
                <label><b>Full Name</b></label>
                <input type="text" placeholder="Enter Full Name" name="form[fullName]" value="" required>

                <label><b>Username</b></label>
                <input type="text" placeholder="Enter Username" name="form[username]" value="" required>

                <label><b>Email</b></label>
                <input type="text" placeholder="Enter Password" name="form[email]" value="" required>

                <label><b>Password</b></label>
                <input type="password" placeholder="Enter Password" name="form[password.first]" value="" required>

                <label><b>Confirm Password</b></label>
                <input type="password" placeholder="Confirm Password" name="form[password.second]" value="" required>


                <button type="submit">Log In</button>
            </div>
        </form>
    </div>




    <div class="buttons">
        <ul class="rotateButtons">
            <li class="rotateButton"><a href="#" onclick="document.getElementById('id01').style.display='block'; return false;" class="round login">Login<span class="round">If you already have an account.</span></a></li>
            <li class="rotateButton"><a href="#" onclick="document.getElementById('id02').style.display='block'; return false;" class="round register">Register<span class="round">If you don't have an account. </span></a></li>
            <li class="rotateButton"><a href="{{ path('print_all_songs') }}" class="round catalog">Catalog<span class="round">Take a look.</span></a></li>
        </ul>
    </div>

Благодаря за помощта!

0