4

I'm trying to add a CSS class to a Zend_Form_Element_Select option, but I just can't find a way to do it.

The desired output would be something like this:

<select name="hey" id="hey">
    <option value="value1" style="parent">label1</option>
    <option value="value2" style="sibling">sublabel1</option>
    <option value="value3" style="sibling">sublabel2</option>
    <option value="value4" style="parent">label2</option>
    <option value="value5" style="sibling">sublabel3</option>
    <option value="value6" style="sibling">sublabel4</option>
</select>

But I'm getting this:

<select name="hey" id="hey">
    <option value="value1">label1</option>
    <option value="value2">sublabel1</option>
    <option value="value3">sublabel2</option>
    <option value="value4">label2</option>
    <option value="value5">sublabel3</option>
    <option value="value6">sublabel4</option>
</select>

I can't seem to pass a CSS class attribute to any of the options in the select element although I can style the select element itselft.

My code:

$sel = new Zend_Form_Element_Select('hey');
$sel->setRequired(true)->setLabel('Select an Option:');
$sel->addMultiOption('value1', 'label1', array('class' => 'parent'))
    ->addMultiOption('value2', 'sublabel1', array('class' => 'sibling')) (etc...);

After researching a bit I found out that Element_Select doesn't have a method for adding CSS styles to the options in the select box, only for the select itself.

So, how can I add them? Should I extend the form_element_select? Or would a custom decorator suffice? Can anyone give me a hint? I'm baffled with this.

Thanks in advance!

3
  • 2
    That's supposed to be class, not style, right? Commented Feb 7, 2010 at 18:31
  • I'd like to accomplish the same thing for individual elements in a MultiCheckbox group. Commented May 26, 2010 at 14:43
  • take a look: stackoverflow.com/questions/6397015/… Commented Sep 23, 2013 at 14:19

4 Answers 4

1
$htmlEgressCss='<style>';
$multiOptions = array("" => "All");
$resEg = $this->commonDB->getEgressTrunk();
while ($row = $resEg->fetch()) {
    if($row['IsActive']==0){
        $htmlEgressCss .= '.egressClass select, option[value="'.$row['TrunkInfoID'].'"] {color:red;font-weight:bold;}';
    }
    $multiOptions[$row['TrunkInfoID']] = $row['IngressTrunkName'];
}
$htmlEgressCss.='</style>';
$this->addElement(
        'select',
        'cmbEgressTrunk',
        array(
            'multiOptions' =>$multiOptions,
        )
    );
$html = '<form><div>'.$this->cmbEgressTrunk .'</div></form>'.$htmlEgressCss;
Sign up to request clarification or add additional context in comments.

Comments

0

This is indeed not possible but already requested to be implemented:

See

Comments

0

You can add it with Javascript, specifically jQuery. This will result in the background of the select dropdown to be colored.

<style type="text/css">
    .t1 {background: red; color:#fff;}
</style>
<form>
    <select id="test">
        <option value="abc">ABC</option>
        <option value="123">123</option>
        <option value="foo">Foo</option>
    </select>

</form>

<script type="text/javascript">
$('#test [value*="abc"]').addClass('t1');
$('#test [value*="foo"]').addClass('t1');
</script>

Comments

0

In form :

<?php

require_once 'glx/Form/Element/Select.php'; // custom select class

// ... in init or __create function :

$categories = new Model_DbTable_Categories(); // some Model

$PID = new glx_Form_Element_Select('PID'); // custom select object

$PID
  ->setLabel('PID')
  ->setDecorators(array('ViewHelper'))
  ->addMultiOptions($categories->getSelectOptions())
;

File library/glx/Form/Select.php :

<?php

require_once 'Zend/Form/Element/Multi.php';

$error_reporting = error_reporting(0);
@include_once '../application/views/helpers/glxFormSelect.php'; // first, maby here
if (! class_exists('Zend_View_Helper_glxFormSelect'))
  require_once 'glx/View/Helper/glxFormSelect.php'; // or least, maby here
error_reporting($error_reporting);

class glx_Form_Element_Select extends Zend_Form_Element_Multi
{
  public $helper = 'glxFormSelect'; // this is my custom code
}

?>

File application/views/helpers/glxFormSelect.php or library/glx/View/Helpe/glxFormSelect.php :

<?php

require_once 'Zend/View/Helper/FormElement.php';

class Zend_View_Helper_glxFormSelect extends Zend_View_Helper_FormSelect
{
    public function glxFormSelect($name, $value = null, $attribs = null, $options = null, $listsep = "<br />\n")
    {
      return parent::formSelect($name, $value, $attribs, $options, $listsep);
    }

    protected function _build($value, $label, $selected, $disable)
    {
        if (is_bool($disable))
            $disable = array();

        $oldLabel = $label;                                                   // this is my custom code
        $label = ltrim($label);                                               // this is my custom code

        $opt = '<option'
             . ' value="' . $this->view->escape($value) . '"'
             . ' label="' . $this->view->escape($label) . '"';

        if (($countSpaces = strlen($oldLabel) - strlen($label)) > 0)          // this is my custom code
          $opt.= sprintf(' style="padding-left:%dpx"', (15 * $countSpaces));  // this is my custom code

        if (in_array((string) $value, $selected))
            $opt .= ' selected="selected"';

        if (in_array($value, $disable))
            $opt .= ' disabled="disabled"';

        $opt .= '>' . $this->view->escape($label) . "</option>";

        return $opt;
    }
}

?>

And final HTML result code (style padding-left added):

<select name="PID" id="PID">
<option value="1" label="Categories" style="padding-left:15px">Categories</option>
<option value="2" label="Publications" style="padding-left:30px">Publications</option>
<option value="83" label="Links" style="padding-left:45px">Links</option>
...

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.