Как передать переменную в функцию контроллера из представления в CodeIgniter? - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть пользовательский контроллер с функцией agentexport, который должен загружать электронную таблицу Excell. Ниже приведена функция:

  function agentexport($agentName) {
    if($this->isAdmin() == TRUE) {
        $this->loadThis();
    }
    else {
        $this->excel->setActiveSheetIndex(0);
        // Gets all the data using agent name
        $data = $this->excel_model->getdatabyname($agentname);

        //print_r($data);
        //die;

        $this->excel->stream('crosstown.xls', $data);
     }
}

На мой взгляд, я пытаюсь выполнить вышеуказанную функцию с помощью следующей кнопки:

<a class="btn btn-sm btn-info" href="<?php echo base_url().'agentexport/'.$record->agentName; ?>" title="Download Sheet><i class="fa fa-pencil"></i>Download Sheet</a>

Данная кнопка предназначена для немедленной загрузки таблицы. URL определяется в моих маршрутах как:

$route['agentexport'] = "user/agentexport";

Правильно ли я определил свой маршрут? Когда я нажимаю на маршрут, я получаю следующий URL http://www.XXXXX.com/John%20Grisham. Как видите, имя добавляется в конце URL, но на странице отображается 404. Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Личное мнение здесь, но я не думаю, что есть веская причина использовать маршрут. Если ничего другого, то следующий эксперимент станет хорошим экспериментом, чтобы выяснить, является ли определение $route проблемой.

  1. Удалите $route, который вы использовали для 'agentexport'.
  2. Изменить ссылку на

<a class="btn btn-sm btn-info" href="<?= base_url('user/agentexport/'.$record->agentName); ?>" title="Download Sheet"><i class="fa fa-pencil"></i>Download Sheet</a>

Чтобы проверить, что ссылка работает и передает значение, используйте следующую версию agentexport

public function agentexport($agentName)
{
    echo $agentName;
    //or alternately
    //var_dump($agentName);
}

Предполагается, что вы подтвердили $agentName пригодное для использования значение до того, как вы использовали его в ссылке. Если приведенное выше показывает вам значение, то вы знаете, что проблема была $route.

Вы можете поэкспериментировать, чтобы найти $route, но $route['agentexport/(:any)'] = 'user/agentexport/$1'; должно работать. Если вы собираетесь вернуться к использованию маршрута, не забудьте вернуть код ссылки. Я бы написал так, где URI передается в качестве аргумента base_url.

<a class="btn btn-sm btn-info" href="<?= base_url('agentexport/'.$record->agentName); ?>" title="Download Sheet"><i class="fa fa-pencil"></i>Download Sheet</a>

Если вы найдете маршрут, который работает - и вы действительно хотите его использовать, то восстановите код в agentexport до того, что вам действительно нужно. Но, опять же, я не вижу веских оснований для запутывания URL-адреса ссылки.

0 голосов
/ 06 ноября 2018

Если в представлении вы указываете на /controller_name/method/agent_name (что в основном и делается после «перевода» маршрута), все, что вам нужно сделать, это выбрать имя агента из URI с помощью помощника URL (не забудьте загрузить его заранее)

$user_id = $this->uri->segment(3);

Выше приведено все, что находится в третьем сегменте URI (в моем примере agent_name), и назначьте его переменной $user_id. Помните, что тому, что пользователь может манипулировать, нельзя доверять, поэтому вам необходимо выполнить санитарную обработку $user_id и убедиться, что пользователю, запрашивающему файл, разрешен доступ к нему

...