Как передать параметры в функции индекса в 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 или что-то еще
Ответ 8
Вы должны использовать CI URI Class. 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);
}
}
Ответ 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
}
}