Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
CRAP
100.00% covered (success)
100.00%
81 / 81
TwbBundleFormButton
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
34
100.00% covered (success)
100.00%
81 / 81
 render(\Zend\Form\ElementInterface $oElement, $sButtonContent = null)
100.00% covered (success)
100.00%
1 / 1
34
100.00% covered (success)
100.00%
81 / 81
<?php
namespace TwbBundle\Form\View\Helper;
use Zend\Form\LabelAwareInterface;
class TwbBundleFormButton extends \Zend\Form\View\Helper\FormButton
{
    /**
     * @var string
     */
    const GLYPHICON_PREPEND = 'prepend';
    /**
     * @var string
     */
    const GLYPHICON_APPEND = 'append';
    /**
     * @var string
     */
    private static $dropdownContainerFormat = '<div class="btn-group %s">%s</div>';
    /**
     * @var string
     */
    private static $dropdownToggleFormat = '%s <b class="caret"></b>';
    /**
     * @var string
     */
    private static $dropdownCaretFormat = '<button type="button" class="dropdown-toggle %s" data-toggle="dropdown"><span class="caret"></span></button>';
    /**
     * Allowed button options
     * @var array
     */
    protected static $buttonOptions = array('default', 'primary', 'success', 'info', 'warning', 'danger');
    /**
     * @see \Zend\Form\View\Helper\FormButton::render()
     * @param \Zend\Form\ElementInterface $oElement
     * @param string $sButtonContent
     * @throws \LogicException
     * @throws \Exception
     * @return string
     */
    public function render(\Zend\Form\ElementInterface $oElement, $sButtonContent = null)
    {
        if ($sClass = $oElement->getAttribute('class')) {
            if (!preg_match('/(\s|^)btn(\s|$)/', $sClass)) {
                $sClass .= ' btn';
            }
            if (!preg_match('/(\s|^)btn-.*(\s|$)/', $sClass)) {
                $sClass .= ' btn-default';
            } else {
                $bHasOption = false;
                foreach (self::$buttonOptions as $sButtonOption) {
                    if (preg_match('/(\s|^)btn-' . $sButtonOption . '.*(\s|$)/', $sClass)) {
                        $bHasOption = true;
                        break;
                    }
                }
                if (!$bHasOption) {
                    $sClass .= ' btn-default';
                }
            }
            $oElement->setAttribute('class', trim($sClass));
        } else {
            $oElement->setAttribute('class', 'btn btn-default');
        }
        //Retrieve glyphicon options
        if (null !== ($aGlyphiconOptions = $oElement->getOption('glyphicon'))) {
            $helperMethod = 'glyphicon';
        } elseif (null !== ($aGlyphiconOptions = $oElement->getOption('fontAwesome'))) {
            $helperMethod = 'fontAwesome';
        }
        //Define button content
        if (null === $sButtonContent) {
            $sButtonContent = $oElement->getLabel();
            if (null === $sButtonContent && !$aGlyphiconOptions) {
                throw new \DomainException(sprintf(
                    '%s expects either button content as the second argument, ' .
                    'or that the element provided has a label value or a glyphicon option; neither found',
                    __METHOD__
                ));
            }
            if (null !== ($oTranslator = $this->getTranslator())) {
                $sButtonContent = $oTranslator->translate(
                    $sButtonContent, $this->getTranslatorTextDomain()
                );
            }
        }
        if (! $oElement instanceof LabelAwareInterface || ! $oElement->getLabelOption('disable_html_escape')) {
            $escapeHtmlHelper = $this->getEscapeHtmlHelper();
            $sButtonContent = $escapeHtmlHelper($sButtonContent);
        }
        //Glyphicon
        if ($aGlyphiconOptions) {
            if(is_scalar($aGlyphiconOptions)) {
                $aGlyphiconOptions = array(
                    'icon' => $aGlyphiconOptions,
                    'position' => self::GLYPHICON_PREPEND
                );
            } elseif(!is_array($aGlyphiconOptions)){
                throw new \LogicException('"glyphicon" button option expects a scalar value or an array, "' . gettype($aGlyphiconOptions) . '" given');
            } elseif(!is_scalar($aGlyphiconOptions['icon'])){
                throw new \LogicException('Glyphicon "icon" option expects a scalar value, "' . gettype($aGlyphiconOptions['icon']) . '" given');
            } elseif(empty($aGlyphiconOptions['position'])){
                $aGlyphiconOptions['position'] = 'prepend';
            } elseif(!is_string($aGlyphiconOptions['position'])){
                throw new \LogicException('Glyphicon "position" option expects a string, "' . gettype($aGlyphiconOptions['position']) . '" given');
            } elseif($aGlyphiconOptions['position'] !== self::GLYPHICON_PREPEND && $aGlyphiconOptions['position'] !== self::GLYPHICON_APPEND){
                throw new \LogicException('Glyphicon "position" option allows "'.self::GLYPHICON_PREPEND.'" or "'.self::GLYPHICON_APPEND.'", "' . $aGlyphiconOptions['position'] . '" given');
            }
            if ($sButtonContent) {
                if($aGlyphiconOptions['position'] === self::GLYPHICON_PREPEND) {
                    $sButtonContent = $this->getView()->{$helperMethod}($aGlyphiconOptions['icon'],isset($aGlyphiconOptions['attributes'])?$aGlyphiconOptions['attributes']:null).' '.$sButtonContent;
                }
                else {
                    $sButtonContent .= ' '.$this->getView()->{$helperMethod}($aGlyphiconOptions['icon'],isset($aGlyphiconOptions['attributes'])?$aGlyphiconOptions['attributes']:null);
                }
            }
            else{
                $sButtonContent = $this->getView()->{$helperMethod}($aGlyphiconOptions['icon'],isset($aGlyphiconOptions['attributes'])?$aGlyphiconOptions['attributes']:null);
            }
        }
        //Dropdown button
        if ($aDropdownOptions = $oElement->getOption('dropdown')) {
            if (!is_array($aDropdownOptions)) {
                throw new \LogicException('"dropdown" option expects an array, "' . gettype($aDropdownOptions) . '" given');
            }
            if (empty($aDropdownOptions['split'])) {
                //Class
                if (!preg_match('/(\s|^)dropdown-toggle(\s|$)/', $sClass = $oElement->getAttribute('class'))) {
                    $oElement->setAttribute('class', trim($sClass . ' dropdown-toggle'));
                }
                //data-toggle
                $oElement->setAttribute('data-toggle', 'dropdown');
                $sMarkup = $this->openTag($oElement) . sprintf(self::$dropdownToggleFormat, $sButtonContent) . $this->closeTag();
            } //Ad caret element
            else {
                $sMarkup = $this->openTag($oElement) . $sButtonContent . $this->closeTag() . sprintf(self::$dropdownCaretFormat, $oElement->getAttribute('class'));
            }
            //No container
            if ($oElement->getOption('disable-twb')) {
                return $sMarkup . $this->getView()->dropdown()->renderListItems($aDropdownOptions);
            }
            //Render button + dropdown
            return sprintf(
                self::$dropdownContainerFormat,
                //Drop way
                empty($aDropdownOptions['dropup']) ? '' : 'dropup',
                $sMarkup
                . $this->getView()->dropdown()->renderListItems($aDropdownOptions)
            );
        }
        return $this->openTag($oElement) . $sButtonContent . $this->closeTag();
    }
}