Как передать переменную в представление в Codeigniter 3, если его нет в URL - PullRequest
0 голосов
/ 20 мая 2018

Я работаю над приложением блога в Codeigniter 3.1.8 и Bootstrap 4.

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

enter image description here

Таблица category в базе данных выглядит следующим образом:

enter image description here

Для этой цели я выполнил следующее:

В модели Posts_model я добавилфункция:

public function get_num_rows_by_category($id) 
{ 
    $query = $this->db->get_where('posts', array('cat_id' => $id));
    return $query->num_rows(); 
}

В контроллере категорий я добавил строку

$data['number_of_posts_by_category'] = $this->Posts_model->get_num_rows_by_category($id);

В представлении Sidebar :

<?php foreach ($categories as $category): ?>
   <a href="<?php echo base_url('/categories/posts/'.$category->id); ?>" class="list-group-item list-group-item-action">
      <span class="text-muted"><?php echo $category->name; ?></span>
      <span class="badge badge-secondary badge-pill"><?php echo $number_of_posts_by_category; ?></span>
   </a>
<?php endforeach; ?> 

Проблема этого подхода заключается в том, что переменная $id (представляющая идентификатор категории) не передается через URL-адрес одной страницы сообщения.Таким образом, есть ошибка :

Message:  Undefined variable: number_of_posts_by_category

Какая жизнеспособная альтернатива.

Ответы [ 4 ]

0 голосов
/ 25 мая 2018

Я предполагаю, что это только для отображения.Я также предполагаю, что у вас есть Posts_model и Categories_model.

class Categories_model extends CI_Model {

    // Method for retrieving categories.
    public function get_all_categories()
    {
        return $this->db
            ->order_by('whatever', 'DESC/ASC') // anything
            ->get('categories')
            ->result();
    }

}

Теперь мы переходим к Posts_model:

class Posts_model extends CI_Model {
    // Method that count posts in categories.
    public function count_posts_in_category($cat_id)
    {
        return $this->db
            ->where('cat_id', $id)
            ->count_all('posts'); // Or count_all_results (Check please)
    }
}

Следующее, что нужно сделать, это использовать обаметоды в вашем контроллере:

class Your_controller extends CI_Controller {

    // I assume you loaded all libs and models.
    public function your_method()
    {
        // Get categories first.
        $data['categories'] = $this->categories_model->get_all_categories();

        // Now we add posts count:
        if ($data['categories'])
        {
           foreach ($data['categories'] as &$category) // Notice the "&".
           {
                $category->posts_count = $this->posts_model->count_posts_in_category($category->id);
           }
        }

        // Then load your sidebar and pass $data:
        $this->load->view('your_sidebar', $data);
    }
}

Представление должно быть (я скопировал ваш), и, пожалуйста, всегда используйте site_url для URL (кроме ресурсов, вы можете использовать base_url):

<?php foreach ($categories as $category): ?>
    <a href="<?php echo site_url('/categories/posts/'.$category->id); ?>" class="list-group-item list-group-item-action">
        <span class="text-muted"><?php echo $category->name; ?></span>
        <span class="badge badge-secondary badge-pill"><?php echo $category->posts_count; ?></span>
    </a>
<?php endforeach; ?> 
0 голосов
/ 20 мая 2018

Надеюсь, это поможет вам: (сделайте это с помощью помощника CI)

создайте custom_helper.php и добавьте его в папку помощника и загрузите его черезautoload.php

$autoload['helper'] = array('custom');

В помощнике создайте такую ​​функцию:

function get_num_rows_by_category($id)
{
   $ci = & get_instance();
   $count = $ci->Posts_model->count_all_where(['cat_id' => $id]);
   return $count;
}

Примечание : убедитесь, что вы загрузили свою модель вautoload.php или в контроллере

Добавьте этот метод к Posts_model:

public function count_all_where($where)
{
    if ($where)
    {
        $this->db->where($where);
        return $this->db->count_all_results('posts');
    }
}

Ваше мнение должно быть таким:

<?php foreach ($categories as $category): ?>
  <a href="<?php echo base_url('categories/posts/'.$category->id); ?>" class="list-group-item list-group-item-action">
    <span class="text-muted"><?php echo $category->name; ?></span>
    <span class="badge badge-secondary badge-pill"><?php echo get_num_rows_by_category($category->id) ?></span>
  </a>
<?php endforeach; ?>

Для более: https://www.codeigniter.com/user_guide/general/helpers.html

0 голосов
/ 20 мая 2018

Сначала вы должны запустить функцию вашего контроллера, вы должны вызвать вашу функцию get_num_rows_by_category вашего post_model

0 голосов
/ 20 мая 2018

Модель, в которой вы получаете все свои категории, должна быть адаптирована, чтобы получить Postcount

Categories_model (или как вы его назвали)

$query = $this->db
    ->select('c.*, count(p.cat_id) AS cntposts')
    ->from('categories c')
    ->join('posts p', 'c.id = p.cat_id')
    ->group_by('p.cat_id')
    ->get();

return $query->result();

ваш взгляд

<?php foreach ($categories as $category): ?>
  <a href="<?php echo base_url('/categories/posts/'.$category->id); ?>" class="list-group-item list-group-item-action">
    <span class="text-muted"><?php echo $category->name; ?></span>
    <span class="badge badge-secondary badge-pill"><?php echo $category->cntposts; ?></span>
  </a>
<?php endforeach; ?> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...