Как передать параметры в функцию index в codeigniter - PullRequest
16 голосов
/ 05 апреля 2011

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

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

на данный момент это выглядит так:

class Search extends CI_Controller{

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

}

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

Ответы [ 12 ]

31 голосов
/ 05 апреля 2011

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

21 голосов
/ 31 января 2013
class Search extends CI_Controller{

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

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

}

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

13 голосов
/ 10 апреля 2012
function _remap($parameter){

        $this->_index($parameter);

}

Попробуйте и расскажите, как все прошло.

6 голосов
/ 10 июля 2014

Большинство из этих решений будут работать только в том случае, если в вашем контроллере есть только одна функция с именем 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, предупреждающих их о том, что такой страницы не существует, и вместо этого приложение будет предполагать, что они ввели поисковый запрос. Тем не менее, похоже, что это не является большой проблемой для вас, и я не вижу ничего страшного в том, что один контроллер не может вернуть 404 с.

4 голосов
/ 05 апреля 2011

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

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 / rout.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
    }
  }

}

Не забудьте обновить свой ответ, если вы сами разберетесьили примите кто-нибудь ответьте, если он ответит:)

1 голос
/ 08 января 2013

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

от 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 или что-то еще

1 голос
/ 04 октября 2011

Я только что запустил 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
    }

   }
0 голосов
/ 16 ноября 2018

Спасибо. Этот код работает для меня. Если параметр является числом

Or you need to use a route $route['search/(:any)'] = 'search/index/$1';

Однако, если параметр является строкой (http://[::1]/note/getnote/index/fg => http://[::1]/note/getnote/fg)., я использую _remap () как этот код.

<?php

класс Getnote расширяет CI_Controller {

public function __construct()
{
    parent::__construct();
    $this->load->library('image_lib');
}

public function index(){

}

public function _remap($keyname)
{
    $this->load->model('Laydb');
    $data = $this->Laydb->getNote($keyname);
    $proListArray['patitle'] = "Edit notepad";

    $this->load->view('top', $proListArray);
    $this->load->view('editblog', $data);
    $this->load->view('bottom');
}

}

0 голосов
/ 03 сентября 2013

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

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

}

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

0 голосов
/ 06 апреля 2011

Я наконец нашел обходной путь, так как не могу просто поместить переменные записи в 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
  }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...