CI: pomooc

Programovacie jazyky, rady, poradňa...
mnichovcan
Medium Expert
Medium Expert
Príspevky: 97
Registrovaný: 17 mar 2011, 23:03

CI: pomooc

Príspevok od používateľa mnichovcan »

Zdravím ,

Mám header.php a footer.php vkladám napr do index_view.php , register_view.php atd . V header.php mám v hlavičke prihlasovací formulár . Priklad v obrazku . Dalej v contoler mám auth a v nej metodu login na ktorú sa po odoslaní formulara presmeruje .
Môj problém je že v tej metode je

Kód: Vybrať všetko

   if ($this->session->userdata('logged_in') == TRUE){   //Ak je uz prihlaseny nedostane sa na prihlasovaciu stranku
      redirect ('home');
     }
         
          

		$this->form_validation->set_rules('meno', 'Meno', 'trim|required|xss_clean')
		                      ->set_rules('heslo', 'Heslo', 'trim|required')
	                        ->set_error_delimiters('<div class="error">', '</div>');
          
           $er_data['error'] = " ";

		if ($this->form_validation->run() == TRUE)
		{
			        

             if ( $this->auth_model->check_user() > 0 ) {       // Existuje uzivatel ? AK ano prihlási
              
                 $data['uname'] = $this->input->post('meno');
                 $data['logged_in'] = TRUE;

                $this->session->set_userdata($data);

              redirect('home');

        } else {
             
              $er_data['error'] = "<div class='error'>Skontroluj Email a Heslo";
           
        }
            
        }
           
  $this->load->view('index_view',$er_data);

Teda ak som napr na register_view a kliknem na login kedze login je v headery a mám k nemu prístup na kazdej stránke tak ma to presmeruje na index. Ja chcem aby sa vykonala tá metoda login a ak sa zadá niečo zle tak sa len vypíše hláška v headeri alebo pomocou JS ale chcem ostať na tej aktuálnej stránke kde som . Ked budem na onas_view a kliknem na prihlásiť nechcem isť na index_view ale ostat na onas_view a len vypísať hlášku ze bolo napr zadane zle heslo . Dúfam že je to pochopiteľné ako som to napísal . Budem rád ak niekto poradí.
Prílohy
a.png
S-player
Light Star
Light Star
Príspevky: 277
Registrovaný: 23 júl 2011, 22:30

Re: CI: pomooc

Príspevok od používateľa S-player »

Keď chceš userovi zobraziť tú istú stránku ,z ktorej odoslal form teda ,na ktorej sa práve nachádza tak načo máš všade redirect na home?
mnichovcan
Medium Expert
Medium Expert
Príspevky: 97
Registrovaný: 17 mar 2011, 23:03

Re: CI: pomooc

Príspevok od používateľa mnichovcan »

S-player napísal:Keď chceš userovi zobraziť tú istú stránku ,z ktorej odoslal form teda ,na ktorej sa práve nachádza tak načo máš všade redirect na home?

Ten prvý redirect je tam na to že ked už je prihlásený tak sa nedostane na stránku z loginom . A ten druhý ak zadá správne meno a heslo tak ho presmeruje . Mne ide o to že ked nezadá správne údaje tak vtedy chcem nechat tú istú stránku!
sharky-no
King
King
Používateľov profilový obrázok
Príspevky: 1681
Registrovaný: 31 okt 2006, 19:53

Re: CI: pomooc

Príspevok od používateľa sharky-no »

No toto si uz pomaly pyta Ajax. ale da sa to spravit aj bez neho. Finta je v tom, ze controller bude overovat za kazdym, ze ci sa nepostol formular. inak to proste nepojde.

takze, ako prve si treba vytvorit constructor v controlerii a metodu na validaciu

Kód: Vybrať všetko

<?php
class Site extends CI_Controller {
        function __construct() {
            parent::__construct();

            $data['err'] = $this->_validate_form(); //zvaliduje a ulozi vystup do premenej
            if($data['err'] === false){ redirect("home") }  //ak bol postnuty formular a bol bez chyb, tak sa redirectne tam kam treba
            $this->load->vars($data); //tento vystup posle automaticky do view (nieco ako ked posielas data do view $this->load->view('index_view', $data);)
            
              
        }
       //metoda na validaciu, _ na zaciatku znamena ze je pristupna len zvnutra aplikacie, cez URL sa k nej nedostanes. Tuto fuknciu by bolo lepsie spravit cez helper, ale pre rychlost ukazky to davam takto
	function _validate_form(){
        
        if ($this->input->post('login'))
        {
            $this->form_validation->set_rules('user',"User",'required');

            if($this->form_validation->run()){
                return false;
            }
            else{
                return validation_errors();
            }
        }
        else return "";


    }
a nasledovny view by vypadal takto

Kód: Vybrať všetko

<?php

        echo form_open();
        echo "<input type='text' name='user' />";
        echo '<input type="submit" name="login" />';
        echo form_close();

 if($err){
 	echo $err;
 }
Takze este raz, princip je v tom, ze zakazdym ked sa odosle formular s loginom tak sa cez konstruktor spusti validovacia funkcia. ak sa spusti formular a budu chyby, tak ich vrati do premenej, ktora je nasledne odovzdana do view, kde ich spracujes. Ked formular prebehne v poriadku, tak sa opat cez konstruktor redirectne tam kam treba.

Nezabudni nastavit submit butonu name="login" alebo nieco unikatne, co bude mat len on.. lebo inak ti mozu nastat konflikty s ostatnymi formularmi
mnichovcan
Medium Expert
Medium Expert
Príspevky: 97
Registrovaný: 17 mar 2011, 23:03

Re: CI: pomooc

Príspevok od používateľa mnichovcan »

Dakujem za radu. Ale ešte mám stým nejaké problémy .

Asi to urobím tak že to presmeruje na nejakú chybovú stránku ako to má FB,Pokec alebo Twiter .

Môj další problem je že mám takýto formular teda vlastne validáciu

Kód: Vybrať všetko

		$this->form_validation->set_rules('meno', 'Meno', 'trim|required|xss_clean|user_is[meno]')
		                      ->set_rules('heslo', 'Heslo', 'trim|required|user_is[heslo]')
	                        ->set_error_delimiters('<div class="error">', '</div>');
Funkcia user_is je moja vlastná

Kód: Vybrať všetko

function user_is($value) {

$ci = & get_instance();

list($meno,$heslo) = $value;    // Toto je 29 riadok 

 $data = array(
      	         'meno' =>$meno,
                 'heslo' => sha1($heslo)  
      	         );


     $success = $ci->db->where('meno',$data['meno'])
                         ->where('heslo',$data['heslo'])
                         ->get('uzivatel');

        if ( $success->num_rows() > 0) {
         
          return True;
      } else{
            $ci->form_validation->set_message('user_is','Skontroluj meno a heslo');
           return False;
      } 

}

problém je že ked tam zadám neprávne meno alebo heslo tak ten message vypíše 2 krát asi pre meno aj heslo dá sa nejako nastaviť aby to bolo len jeden krát ?
Napísať odpoveď