CodeIgniter: создать новый помощник?

178

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

Я знаю, что могу «расширить» помощников, но я не хочу расширять помощников. Я хочу создать помощника с помощью моих функций цикла. Давайте назовем его loops_helper.php

Джонатан
источник
Почему вы не можете просто передать эти массивы на просмотр?
Майк Хордеки
Я могу, но это упускает смысл отделить представление от функций ..
Джонатан

Ответы:

378

Помощник CodeIgniter - это файл PHP с несколькими функциями. Это не класс

Создайте файл и вставьте в него следующий код.

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

if ( ! function_exists('test_method'))
{
    function test_method($var = '')
    {
        return $var;
    }   
}

Сохраните это в приложение / помощники / . Мы будем называть это "new_helper.php"

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

Использование помощника


Это может быть в вашем контроллере , модели или представлении (не желательно)

$this->load->helper('new_helper');

echo test_method('Hello World');

Если вы используете этот помощник во многих местах вы можете иметь его автоматически загружаться при добавлении его в файл конфигурации автозагрузку , т.е. <your-web-app>\application\config\autoload.php.

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

-Mathew

Pixel Developer
источник
33
Всегда используйте, чтобы к имени вспомогательного файла добавлялось «_helper», иначе вы получите ошибку. Так что "helper_name" не будет работать, но назовите ваш файл "name_helper".
Бхуми Сингхал
3
Начиная с CI2, вам также потребуется получить экземпляр CI, чтобы использовать помощника в модели: $ ci = get_instance (); $ CI-> load-> помощник ( 'name_helper');
Evernoob
3
Просто примечание, помощник не должен быть функцией. Это может быть и класс. Например, ознакомьтесь со стратегией создания «виджетов» на форуме EllisLab . Затем вы можете использовать этот класс где угодно ... также Techincally, вы можете загрузить свой помощник в экземпляр CI, если хотите, получив экземпляр, а затем установив его $thisкак свойство ... Все, если вы хотите, конечно.
Генерал Реднек
2
Какая польза от проверки if function_exists? Это что-то вроде средства зажигания кода, это вообще хорошая практика php? Зачем вам это нужно?
skrln
2
@skrln есть вероятность, что у вас есть помощник, автоматически загружаемый (давайте назовем его cool_helper), и, если вы забудете об этом и вызовете $this->load->helper('cool_helper')его вручную после его автоматической загрузки, вы получите «уже определенную» ошибку PHP или что-то в этом роде. Это предотвращает загрузку одного и того же кода дважды (это похоже на include_once()функцию PHP, но для помощников CodeIgniter, чтобы избежать проблем). В основном, перевод немного: если функция не существует, это означает, что помощник не был загружен раньше. Давайте определим это.
Алехандро Иван
79

Некоторый код, который позволяет вам использовать экземпляр CI внутри помощника:

function yourHelperFunction(){
    $ci=& get_instance();
    $ci->load->database(); 

    $sql = "select * from table"; 
    $query = $ci->db->query($sql);
    $row = $query->result();
}
r4ccoon
источник
1
@ r4ccoon, так правильно. Мне даже не потребовалось 5 минут, чтобы вернуться к определениям экземпляров. :)
user1048839
@ r4ccoon, и это фантастический совет
Арун
17

Ну у меня работает только добавление текста "_helper"после в файл php, например:

Помощники Codeiginiter

А для автоматической загрузки помощника в папку aplication -> файл autoload.php добавьте в массив имя помощника без "_helper", например:

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

И с этим я могу использовать все функции помощника

Эдуардо Чавира
источник
1
Я только что обнаружил, что, как вы сказали, CodeIgniter потребует _helperв конце имени файла.
Джаред Эйтньер
@ Джаред, да, это тоже касается меня, для этого требуется _helper в конце имени файла!
contax1er
11

Для создания нового помощника вы можете следовать инструкциям The Pixel Developer , но я советую не создавать помощника только для логики, требуемой определенной частью конкретного приложения. Вместо этого используйте эту логику в контроллере, чтобы установить для массивов их окончательные предполагаемые значения. Получив это, вы передаете их в представление с помощью класса Template Parser и (надеюсь) вы можете сохранить представление чистым от всего, что выглядит как PHP, используя простые переменные или пары переменных тегов вместо echos и foreachs. то есть:

{blog_entries}
<h5>{title}</h5>
<p>{body}</p>
{/blog_entries}

вместо того

<?php foreach ($blog_entries as $blog_entry): ?>
<h5><?php echo $blog_entry['title']; ?></h5>
<p><?php echo $blog_entry['body']; ?></p>
<?php endforeach; ?>

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

Лима
источник
3

Создайте файл с именем вашего помощника в / application / helpers и добавьте его в файл конфигурации автозагрузки / загрузите его вручную.

Например, поместите файл с именем user_helper.php в / application / helpers с таким содержимым:

<?php
  function pre($var)
  {
    echo '<pre>';
    if(is_array($var)) {
      print_r($var);
    } else {
      var_dump($var);
    }
    echo '</pre>';
  }
?> 

Теперь вы можете либо загрузить помощника через него, $this->load->helper(‘user’);либо добавить его в config application / config / autoload.php .

Sumit
источник
3

Просто определите помощника в каталоге помощника приложения, затем вызовите из вашего контроллера просто имя функции, как

helper name = new_helper.php
function test_method($data){
 return $data
}   

в контроллере загрузи помощника

$this->load->new_helper();
$result =  test_method('Hello world!');
if($result){
 echo $result
}

выход будет

Hello World!
Хуршид Алам Джони
источник
3

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

$this->config->item('item name'); Где имя элемента - индекс массива $ config, который вы хотите получить. Например, чтобы выбрать язык, вы сделаете это:

$lang = $this->config->item('language'); Функция возвращает FALSE (логическое значение), если элемент, который вы пытаетесь получить, не существует.

Если вы используете второй параметр функции $ this-> config-> load для назначения элементов конфигурации определенному индексу, вы можете получить его, указав имя индекса во втором параметре $ this-> config- > функция item (). Пример:

// Загружает файл конфигурации с именем blog_settings.php и назначает его индексу с именем blog_settings

$this->config->load('blog_settings', TRUE);

// Получить элемент конфигурации с именем site_name, содержащийся в массиве blog_settings

$site_name = $this->config->item('site_name', 'blog_settings');

// Альтернативный способ указать тот же элемент:

$blog_config = $this->config->item('blog_settings');

$ site_name = $ blog_config ['site_name'];

user6280268
источник