2011-04-04 47 views
13

aquí es un ejemplo de URL: http://www.example.com/search/search-keywordCómo pasar parámetros en función de índices en CodeIgniter

Estoy tratando de hacer este trabajo, me quita el index.php usando .htaccess, la búsqueda es el controlador y quiero pasar un parámetro en el método de índice.

este momento es lo que parece:

class Search extends CI_Controller{ 

    function index($param){ 
     echo $param; 
    } 

} 

alguna sugerencia? Me parece que no puede hacer que funcione

+0

¿Encontró una solución al final? – robjbrain

Respuesta

24
  • Es necesario el segmento http://www.mysite.com/search/index/search-keywordindex.
  • o si tiene que utilizar una ruta $route['search/(:any)'] = 'search/index/$1';
  • O se puede ver en remap

Recuerde que no debe confiar en la entrada del usuario, especialmente cuando se está lanzando en su URL. La última versión de CI admite las variables $_GET ahora, por lo que es posible que desee examinar el uso de eso o flashdata. Un término de búsqueda tan simple como O' Brien le dará un error fatal ("El URI que ha enviado tiene caracteres no permitidos").

+0

¿No es posible URLencode el parámetro de consulta y luego decodificarlo en el controlador? –

+0

@pat: No, aún recibirá errores. Sin embargo, podría encriptar el parámetro, pero eso sería inútil. También podría usar datos de sesión o de publicación, pero luego no aparecerían en la url. –

+0

La primera opción realmente funcionó para mí simplemente especificando el nombre de la función después del nombre del controlador (como hacemos regularmente para llamar a otras funciones. Ej. 'Href =" " ' – Dipen

0

Debe usar la Clase de URI de CI. http://codeigniter.com/user_guide/libraries/uri.html


class Search extends CI_Controller{ 

    function index($param){ 
     //echo the search-keyword 
     echo $this->uri->segment(2); 
    } 

} 
+0

Esto no funcionará porque no se invoca la función de índice, está buscando la función inexistente 'búsqueda-palabra clave' –

+0

¿Qué le parece declarar el segmento uri 2 como palabra clave de búsqueda en una construcción? – Peter

0

Esta forma más fácil es sólo para usar uri segments:

class Search extends CI_Controller{ 
    function index(){ 
    $param=$this->uri->segment(2); 
    echo $param; 
    } 
} 

O como dijo Madmartigan, rutas de uso, que es probablemente la mejor manera de hacer esto.

+0

Esto no funcionará porque la función de índice no se invoca, está buscando la función inexistente 'search-keyword' –

+0

Muy cierto, necesita agregar una ruta de todos modos, así que supongo que es mejor usar el método de ruta – jfoucher

+0

Puede usar php5 ' __call' también, similar a como usaría el '_remap' de CI. Personalmente, me gusta mantener mis rutas limpias y delgadas, por lo que me gustan los métodos para los controladores simples que solo hacen una o dos t Hings. –

4

Es necesario comprender el código de manera Funciona el encendedor direcciones URL, su básicamente así:

http://www.mysite.com/ {controlador}/{función}

Así que lo que su url está buscando realmente una función llamada "palabra clave" en su controlador de búsqueda.

Tiene varias opciones. La forma más fácil será la de simplemente cambiar la url para:

http://www.mysite.com/search/result/keyword

Entonces esto debe funcionar a la perfección:

class Search extends CI_Controller{ 

function result($param){ 
echo $param; 
} 

} 

Si realmente desea utilizar la URL como lo ha tenido, se puede utilizar el mismo fragmento de código que el anterior pero también abre "application/config/routes.php" y agrégalo a la parte inferior.

$route['search/(:any)'] = "search/result"; 

Alternativamente, si desea seguir utilizando la función de índice se puede cambiar a este

$route['search/(:any)'] = "search/index"; 

y cambiar su clase a algo como esto:

class Search extends CI_Controller{ 

    function index($param=FALSE){ 
    if($param == FALSE) { 
     //Show search box 
    } else { 
     //Show search results 
    } 
    } 

} 

No se olvide para actualizar su respuesta, si la resuelve usted mismo o acepta respuestas de alguien si responde :)

+0

Eso es genial, funciona. Pero, ¿cómo acceder al parámetro que está pasando a la función de índice? – WebDevRon

-2

Finalmente encontré una solución ya que simplemente no puedo poner variables de publicación en la URL.

Lo que hice fue crear otra función, luego redirigirla a esa función.

class Search extends CI_Controller{ 
    function index(){ 
     $search_item = $this->input-post('search_item'); 
     redirect("search/q/".url_title($search_item)); 
    } 

    function q($key){ 
    // process search 
    } 
} 
+0

Esto altera el término de búsqueda, que no es deseable. Si buscaba 'Hello World!', Obtendrías resultados para 'hello-world' –

1

Acabo de iniciar CI y aquí estaba mi solución y la implementé en mi sitio web. Hasta ahora funciona para mí y mis consultas de búsqueda han sido indexada por Google como enlaces

Class Search extends CI_Controller{ 
    function index(){ 

    $search_item = $this->input->post('search_box'); // this is from the input field 

    redirect(base_url()."search/q/".url_title($search_item)); 

    } 



// i've redirected it to the "search" controller then : 

    function q($search_item = null){// process search 
    // load the view here with the data 
    } 

    } 
12
function _remap($parameter){ 

     $this->_index($parameter); 

} 

Darle una oportunidad y nos dicen cómo ha ido.

+5

Esto funciona sin el _frente del índice – foxybagga

1

Esta es mi solución:

De CI userguide

public function _remap($method) 
{ 
    if ($method == 'some_method') 
    { 
     $this->$method(); 
    } 
    else 
    { 
     $this->default_method(); 
    } 
} 

Así que he creado mi controlador de esta manera:

class Shortener extends CI_Controller { 
function shortener() { 
    parent::__construct(); 
} 

function index($getVar) { 
    echo "Get var: " . $getVar; 
} 

function config() { 
    echo "another function"; 
} 

function _remap($method) { 
    if($method == "config") { 
     $this->$method(); 
    } 
    else { 

     $this->index($method); 
    } 
} 
} 

Hope esto puede ser útil a alguien ..

ERROR: si llama/acorta la función _remap pase "índice" a la función index() ... puede ser resuelto añadiendo una condición o si algo más

16
class Search extends CI_Controller{ 

    function _remap($param) { 
     $this->index($param); 
    } 

    function index($param){ 
     echo $param; 
    } 

} 

A continuación, debería ser capaz de acceder a que a medida:/search/123123: y la página se echo fuera "123123" o lo que poner en su lugar de ello.

+0

¡funciona perfecto para mí, gracias! – zx1986

+0

gracias, está un poco escondido ni olvidé leerlo en el documento –

0

También tuve que comprobar si alguna variable se aprobó o no, así que aquí está la solución que tomé.

<?php 

defined('BASEPATH') OR exit('No direct script access allowed'); 

class Story extends CI_Controller{ 

    function story() { 
     parent::__construct(); 
    } 

    function _remap($parameter){ 
     $this->_index($parameter); 
    } 

    public function _index($story_id) {   
     if($story_id == 'index'){ 
      //No variable passed 
      redirect('auth', 'refresh'); 
     }else{ 
      $data['title'] = "Story"; 
      $this->load->view('story', $data);     
     } 
    } 

} 

Espero que esto ayude a alguien!

6

La mayoría de estas soluciones solo funcionarán si solo tiene una sola función llamada index() en su controlador. Si usted tiene esto en sus rutas:

$route['search/(:any)'] = 'search/index/$1'; 

Con lo anterior en sus rutas, lo que sucederá es que su función de búsqueda funciona, pero luego si se agrega ninguna otra función a ese mismo controlador que todo va a ser redirigido a /search/index/$1.

La única solución que puedo pensar que le permite usar la URL que desea y aún puede agregar otras funciones a su controlador de búsqueda es agregar un tipo de condicional desordenado a su archivo de rutas.Esto es lo que se verá así y lo que hace:

$request = $_SERVER['REQUEST_URI']; // Only add this for readability if(!strpos($request, 'search/another_function') || !strpos($request, 'search/more_functions')) { $route['search/(:any)'] = 'search/index/$1'; }

Lo que esto hace es básicamente diciendo "si la URL solicitada no contiene el nombre de cualquiera de mis búsqueda funciones del controlador, entonces debe ser significaba para el índice así que activaremos la regla de ruta para el índice ".

Esto le permitirá tomar las solicitudes de search/any_other_functions_you_have sin problema y solo activar la regla para ocultar la función de índice cuando un URI de solicitud no concuerde con ninguna de ellas.

Un efecto colateral de esto es que nunca obtendrá un 404. Por ejemplo, si alguien ingresa una URL como "sudominio.com/buscada/algo" y esperan que muestre una página de resultados que no sean de búsqueda, no recibirá un 404 que los alerta sobre el hecho de que no hay una página como esa y, en su lugar, la aplicación asumirá que lo que escribieron es un término de búsqueda. Sin embargo, parece que esto no es un gran problema para ti y no veo que sea tan terrible que un controlador no pueda devolver 404s.

Cuestiones relacionadas