function _attrs($extra, $names) { $body = []; $a = []; foreach ((array) $names as $name) { if (strlen($name) && isset($extra[$name])) { $a[$name] = $extra[$name]; } } // Try to find and allow all data-* and ng-* attributes automatically foreach ((array) $extra as $name => $val) { if (strpos($name, 'data-') === 0 || strpos($name, 'ng-') === 0) { $a[$name] = $val; } } // Custom html attributes forced with sub-array "attr" if (is_array($extra['attr'])) { foreach ($extra['attr'] as $name => $val) { if (strlen($name)) { $a[$name] = $val; } } } // Make sure that class attribute contains unique names and also cleanup extra spaces if (isset($a['class']) && strpos($a['class'], ' ') !== false) { $a['class'] = _attr_class_clean($a['class']); } foreach ($a as $name => $val) { if (is_array($val)) { $body[$name] = _htmlchars($name) . '="' . http_build_query(_htmlchars($val)) . '"'; } else { if (!strlen($val)) { continue; } if ($name == 'id') { $val = fix_html_attr_id($val); } $body[$name] = _htmlchars($name) . '="' . _htmlchars($val) . '"'; } } return $body ? ' ' . implode(' ', $body) : ''; }
public function test_container() { $this->assertEquals('<form method="post" action="' . self::$action . '" class="form-horizontal" name="form_action" autocomplete="1"><fieldset>' . '<div class="' . self::$css['CLASS_FORM_GROUP'] . '"><div class="' . _attr_class_clean(self::$css['CLASS_CONTROLS'] . self::$css['CLASS_NO_LABEL']) . '"><section id="test"></section></div></div></fieldset></form>', str_replace(PHP_EOL, '', trim(form()->container('<section id="test"></section>')))); $this->assertEquals('<section id="test"></section>', trim(self::form_no_chain($r)->container('<section id="test"></section>'))); }