MenuItemContentQuick.php #1

  • //
  • guest/
  • perforce_software/
  • chronicle/
  • main/
  • application/
  • menu/
  • forms/
  • MenuItemContentQuick.php
  • View
  • Commits
  • Open Download .zip Download (5 KB)
<?php
/**
 * This form is specialized for quickly editing content 
 * menu items from the context of content editing.
 * 
 * @copyright   2011 Perforce Software. All rights reserved.
 * @license     Please see LICENSE.txt in top-level folder of this distribution.
 * @version     <release>/<patch>
 */
class Menu_Form_MenuItemContentQuick extends Menu_Form_MenuItemContent
{
    /**
     * Defines the elements that make up the 'quick' content menu item form.
     * Called automatically when the form object is created.
     */
    public function init()
    {
        parent::init();
        
        // remove elements we don't care to expose here.
        $remove = array('type', 'contentId', 'target', 'class', 'save');
        array_map(array($this, 'removeElement'), $remove);
        $this->removeDisplayGroup('buttons');
        
        // in content post-save (when we are actually dealing with this form),
        // we need access to fields that are normally ignored, expose them.
        $expose = array('uuid', 'menuId', 'position', 'location');
        foreach ($expose as $name) {
            $this->getElement($name)->setIgnore(false);
        }

        // tweak label element to change label and hide input by default.
        $label = $this->getElement('label');
        $label->getDecorator('htmlTag')->setOption('style', 'display: none;');
        
        // hide the onClick element while editing menu items in the context of 
        // editing content.
        $onClick = $this->getElement('onClick');
        $onClick->getDecorator('htmlTag')->setOption('style', 'display: none;');
        $onClick->getDecorator('label')->setOption('style', 'display: none;');
        
        // tweak checkbox onChange behavior for content editing context.
        // show/hide the label field and update its value as appropriate.
        $this->getElement('autoLabel')->setAttrib(
            "onClick", 
            "
            var fieldset = new dojo.NodeList(this).closest('fieldset')[0];
            var label    = dojo.query('input[type=text][name*=\'label\']', fieldset)[0];
            if (this.anim && this.anim.status() != 'stopped') {
                this.anim.stop();
            }
            if (this.checked) {
                dojo.attr(label, 'disabled', true);
                this.anim = p4cms.ui.hide(label.parentNode);
            } else {
                // update title to match content title
                var subForm  = new dojo.NodeList(this).closest('[dojotype=p4cms.content.SubForm]')[0];
                subForm      = dijit.byNode(subForm);
                var title    = dojo.query('input[name=title]', subForm.getContentEntry().domNode)[0];
                label.value = title ? title.value : '';
                
                dojo.removeAttr(label, 'disabled');
                this.anim = p4cms.ui.show(label.parentNode);
            }
            "
        );
        
        // add a button to delete the menu item.
        $this->addElement(
            'checkbox',
            'remove',
            array(
                'label'     => "Remove",
                'order'     => -1000,
                'class'     => 'menu-item-remove',
                'onClick'  => "
                    var checkbox = this;
                    p4cms.ui.hide(
                        new dojo.NodeList(checkbox).closest('fieldset')[0],
                        {onEnd: function(){dojo.attr(checkbox, 'checked', true);}}
                    );
                "
            )
        );
        $element = $this->getElement('remove');
        $this->moveCheckboxLabel($element);
        $element->getDecorator('htmlTag')->setOption('class', 'menu-item-remove');
    }
    
    /**
     * Extends parent to hide label field if using content's title.
     * 
     * @param   P4Cms_Record|array  $defaults   the default values to set on elements
     * @return  Zend_Form           provides fluent interface
     */
    public function setDefaults($defaults)
    {
        parent::setDefaults($defaults);
        
        $this->getElement('label')->getDecorator('htmlTag')->setOption(
            'style', 
            $this->getValue('label') ? null : 'display: none;'
        );
        
        return $this;
    }
    
    /**
     * Validate the form, if item is deleted, don't validate other fields.
     *
     * @param  array    $data   the data to validate.
     * @return boolean
     */
    public function isValid($data)
    {
        // dissolve a copy of data into a new values array so
        // we can find the remove element
        $values = $data;
        if ($this->isArray()) {
            $eBelongTo = $this->getElementsBelongTo();
            $values    = $this->_dissolveArrayValue($data, $eBelongTo);
        }

        // if we are doing a remove skip other checks
        if (isset($values['remove']) && $values['remove']) {
            return true;
        }
        
        return parent::isValid($data);
    }

    /**
     * Extended to only include menus we want to show when editing content.
     * 
     * @return  P4Cms_Model_Iterator    menus and menu items in a single flat list.
     */
    protected function _getLocations()
    {
        $filter = new P4Cms_Record_Filter;
        $filter->add('showInContentForm', '1');
        
        return P4Cms_Menu::fetchMixed(array('filter' => $filter));
    }    
}
# Change User Description Committed
#1 16170 perforce_software Move Chronicle files to follow new path scheme for branching.
//guest/perforce_software/chronicle/application/menu/forms/MenuItemContentQuick.php
#1 8972 Matt Attaway Initial add of the Chronicle source code