Как я могу передать входное значение из представления в контроллер и модель для правильного извлечения данных? Codeigniter - PullRequest
0 голосов
/ 16 марта 2020

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

Я не могу получить идентификатор или ввести скрытое значение данных

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

В представлении - groups / index. php

Как вы можете видеть, я сделал posts/index/1, что является жестко закодированным значением, но позже я могу легко это изменить, это не моя проблема

<?php echo form_open('posts/index/1') ?>

    <input type="hidden" name="txtGroup" value="1" />
    <button type="submit" class="btn btn-info"> Submit</button>

</form>

Поэтому после того, как я сделал форму, я сделаю функцию в контроллере для извлечения posts/index

В контроллере - сообщений. php

public function index(){
    $this->load->view('templates/header');
    $this->load->view('teachers/posts/index');
    $this->load->view('templates/footer');   
}

И поэтому я достал страницу. На данный момент я могу теперь go через /posts/index/1 и увидеть мою страницу

На моей странице posts / index. php У меня есть данные, и они извлекаются через Ajax здесь это

Так что я уже получил эти данные в posts/showPosts

showAllQuestions();

//Show all data
function showAllQuestions(){
    $.ajax({
        type: 'ajax',
        url: '<?php echo base_url() ?>posts/showPosts',
        async: false,
        dataType: 'json',
        success: function(data){
            var html = '';
            var i;
            var n=1;

            for(i=0; i<data.length; i++){
                html +='<div class="card">'+
                    '<div class="card-header" style="color:white; background-color:black">'+
                        '<h4><span class="iconify" data-icon="ant-design:info-circle-outlined" data-inline="false"></span> Question No. '+ n++ +'</h4>'+
                    '</div>'+
                    '<div class="card-body">'+
                        '<form>'+
                            '<div class="form-group">'+
                                '<label for="exampleFormControlTextarea1"><h5> <span class="iconify" data-icon="emojione:check-mark-button" data-inline="false"></span> </h5></label>'+
                                '<input type="text" value="'+data[i].question+'" class="form-control" disabled />'+
                            '</div>'+
                            '<hr>'+
                            '<a href="<?php echo base_url() ?>posts/edit/'+data[i].id+'" class="btn btn-info"><span class="iconify" data-icon="el:edit" data-inline="false"></span> </a>&nbsp;'+
                            '<a href="<?php echo base_url()?>posts/delete/'+data[i].id+'" class="btn btn-primary"><span class="iconify" data-icon="fa-solid:trash-alt" data-inline="false"></span></a>'+
                            //  '<a href="javascript:;" class="btn btn-info item-edit" data-id="'+data[i].id+'">Edit </a>&nbsp;'+
                        '</form>'+
                    '</div>'+
                '</div><br>';
            }

            $('#showdata').html(html);
        },
        error: function(){
            alert('Could not get Data from Database');
        }
});

}

В posts/showPosts - сообщениях. php, это контроллер

public function showPosts(){
    $result = $this->post_model->showPosts();
    echo json_encode($result);
}

Наконец модель для определения, выбрал ли я правильный идентификатор в зависимости от идентификатора данных, который я отправляю

Проблема в том, что $ id null, и у меня нет подсказки для начала, потому что я объявляю скрытое значение ввода на странице просмотра.

public function showPosts(){
    // Show questions and answers
    $id = $this->input->post('txtGroup');
    $this->db->select('*');
    $this->db->from('questions');
    $this->db->where('group_id', $id);
    $query = $this->db->get();
    return $result = $query->result_array();

}

1 Ответ

0 голосов
/ 17 марта 2020

Я попытаюсь понять этот вопрос лучше, чем предыдущий (который теперь безопасно удалить, поскольку это лучшее описание вашей проблемы).

В вашем представлении groups/index.php вы хотите чтобы позволить пользователю перейти на страницу posts/index и передать целое число в качестве единственного параметра (который жестко задан вами, а не введен пользователем) - я буду называть его $txtGroup для контекста. Поскольку вы не выполняете операцию INSERT | UPDATE | DELETE, лучше отправлять данные как $_GET вместо $_POST. Поскольку Codeigniter разрешает передачу параметра $_GET как расширение URL, ограниченное sla sh, я не вижу никаких преимуществ в настройке <form>.

Стиль вашей новой гиперссылки как используйте предпочитаемые вами классы.

<a href="<?php echo base_url("posts/index/{$integer}"); ?>">Link to <?php echo $integer; ?></a>

Это отправит ваши данные на контроллер posts/index.php. Именно здесь вы должны получить / извлечь значение $txtGroup из URL.

Здесь я начинаю затуманивать то, что вам нужно. Если вы хотите передать значение в представление teachers/posts/index, сделайте это, передав ассоциативный массив в качестве второго параметра при загрузке представления.

public function index($txtGroup) {
    $this->load->view('templates/header');
    // if you want to pass the value to THIS 
    $this->load->view('teachers/posts/index', ['txtGroup' => $txtGroup]);
    $this->load->view('templates/footer');   
}

Если вас это не интересует Передав $txtGroup в представление, единственной другой причиной для передачи значения из groups/index.php в posts/index будет изменение запроса и передача данных Dynami c в представление teachers/posts/index необходимо указать при загрузке представления в любом случае).

public function index($txtGroup) {
    $data['posts'] = $this->post_model->showPosts($txtGroup);
    $this->load->view('templates/header');
    $this->load->view('teachers/posts/index', $data);
    $this->load->view('templates/footer');   
}

В вашей модели используйте переданный аргумент.

public function showPosts($groupId) {
    return $this->db->get_where('questions', ['group_id' => $groupId])->result_array();
}

Таким образом, вам не нужно использовать ajax вызов (который выглядит так, как будто вы безоговорочно вызываете ваш взгляд в любом случае). Теперь Codeigniter будет использовать свои магические значения c для передачи $data в ваше представление, благодаря чему вы сможете получить доступ к многомерному результирующему набору как $posts (переменная именуется ключом первого уровня, который вы ей присвоили). Используйте foreach() l oop для итерации строк результатов и создания контента html - все с использованием серверного языка.

<?php foreach ($posts as $index => $post) { ?> 
    <div class="card">
    // ... the rest of your content ...
<?php } ?>

При разработке нового динамического контента c используя вышеуказанное l oop:

  • Используйте $index в качестве счетчика, чтобы вам не приходилось увеличивать вручную.
  • НЕ разрешить INSERT | UPDATE | DELETE операций, которые должны запускаться событиями $_GET, это не лучшая практика. Эти типы действий должны быть инициированы только $_POST представлениями.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...