2011-10-01 13 views
6

Ho un problema con i percorsi Codeigniter. Vorrei che tutti gli utenti registrati sul mio sito ricevessero la propria "directory", ad esempio: www.example.com/username1, www.example.com/username2. Questa "directory" dovrebbe mappare al controllore "polica", metodo "ogled", parametro "username1".Percorsi in Codeigniter - Automaticamente

Se si esegue questa operazione, ciascun controller viene mappato su questa rotta: "polica/ogled/parameter". Non va bene:

$route["(:any)"] = "polica/ogled/$1"; 

Questo funziona, ma ho sempre inseriti manualmente info in routes.php:

$route["username1"] = "polica/ogled/username1"; 

Come faccio in modo che questo sarà automatizzato?

UPDATE: Ad esempio, ho controller con nome ads. Ad esempio, se vai a www.example.com/ads/ verranno elencati gli annunci. Se vai a www.example.com/username1 ci sono annunci elencati dall'utente username1. C'è anche regolatore user, profile, latest, ...

mio attuale routes.php:

$route['oglasi'] = 'oglasi'; 
$route['(:any)'] = "polica/ogled/$1" 
$route['default_controller'] = 'domov'; 
$route['404_override'] = ''; 

ho risolto problema con questo codice:

$route['oglasi/(:any)'] = 'oglasi/$1'; 
$route['(:any)'] = "polica/ogled/$1" 
$route['default_controller'] = 'domov'; 
$route['404_override'] = ''; 

Saluti, Mario

+0

Brilliant! Ho appena fatto questo con il controller predefinito e funziona anche lì. –

risposta

23

Il il problema con il tuo percorso è che usando: qualsiasi abbinamenti, in realtà ... QUALSIASI rotta, quindi sei praticamente bloccato lì. Penso che si potrebbe avere due soluzioni:

1) È possibile selettivamente reindirizzare tutto il controller siti singolarmente, come:

$route['aboutus'] = "aboutus"; 
$route['where-we-are'] = "whereweare"; 
//And do this for all your site's controllers 
//Finally: 
$route['(:any)'] = "polica/ogled/$1"; 

Tutti questi percorsi deve venire prima ANY, dal momento che vengono lette in l'ordine in cui sono presentati e se si posiziona il: qualsiasi all'inizio salterà felicemente tutto il resto.

EDIT dopo il commento:

Quello che voglio dire è che, se avete intenzione di corrispondere contro qualsiasi segmento, questo significa che non è possibile utilizzare qualsiasi controller a tutti (che è, per impostazione predefinita, il primo URI segmento), poiché il router reindirizzerà sempre l'utente utilizzando la legge definita. Per consentire all'IC di eseguire altri controller (qualunque essi siano, ho appena usato alcune pagine Web comuni, ma può essere letteralmente tutto), è necessario consentire loro escludendoli dal re-routing. E puoi ottenere ciò ponendoli prima della tua QUALSIASI regola, in modo che ogni volta che l'IC passa attraverso le tue regole di routing analizza prima quello che hai "scappato", e SOLO se non corrisponde a qualcosa trovato nell'URL, passa alla: qualsiasi regola

So che questo è un codice verbosità comunque, ma saranno sicuramente meno di 6K come hai detto tu. Poiché non conosco la struttura effettiva dei tuoi URL e della tua applicazione web, è l'unica soluzione che mi viene in mente.Se si forniscono ulteriori informazioni, ad esempio come sono modellati gli URL regolari della vostra applicazione, quindi posso aggiornare la mia risposta

/fine modificare

Questo non è tanto una soluzione pratico, perché richiederà un sacco di codice, ma se vuoi un disegno del genere è l'unico modo che mi viene in mente. Inoltre, considera che puoi usare le espressioni regolari come indice del percorso $, ma non penso che possa funzionare qui, dato che i tuoi nomi utente sono improbabili in questo modo, ma volevo solo sottolineare la possibilità.

O

2) È possibile modificare il modello di progettazione un po ', e assegnare un altro percorso per i nomi utente, qualcosa lungo la linea di

$route['user/(:any)'] = "polica/ogled/$1"; 

Questo genererà abbastanza belle (e semantici) URL tuttavia, ed eviterà tutto il fastidio di fuggire dalle altre rotte.

+0

Grazie per la risposta. Non posso usare la seconda soluzione perché il mio cliente desidera avere un nome utente dopo il nome di dominio.Non capisco la tua prima soluzione. Puoi spiegarmelo per favore sul mio caso? Il mio obiettivo è, per risolvere questo problema con meno codice. Ora, ho nel mio file 'routes.php' circa 6000 righe - Non mi piace:/ – Puzo

+0

@Puzo Ho aggiornato la mia risposta con qualche spiegazione della prima soluzione. E sì, 6000 percorsi sono decisamente troppi. –

+0

Ho aggiornato il mio primo post - domanda .. Hai bisogno di maggiori informazioni? Che tipo? – Puzo

1

Ho avuto questo problema molto recentemente. Ho creato qualcosa che ha funzionato per me in questo modo:

Definire un controller di "reindirizzamento" con un metodo remap. Ciò consentirà di raccogliere le richieste inviate al contoller con qualsiasi stringa variabile procedente in un'unica funzione. Quindi, se viene fatta una richiesta a http://yoursite/jeff/ o http://yoursite/jamie, non colpirà quei metodi ma invece colpirà la funzione di rimappatura http://yoursite/. (anche se quei metodi/nomi non esistono e anche se si ha una funzione di indice, la sostituisce). Nel metodo _Remap puoi definire un interruttore condizionale che poi funziona con il resto del codice che reindirizza l'utente nel modo desiderato.

Si dovrebbe quindi definire questo controller di ri-diretto come quello di default e impostare i percorsi in questo modo:

$route['(.*)'] = "redirect/index/$1"; 
$route['default_controller'] = "redirect"; 

Questo è in un primo momento un po 'un problema, perché questo sarà essenzialmente forzare tutto per essere ri -diretto a questo controller, non importa cosa e in definitiva attraverso questo switch _remap.

Ma ciò che si potrebbe fare è definire le regole/percorsi che non si vogliono rispettare a questa condizione al di sopra di tali istruzioni di instradamento.

cioè

$route['myroute'] = "myroute"; 
$route['(.*)'] = "redirect/index/$1"; 
$route['default_controller'] = "redirect"; 

ho scoperto che questo produce un bel sistema in cui posso avere il maggior numero di utenti variabili come sono definiti dove sono in grado di reindirizzare facilmente in base a ciò che rappresentano attraverso un controller.

+0

Hmm .. Quindi, se ho capito bene, dovrei definire tutti i miei controller nel file 'routes.php' e poi in basso definisco la regola di reindirizzamento? Colpisce questo sulle prestazioni della pagina? – Puzo

+0

@Puzo Leggendo il tuo commento, questo è praticamente quello che ho cercato di dire nella mia risposta .. –

+0

@Chamilyan Come posso sostituire # con/in url con il routing – Bugfixer

1

Un altro modo sarebbe dichiarando un array con i controller interne a reindirizzare e tutto il resto per il controller all'utente come questo nel file routes.php da CodeIgniter:

$controllers=array('admin', 'user', 'blog', 'api'); 
if(array_search($this->uri->segment(1), $controllers)){ 
    $route['.*'] = "polica/ogled/$1"; 
}