23. Form and grid widgets

1. Structure and template
这里写图片描述
这里写图片描述

In Magento, the grid container automatically finds the grid content block (based on two protected attributes: _blockGroup, _controller) to render grid to HTML.
Secondly, the Form in Magento back-end is a basic template. The Form Widgets in Magento have some blocks as the followings:

这里写图片描述

这里写图片描述

Similar to the grid container, the form container automatically finds the form content block (based on protected attributes: _blockGroup and _controller) to render form to HTML.

这里写图片描述


2. How to use a grid in your extension
Now, we will create an adminhtml grid with some steps below:

Step 1: Create a grid container block. For example: app\code\local\Magestore\Tests\Block\Adminhtml\Tests.php
<?php

class Magestore_Tests_Block_Adminhtml_Tests extends Mage_Adminhtml_Block_Widget_Grid_Container
{
    public function __construct(){
        $this->_controller = 'adminhtml_tests';
        $this->_blockGroup = 'tests';
        $this->_headerText = Mage::helper('tests')->__('Item Manager');
        $this->_addButtonLabel = Mage::helper('tests')->__('Add Item');
        parent::__construct();
    }
}

这里写图片描述

Step 2: Create a grid block

Because the grid container above has the attribute _controller equal ‘adminhtml_test’, so we need to create a grid block app\code\local\Magestore\Tests\Block\Adminhtml\Tests\Grid.php
?php

class Magestore_Tests_Block_Adminhtml_Tests_Grid extends Mage_Adminhtml_Block_Widget_Grid
{
    public function __construct(){
        parent::__construct();
        $this->setId('testsGrid');
        $this->setDefaultSort('tests_id');
        $this->setDefaultDir('ASC');
        $this->setSaveParametersInSession(true);
    }

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

    protected function _prepareColumns(){
        $this->addColumn('tests_id', array(
            'header'    => Mage::helper('tests')->__('ID'),
            'align'  =>'right',
            'width'  => '50px',
            'index'  => 'tests_id',
        ));

        $this->addColumn('title', array(
            'header'    => Mage::helper('tests')->__('Title'),
            'align'  =>'left',
            'index'  => 'title',
        ));

        return parent::_prepareColumns();
    }

    protected function _prepareMassaction(){
        $this->setMassactionIdField('tests_id');
        $this->getMassactionBlock()->setFormFieldName('tests');

        $this->getMassactionBlock()->addItem('delete', array(
            'label'     => Mage::helper('tests')->__('Delete'),
            'url'       => $this->getUrl('*/*/massDelete'),
            'confirm'   => Mage::helper('tests')->__('Are you sure?')
        ));
        return $this;
    }

    public function getRowUrl($row){
        return $this->getUrl('*/*/edit', array('id' => $row->getId()));
    }
}
Step 3: Show the grid in a controllers/action by editing the layout file: app\design\adminhtml\default\default\layout\tests.xml
<?xml version="1.0"?>
<layout version="0.1.0">
    <testsadmin_adminhtml_tests_index>
        <reference name="content">
            <block type="tests/adminhtml_tests" name="tests" />
        </reference>
    </testsadmin_adminhtml_tests_index>
</layout>

3. How to use a form in your extension

To use a form in your extension, it’s necessary to create form’s blocks and attach them to your controller.

Step 1: Create a form container block (app\code\local\Magestore\Tests\Block\Adminhtml\Tests\Edit.php)
<?php
class Magestore_Tests_Block_Adminhtml_Tests_Edit extends Mage_Adminhtml_Block_Widget_Form_Container
{
    public function __construct(){
        parent::__construct();
        $this->_objectId = 'id';
        $this->_blockGroup = 'tests';
        $this->_controller = 'adminhtml_tests';
        $this->_mode = 'edit';

        $this->_updateButton('save', 'label', Mage::helper('tests')->__('Save Item'));
        $this->_updateButton('delete', 'label', Mage::helper('tests')->__('Delete Item'));
    }

    public function getHeaderText(){
        if(Mage::registry('tests_data') && Mage::registry('tests_data')->getId())
            return Mage::helper('tests')->__("Edit Item '%s'", $this->htmlEscape(Mage::registry('tests_data')->getTitle()));
        return Mage::helper('tests')->__('Add Item');
    }
}
Similar to the grid container, you have to declare some protected attributes, besides you can set _mode attribute (default is ‘edit‘).
Step 2: Create a form content block
Because form container attribute _mode is ‘edit‘, you need create form block:
(app\code\local\Magestore\Tests\Block\Adminhtml\Tests\Edit\Form.php)
<?php
class Magestore_Tests_Block_Adminhtml_Tests_Edit_Form extends Mage_Adminhtml_Block_Widget_Form
{
    protected function _prepareForm(){
        $form = new Varien_Data_Form(array(
            'id'        => 'edit_form',
            'action'    => $this->getUrl('*/*/save', array(
                'id'    => $this->getRequest()->getParam('id'),
            )),
            'method'    => 'post',
            'enctype'   => 'multipart/form-data'
        ));
        $form->setUseContainer(true);
        $this->setForm($form);
        return parent::_prepareForm();
    }
}
This block only defines a form that has no items. The form item will be added by a Tabs block as below:

Step 3: Create a Tabs block
(app\code\local\Magestore\Tests\Block\Adminhtml\Tests\Edit\Tabs.php)
<?php
class Magestore_Tests_Block_Adminhtml_Tests_Edit_Tabs extends Mage_Adminhtml_Block_Widget_Tabs
{
    public function __construct(){
        parent::__construct();
        $this->setId('tests_tabs');
        $this->setDestElementId('edit_form');
        $this->setTitle(Mage::helper('tests')->__('Item Information'));
    }

    protected function _beforeToHtml(){
        $this->addTab('form_section', array(
            'label'  => Mage::helper('tests')->__('Item Information'),
            'title'  => Mage::helper('tests')->__('Item Information'),
            'content'    => $this->getLayout()->createBlock('tests/adminhtml_tests_edit_tab_form')->toHtml(),
        ));
        return parent::_beforeToHtml();
    }
}
In this block, we add tab form_section to a form ‘tests/adminhtml_tests_edit_tab_form‘, so we need to create that block:
(app\code\local\Magestore\Tests\Block\Adminhtml\Tests\Edit\Tab\Form.php)
<?php
class Magestore_Tests_Block_Adminhtml_Tests_Edit_Tab_Form extends Mage_Adminhtml_Block_Widget_Form
{
    protected function _prepareForm(){
        $form = new Varien_Data_Form();
        $this->setForm($form);

        if (Mage::getSingleton('adminhtml/session')->getTestsData()){
            $data = Mage::getSingleton('adminhtml/session')->getTestsData();
            Mage::getSingleton('adminhtml/session')->setTestsData(null);
        }elseif(Mage::registry('tests_data'))
            $data = Mage::registry('tests_data')->getData();

        $fieldset = $form->addFieldset('tests_form', array('legend'=>Mage::helper('tests')->__('Item information')));

        $fieldset->addField('title', 'text', array(
            'label'     => Mage::helper('tests')->__('Title'),
            'class'     => 'required-entry',
            'required'  => true,
            'name'      => 'title',
        ));

        $form->setValues($data);
        return parent::_prepareForm();
    }
}
Step 4: Add a form to controllers/action in the controller file
public function editAction() {
    $id  = $this->getRequest()->getParam('id');
    $model  = Mage::getModel('tests/tests')->load($id);
    if ($model->getId() || $id == 0) {
        $data = Mage::getSingleton('adminhtml/session')->getFormData(true);
        if (!empty($data))
            $model->setData($data);
        Mage::register('tests_data', $model);

        $this->loadLayout();
        $this->_setActiveMenu('tests/tests');
        $this->getLayout()->getBlock('head')->setCanLoadExtJs(true);
        $this->_addContent($this->getLayout()->createBlock('tests/adminhtml_tests_edit'))
            ->_addLeft($this->getLayout()->createBlock('tests/adminhtml_tests_edit_tabs'));
        $this->renderLayout();
    } else {
        Mage::getSingleton('adminhtml/session')->addError(Mage::helper('tests')->__('Item does not exist'));
        $this->_redirect('*/*/');
    }
}
Here you can see two functions: _addContent and _addLeft to add the form’s content and tabs for the controllers/action.
This part ends here. Hope that you can take and extend the Magento experience that I’ve shared for your own needs.
在使用Python来安装geopandas包时,由于geopandas依赖于几个其他的Python库(如GDAL, Fiona, Pyproj, Shapely等),因此安装过程可能需要一些额外的步骤。以下是一个基本的安装指南,适用于大多数用户: 使用pip安装 确保Python和pip已安装: 首先,确保你的计算机上已安装了Python和pip。pip是Python的包管理工具,用于安装和管理Python包。 安装依赖库: 由于geopandas依赖于GDAL, Fiona, Pyproj, Shapely等库,你可能需要先安装这些库。通常,你可以通过pip直接安装这些库,但有时候可能需要从其他源下载预编译的二进制包(wheel文件),特别是GDAL和Fiona,因为它们可能包含一些系统级的依赖。 bash pip install GDAL Fiona Pyproj Shapely 注意:在某些系统上,直接使用pip安装GDAL和Fiona可能会遇到问题,因为它们需要编译一些C/C++代码。如果遇到问题,你可以考虑使用conda(一个Python包、依赖和环境管理器)来安装这些库,或者从Unofficial Windows Binaries for Python Extension Packages这样的网站下载预编译的wheel文件。 安装geopandas: 在安装了所有依赖库之后,你可以使用pip来安装geopandas。 bash pip install geopandas 使用conda安装 如果你正在使用conda作为你的Python包管理器,那么安装geopandas和它的依赖可能会更简单一些。 创建一个新的conda环境(可选,但推荐): bash conda create -n geoenv python=3.x anaconda conda activate geoenv 其中3.x是你希望使用的Python版本。 安装geopandas: 使用conda-forge频道来安装geopandas,因为它提供了许多地理空间相关的包。 bash conda install -c conda-forge geopandas 这条命令会自动安装geopandas及其所有依赖。 注意事项 如果你在安装过程中遇到任何问题,比如编译错误或依赖问题,请检查你的Python版本和pip/conda的版本是否是最新的,或者尝试在不同的环境中安装。 某些库(如GDAL)可能需要额外的系统级依赖,如地理空间库(如PROJ和GEOS)。这些依赖可能需要单独安装,具体取决于你的操作系统。 如果你在Windows上遇到问题,并且pip安装失败,尝试从Unofficial Windows Binaries for Python Extension Packages网站下载相应的wheel文件,并使用pip进行安装。 脚本示例 虽然你的问题主要是关于如何安装geopandas,但如果你想要一个Python脚本来重命名文件夹下的文件,在原始名字前面加上字符串"geopandas",以下是一个简单的示例: python import os # 指定文件夹路径 folder_path = 'path/to/your/folder' # 遍历文件夹中的文件 for filename in os.listdir(folder_path): # 构造原始文件路径 old_file_path = os.path.join(folder_path, filename) # 构造新文件名 new_filename = 'geopandas_' + filename # 构造新文件路径 new_file_path = os.path.join(folder_path, new_filename) # 重命名文件 os.rename(old_file_path, new_file_path) print(f'Renamed "{filename}" to "{new_filename}"') 请确保将'path/to/your/folder'替换为你想要重命名文件的实际文件夹路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值