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 6849 Точки

Нека тогава 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 41 Точки

Здравейте, ще се опитам да обясня проблема по-точно. С 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 6849 Точки

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

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

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

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

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

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

 

 

0
Petar_Belberov avatar Petar_Belberov 41 Точки

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 41 Точки

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

<!--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 41 Точки

Понеже преди бяха в отделни 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 41 Точки

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

<!--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
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.