Codeigniter MY_Controller не отправляет переменные в представление - PullRequest
0 голосов
/ 08 февраля 2019

Я использую CodeIgniter и попытался создать собственный контроллер для расширения всех моих контроллеров.Затем он передаст его в макет, где будет весь код, кроме главной страницы.Я надеюсь, что кто-то может сказать мне, что я делаю неправильно.Ниже описано, как я его настроил, и код для каждого контроллера и вида.

Я сделал MY_Controller, чтобы я мог расширить все свои контроллеры из него.Внутри MY_Controller я добавил публичную функцию под названием loadView.Ниже приведен код.

Затем я расширил свой контроллер Contact, вызвал loadView и передал некоторые переменные.Смотрите также приведенный ниже код.

В моем макете / главном представлении он не увидит никаких переменных.Ниже приведен фрагмент для просмотра заголовка.

class MY_Controller extends CI_Controller
{
//    protected $trainedJobs = array();

    public function __construct()
    {
        parent::__construct();
    }
    public function loadView($layout = "main", $title = "What Do I Work", $page = "index", $xtraCSS = null, $xtraJS = null, $hideNavbar = false)
    {

        $data['$_title'] = $title;
        $data['$_view'] = $page;
        $data['$_xtraCSS'] = $xtraCSS;
        $data['$_xtraJS'] = $xtraJS;
        $data['$_hideNavbar'] = $hideNavbar;

        $this->load->view('layouts/' . $layout, $data);
    }
}

My Contact Controller

class Contact extends MY_Controller
{
    public function index()
    {

        $this->loadView('main',"Contact Us", 'contact', 'base_url("assets/css/contact-us.css")');
    }

}

Внутри моего основного вида компоновки

<!DOCTYPE html>
<html>
<head>
    <title><?php if (isset($_title)) echo $_title; ?></title>
</head>
<body>

<?php if (isset($_view) && $_view)
$this->load->view($_view);
?>

</body></html>

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Как справедливо предложено Dont_panic, не используйте $ в ключе

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

Если вы хотите динамически загружать файлы CSS и JS для каждой страницы, для которой требуется ее запуск.Используйте базу данных для извлечения файлов подкачки в нужный вам массив и используйте его с помощью foreach($file['css'] as $key => $value) и foreach($file['js'] as $key => $value) или создайте массив в модели и верните.

Пример

public function get_contact_files() {
$params['css'] = array(
0 => 'assets/css/file_1.css',
1 => 'assets/css/file_2.css',
2 => 'assets/css/file_3.css',
);
$params['js'] = array(
0 => 'assets/js/file_1.js',
1 => 'assets/js/file_2.js',
2 => 'assets/js/file_3.js',
);

return $params;
}

Inконтроллер

$data['common'] = array(
        'page_title' => 'My Page Title',
        'page_heading' => 'My Page Heading'
);
$this->load->model('File_model');
$data['file'] = $this->File_model->get_contact_files();

В поле зрения

<html>
        <head>
                <title><?php echo $common['page_title']; ?></title>
<?php foreach($file['css'] as $key => $value) { ?>
    <link rel="stylesheet" href="<?php echo base_url($value); ?>">
<?php } ?>
        </head>
        <body>
        <h1><?php echo $common['page_heading']; ?></h1>
<?php foreach($file['js'] as $key => $value) { ?>
<script src="<?php echo base_url($value); ?>"></script>
<?php } ?>
        </body>
</html>

Предложение 1: Существует встроенная библиотека шаблонов на случай, если вы хотите использовать

В контроллере

$this->load->library('parser');

$data = array(
        'page_title' => 'My Page Title',
        'page_heading' => 'My Page Heading'
);

$this->parser->parse('ur_page_view', $data);

По вашему мнению

<html>
        <head>
                <title>{page_title}</title>
        </head>
        <body>
        <h1>{page_heading}</h1>
        </body>
</html>

Предложение 2: Если вы хотите передать одну и ту же переменную во всех функциях этого конкретного контроллера, используйте

<?php

class Page extends CI_Controller{

    function __construct()
    {
        parent::__construct();
        $data['page_title'] = 'My Page Title';
        $data['page_heading'] = 'My Page Heading';
        $this->load->vars($data);       
    }

    function name()
    {
        $this->load->view('ur_page_view',$data);
    }

В поле зрения

<html>
        <head>
                <title><?php echo $page_title; ?></title>
        </head>
        <body>
        <h1><?php echo $page_heading; ?></h1>
        </body>
</html>

Пожалуйста, проголосуйте, если это было полезно

0 голосов
/ 09 февраля 2019

Проблема с именами переменных, которые вы используете, например:

$data['$_title'] = $title;

Ключ массива ($_title) станет именем переменной в представлении.Но нет способа обратиться к имени переменной, которая начинается с $, на самом деле это недопустимое имя переменной AFAICT. Согласно документации PHP имя переменной:

... начинается с буквы или подчеркивания, за которым следует любое количество букв, цифр или подчеркиваний.

Нет никаких упоминаний о том, что $ вообще является юридическим персонажем - и это определенно не может быть первым символом.

Мне было любопытно и проверено, но $$_title не работает,${$_title} также не работает (этот синтаксис работает для переменных-переменных, которые совершенно допустимы ).

AFAICT Вы не пытаетесь использовать переменные-переменные, поэтому я думаю, что это простая опечатка, и все, что вам нужно сделать, это удалить эти $ s из ключей массива:

$data['_title']      = $title;
$data['_view']       = $page;
$data['_xtraCSS']    = $xtraCSS;
$data['_xtraJS']     = $xtraJS;
$data['_hideNavbar'] = $hideNavbar;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...