Хелперы 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