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

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

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

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

有帮助吗?

解决方案

首先,我强烈建议您购买 PHP Architect 的 PDF/电子书. 。它售价 20 美元,但却是我能找到的唯一简单明了的“Magento 的工作原理”资源。我也开始写了 我自己网站上的 Magento 教程.

其次,如果您有选择,并且不是经验丰富的程序员或无法接触经验丰富的程序员(最好是 PHP 爪哇), 选择另一辆购物车. 。Magento 设计精良,但它被设计为一个购物车解决方案,其他程序员可以在其上构建模块。它的设计初衷并不是让聪明人(但不是程序员)能够轻松理解。

三、Magento MVC 与 红宝石 on Rails, 姜戈, 代码点火器, 蛋糕PHP, , ETC。如今,MVC 模型在 PHP 开发人员中很流行。我认为这是基于 赞德 模型,整个事情非常像 Java OOP。有 您需要关心的控制器。module/frontName 控制器,然后是 MVC 控制器。

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

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

Magento 使用 电子AV 数据库架构。只要有可能,尝试使用系统提供的模型对象来获取您需要的信息。我知道这些都在 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 是供您修改的唯一命名空间,它不必是您公司的名称,而是我的 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 的 frontName 的 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 的第二部分现在是并且永远是controllerName。此行为是 Magento 中捆绑的 Zend Framework 的继承。

您现在应该能够点击以下 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 控制器类,看看应该如何使用模型和模板/布局系统。

其他提示

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

对于调试我绝对会推荐 使用FirePHP 当出现问题时查看 HTML 源代码。ole echo 调试方法实际上效果不太好。

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

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

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

Magento 使用类似的方法 Mage::getModel('mymodel'), Mage::getSingleton('mysingleton'), Mage::helper('myhelper') 返回某些类的对象。它默认在其核心命名空间中找到这些。如果您希望它使用您自己的,您需要在您的 config.xml 文件。

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

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

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

你会看到的 $this 被大量使用。这意味着不同的类,具体取决于您看到的文件。 get_class($this) 是您的朋友,尤其是与 FirePHP 结合使用时。

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

Magento 热爱面向对象。如果跟踪一个方法需要您经历 5-10 个不同的类,请不要感到惊讶。

阅读设计师指南 这里. 。它主要适用于图形设计师,但您 需要 它可以了解模块的输出将在何处以及为何结束。为此,请不要忘记在管理面板的开发人员部分中打开“模板路径提示”。

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

我宁愿推荐 法师2世代, ,这将帮助您生成样板文件,您可以只关注核心业务逻辑。它只是有助于加快速度。

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 Component Registrar 类在 Magento 2 系统中注册。现在我们将在模块根目录中创建文件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

完成完整流程后分享您的反馈

我试图从 Magaplaza hello world 教程中制作我的模块,但出了问题。我导入了这个模块的代码 https://github.com/astorm/magento2-hello-world 来自 github 并且它有效。从该模块中,我创建了一个类别子类别 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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top