'two',
4 => 'four',
6 => 'six',
8 => 'eight',
12 => 'twelve',
20 => 'medium',
30 => 'big',
45 => 'huge',
);
/**
* Constructor
*
* @access public
*/ function __construct() {
$template = CRM_Core_Smarty::singleton();
parent::__construct($template);
}
/**
* Static instance provider.
*
* Method providing static instance of as in Singleton pattern.
*/
static function &singleton() {
if (!isset(self::$_singleton)) {
self::$_singleton = new CRM_Core_Form_Renderer();
}
return self::$_singleton;
}
/**
* Creates an array representing an element containing
* the key for storing this. We allow the parent to do most of the
* work, but then we add some CiviCRM specific enhancements to
* make the html compliant with our css etc
*
* @access private
*
* @param $element HTML_QuickForm_element
* @param $required bool - Whether an element is required
* @param $error string - Error associated with the element
*
* @return array
*/
function _elementToArray(&$element, $required, $error) {
self::updateAttributes($element, $required, $error);
$el = parent::_elementToArray($element, $required, $error);
// add label html
if (!empty($el['label'])) {
$id = $element->getAttribute('id');
if (!empty($id)) {
$el['label'] = '';
}
else {
$el['label'] = "";
}
}
// Display-only (frozen) elements
if (!empty($el['frozen'])) {
if ($element->getAttribute('data-api-params') && $element->getAttribute('data-entity-value')) {
$this->renderFrozenEntityRef($el, $element);
}
$el['html'] = '
' . $el['html'] . '
';
}
// Active form elements
else {
if ($element->getType() == 'select' && $element->getAttribute('data-option-edit-path')) {
$this->addOptionsEditLink($el, $element);
}
if ($element->getType() == 'group' && $element->getAttribute('unselectable')) {
$this->appendUnselectButton($el, $element);
}
}
return $el;
}
/**
* Update the attributes of this element and add a few CiviCRM
* based attributes so we can style this form element better
*
* @access private
*
* @param $element HTML_QuickForm_element object
* @param $required bool Whether an element is required
* @param $error string Error associated with the element
*
* @return array
* @static
*/
static function updateAttributes(&$element, $required, $error) {
// lets create an id for all input elements, so we can generate nice label tags
// to make it nice and clean, we'll just use the elementName if it is non null
$attributes = array();
if (!$element->getAttribute('id')) {
$name = $element->getAttribute('name');
if ($name) {
$attributes['id'] = str_replace(array(']', '['),
array('', '_'),
$name
);
}
}
$class = $element->getAttribute('class');
$type = $element->getType();
if (!$class) {
if ($type == 'text') {
$size = $element->getAttribute('size');
if (!empty($size)) {
$class = CRM_Utils_Array::value($size, self::$_sizeMapper);
}
}
}
if ($type == 'select' && $element->getAttribute('multiple')) {
$type = 'multiselect';
}
// Add widget-specific class
if (!$class || strpos($class, 'crm-form-') === FALSE) {
$class = ($class ? "$class " : '') . 'crm-form-' . $type;
}
if ($required) {
$class .= ' required';
}
if ($error) {
$class .= ' error';
}
$attributes['class'] = $class;
$element->updateAttributes($attributes);
}
/**
* Render entity references as text.
* If user has permission, format as link (or now limited to contacts).
* @param $el array
* @param $field HTML_QuickForm_element
*/
function renderFrozenEntityRef(&$el, $field) {
$api = json_decode($field->getAttribute('data-api-params'), TRUE);
$vals = json_decode($field->getAttribute('data-entity-value'), TRUE);
if (isset($vals['id'])) {
$vals = array($vals);
}
$display = array();
foreach ($vals as $val) {
// Format contact as link
if ($api['entity'] == 'contact' && CRM_Contact_BAO_Contact_Permission::allow($val['id'], CRM_Core_Permission::VIEW)) {
$url = CRM_Utils_System::url("civicrm/contact/view", array('reset' => 1, 'cid' => $val['id']));
$val['text'] = '' . $val['text'] . '';
}
$display[] = $val['text'];
}
$el['html'] = implode('; ', $display) . '';
}
/**
* @param array $el
* @param HTML_QuickForm_element $field
*/
function addOptionsEditLink(&$el, $field) {
if (CRM_Core_Permission::check('administer CiviCRM')) {
// NOTE: $path is used on the client-side to know which option lists need rebuilding,
// that's why we need that bit of data both in the link and in the form element
$path = $field->getAttribute('data-option-edit-path');
// NOTE: If we ever needed to support arguments in this link other than reset=1 we could split $path here if it contains a ?
$url = CRM_Utils_System::url($path, 'reset=1');
$el['html'] .= ' ';
}
}
/**
* @param array $el
* @param HTML_QuickForm_element $field
*/
function appendUnselectButton(&$el, $field) {
// Initially hide if not needed
// Note: visibility:hidden prevents layout jumping around unlike display:none
$display = $field->getValue() !== NULL ? '' : ' style="visibility:hidden;"';
$el['html'] .= ' ';
}
}