Планирование задач Codeigniter - PullRequest
0 голосов
/ 01 июля 2018

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

Дисплей (Контроллер)

$table_data = array(
                'table_data' => $this->display_model->get_table_data($table_name),
                'edit_table_data'=>$this->display_model->get_table_data($table_name,$row_id) 
            );

$form_name='edit_'.$table_name;

$this->load->view('header');
$this->load->view($form_name,$table_data);
$this->load->view('footer');

Вы можете видеть tabe_data и edit_table_data вызывает одну и ту же функцию с другим параметром. Здесь я сомневаюсь в планировании времени между этими двумя вызовами функций (что, честно говоря, я ошибаюсь, потому что codeigniter управляет вызовами функций)

Display_model (модель)

public function get_table_data($table_name,$row_id=null)
{
    $return = "";

    if ($row_id != null) 
    {
        switch ($table_name) {

            case 'user':

                //$return = $this->db->where($table_name."_id",$row_id)->get($table_name)->result();
                $return = $this->db->select($table_name.'.*,country.country_name')
                ->join('country','country.country_id=user.user_country_id','left')
                ->where($table_name.'_id',$row_id)
                ->get($table_name)->result();
                break;

            case 'user_document':

                //$return = $this->db->where($table_name."_id",$row_id)->get($table_name)->result();
                $return = $this->db->select($table_name.'.*,document.document_name')
                ->join('document','document.document_id=use_document.document_id','left')
                ->where($table_name.'_id',$row_id)
                ->get($table_name)->result();
                break;

            default:

                $return = $this->db->where($table_name."_id",$row_id)->get($table_name)->result();

                break;
        }

    if($return != null)
    {
        return $return;
    }
    else
    {
        return "no_data";
    }
}

Вот мое мнение, где я получаю ошибку

                <?php foreach ($edit_table_data as $etd_row) {?>
                <form method="post" class="form-horizontal" action="<?php echo site_url('admin/edit_row/user_type/'.$etd_row->user_type_id)?>">
                    <div class="form-group">
                        <label class="col-sm-4 control-label">User Type Name</label>

                        <div class="col-sm-8"><input type="text" class="form-control" name="user_type_name" value="<?php echo $etd_row->user_type_name?>"></div>
                    </div>

                    <div class="hr-line-dashed"></div>

                    <div class="form-group">
                        <div class="col-sm-2 col-sm-offset-2">
                            <button class="btn btn-primary" type="submit">Edit changes</button>
                        </div>
                    </div>

                </form>
                <?php } ?>

в строке цикла foreach, мне выдается ошибка

Invalid argument supplied for foreach

Заранее спасибо за ваши комментарии

Ошибка

A PHP Error was encountered
Severity: Warning

Message: Invalid argument supplied for foreach()

Filename: views/edit_user_type.php

Line Number: 18

Backtrace:

File: C:\wamp\www\gmf\application\views\edit_user_type.php
Line: 18
Function: _error_handler

File: C:\wamp\www\gmf\application\controllers\Display.php
Line: 170
Function: view

File: C:\wamp\www\gmf\index.php
Line: 315
Function: require_once

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Кажется, что нет причины вызывать get_table_data дважды, один раз с и один раз без $row_id, потому что вы никогда не используете $table_data['$table_data'] в представлении. В интересах получения чего-то, что работает, первый звонок должен быть исключен. Пересмотренный контроллер выглядит следующим образом.

$table_data['edit_table_data'] = $this->display_model->get_table_data($table_name,$row_id) ;

$form_name='edit_'.$table_name;

$this->load->view('header');
$this->load->view($form_name,$table_data);
$this->load->view('footer');

В коде модели в вопросе отсутствует фигурная скобка }, чтобы закрыть это утверждение.

if ($row_id != null) 
{

Так что немного сложно точно сказать, что вы хотите, если $row_id не предоставлено. Без дальнейшей информации мое мнение таково, что get_table_data не должен давать второму аргументу значение по умолчанию. Другими словами, функция должна быть определена без значения по умолчанию для `$ row_id - вот так.

public function get_table_data($table_name, $row_id) 

Без значения по умолчанию для `$ row_id 'возникает фатальная ошибка, если значение не указано. Таким образом, контроллер должен убедиться, что значение предоставлено. Аналогичным образом, контроллер всегда должен проверять возвращаемость модели или модель всегда должна возвращать то, что может использовать представление.

get_table_data() содержит много повторяющихся кодов - where($table_name.'_id', $row_id) и get($table_name)->result() появляются по три раза каждый. Переставляя логику, можно исключить повторяющиеся строки, чтобы сделать функцию намного более краткой. Рассмотрите эту версию.

public function get_table_data($table_name, $row_id)
{
    if($table_name === 'user')
    {
        $this->db
            ->select($table_name.'.*, country.country_name')
            ->join('country', 'country.country_id = user.user_country_id', 'left');
    }
    elseif($table_name === 'user_document')
    {
        $this->db
            ->select($table_name.'.* ,document.document_name')
            ->join('document', 'document.document_id = use_document.document_id', 'left');
    }

    return $this->db
            ->where($table_name."_id", $row_id)
            ->get($table_name)
            ->row();
}

Вышеприведенное возвращает данные из любого $table_name, где $table_name."_id" == $row_id. В случае таблиц «user» или «user_document» добавляются специальные предложения «select» и «join».

Поскольку вас, похоже, интересует только одна строка, вам следует позвонить row() вместо result().

Важно знать, что db->row() вернет NULL, если записи не найдены. Этот факт можно использовать для проверки возврата модели и соответствующей реакции. В этом случае мы делаем проверку в представлении. Потому что есть только один ряд. foreach не требуется.

<?php if(isset($edit_table_data)) { ?>
    <form method="post" class="form-horizontal" action="<?php echo site_url('admin/edit_row/user_type/'.$edit_table_data->user_type_id) ?>">
        <div class="form-group">
            <label class="col-sm-4 control-label">User Type Name</label>
            <div class="col-sm-8"><input type="text" class="form-control" name="user_type_name" value="<?php echo $edit_table_data->user_type_name ?>"></div>
        </div>

        <div class="hr-line-dashed"></div>

        <div class="form-group">
            <div class="col-sm-2 col-sm-offset-2">
                <button class="btn btn-primary" type="submit">Edit changes</button>
            </div>
        </div>
    </form>
    <?php
}
else { ?> <div>No Data Available</div> <?php } ?>
0 голосов
/ 01 июля 2018

Вы получите эту ошибку, если $edit_table_data не является массивом - в этом случае, вероятно, строка.

Мои знания по КИ немного ржавые, но, думаю, что-то в этом роде поможет вам:

$query = $this->db->select($table_name.'.*,country.country_name')
->join('country','country.country_id=user.user_country_id','left')
->where($table_name.'_id',$row_id)
->get($table_name);

if ($query->num_rows() === 0){
    return []; // Make sure we're always returning an array.
    // I'd rather handle this stuff in the view...
    // Probably some kind of message that shows:
    // that there are not results when $edit_table_data is not an array, otherwise loop.

}

return $query->result();

Или вы могли бы сделать что-то вроде этого:

<?php
if (!is_array($edit_table_data)) {
    echo 'No results here.';
} else {
    foreach ($edit_table_data as $etd_row) { ?>
        <form method="post" class="form-horizontal"
              action="<?php echo site_url('admin/edit_row/user_type/' . $etd_row->user_type_id) ?>">
            <div class="form-group">
                <label class="col-sm-4 control-label">User Type Name</label>

                <div class="col-sm-8"><input type="text" class="form-control" name="user_type_name"
                                             value="<?php echo $etd_row->user_type_name ?>"></div>
            </div>

            <div class="hr-line-dashed"></div>

            <div class="form-group">
                <div class="col-sm-2 col-sm-offset-2">
                    <button class="btn btn-primary" type="submit">Edit changes</button>
                </div>
            </div>

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