繁体   English   中英

自定义Magento模块

[英]Custom Magento Module

所以我在后端创建了一个模块,我创建了一个shell模块(管理顶部菜单中的项目和要访问的页面。)基本上我想要一个输入字段,管理员可以输入一个数字然后单击一个按钮“添加“,这将在数据库中的现有表中插入一行。

$connection = Mage::getSingleton('core/resource')->getConnection('core_write');

$connection->beginTransaction();
$fields = array();
$fields['name']= 'andy';
$connection->insert('test', $fields);
$connection->commit();

我的数据库中有一个名为“test”的表。 如果我将上面的代码放入我的Controller文件中,当我访问管理页面时,它会成功地向数据库添加一行。 但我需要允许用户输入插入的数据。

我是否必须将该代码移动到模型中并以某种方式将输入数据发送到模型并让它完成工作? 或不。 如果这是正确的,有人可以指出我研究向模型发送数据的好地方吗? (如果那可能)

iv尝试了很多教程,但是它们都可以满足我的需要,我不需要显示任何东西,我只需要一个输入框和一个保存按钮。

编辑

我创建了一个文件块/ Adminhtml / Form / Edit / Form.php,其中包含以下内容。

class AndyBram_Presbo_Block_Adminhtml_Form_Edit_Form extends Mage_Adminhtml_Block_Widget_Form
{
protected function _prepareForm()
{
$form = new Varien_Data_Form(
array(
'id' => 'edit_form',
'action' => $this->getUrl('*/*/test'),
'method' => 'post',
)
);

$form->setUseContainer(true);
$this->setForm($form);

$fieldset = $form->addFieldset('display', array(
'legend' => 'Display Settings',
'class' => 'fieldset-wide'
));

$fieldset->addField('label', 'text', array(
'name' => 'label',
'label' => 'Label',
));

if (Mage::registry('andybram_presbo')) {
$form->setValues(Mage::registry('andybram_presbo')->getData());
}

return parent::_prepareForm();
}
}

然后在我的控制器中我有2个功能,如下所示。

public function indexAction()
    {
        $this->loadLayout();

        $this->_addContent($this->getLayout()->createBlock('presbo/adminhtml_form_edit_form'));



    }   
    public function testAction()
    {
        echo 'form data here';
        $this->loadLayout();
        $this->renderLayout();

    }

表单显示成功但没有按钮发送或说“执行操作”

进一步编辑

我已经成功地向表单添加了一个提交按钮,该表单成功转到testAction并回显“此处的表单数据”。

我如何访问数据,

iv添加以下行

$postData = $this->getRequest()->getPost();

现在,如果我回显$ postData,它只是把“数组”

如果我回显$ postData [0]它不会放任何东西只是一个空白页面

任何想法或指针?

Magento是作为MVC框架构建的 ,因此您是对的 - 您需要将数据从控制器传递到模型,而不是直接在控制器的代码中进行任何数据库更新。 示例的最佳来源是自己的Magento代码 - 您可以执行任何控制器操作,将数据保存到数据库以查看它是如何完成的。 例如,检查app/code/core/Mage/Adminhtml/controllers/NotificationController.php方法markAsReadAction()

在那里你可以看到:

  • 通过调用$this->getRequest()->getParam('id')从请求中检索数据 - 实际上这是问题的答案,如何获取提交的数据
  • 数据设置为模型,然后通过调用保存到DB
    $model->setIsRead(1)->save()

强烈建议遵循与模型一起使用的相同方法。 这使代码更好,更容易支持。

注意,Magento中“MVC”架构的“M”字母由两层表示:模型和资源模型。

楷模:

  • 包含实体的业务逻辑。 例如,向购物车模型添加十个项目会触发折扣规则
  • 由通用名称为<Your_Module>_Model_<Model_Name>
  • 如果需要使用DB,那么扩展Mage_Core_Model_Abstract并拥有一个资源模型,它负责数据库通信
  • 不需要实现基本的保存/加载方法,因为祖先Mage_Core_Model_Abstract已经准备好使用所有例程
  • 通过调用Mage::getModel('<your_module>/<model_name>')

资源模型:

  • 作为DB抽象层,从而保存/加载来自DB的数据,执行其他DB查询
  • 扩展Mage_Core_Model_Resource_Db_Abstract以便与DB通信
  • 由通用名称为<Your_Module>_Model_Resource_<Model_Name>
  • 当需要与DB通信时,由相应的模型自动创建

因此,在控制器中,您只关心创建模型。 资源模型由模型自动创建。

并且,根据上述所有内容,您的控制器应如下所示:

public function testAction()
{
    $model = Mage::getModel('your_module/your_model');
    $model->setName('andy');
    $model->save();
}

您可以在此处下载完整的工作示例。

根据您的具体情况,所提供的代码可能有多种变体。 但它代表了实现你想要的东西的一般方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM