Передача информации из одного вида в другой - PullRequest
2 голосов
/ 27 апреля 2010

РЕДАКТИРОВАТЬ 1. Результаты запроса из моей базы данных отображаются на моей странице просмотра. Рядом с каждым уникальным результатом находится кнопка:

// 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>

Когда пользователь нажимает одну из этих кнопок (скажем, кнопку 4), я хотел бы отобразить выбор пользователя из массива в другом представлении.

Я пытался использовать это:

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

непосредственно перед

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

думает, что там будет сохранен окончательный выбор пользователя, поэтому я могу отобразить его в другом виде, например:

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


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

Однако на самом деле отображается последний результат, отображаемый в first_view.php, а не то, что выбрал пользователь.

У меня вопрос: если пользователь нажал кнопку 4, как я могу отобразить этот конкретный выбор в другом представлении?

КОНЕЦ РЕДАКТИРОВАНИЯ1

ОРИГИНАЛЬНЫЙ ВОПРОС

Моя страница просмотра (CodeIgniter) отображает содержимое массива в виде нескольких ссылок. Если пользователь щелкает ссылку, я хочу, чтобы пользователь перешел на другую страницу просмотра (через контроллер), которая дает больше информации об этой конкретной ссылке (которая хранится в этой конкретной позиции в массиве)

Мой вопрос: как мне получить доступ и отобразить содержимое этого конкретного местоположения в массиве во втором файле представления, не получая «Неопределенная ошибка переменной» во втором представлении?

Вот что я пытаюсь сделать в форме кода

// 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 ]

1 голос
/ 02 мая 2010

То, что вы делаете (как я это вижу), это то, что вы создаете форму, генерируете кнопки row sumbit и затем закрываете эту форму.

Если вы хотите использовать формы в качестве индикации того, что пользователь хочет купить, вы должны сгенерировать форму для каждой строки из результата, что-то вроде этого (он генерирует HTML, но вам нужно отредактировать его в соответствии со своими потребностями): 1004 *

Редактировать (псевдокода недостаточно :):

<!-- 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 -->

Таким образом, каждый раз, когда пользователь нажимает кнопку «купить», различные формы отправляются, и в вашем контроллере / представлении вы можете получить id того, что пользователь хочет купить через $this->input->post('idToAdd').

1 голос
/ 27 апреля 2010

Похоже, вам нужны два контроллера и два представления.

Контроллер 1 запрашивает базу данных, чтобы получить список вещей. Вызовите контроллер «список», а метод «индекс».

http://mysite.com/list/

Контроллер 2 запрашивает базу данных, чтобы получить больше информации об одной конкретной вещи. Назовите контроллер «item», метод «detail», а третьим параметром URL будет имя элемента или некоторый другой идентификатор, который вы можете передать в свою базу данных.

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

Этот третий параметр предоставляет информацию, которую вы используете для запроса вашей базы данных, чтобы найти больше информации о книге. Выполните этот запрос как часть контроллера 2 и передайте данные для просмотра 2.

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

1 голос
/ 27 апреля 2010

Откуда изначально появился массив? Я предполагаю, что это произошло из базы данных или из какого-то другого "предсказуемого" источника данных? В этом случае вы можете просто передать ссылку на эти данные (например, первичный ключ из базы данных) через URL при ссылке на вторую страницу. Если у вас недостаточно информации для этого, вам, возможно, придется пересмотреть свой дизайн. Наличие одного представления для доступа к содержимому другого отдельного представления было бы плохой идеей. Конечно, вы можете создавать фрагменты представления (просто файл PHP, который вы «включаете» в другие шаблоны), чтобы минимизировать дублирование кода.

Я не знаком с тем, как работает CodeIgniter, но на самом деле это просто общая логика веб-разработки.

EDIT

Что должно произойти, так это то, что ваша форма отправляется вашему контроллеру. Затем ваш контроллер проверяет данные POST и решает, какой выбор пользователь сделал из списка. Затем он перенаправляет на второй контроллер, передавая параметр в URL, чтобы второй контроллер мог найти элемент из базы данных.

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

Контроллер выбора языка

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);
  }
}

Форма выбора языка

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

BooksController, который получает значение language_id

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);
  }
}

Теперь BooksController может реализовать представление, отображающее все книги на языке, выбранном на предыдущем контроллере. Все, что было сделано для достижения этой цели, - передать первичный ключ для языка в URL-адресе между двумя контроллерами.

PS: не используйте сессии для чего-то подобного. Это плохая привычка. Будьте в восторге.

1 голос
/ 27 апреля 2010

Вы можете использовать параметр в URL для передачи информации во 2-е представление.

0 голосов
/ 27 апреля 2010

Вы всегда можете использовать сеанс или флэш-данные .

Вы можете сохранить данные при показе первой страницы. Затем вы можете получить его в следующем представлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...