CodeIgniter: передача переменных через URL - альтернативы использованию GET
Я новичок в CodeIgniter и только что обнаружил трудности с использованием метода GET для передачи переменных по URL-адресу (например, domain.com/page.php?var1=1&var2=2).
Я понимаю, что один из подходов - передать переменные в сегментах URI, но не совсем понял, как это сделать, но, как кажется, создается ожидание наличия функции в контроллере, названном как конкретный сегмент URI????
В любом случае Вместо использования GET я решил использовать POST, адаптировав кнопку отправки (замаскированную под ссылку) с переменными в скрытых полях ввода. Я создал следующее решение, которое, кажется, работает нормально, но мне интересно, находится ли я на правильном пути здесь или есть ли более простой способ передачи переменных через ссылку внутри CodeIgniter?
Я создал следующий класс в application/libraries/
<?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);
?>
Спасибо за вашу помощь...
Ответы
Ответ 1
Честно говоря, создание формы для выполнения задания гиперссылок - это немного семантический, нет.
Codeigniter по умолчанию полностью разделяет любые параметры $_GET. Поэтому без включения строк запроса в конфигурации вы не можете сделать следующее:
http://my-domain.com/script/?param=1¶m2=foo
Для новичков, ориентированные на сегменты URL-адреса являются немного кривой обучения, но вскоре имеют смысл. Хорошим примером того, как работают на основе сегментов URL-адреса, является Stack Overflow!
Итак, если вы захотите скопировать страницу просмотра вопроса о переполнении стека со следующим URL-адресом в codeigniter:
http://stackoverflow.com/questions/2728978/codeigniter-passing-variables-via-url-alternatives-to-using-get
В контроллере по умолчанию создайте следующий метод:
public function questions()
{
$question_id = $this->uri->segment(2);
// now do something with our question_id
}
Третий сегмент (заголовок заголовка вопроса) эффективно игнорируется. Но вы можете схватить его со следующим:
$question_title = $this->uri->segment(3);
Дополнительная информация здесь: http://ellislab.com/codeigniter/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";
Дополнительная информация здесь: http://ellislab.com/codeigniter/user-guide/general/routing.html
Если вы хотите иметь бесконечное количество параметров в своем URL-адресе или не знаете, какие параметры ожидать, например. mysite.com/my_page/param1/12/param2/foo/param3/bar/param4/baz/another-param/xyz-123
Вы можете разбить их на ассоциативный массив, используя метод URI $this->uri->uri_to_assoc(1)
, чтобы получить следующее:
[array]
(
'param1' => '12'
'param2' => 'foo'
'param3' => 'bar'
'param3' => 'baz'
'another-param' => 'xyz-123'
)
Затем вы можете обрабатывать это точно так же, как если бы вы использовали массив $_GET. Затем вы можете объединить этот подход с настраиваемыми маршрутами, чтобы предоставить вам практически любую структуру URI и приложений, которые вам нравятся. Вы также получаете преимущество в том, что каждый параметр и сегмент были автоматически очищены. Это немного кривая обучения и может показаться дополнительной работой для начала, но на самом деле довольно гибкой и поможет вам построить хорошо структурированное приложение.
Ответ 2
Почему вы публикуете свой CSS, если вы боретесь с Query Strings?
Безумие.
В любом случае, вы можете повторно создать доступ к строке запроса несколькими способами в 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()
Если у вас есть глобальный код, например, hook или MY_Controller, вы можете повторно заполнить $_GET следующим однострочным:
parse_str($_SERVER['QUERY_STRING', $_GET');
REQUEST_URI
Установите $config ['uri_protocol'] в "REQUEST_URI" и включите строки запроса дальше. REQUEST_URI не работает на всех серверах, поэтому это не самый совершенный метод, хотя он и самый простой.
Ответ 3
Я использую это, и он работает:
сначала вы помещаете переменные в строку запроса следующим образом:
redirect('mycontroler/senddata/'.$name.'/'.$email);
в mycontroler я получаю параметры таким образом:
public function senddata($name,$email)
{}