Magento에서 간단한 'Hello World'모듈을 어떻게 만듭니 까?


305

마 젠토에서 다음을 어떻게 달성 할 수 있습니까?

  • 컨트롤러 / 뷰 / 모델 접근 방식을 사용하여 "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;비슷한 것이 작동합니다.)

마젠 토의 코드 구조에 대한 다른 정보도 도움이 될 것입니다.


6
시스템이 현상금을 인식하지 못하는 것 같습니다.
Alan Storm

2
바운티는 48 시간이 아니기 때문에 아직 열 수 없습니다. 그러나 가능한 빨리 열면 최상의 답변을 드릴 것입니다.
공감하기

아, 나는 바운티가 오래된 게시물, 사과에만 적용되는 것을 몰랐습니다.
Alan Storm

3
어렸을 때, 그는 항상 요원에게 중력을 가졌습니다. 그의 코드는 같은 방식으로 작동합니다.
vol7ron

답변:


539

우선, PHP Architect에서 PDF / E-Book 을 구입하는 것이 좋습니다 . 미화 20 달러이지만 내가 찾은 유일한 "마젠 토의 작동 방식"리소스입니다. 또한 내 웹 사이트에서 Magento 자습서를 작성하기 시작했습니다 .

둘째, 당신이 선택할 수 있고, 숙련 된 프로그래머가 아니거나 숙련 된 프로그래머 (이상적으로 PHP Java) 에 접근 할 수 없다면 , 다른 카트를 선택하십시오 . Magento는 잘 설계되었지만 다른 프로그래머가 모듈을 만들 수있는 쇼핑 카트 솔루션으로 설계되었습니다. 똑똑하지만 프로그래머는 아닌 사람들이 쉽게 이해할 수 있도록 설계되지 않았습니다.

셋째, Magento MVC는 Ruby on Rails , Django , CodeIgniter , CakePHP 등 요즘 PHP 개발자들에게 인기있는 MVC 모델과 는 매우 다릅니다 . Zend 모델을 기반으로 하고 있으며 모든 것이 Java OOP와 유사 하다고 생각합니다 . 거기에 당신에 대해 우려 할 필요가 컨트롤러. 모듈 / frontName 컨트롤러와 MVC 컨트롤러

넷째, Magento 응용 프로그램 자체는 사용하는 것과 동일한 모듈 시스템을 사용하여 빌드되므로 핵심 코드를 파는 것이 유용한 학습 전술입니다. 또한 Magento로 수행 할 작업은 기존 클래스를 재정의 하는 것입니다. 여기서 다루는 것은 재정의하지 않고 새로운 기능을 만드는 것 입니다. 코드 샘플을 볼 때이 점을 명심하십시오.

첫 번째 질문부터 시작하여 특정 URL에 응답하도록 컨트롤러 / 라우터를 설정하는 방법을 보여줍니다. 이것은 작은 소설이 될 것입니다. 나중에 모델 / 템플릿 관련 주제에 대한 시간이있을 수 있지만 지금은 그렇지 않습니다. 그러나 SQL 질문에 대해 간단히 이야기하겠습니다.

마 젠토는 EAV 데이터베이스 아키텍처를 사용합니다 . 가능하면 시스템이 제공하는 모델 객체를 사용하여 필요한 정보를 얻으십시오. SQL 테이블에 모든 것이 있다는 것을 알고 있지만 원시 SQL 쿼리를 사용하여 데이터를 가져 오는 것을 생각하지 않는 것이 가장 좋습니다. 그렇지 않으면 화가 날 것입니다.

최종 면책 조항. 약 2 ~ 3 주 동안 마 젠토를 사용해 왔으므로주의하십시오. 이것은 스택 오버플로를 돕기 위해 내 머리에 똑바로 넣는 운동입니다.

모듈 만들기

Magento에 대한 모든 추가 및 사용자 정의는 모듈을 통해 수행됩니다. 따라서 가장 먼저해야 할 일은 새 모듈을 만드는 것입니다. app/modules다음과 같이 이름이 지정된 XML 파일을 작성하십시오.

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. All Cache 메뉴에서 Refresh를 선택하십시오.
  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

이제 페이지를로드하십시오. 진행! 404 대신 PHP / Magento 예외가 발생합니다

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 에서이 컨트롤러를 다음과 같이 명시 적으로 호출해야합니다 .url http://example.com/magento/index.php/helloworld/index/foo의 두 번째 부분은 항상 controllerName이기 때문입니다. 이 동작은 Magento에 번들로 제공된 Zend Framework의 상속입니다.

이제 다음 URL을 방문하여 반향 문의 결과를 볼 수 있습니다

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 컨트롤러 클래스를 파킹하여 모델과 템플릿 / 레이아웃 시스템이 어떻게 사용되는지 확인하는 것이 좋습니다.


4
고마워, 이것은 매우 도움이됩니다. 당신의 대답이 완료 될 수 있도록 모델 / 데이터베이스 및 뷰를 사용하는 방법에 대한 몇 가지 정보를 추가하는 것을 고려하십시오
찬성 투표를 클릭

7
app / code / local / MyCompanyName / HelloWorld / etc / config.xml이 etc / modules (MyCompanyName_HelloWorld NOT mycompanyname_helloworld)에있는 XML과 동일한 케이스인지 확인하십시오. 그렇지 않으면 백엔드에 항목이 있습니다!
Moak

8
Alan의 완벽한 답변에 대한 작은 의견이 있습니다. "우리가 방금 설정 한 것은 모듈 / frontName 컨트롤러입니다. MVC 컨트롤러가 아닙니다." FooController와 동일한 유형의 컨트롤러입니다. ZF에서는 IndexController의 인덱스 액션이 기본적으로 호출 되므로 example.com/magento/index.php/helloworld 를 요청 하면 helloworld 모듈에서 IndexController :: indexAction ()을 호출합니다. 따라서 ... / helloworld / foo를 호출하면 helloworld 모듈에서 FooController를 찾고 indexAction ()을 호출합니다. IndexController :: fooAction ()을 트리거하려면 ... / helloworld / index / foo를 요청해야합니다.
Matus Zeman

2
@Matus Zeman의 응답을 읽고 IndexController에서 fooAction을 찾을 수없는 이유를 이해하십시오. 이는 '정상적인'Zend Framework MVC / 라우터이고 잘못된 URL을 사용했기 때문에 "이것은 귀하의 답변에 MVC 컨트롤러 "부분.
regilero

2
@ hypervisor666 "개발자 모드"(Google it)를 켭니다. 개발자 모드가 켜져 있으면 Magento는 XML 파일의 오류로 인해 충돌합니다.
Alan Storm

39

나는 지난 달 정도 Magento와 씨름하고 있었고 여전히 그것을 알아 내려고 노력하고 있습니다. 맹인을 이끄는 맹인의 경우입니다. 문서화 방법은 거의 없으며 포럼 / 위키는 혼란스러워합니다. 뿐만 아니라 오래되거나 최적의 솔루션이 몇 가지 있습니다. 프로젝트가 있는지 또는 그냥 알아 내려고하는지 확실하지 않지만 완전히 새로운 무언가를 만드는 대신 기존 기능을 수정하는 것이 더 쉽습니다. 이를 위해 위키의 "개발자에게 권장되는 기사"를 사용하겠습니다. 새로운 지불 방법 중 하나는 진정한 눈길을 사로 잡았습니다.

디버깅을 위해 FirePHP를 사용 하고 무언가 잘못되었을 때 HTML 소스를 보는 것이 좋습니다 . 올레 에코 디버그 방법은 실제로 모든 것이 잘 작동하지 않습니다.

일반적인 아키텍처는 엄청나게 복잡하기 때문에 완전히 이해하더라도 그것을 다루기 위해 책을 써야 할 것입니다. 내가 할 수있는 최선의 방법은 내가 처음 시작할 때 누군가가 내게 준 조언을하는 것입니다.

핵심 파일을 피하십시오. 그것들을 수정하지 말고, 대신 자신의 모듈을 작성하고 필요한 것을 무시하십시오.

Magento는 XML로 구성된 구성 파일을 사용하여 필요한 작업을 결정합니다. 핵심 기능이 아닌 자체 기능을 실행하려면 올바른 xml이 필요합니다. 불행히도 XML을 구축하는 방법에 대한 가이드는 없습니다. 예제를보고 심각한 테스트를 수행해야합니다. 문제를 복잡하게하기 위해 이러한 파일의 내용은 대소 문자를 구분합니다. 그러나 이것들을 마스터하면 매우 강력한 시스템을 만드는 기본 기능의 일부를 무시할 수 있습니다.

마 젠토는 방법이 좋아 사용 Mage::getModel('mymodel'), Mage::getSingleton('mysingleton'), Mage::helper('myhelper')특정 클래스의 개체를 반환 할 수 있습니다. 기본적으로 핵심 네임 스페이스에서이를 찾습니다. 자신의 것을 사용하려면 config.xml파일 에서 이것을 재정의해야 합니다.

수업 이름은 해당 수업의 폴더와 일치해야합니다.

Magento의 많은 객체는 궁극적으로이라는 것을 확장합니다 Varien_Object. 이것은 범용 클래스 (스위스 군용 칼과 같은 종류)이며 삶의 목적은 사용자가 직접 자신의 방법 / 변수를 정의 할 수 있도록하는 것입니다. 예를 들어, 한 메소드에서 다른 메소드로 데이터를 전달하기 위해 영광스러운 배열로 사용 된 것을 볼 수 있습니다.

개발 중에 캐싱이 비활성화되어 있는지 확인하십시오. 그것은 마 젠토를 엄청나게 느리게 만들지 만, 책상에서 두드리는 것에서 많은 머리 외상을 줄입니다.

$this많이 사용되는 것을 볼 수 있습니다. 그것은 당신이 보는 파일에 따라 다른 클래스를 의미합니다. get_class($this)특히 FirePHP와 함께 친구입니다.

종이에 물건을 적어 두십시오. 많이. 당신이 그들을 만난 후 1-2 일이 필요할 거라는 수많은 사실이 있습니다.

마 젠토는 OO를 좋아합니다. 메소드를 추적하여 5-10 개의 다른 클래스를 진행하더라도 놀라지 마십시오.

여기 에서 디자이너 안내서를 읽으 십시오 . 그것은 그래픽 디자이너를위한 대부분의 의미,하지만 당신은있어 필요한 모듈의 출력이 끝날 이유가 어디에 이해. 이를 위해 관리자 패널의 개발자 섹션에서 "템플릿 경로 힌트"를 설정하는 것을 잊지 마십시오.

더 많은 것이 있지만, 이것이 논문으로 바뀌기 전에 여기서 멈출 것입니다.


가능하면 더 많은 정보를 게시하십시오. 모든 정보는 매우 유용합니다. :)
클릭하여 투표

미사, 쿠키를 잃어버린 경우 모든 담당자가 사라질 것입니다.)
찬성 투표를 클릭

감사합니다! 이것은 매우 도움이됩니다.Ner
Ner

2

오히려 Mage2Gen을 권장 합니다 . 이것은 상용구를 생성하는 데 도움이되며 핵심 비즈니스 로직에 집중할 수 있습니다. 그것은 단지 속도를내는 데 도움이됩니다.


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 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

완전한 프로세스를 마친 후에 의견을 공유하십시오


0

magaplaza hello world tutorial에서 모듈을 만들려고했지만 문제가 발생했습니다. github 에서이 모듈 https://github.com/astorm/magento2-hello-world의 코드를 가져 와서 작동했습니다. 해당 모듈에서 카테고리 하위 카테고리 ajax select 드롭 다운 모듈을 작성했습니다. 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를 사용하여 모듈 기능을 확인할 수 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.