3

対応するモデルの変更を編集するためのグリッドと対応するフォームを備えた完全に機能するバックエンド ページがあります。ユーザーからの yes/no 構成オプションに応答するため、ビット タイプの新しいフィールドをテーブルに追加しました。グリッドとフォームの両方にチェックボックスを追加しました。

私の問題は、数時間検索してさまざまなアプローチを試した後checked、グリッドとデータベースから対応するフィールドを読み取るフォームの両方でチェックボックスの値を設定できないことです。また、フォームの保存をクリックすると、チェックボックスに対応する値が常に1で保存されます。グリッドとフォームの他のすべては正常に機能します。ここここここここ、その他のサイトとSOの質問/回答を読みましたが、何が間違っているのかまだわかりません。オプション付きのコンボボックスを使用することを推奨するソリューションも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']));
4

2 に答える 2

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',
    ....
));
于 2012-12-04T15:23:48.420 に答える
0

@RSは、対応するモデル/データベースフィールドにチェックボックスの値を保存する方法という1つの問題に回答しました。しかし、グリッドとフォームの両方でチェックボックスを正しく表示する方法に関する問題は解決されませんでした。さらに検索を行った後、問題を解決するのに役立つこれら2つのリンクにたどり着きました。

グリッドの問題を修正するには:グリッドシリアライザーブロックを理解する

これで、チェックボックス列が追加されたコードの部分です。要素に追加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クラスリファレンス

この場合の問題は、私が使用しようとして$thisいたことでしたが、使用する必要があるのは、関数$dataの最初にロードされるものでした。_prepareForm@RSは正しい方向を示しましたが、レジストリのはモデルではなく配列であるため、使用することはできませ$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
));
于 2012-12-05T10:51:12.733 に答える