Как передать параметры в функции индекса в codeigniter

вот пример URL: http://www.example.com/search/search-keyword

Я пытаюсь выполнить эту работу, я удалил index.php, используя .htaccess, поиск - это контроллер, и я хочу передать параметр в методе индекса.

В настоящее время это выглядит так:

class Search extends CI_Controller{

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

}

любые предложения? Я не могу заставить его работать.

Ответы

Ответ 1

  • Вам нужен сегмент index http://www.mysite.com/search/index/search-keyword.
  • Или вам нужно использовать маршрут $route['search/(:any)'] = 'search/index/$1';
  • Или вы можете посмотреть remap

Помните, что не доверяйте пользовательскому вводу, особенно когда вы бросаете его в свой URL-адрес. Последняя версия CI теперь поддерживает переменные $_GET, поэтому вы можете захотеть изучить это или flashdata. Исходный термин, столь же простой, как O' Brien, даст вам фатальную ошибку ( "В URI, который вы отправили, были запрещены символы." ).

Ответ 2

class Search extends CI_Controller{

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

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

}

Затем вы сможете получить доступ к этому как:/search/123123: и страница будет вызывать "123123" или все, что вы ставите вместо этого.

Ответ 3

function _remap($parameter){

        $this->_index($parameter);

}

Попробуй и расскажи, как это получилось.

Ответ 4

Большинство этих решений будут работать только в том случае, если в вашем контроллере имеется только одна функция с именем index(). Если у вас есть это на ваших маршрутах:

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

С приведенным выше в ваших маршрутах, что произойдет, будет работать ваша функция поиска, но если вы добавите какие-либо другие функции к тому же контроллеру, все они будут перенаправлены на /search/index/$1.

Единственное решение, о котором я могу думать, позволяет вам использовать нужный URL-адрес, сохраняя при этом возможность добавлять какие-либо другие функции к вашему контроллеру поиска, чтобы добавить своего рода беспорядочный условный файл вашего маршрута. Вот как это будет выглядеть и что он делает:

$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'; }

Что это такое, в основном говорит: "Если запрошенный URL не содержит имени какой-либо из моих функций контроллера поиска, то это нужно понимать для индекса, поэтому мы активируем правило маршрута для индекса".

Это позволит вам без проблем отправлять запросы на search/any_other_functions_you_have и только активировать правило для скрытия функции индекса, когда URI запроса не соответствует ни одному из них.

Один из побочных эффектов заключается в том, что вы никогда не получите 404. Например, если кто-то вводит такой URL-адрес, как "yourdomain.com/search/something", и они ожидают, что он покажет страницу результатов без поиска, которую они выиграли 'получить 404, предупреждая их о том, что нет такой страницы, и вместо этого приложение будет считать, что они набрали, это поисковый запрос. Тем не менее, похоже, что это не проблема для вас, и я не вижу, чтобы это было ужасно, потому что один контроллер был неабелем, чтобы вернуть 404s.

Ответ 5

Вам нужно понять, как работают коды воспламенителя кода, в основном так:

http://www.mysite.com/ {controller}/{function}

Итак, что ваш url действительно ищет функцию, называемую "ключевым словом" в вашем контроллере поиска.

У вас есть несколько вариантов. Самый простой способ - просто изменить URL-адрес:

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

Тогда это должно работать отлично:

class Search extends CI_Controller{

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

}

Если вы действительно хотите использовать URL-адрес, как у вас, вы можете использовать тот же фрагмент кода, что и выше, но также открыть "application/config/routes.php" и добавить его к нижней части.

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

В качестве альтернативы, если вы хотите продолжить использование функции индекса, вы можете изменить ее на

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

И измените свой класс на что-то вроде этого:

class Search extends CI_Controller{

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

}

Не забудьте обновить свой ответ, если вы сами это осознаете или согласитесь, что некоторые из них отвечают, если он отвечает на него:)

Ответ 6

Я только что начал CI, и вот мое решение и реализовало его на моем сайте. Пока это работает для меня, и мои поисковые запросы были проиндексированы Google как ссылки

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
    }

   }

Ответ 7

Это мое решение:

Из CI userGuide

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

Итак, я создал свой контроллер таким образом:

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);
    }
}
}

Надеюсь, это может быть полезно кому-то...

BUG: если вы вызываете/сокращаете функцию _remap, переходите "index" к функции index()... ее можно решить, добавив условие if или что-то еще

Ответ 9

Этот самый простой способ - использовать сегменты uri:

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

Или, как сказал Madmartigan, используйте маршруты, которые, вероятно, лучший способ сделать это.

Ответ 10

Мне также нужно было проверить, была ли какая-либо переменная передана или нет, так что вот решение, которое я принял.

<?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);                
        }
    }

}

Надеюсь, это поможет кому-то!

Ответ 11

Наконец-то я нашел обходное решение, так как я не могу просто поместить переменные post в URL.

То, что я сделал, это создать другую функцию, а затем перенаправить ее на эту функцию.

 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
  }
 }