Bir Görünümü diğerine Bilgisi Passing

5 Cevap php

EDIT 1. The results of a query from my database are displayed on my view page. Next to each unique result is a button:

// first_view.php    
<?php echo form_open('controller/method'); ?>
<?php foreach($results_found as $item): ?>
<p><?php echo $item->name ?></p>
<p><?php form_submit('buy','Buy This'); ?></p>

Bir kullanıcı bu düğmelerden birine tıkladığında, başka bir görünüm üzerine diziden kullanıcının seçim görüntülemek istiyorum (4 düğmesine Diyelim).

Ben bu kullanarak denedim:

 // first_view.php
<?php echo $this->session->set_userdata('choice',$item); ?>

hemen önce

// first_view.php    
<?php echo form_close(); ?>

Ben bu gibi başka bir görünümde görüntülemek böylece kullanıcının son seçim orada saklanır olacağını düşünerek:

// second_controller.php
$c = $this->session->userdata('choice');


// second_view.php
echo 'Your Choose: '. $c;

Ancak, ne gerçekte görüntüleyen kullanıcı tercih değil, ne first_view.php görüntülenen son sonucudur.

Benim soru kullanıcı düğmesini 4 tıklandığında ise, nasıl ben özellikle seçim, başka bir görünüm üzerine gösterdiği alabilirim, değil mi?

END OF EDIT1

ORIGINAL QUESTION

Benim görüşüm sayfa (CodeIgniter) çeşitli bağlantılar şeklinde bir dizinin içeriğini görüntüler. Bir kullanıcı bir linke tıkladığında, ben kullanıcı (dizideki belirli bir pozisyonda muhafaza edilir) söz konusu bağlantı ile ilgili daha fazla bilgi verir (bir kontrolör üzerinden) başka bir görünümü sayfaya alınacak istiyorum

Benim soru nasıl erişmek ve ikinci görünümünde bir "Tanımsız değişken hatası" almadan ikinci görünüm dosyasında dizi içindeki belirli yerin içeriğini görüntülemek mi, nedir?

İşte kod biçiminde yapmaya çalışıyorum ne

// my_controller.php
$array_name['variable_name'];
$this->load->view('first_view.php');

// first_view.php
<?php foreach($variable_name as $vn): ?>
<?php echo anchor('controller_name' $vn->info ?> // if user clicks on 3rd link
<?php endforeach ?>                              // I want to beable to access
                                                 // index 2 of the array in the 
                                                 // second view file so I can 
                                                 // display more info 
// second_view.php
<?php $vn[2]->info ?>

5 Cevap

Ne yapmak (onu görmek gibi), form oluşturmak row düğmelerini sumbit oluşturmak ve sonra bu formu kapatın olmasıdır.

Eğer satın almak istediği kullanıcı göstergesi olarak formlarını kullanmak isterseniz, sonuç her satır için bir form, böyle bir şey (bu html oluşturulan, ancak sizin ihtiyaçlarınıza göre düzenlemek gerek var) oluşturmalıyız:

Düzenle (pseudocode yeterli :) değildi:

<!-- repeat row times -->
<?php foreach($items as $item): ?>
<p><?php echo $item->name; //echo name ?>
  <?php form_open(/*your settings*/); ?>
  <input type="hidden" name="idToAdd" value="<?php echo $item->id;?>" />
  <input type="submit" value="Buy this" />
  </form>
</p>
<?php endforeach; ?>
<!-- end repeat -->

Bu şekilde, her kullanıcı tıklama 'buy-it' düğmesine, farklı bir form gönderir ve denetleyici / görünümünde, sen id ne kullanıcı alabilirsiniz $this->input->post('idToAdd') ile satın almak istiyor.

Eğer iki kontrolörleri ve iki incelemeler gerekir gibi geliyor.

Kontrolör 1 şeylerin bir listesini almak için veritabanını sorgular. Denetleyicisi "listesi", ve yöntemi "index" diyoruz.

http://mysite.com/list/

Kontrolör 2 belirli bir şey hakkında daha fazla bilgi almak için veritabanını sorgular. Denetleyicisi "item", yöntemi "detay", ve üçüncü URL parametresi veritabanı içine geçebilir öğe veya bazı diğer tanımlayıcı adı olacaktır diyoruz.

http://mysite.com/item/detail/436 or
http://mysite.com/item/detail/the-name-of-book-436

Bu üçüncü parametre kitap hakkında daha fazla bilgi bulmak için veritabanını sorgulamak için kullanabileceğiniz bilgi sağlar. Kontrol ünitesi 2 parçası olarak bu sorguyu tamamlamak ve görünümü 2 veri aktarmak.

Diğer yanıtlar oturum verileri kullanarak sürmüştür. Ben oturum verileri kitaplar hakkında kullanıcıya özgü bilgi ve ayrıntılar için olduğundan bu tür kullanıcı özgü tuhaf bir fikir değil bence.

Dizi aslen nereden geldi? Ben bir veritabanından ya da diğer bazı "öngörülebilir" veri kaynağından gelen varsayıyorum? Ikinci sayfaya bağlantı Bu durumda sadece URL yoluyla bu verilere referans (örneğin veritabanından bir birincil anahtar) geçebilir. Bunu yapmak için yeterli bilgi yoksa sizin tasarım yeniden düşünmek gerekebilir. Bir görünüm erişim başka farklı bakış içeriğine sahip kötü bir fikir olacaktır. Siz tabii ki kod tekrarını en aza indirmek için (sadece bir PHP dosyası diğer şablonları 'dahil') view parçaları oluşturabilirsiniz.

Ben CodeIgniter nasıl çalıştığını aşina değilim ama bu gerçekten sadece genel web geliştirme mantıktır.

EDIT

Ne gerçekleşmesi gereken form controller kendisini teslim olmasıdır. Sizin denetleyici sonra POST verileri inceler ve karar hangi seçim listeden yapılmış kullanıcı. Daha sonra ikinci denetleyici veritabanından öğeyi aramak böylece URL bir parametre geçirerek, ikinci denetleyiciye yönlendirir.

Bir ilkel bir örnek, belirli bir kullanım durumunun, sadece bazı semantik sözde-kodu kullanarak değil. Burada birlikte takip edebilirsiniz umuyoruz. Örnek kullanıcı bu dilde kitapların bir listesini görmeden önce bir dil seçer kurgusal bir çok-dilli kitap deposudur. Çerçeve kodu tamamen kurgusal. Ben bu iş akışı gerçekleşmesi sadece parçaları görebilirsiniz kısalık için tamamen kontrol aklı dahil her şeyi ihmal ettik:

Language selection controller

class LanguagesController ... {
  public function selectLanguage() {
    // If the user submitted the form, collect the language_id
    // and redirect to the BooksController
    if ($this->_request->get('language_id')) {
      return $this->_response->redirect(array(
        'controller' => 'BooksController',
        'action' => 'viewBooks',
        'language_id' => $this->_request->get('language_id')
      ));
    }

    $languages = Language::findAllWithBooksInStock();
    $this->_view->set('languages', $languages);
  }
}

Language selection form

<form method="post">
  <fieldset>
     <label for="language">Select a language</label>
     <select name="language_id" id="language">
       <?php foreach ($languages as $lang): ?>
         <option value="<?php escape($lang->id); ?>"><?php escape($lang->name); ?></option>
       <?php endforeach; ?>
     </select>
  </fieldset>
  <fieldset>
    <input type="submit" name="submit" value="Continue" />
  </fieldset>
</form>

Dil_Kimliği değerini alır * BooksController *

class BooksController ... {
  public function viewBooks() {
    $language = Language::findById($this->_request->get('language_id'));
    $books = Book::findAllWithLanguage($language);

    $this->_view->set('language', $language)
                ->set('books', $books);
  }
}

Şimdi BooksController önceki kontrolör seçilen dilde tüm kitapları görüntüleyen bir görünüm uygulayabilirsiniz. Bunu başarmak için bitmiş oldu ki tüm iki denetleyicileri arasında URL dil için birincil anahtar geçmek oldu.

Not: Böyle bir şey için oturumları kullanmayın. O içine almak için kötü bir alışkanlıktır. Sığınakta olun.

Her zaman oturumunu kullanabilirsiniz ya da flashdata.

Eğer ilk sayfa göstermek zaman verileri saklayabilirsiniz. Daha sonra bir sonraki görünümünde alabilirsiniz.

Sen 2. görünümüne bilgi aktarmak için URL bir parametre kullanabilirsiniz.