Magento,在网格上添加并设置一个复选框并形成后端

时间:2012-12-04 14:15:46

标签: forms magento checkbox magento-1.7 backend

我有一个完整工作的后端页面,其中包含一个网格和相应的表单,用于编辑相应模型的更改。我在表上添加了一个新字段,比特类型,因为它将回答用户的是/否配置选项。我在网格和表格上添加了复选框。

我的问题是,经过几个小时的搜索和尝试不同的方法后,我无法在网格和从数据库中读取相应字段的表单上设置复选框checked值。此外,当我点击表单上的保存时,与复选框对应的值始终保存为 1 。网格上的所有其他内容和表单都可以正常工作。我已阅读herehereherehere以及更多网站和SO questions/answers,但仍然不知道我做错了什么。有些解决方案建议使用带有YES/NO选项的组合框,但我想要一个复选框,不会那么困难。

函数_prepareColumns()中的网格代码:

protected function _prepareColumns() {
    ...
    $this->addColumn('banner_gral', array(
        'header'    => Mage::helper('banners')->__('General'),
        'align'     => 'center',
        'index'     => 'banner_gral',
        'type'      => 'checkbox',
        'values'    => $this->getBannerGral()==1 ? 'true' : 'false',
     ));
    ...
}

public function __construct()
{
    parent::__construct();
    $this->setId('bannersgrid');
    $this->setDefaultSort('bannerid');
    $this->setDefaultDir('asc');
    $this->setSaveParametersInSession(true);
    $this->setUseAjax(true);
}

public function getGridUrl()
{
    return $this->getUrl('*/*/grid', array('_current'=>true));
}

protected function _prepareCollection()
{
    $collection = Mage::getModel('banners/bannersadmin')->getCollection();
    $this->setCollection($collection);
    return parent::_prepareCollection();
}

表单代码,用于在函数_prepareForm()中添加复选框:

protected function _prepareForm()
{
    $id = $this->getRequest()->getParam('id');
    $params = array('id' => $this->getRequest()->getParam('id'));

    if (Mage::registry('banners_data')->getdata())  {
        $data = Mage::registry('banners_data')->getdata();
    }
    elseif (Mage::getSingleton('adminhtml/session')) {
        $data = Mage::getSingleton('adminhtml/session')->getdata();
        Mage::getSingleton('adminhtml/session')->getdata(null);
    }
    else {
        $data = array();
    }

    $form = new Varien_Data_Form(array(
                                    'id' => 'edit_form',
                                    'action' => $this->getUrl('*/*/save', $params),
                                    'method' => 'post',
                                    'enctype' => 'multipart/form-data',
    ));
    ...

    $fieldset->addField('banner_gral', 'checkbox', array(
        'label'    => Mage::helper('banners')->__('Is general'),
        'name'     => 'banner_gral',
        'class'    => 'banner_gral',
        'checked'  => $this->getBannerGral()==1 ? 'true' : 'false',
        'onclick'  => 'this.value == this.checked ? 1 : 0',
        'note'     => Mage::helper('banners')->__('blablablabla'),
        'tabindex'  => 2
    ));
    ...
}

在我的表格的saveAction()上:

$campaign->setbanner_gral(!empty($data['banner_gral']));

2 个答案:

答案 0 :(得分:10)

保存复选框数据时,在控制器saveAction()中执行

$banner_gral = isset($your_form_Data['banner_gral']) ? 1 : 0;

对于网格和表单页面

在你的控制器中你应该有Mage :: register(...) - > getData()或Mage :: register(...)

public function editAction()
     ....
     Mage::register('example_data', $model);

在表单_prepareForm()

$model = Mage::registry('example_data'); // NOTE registry('example_data'); NOT registry('example_data')->getData();

$fieldset->addField('entire_range', 'checkbox', array(
      ....
      'checked'    => $model->getBannerGral()==1 ? 'true' : 'false',
       ......
))

请参阅http://www.magentocommerce.com/boards/viewthread/20536/

在您的网格上_prepareColumns()

$this->addColumn('banner_gral', array(
    ....
    'type'     => 'checkbox',
    'index'    => 'banner_gral',
    'values'   => array(1,2),
    'field_name' => 'checkbox_name',
    ....
));

答案 1 :(得分:0)

@ R.S回答了一个问题,如何在相应的模型/数据库字段中保存复选框值。但是如何正确显示网格和表单上的复选框的问题仍未解决。在做了一些搜索之后,我终于找到了这两个帮助我解决问题的链接。

更正网格问题:Understanding the Grid Serializer Block

现在添加了复选框列的代码部分,看到我在array(1,2)元素上添加了values

$this->addColumn('banner_gral', array(
        'header'   => Mage::helper('banners')->__('General'),
        'width'    => '20px',
        'type'     => 'checkbox',
        'align'    => 'center',
        'index'    => 'banner_gral',
        'values'   => array(1,2),
        'editable' => 'false',
));

另外,如果你看一下Magento的核心代码,类Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Checkbox会返回一个值数组。看看这里终于让我走上了正确的道路。

/**
 * Returns values of the column
 *
 * @return array
 */
public function getValues()
{
    if (is_null($this->_values)) {
        $this->_values = $this->getColumn()->getData('values') ? $this->getColumn()->getData('values') : array();
    }
    return $this->_values;
}

更正表单问题:Mage_Adminhtml_Block_System_Store_Edit_Form Class Reference

这个案例的问题是我试图使用$this,但我需要使用的是$data函数开头加载的_prepareForm。 @R.S指出了正确的方向,但是不可能使用$model->getBannerGral(),因为注册表上的$data是一个数组,而不是模型。因此,使用$data["banner_gral"]我可以获得复选框所需的值。经过测试,它正在运作。

$fieldset->addField('banner_gral', 'checkbox', array(
        'label'    => Mage::helper('banners')->__('Is general'),
        'name'     => 'banner_gral',
        'checked'  => $data["banner_gral"],
        'onclick'  => 'this.value = this.checked ? 1 : 0;',
        'note'     => Mage::helper('banners')->__('blablablabla'),
        'tabindex' => 2
));