309

如何在 Magento 中完成以下任务?

  • 使用控制器/视图/模型方法显示“Hello World”消息。所以,如果我去http://example.com/myController它会显示字符串'Hello World'。能够在我的网站模板中显示此字符串(例如,页眉、页脚等)将是一个奖励。

  • 如何向此控制器(或必要时添加新控制器)添加方法,该方法与模型交互,执行查询Select * FROM articles where id='10'并将行(包含列id, title, content)返回给控制器?然后使用控制器包含一个视图,该视图将显示这一行。所以去http://example.com/myController/show_row(或类似的东西)会在视图中显示该行。(不需要花哨,只要 aecho $row->id;或类似的东西就可以了。)

有关 Magento 代码结构的任何其他信息也将非常有帮助。

4

6 回答 6

544

首先,我强烈建议您从 PHP Architect 购买 PDF/电子书。它是 20 美元,但它是我能找到的唯一直接的“Magento 的工作原理”资源。我还开始在我自己的网站上编写 Magento 教程

其次,如果您可以选择,但不是经验丰富的程序员或无法接触到经验丰富的程序员(最好是 PHPJava),请选择另一个购物车。Magento 设计精良,但它被设计成一个购物车解决方案,其他程序员可以在其上构建模块。它的设计不是为了让聪明但不是程序员的人容易理解。

第三,Magento MVC 与现在 PHP 开发人员流行的Ruby on RailsDjangoCodeIgniterCakePHP等 MVC 模型有很大不同。我认为它是基于Zend模型的,整个过程非常类似于 Java OOP。您需要关注两个控制器。module/frontName 控制器,然后是 MVC 控制器。

第四,Magento 应用程序本身是使用您将使用的相同模块系统构建的,因此围绕核心代码进行探索是一种有用的学习策略。此外,您将使用 Magento 做的很多事情都是覆盖现有的类。我在这里介绍的是创建新功能,而不是覆盖。当您查看那里的代码示例时,请记住这一点。

我将从您的第一个问题开始,向您展示如何设置控制器/路由器以响应特定的 URL。这将是一本小小说。稍后我可能有时间讨论与模型/模板相关的主题,但现在我没有。但是,我将简要谈谈您的 SQL 问题。

Magento 使用EAV数据库架构。只要有可能,尝试使用系统提供的模型对象来获取您需要的信息。我知道这些都在 SQL 表中,但最好不要考虑使用原始 SQL 查询来获取数据,否则你会发疯的。

最后的免责声明。我已经使用 Magento 大约两三周了,所以请谨慎购买。这是一个让我明白这一点的练习,就像帮助 Stack Overflow 一样。

创建一个模块

Magento 的所有添加和定制都是通过模块完成的。因此,您需要做的第一件事就是创建一个新模块。创建一个 XML 文件,app/modules命名如下

cd /path/to/store/app
touch etc/modules/MyCompanyName_HelloWorld.xml
<?xml version="1.0"?>
<config>
     <modules>
        <MyCompanyName_HelloWorld>
            <active>true</active>
            <codePool>local</codePool>
        </MyCompanyName_HelloWorld>
     </modules>
</config>

MyCompanyName 是您修改的唯一命名空间,它不必是您公司的名称,而是推荐的约定 my magento。HelloWorld是您的模块的名称。

清除应用程序缓存

现在模块文件已经到位,我们需要让 Magento 知道它(并检查我们的工作)。在管理应用程序中

  1. 转到系统->缓存管理
  2. 从所有缓存菜单中选择刷新
  3. 单击保存缓存设置

现在,我们确保 Magento 知道该模块

  1. 转到系统->配置
  2. 单击高级
  3. 在“禁用模块输出”设置框中,查找名为“MyCompanyName_HelloWorld”的新模块

如果您可以忍受性能下降,您可能希望在开发/学习时关闭应用程序缓存。没有什么比忘记清除缓存并想知道为什么您的更改没有显示更令人沮丧的了。

设置目录结构

接下来,我们需要为模块设置目录结构。您不需要所有这些目录,但现在设置它们并没有什么坏处。

mkdir -p app/code/local/MyCompanyName/HelloWorld/Block
mkdir -p app/code/local/MyCompanyName/HelloWorld/controllers
mkdir -p app/code/local/MyCompanyName/HelloWorld/Model
mkdir -p app/code/local/MyCompanyName/HelloWorld/Helper
mkdir -p app/code/local/MyCompanyName/HelloWorld/etc
mkdir -p app/code/local/MyCompanyName/HelloWorld/sql

并添加配置文件

touch app/code/local/MyCompanyName/HelloWorld/etc/config.xml

在配置文件中,添加以下内容,这本质上是一个“空白”配置。

<?xml version="1.0"?>
<config>
    <modules>
        <MyCompanyName_HelloWorld>
            <version>0.1.0</version>
        </MyCompanyName_HelloWorld>
    </modules>
</config>

过于简单化了,这个配置文件可以让你告诉 Magento 你想运行什么代码。

设置路由器

接下来,我们需要设置模块的路由器。这将使系统知道我们正在处理任何形式的 URL

http://example.com/magento/index.php/helloworld

因此,在您的配置文件中,添加以下部分。

<config>
<!-- ... -->
    <frontend>
        <routers>
            <!-- the <helloworld> tagname appears to be arbitrary, but by
            convention is should match the frontName tag below-->
            <helloworld>
                <use>standard</use>
                <args>
                    <module>MyCompanyName_HelloWorld</module>
                    <frontName>helloworld</frontName>
                </args>
            </helloworld>
        </routers>
    </frontend>
<!-- ... -->
</config>

你在这里说的是“任何带有 helloworld 前端名称的 URL ...

http://example.com/magento/index.php/helloworld

应该使用 frontName 控制器 MyCompanyName_HelloWorld”。

所以,有了上面的配置,当你加载上面的 helloworld 页面时,你会得到一个 404 页面。那是因为我们还没有为控制器创建文件。现在让我们这样做。

touch app/code/local/MyCompanyName/HelloWorld/controllers/IndexController.php

现在尝试加载页面。进步!你会得到一个 PHP/Magento 异常,而不是 404

Controller file was loaded but class does not exist

因此,打开我们刚刚创建的文件,并粘贴以下代码。类的名称需要基于您在路由器中提供的名称。

<?php
class MyCompanyName_HelloWorld_IndexController extends Mage_Core_Controller_Front_Action{
    public function indexAction(){
        echo "We're echoing just to show that this is what's called, normally you'd have some kind of redirect going on here";
    }
}

我们刚刚设置的是 module/frontName 控制器。这是默认控制器和模块的默认操作。如果你想添加控制器或动作,你必须记住 Magento URL 的树的第一部分是不可变的,它们总是这样http://example.com/magento/index.php/frontName/controllerName/actionName

所以如果你想匹配这个 url

http://example.com/magento/index.php/helloworld/foo

你必须有一个 FooController,你可以这样做:

touch app/code/local/MyCompanyName/HelloWorld/controllers/FooController.php
<?php
class MyCompanyName_HelloWorld_FooController extends Mage_Core_Controller_Front_Action{
    public function indexAction(){
        echo 'Foo Index Action';
    }

    public function addAction(){
        echo 'Foo add Action';
    }

    public function deleteAction(){
        echo 'Foo delete Action';
    }
}

请注意,默认控制器 IndexController 和默认操作 indexAction 可以是隐式的,但如果后面有东西,则必须是显式的。因此http://example.com/magento/index.php/helloworld/foo将匹配控制器 FooController 和动作 indexAction 而不是 IndexController 的动作 fooAction。如果你想要一个 fooAction,那么在控制器 IndexController 中你必须像这样显式地调用这个控制器: http://example.com/magento/index.php/helloworld/index/foo因为 url 的第二部分是并且将永远是控制器名。这种行为是对捆绑在 Magento 中的 Zend 框架的继承。

您现在应该可以访问以下 URL 并查看 echo 语句的结果

http://example.com/magento/index.php/helloworld/foo
http://example.com/magento/index.php/helloworld/foo/add
http://example.com/magento/index.php/helloworld/foo/delete

因此,这应该让您对 Magento 如何调度到控制器有一个基本的了解。从这里我建议查看现有的 Magento 控制器类,看看应该如何使用模型和模板/布局系统。

于 2009-02-26T01:07:06.960 回答
39

上个月左右我一直在与 Magento 搏斗,但我仍在努力解决问题。所以这是一个盲人带领盲人的例子。文档的方式很少,论坛/wiki充其量是混乱的。不仅如此,还有一些解决方案要么已经过时,要么远非最优。我不确定您是否有一个项目或只是想弄清楚,但如果您从修改现有功能而不是创建全新的功能开始可能会更容易。为此,我肯定会选择 wiki 中的“开发人员推荐文章”。新的付款方式一是真正令人大开眼界。

对于调试,我绝对推荐使用 FirePHP并在出现问题时查看您的 HTML 源代码。ole echo 调试方法并不能很好地工作。

总体架构非常复杂,即使我完全理解它,我也需要写一本书来涵盖它。我能做的最好的就是给你建议,我希望有人在我刚开始的时候给我...

远离核心文件。不要修改它们,而是编写你自己的模块并覆盖你需要的。

Magento 使用由 XML 组成的配置文件来决定它需要做什么。为了让它运行你自己的东西而不是核心功能,你需要正确的 xml。不幸的是,没有关于如何构建 XML 的指南。您需要查看示例并进行一些认真的测试。更复杂的是,这些文件的内容在很大程度上是区分大小写的。但是,如果您掌握了这些,您就可以覆盖基本功能的任何部分,从而形成一个非常强大的系统。

Magento 使用Mage::getModel('mymodel'), Mage::getSingleton('mysingleton'),之类的方法Mage::helper('myhelper')来返回某些类的对象。默认情况下,它会在其核心命名空间中找到这些。如果你想让它使用你自己的,你需要在你的config.xml文件中覆盖这些。

您的类的名称必须与它们所在的文件夹相对应。

Magento 中的许多对象最终都扩展了称为 a 的东西Varien_Object。这是一个通用类(有点像瑞士军刀),它在生活中的目的是允许您动态定义自己的方法/变量。例如,您会看到它被用作一个美化的数组,将数据从一种方法传递到另一种方法。

在开发过程中,请确保禁用缓存。它会让 magento 变得非常缓慢,但它会为你节省很多头部创伤(因为它会撞到你的桌子上)。

你会看到$this被大量使用。根据您看到的文件,这意味着不同的类。get_class($this)是你的朋友,尤其是与 FirePHP 一起使用。

把事情记在纸上。很多。在你遇到它们后 1-2 天你会需要无数的小事实。

Magento 喜欢 OO。如果跟踪一个方法会带您完成 5-10 个不同的类,请不要感到惊讶。

在此处阅读设计师指南。它主要适用于图形设计师,但您需要它来了解模块输出的位置和原因。为此,不要忘记在管理面板的开发人员部分中打开“模板路径提示”。

还有更多,但在这变成一篇论文之前我会在这里停下来。

于 2009-02-25T11:09:50.607 回答
3

我宁愿推荐Mage2Gen,这将帮助您生成样板,您可以只专注于核心业务逻辑。它只是有助于加快速度。

于 2018-06-27T14:55:32.787 回答
0

Magento 模块是一组目录,其中包含创建特定商店功能所需的块、控制器、助手和模型。它是 Magento 平台中的定制单元。可以创建 Magento 模块来执行具有支持逻辑的多种功能,以影响用户体验和店面外观。它有一个生命周期,允许它们被安装、删除或禁用。从商家和扩展开发者的角度来看,模块是 Magento 平台的核心单元。

模块声明

我们必须使用配置文件来声明模块。作为 Magento 2 在模块的 etc 目录中搜索配置模块。所以现在我们将创建配置文件 module.xml。

代码将如下所示:

<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="Cloudways_Mymodule" setup_version="1.0.0"></module> </config>

模块注册 该模块必须在 Magento 2 系统中使用 Magento Component Registrar 类进行注册。现在我们将在模块根目录中创建文件registration.php:

app/code/Cloudways/Mymodule/registration.php

代码将如下所示:

?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Cloudways_Mymodule',
__DIR__
);

检查模块状态 按照上述步骤,我们将创建一个简单的模块。现在我们将使用以下命令行检查模块的状态以及它是启用还是禁用:

php bin/magento module:status

php bin/magento module:enable Cloudways_Mymodule

完成整个过程后分享您的反馈

于 2018-11-20T14:36:11.830 回答
0

我试图从 magaplaza hello world 教程中制作我的模块,但是出了点问题。我从 github导入了这个模块的代码https://github.com/astorm/magento2-hello-world并且它有效。从该模块中,我创建了一个类别子类别 ajax 选择下拉模块。将其安装在 magento2 安装的 aap/code 目录后,请按照此 URL.. http://www.example.com/hello_mvvm/hello/world 您可以从这里下载其代码https://github.com/sanaullahAhmad/Magento2_cat_subcat_ajax_select_dropdowns 并将其放在您的 aap/code 文件夹中。比运行这些命令...

php bin/magento setup:update
php bin/magento setup:static-content:deploy -f
php bin/magento c:c

现在您可以使用以下 URL http://{{www.example.com}}/hello_mvvm/hello/world 检查模块功能

于 2019-09-03T07:36:58.373 回答
0

和,

我建议你了解系统配置。

如何在系统配置字段中显示所有类别?

在这里,我用一个很好的例子解决了。它工作。您可以检查和学习代码流。

还有其他太多的例子你应该学习。

于 2020-01-05T13:23:19.940 回答