общая функция, вызываемая во всех контроллерах

#codeigniter #codeigniter-3

#codeigniter #codeigniter-3

Вопрос:

можно ли вызвать общую функцию через веб-сайт с помощью codeigniter?

Я создал CMS с использованием codeigniter 3, и у него есть опция обмена сообщениями. В заголовке сайта я показываю количество непрочитанных сообщений

в настоящее время я включил приведенный ниже код во все модели

 function get_unread_count($id)
    {

        $this->db->where('to',$id);
        $this->db->where('read',0);

        $x =  $this->db->get('messages');

        return $x->num_rows();

    }
  

и я вызываю ее во всех контроллерах.

Есть ли какой-либо упрощенный способ для этого?

Ответ №1:

Используйте переменные сеанса (CI_SESSION) для хранения данных один раз за сеанс, чтобы вы могли ссылаться на:

 $this->session->userdata(your_msg_number)
  

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

 $this->session->set_userdata('your_msg_number_variable_name', msg_number)
  

Если вы предпочитаете AJAX, вы можете настроить javascript для указания контроллера, который предоставляет номера сообщений через JSON….

Ответ №2:

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

Создайте файл в вспомогательном каталоге как application/helper/common_helper.php и поместите функцию в файл.

Теперь настройте имя помощника в routes.php для автоматической загрузки как : $autoload['helper'] = array('common_helper');

Теперь вы сможете вызывать вспомогательную функцию без объекта во всех контроллерах, например. get_unread_count($id);

Пожалуйста, обратите внимание: $this->db объект не будет доступен в помощнике, поэтому вам нужно создать экземпляр codeigniter и использовать:

 $ci =amp; get_instance();
$ci->db->query();
  

Ответ №3:

Основываясь на том, что говорит Лучано — на каждой странице вы должны подтвердить, кто является пользователем, с помощью проверки сеанса или чего-то подобного. Таким образом, в то же время вы можете обновить количество сообщений в сеансе для новой страницы. Таким образом, вам не нужно вызывать функцию подсчета сообщений с каждого контроллера, это просто часть процесса проверки пользователя.

Также следует иметь в виду, что вместо простой проверки пользователя вы можете вернуть запись пользователя — либо объект, либо массив — для использования по-разному, например, для их имени и т. Д. Другими словами, вам не всегда нужно записывать вещи и извлекать их из сеанса. Наконец, рассмотрите возможность создания отдельного шаблона для зарегистрированных пользователей. Это может помочь разделить вещи.

Ответ №4:

 make the one model common and add it on route file 

$autoload['model'] = array('mdl_common');
  

как это указано выше, установите метод автозапуска.
и поместите свою функцию в эту модель, как показано ниже в строке кода

 class Mdl_common extends CI_Model 
{
  function get_unread_count($id)
  {

    $this->db->where('to',$id);
    $this->db->where('read',0);

    $x =  $this->db->get('messages');

    return $x->num_rows();
  }
}
  

и вызовите эту функцию в вашем заголовочном файле следующим образом: строка кода ниже

 $this->mdl_common->get_unread_count($id); // i don't know what id you were passing 
  

но попробуйте, как этот поток, надеюсь, поможет вам

Комментарии:

1. Привет, его application / config / автозагрузка — не файл маршрута. В противном случае я почти предложил что-то похожее на то, что вы опубликовали, но я думаю, что предложение Лучано на самом деле намного лучше, особенно если вы объедините его с тем фактом, что вам уже нужно проверить сеанс для проверки пользователя.

2. извините, я просто пропустил это