web-dev-qa-db-ja.com

CodeIgniter:URL経由で変数を渡す-GETを使用する代わり

私はCodeIgniterを使い始めたばかりで、URLを介して変数を渡すGETメソッドを使用して問題を発見しました(例:domain.com/page.php?var1=1&var2=2)。

1つのアプローチは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);
?>

ご協力いただきありがとうございます...

10
John Durrant

正直なところ、ハイパーリンクの機能を実行するフォームを作成することは、セマンティックなことではありません。

Codeigniterはデフォルトで、すべての$ _GETパラメータを完全に取り除きます。したがって、設定でクエリ文字列を有効にしないと、次のことはできません。

http://my-domain.com/script/?param=1&param2=foo

初心者にとって、セグメントベースのURLは少し習得しやすいですが、すぐに理にかなっています。セグメントベースのURLが実際にどのように機能するかを示す実例は、スタックオーバーフローです。

したがって、StackOverflowの質問ビューページをcodeigniterに次のURLでコピーする場合は、

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

3番目のセグメント(質問タイトルのスラッグ)は事実上無視されます。しかし、次のようにしてそれをつかむことができます:

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

詳細はこちら: https://codeigniter.com/user_guide/libraries/uri.html

コントローラのメソッドに最初のURIセグメントで名前を付ける必要があるという考えが気に入らない場合。ルート構成でカスタムルートを作成できます。

したがって、_questions_controller.php_というコントローラーを作成し、show_question_by_id()というメソッドがあるとします。 _/questions/1234/some-text-here_スタイルのURIを保持しながら、上記のコントローラー/メソッドで処理するには、次のルートを作成します。

_$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とアプリケーション構造を提供できます。また、各パラメーターとセグメントが自動的にクリーンアップされるという利点もあります。これは学習曲線のようなものであり、最初は余分な作業のように思えるかもしれませんが、実際にはかなり柔軟であり、適切に構造化されたアプリケーションを構築するのに役立ちます。

33
rbaker86

クエリ文字列と格闘しているのに、なぜCSSを投稿しているのですか?

狂気。

とにかく、CodeIgniterではいくつかの方法でクエリ文字列へのアクセスを再作成できます。

uri_to_assoc()

まず、すばらしい連想URIセグメントがあります。

URLの例: http://example.com/controller/method/name/value/name2/value2

次のコードを使用して、これらの2つの値にアクセスできます。

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

もちろん、これはクエリ文字列の代わりですが、これを使用できる場合は、それを実行してください。

parse_str()

フックまたは MY_Controller のようなグローバルコードがある場合は、次の1行で$ _GETを再設定できます。

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

REQUEST_URI

$ config ['uri_protocol']を "REQUEST_URI"に設定し、さらに下の方でクエリ文字列を有効にします。 REQUEST_URIはすべてのサーバーで機能するわけではないため、最も簡単な方法ですが、これは最も完全な方法ではありません。

10
Phil Sturgeon

私はこれを使用して動作します:

まず、次のように変数をクエリ文字列に配置します。

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

mycontrolerで私はこの方法でパラメータを受け取ります:

public function senddata($name,$email)
{}
0
ganji