CodeIgniter: передача переменных через URL - альтернатива использованию GET - PullRequest
10 голосов
/ 28 апреля 2010

Я новичок в CodeIgniter и только что обнаружил трудности при использовании метода GET для передачи переменных через URL (например, domain.com/page.php?var1=1&var2=2).

Я понимаю, что один из подходов заключается в передаче переменных в сегментах URI, но пока не совсем выяснили, как это сделать, так как создается впечатление, что функция в контроллере будет называться как конкретный сегмент URI? ???

В любом случае, вместо использования GET, я решил использовать POST, адаптируя кнопку отправки (замаскированную как ссылка) с переменными в скрытых полях ввода. Я создал следующее решение, которое, кажется, работает нормально, но мне интересно, нахожусь ли я здесь на правильном пути или есть ли более простой способ передачи переменных через ссылку в CodeIgniter?

Я создал следующий класс в приложении / библиотеки /

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class C_variables {

function variables_via_link($action, $link_text, $style, $link_data) {
    $attributes = array('style' => 'margin:0; padding:0; display: inline;');
    echo form_open($action, $attributes);
    $attributes = array('class' => $style, 'name' => 'link');
    echo form_submit($attributes, $link_text);
    foreach ($link_data as $key => $value){
        echo form_hidden($key, $value);
    }
    echo form_close();
 }
}
?>

Со следующим CSS:

/* 
SUBMIT BUTTON AS LINK
adapted from thread: http://forums.digitalpoint.com/showthread.php?t=403667
Cross browser support (apparently).
*/
.submit_as_link {
background: transparent;
border-top: 0;
border-right: 0;
border-bottom: 1px solid #00F;
border-left: 0;
color: #00F;
display: inline;
margin: 0;
padding: 0;
    cursor: hand /* Added to show hand when hovering */
}

*:first-child+html .submit_as_link {  /* hack needed for IE 7 */
border-bottom: 0;
text-decoration: underline;
}

* html .submit_as_link {    /* hack needed for IE 5/6 */
border-bottom: 0;
text-decoration: underline;
}

Ссылка затем создается с использованием следующего кода в VIEW:

<?php
$link = new C_variables;
$link_data=array('var1' => 1, 'var2' => 2);
$link ->variables_via_link('destination_page', 'here is a link!', 
'submit_as_link', $link_data);
?>

Спасибо за вашу помощь ...

Ответы [ 3 ]

33 голосов
/ 28 апреля 2010

Если честно, создание формы для выполнения работы с гиперссылками немного семантически нет.

Codeigniter по умолчанию полностью удаляет любые параметры $ _GET. Поэтому, не включив строки запросов в конфигурации, вы не сможете сделать следующее:

http://my -domain.com / скрипт /? = 1 парам и param2 = Foo

Для новичков, сегментированные URL-адреса являются чем-то вроде кривой обучения, но вскоре имеют смысл. Хорошим примером того, как сегментированные URL-адреса работают на практике, является переполнение стека!

Так что, если вы хотите скопировать страницу просмотра вопросов переполнения стека со следующим URL в codeigniter:

/1667417/codeigniter-peredacha-peremennyh-cherez-url-alternativa-ispolzovaniy-get

В вашем контроллере по умолчанию создайте следующий метод:

public function questions()
{
  $question_id = $this->uri->segment(2);

  // now do something with our question_id
}

Третий сегмент (заголовок вопроса) эффективно игнорируется. Но вы можете получить это с помощью следующего:

$question_title = $this->uri->segment(3);

Больше информации здесь: https://codeigniter.com/user_guide/libraries/uri.html

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

Итак, представьте, что вы создали контроллер с именем questions_controller.php и у вас есть метод с именем show_question_by_id(). Чтобы сохранить URI в стиле /questions/1234/some-text-here, но обрабатывать его с помощью контроллера / метода, описанного выше, вы можете создать следующий маршрут:

$route['question/(:num)'] = "questions_controller/show_question_by_id/$1";

Больше информации здесь: https://codeigniter.com/user_guide/general/routing.html

Если вы хотите, чтобы в вашем URL было бесконечное количество параметров, или вы не знаете, какие параметры ожидать, например, mysite.com/my_page/param1/12/param2/foo/param3/bar/param4/baz/another-param/xyz-123

Вы можете разделить их на ассоциативный массив, используя метод $this->uri->uri_to_assoc(1) URI, чтобы получить следующее:

  [array]
(
    'param1' => '12'
    'param2' => 'foo'
    'param3' => 'bar'
    'param3' => 'baz'
    'another-param' => 'xyz-123'
)

Затем вы можете обработать это точно так же, как если бы вы использовали массив $ _GET. Затем вы можете объединить этот подход с пользовательскими маршрутами, чтобы получить практически любой URI и структуру приложения, которые вам нравятся. Вы также получаете преимущество в том, что каждый параметр и сегмент автоматически очищаются. Это что-то вроде кривой обучения, и для начала это может показаться дополнительной работой, но на самом деле она довольно гибкая и помогает создавать хорошо структурированное приложение.

10 голосов
/ 28 апреля 2010

С какой стати вы публикуете свой CSS, если боретесь со строками запросов?

Безумие.

В любом случае, вы можете заново создать доступ к строке запроса в CodeIgniter несколькими способами.

uri_to_assoc ()

Во-первых, есть замечательные ассоциативные сегменты URI.

Пример URL: http://example.com/controller/method/name/value/name2/value2

Вы можете использовать следующий код для доступа к этим двум значениям:

$get = $this->uri->uri_to_assoc();
echo $get['name']; // value
echo $get['name2']; // value2

Это, конечно, замена строк запроса, но если вы можете использовать это, сделайте это.

parse_str ()

Если у вас есть глобальный код, такой как ловушка или MY_Controller , вы можете заново заполнить $ _GET следующей однострочной:

parse_str($_SERVER['QUERY_STRING', $_GET');

REQUEST_URI

Установите для $ config ['uri_protocol'] значение "REQUEST_URI" и разрешите строки запроса дальше вниз. REQUEST_URI не будет работать на всех серверах, так что это не самый совершенный метод, хотя и самый простой.

0 голосов
/ 19 декабря 2015

Я использую это, и оно работает:

сначала вы помещаете свои переменные в строку запроса следующим образом:

redirect('mycontroler/senddata/'.$name.'/'.$email);

в mycontroler я получаю параметры следующим образом:

public function senddata($name,$email)
{}
...