Создание красивых хелперов для CodeIgniter

Хелперы CodeIgniter призваны повысить читаемость php шаблонов и избежать дублирования кода, но по сути являются простыми функциями, поэтому при генерации html кода, сами нуждаются в повышении читаемости. Можно для каждого хелпера создавать своё отображение, но для подавляющего большинства задач, плодить лишние файлы нет необходимости.

Как же сделать генератор html кода наглядным и читаемым?

В CodeIgniter есть зачатки решения этой задачи в виде хелпера HTML, библиотеки HTML Table, и некоторых других функций, которые позволяют генерировать html код путем передачи параметров и массивов, но подобные функции представлены далеко не для всех тегов, поэтому вместо всех их, предлагаю воспользоваться единой функцией преобразования массива в html.

Функция tag принимает 2 параметра, где первый - это название тега, а второй - массив конфигурации.

В массиве конфигурации могут быть следующие ключи:

  • html: вложенные элементы тега (может быть строкой или массивом)
  • attr: массив атрибутов тега (кроме style и class)
  • style: массив для генерации атрибута style
  • class: массив названий классов

Пример использования:

$html = tag(
    'div', 
    array(
        'attr' => array(
            'id' => '123'
        ),
        'html' => array(
            array(
                'a',
                array(
                    'class' => array('link', 'other'),
                    'style' => array(
                        'border-color' => '#00ff00'
                    ),
                    'html' => 'Ссылка',
                    'attr' => array(
                        'href' => 'http://example.com/link/',
                        'id' => 'my_link'
                    )
                )
            )
        )
    )
);

Исходный код:

if (function_exists('tag') == FALSE)
{
    function tag($tag, $params = array())
    {
        $return = '<'.$tag;

        if (isset($params['class']) != FALSE)
        {
            if (is_array($params['class']) == FALSE)
            {
                $params['class'] = array($params['class']);
            }

            $params['class'] = implode(' ', $params['class']);

            $params['class'] = trim($params['class']);

            if ($params['class'] != FALSE)
            {               
                $return .= ' class="'.$params['class'].'"';
            }           
        }

        if (isset($params['attr']) != FALSE)
        {
            foreach($params['attr'] as $key => $value)
            {
                if (is_array($value) != FALSE)              
                {
                    if (isset($value[count($value) - 1]) != FALSE)
                    {
                        $return .= ' '.$key.'="'.$value[count($value) - 1].'"';
                    }
                }
                else
                {           
                    $return .= ' '.$key.'="'.$value.'"';
                }
            }
        }

        if (isset($params['style']) != FALSE)
        {
            $return .= ' style="';

            if (is_array($params['style']) == FALSE)
            {
                $return .= $params['style'];
            }
            else
            {
                foreach($params['style'] as $key => $value)
                {
                    $return .= $key.':'.$value.';';
                }
            }       

            $return .= '"';
        }       

        if (isset($params['html']) == FALSE)
        {
            $return .= ' '.'/'.'>';
        }
        else
        {
            if (is_array($params['html']) != FALSE)
            {
                $html = '';

                foreach($params['html'] as $args)
                {
                    $html .= call_user_func_array('tag', $args);
                }

                $params['html'] = $html;
            }

            $return .= '>'.$params['html'].'<'.'/'.$tag.'>';
        }

        return $return;
    }   
}

24.04.2012