自定义Magento模块

自定义Magento模块,magento,module,admin,Magento,Module,Admin,因此,我在后端创建一个模块,我创建了一个shell模块(管理顶部菜单中的项目和要访问的页面)。基本上,我希望有一个输入字段,管理员可以在其中键入数字,然后单击“添加”按钮,这将在数据库中的现有表中插入一行 $connection = Mage::getSingleton('core/resource')->getConnection('core_write'); $connection->beginTransaction(); $fields = array(); $fields[

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

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

$connection->beginTransaction();
$fields = array();
$fields['name']= 'andy';
$connection->insert('test', $fields);
$connection->commit();
我的数据库中有一个名为“test”的表。如果我将上述代码放入我的控制器文件,当我访问管理页面时,它会成功地将一行添加到数据库中。但是我需要允许用户输入插入的数据

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

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

编辑

我已经创建了一个文件block/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();
}
}
然后在我的控制器中,我有如下两个函数

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和echo的“form data here”

然后我如何访问数据

iv添加了以下行

$postData = $this->getRequest()->getPost();
现在如果我回显$postData,它只会放入“array”

如果我回显$postData[0],它不会将任何内容放在一个空白页上

有什么想法或建议吗?

Magento是作为一个构建的,因此您是对的-您需要将数据从控制器传递到模型,并且不要直接在控制器的代码中进行任何数据库更新。最好的示例源代码是自己的Magento代码-您可以执行任何控制器操作,将数据保存到DB以查看如何执行。例如,检查
app/code/core/Mage/Adminhtml/controllers/NotificationController.php
method
markAsReadAction()

你可以看到:

  • 通过调用
    $this->getRequest()->getParam('id')
    -实际上这就是答案 对于这个问题,如何获取提交的数据
  • 数据设置为model,然后通过调用
    $model->setIsRead(1)->save()
强烈鼓励采用与模型相同的方法。这使得代码更好、更容易支持

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

型号:

  • 包含实体的业务逻辑。例如,将十个项目添加到 购物车模型触发折扣规则
  • 由通用名称为
    \u Model\u的类表示
  • 如果需要使用DB,则扩展
    Mage\u Core\u Model\u Abstract
    并拥有资源 模型,负责数据库通信
  • 不需要实现基本的save/load方法,就像祖先一样
    Mage\u Core\u Model\u Abstract
    已经有了所有可以使用的例程
  • 通过调用
    Mage::getModel('/')创建
资源模型:

  • 充当数据库抽象层,从而从数据库保存/加载数据,执行 其他数据库查询
  • 扩展
    Mage\u Core\u Model\u Resource\u Db\u Abstract
    以便与数据库通信
  • 由通用名称为的类表示
    \u模型\u资源
  • 当需要与数据库通信时,由相应的模型自动创建
因此,在控制器中,您只关心创建模型。资源模型由模型自动创建

根据以上所述,您的控制器应该如下所示:

public function testAction()
{
    $model = Mage::getModel('your_module/your_model');
    $model->setName('andy');
    $model->save();
}
你可以下载一个你需要的东西的完整的工作示例


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

您已经创建了管理表单吗?我将在上面的帖子中添加,它不适合在注释中。$this->getRequest()->getParam('param_name');当您在getParam中使用'param_name'时,这是表单中字段的名称吗?它有效!!!!蒂姆:你是我的救世主,我已经努力了好几天了,谢谢你的帮助哇,谢谢你的回复,我有几个问题,我看了一下示例代码,在testController的第7行有一个调用$model->setName(“”);但是我找不到setName(“”)的函数描述符;这个例子不在前端吗?在配置文件中使用standard?抱歉,只需重新阅读您评论的最后两行,它可以更改为admin区域,再次感谢您我将尝试这种方法:)好的,很好,您使用admin action controller解决了这个问题。关于
setName()
-您可以在模型对象上调用set/get。这将在该模型中的
$\u data
数组中设置/获取“any\u field”条目,然后在调用
save()
方法时将其保存到数据库中。这些方法调用由magic method
\uuu call()
处理,它在
Varien\u Object
类中声明,是大多数Magento模型(以及许多其他实体)的祖先。您可以在
lib/Varien/Object.php
中找到源代码。我建议您安装XDebug,它将帮助您跟踪Magento的细节。嗨,Andrey,我正在查看您为我创建的示例更改模块和名称空间的名称,在config.xml中,在您的_module_资源下有一个标记,该标记看起来像。现在,如果上面看起来像->andybram\u presbo\u资源,那么table标记会像andybram\u table吗??很多人感谢表标记只是表别名到实际表名的映射。它不受资源标记名称的影响。所以