맞춤 확장 프로그램을 작성하는 방법


143

최근에 무료 및 상용 확장 프로그램에서 많은 문제가 발생했기 때문에이 질문을하고 확장 프로그램을 작성할 때 일반적으로 따르는 단계에 따라이 질문에 대답하기로 결정했습니다. 답변을 수정하거나 새 답변을 추가하십시오.
확장 프로그램이나 테마를 설치할 때 대부분의 경우 필요한 모든 환경에서 작동하려면 몇 시간 (때로는 더 적거나 때로는 적은 시간)을 소비해야합니다.

  • dev : 일반적으로 localhost프로젝트가 하위 폴더에있는 곳
  • 프리프로드 및 라이브

이것은 큰 확장 프로그램 공급자의 확장 프로그램에서도 발생했습니다 (적어도 실제로 화가 나고 여기에 이름을 추가 할 때까지는 이름이 없어야 함)
. 주된 질문은 .. 확장 프로그램을 작성할 때 품질을 보장하기 위해 고려해야 할 단계는 무엇입니까? 기술 및 비 기술자가 코드를 사용하고 기술 담당자가 코드를 쉽게 변경할 수 있도록 하시겠습니까?


11
대규모 확장 제공 업체 중 하나가이 질문을 좋아하지 않고 다운 보딩 한 것 같습니다. :)
Marius

1
개인적으로, 절대적으로 Wyomind 아니 확률값,하지만 그들은 자신의 코드를 암호화하고 "프리미엄 파트너":( (단지 예를 들어) 여전히
sv3n

답변:


185

여기 내가 일반적으로하는 일이 있습니다.

  1. 항상 error_reportingon으로 개발하십시오 .
  2. isDeveloperMode설정하여 항상 개발하십시오 true. 파일 또는 Nginx 또는 그 밖의 다른 파일에 추가 SetEnv MAGE_IS_DEVELOPER_MODE 1하십시오.httpd.conf
  3. 확장이 핵심 기능에 링크 된 경우 선언 파일에 종속성을 추가하십시오. <depends><Mage_Catalog /></depend>
  4. 모듈이 커뮤니티 community용인 경우 코드 풀로 사용 하여 개발자가 코드를 직접 수정하지 않고 일부 클래스를 대체 할 수있는 기회를 제공하십시오.
  5. app/design/frontend/base/default 모든 테마에서 사용할 수 있도록 프론트 엔드 디자인 파일을 넣으십시오 .
  6. 관리자 디자인 파일을 app/design/adminhtml/default/default넣고 관리자 테마를 변경하지 마십시오. 내 모듈 중 하나에서 변경하고 싶을 수도 있습니다.
  7. 레이아웃 파일 이름과 템플릿 폴더 이름 앞에 회사 이름을 접두어 쉽게 구분할 수 있습니다. easylife_articles.xmlapp/design/.../easylife_articles
  8. 정적 리소스 (JavaScript, CSS 및 이미지)를 템플릿 파일과 유사한 폴더에 넣습니다. easylife_articles/images/doh.png
  9. 확장을 설치 제거하는 방법으로 간단한 텍스트 파일을 첨부하십시오. 제거해야 할 파일, 제거해야하는 테이블, 테이블에서 제거해야하는 구성 설정 core_config_data.
  10. 모델, 블록 또는 헬퍼에 직접 쿼리를 작성하지 말고 이에 대한 자원 모델을 사용하십시오.
  11. 테이블 이름을 사용하여 쿼리를 직접 쓰지 마십시오 Select * from sales_flat_order where .... 를 사용하고를 사용 Zend_Select하여 테이블 이름을 변환하십시오 ->getTable('sales/order').
  12. 기본 URL을 사용하여 js템플릿에 파일 을 포함 시킵니다. 잘못되었습니다 <script type="text/javascript" src="../js/some.js"></script> . 권리 <script type="text/javascript" src="<?php echo Mage::getBaseUrl('js').'some.js'?>"></script>
  13. 필요한 경우가 아니면 클래스를 다시 쓰지 마십시오. 관찰자를 사용하고 재정의하려는 클래스의 매개 변수 및 인스턴스로받는 도우미 메서드를 사용할 수없는 경우 사용합니다. 잘못됨 : Mage_Catalog_Model_Product메소드를 추가하도록 재정의 하십시오 getProductArticles(). 맞아 . 도우미에서 추가 getProductArticles(Mage_Catalog_Model_Product $product)
  14. 클래스를 재정의하면 readme.txt파일 목록을 클래스에 넣습니다.
  15. 모듈의 관리 섹션에 기본 관리 경로를 사용하십시오. 관리 URL이 잘못되었습니다 articles/adminhtml_articles/index . 올바른 관리자 URL admin/articles/index
  16. 관리자 섹션에 ACL을 추가하십시오. 일부 관리자에 대한 액세스를 제한하고 싶을 수도 있습니다.
  17. 필요하지 않은 경우 다른 JavaScript 프레임 워크 (jQuery, MooTools 등)를 추가하지 마십시오. 프로토 타입에 코드를 작성하십시오.
  18. 템플릿 HTML W3C를 유효하게 만드십시오 (나 같은 OCD 개발자를위한 것임).
  19. media폴더 에 이미지를 넣지 마십시오 . 사용하십시오 skin. media 폴더는 일반적으로 버전이는 열심히 서로 다른 환경에 웹 사이트를 이동할 수 있습니다되지 않습니다.
  20. 플랫 카탈로그를 켜고 끈 상태에서 확장을 테스트하십시오. 개발 시간을 두 배로 늘리지 않으려면 Chaos Monkey를 사용하십시오 .
  21. cache on및 cache로 확장을 테스트하십시오 off.
  22. 모듈과 클래스 이름에 대문자를 사용하지 마십시오. 제대로 테스트하지 않으면 다른 OS에서 문제가 발생할 수 있습니다. 이것은 '필수'가 아니라 더 권장 사항입니다.
  23. 개발자가 기능을 쉽게 변경할 수 있도록 코드에 이벤트를 전달하십시오.
  24. Magento가 사용하는 것과 동일한 코딩 표준을 따르고 코드에 주석을 답니다.
  25. PHP 짧은 태그 ( <? $this->doSomething() ?>)를 사용하지 마십시오 . 전체 태그 ( <?php $this->doSomething()?>)를 사용하십시오 . 또한 짧은 에코 태그를 사용하지 마십시오. ( <?="D'oh";?>). 사용 ( <?php echo "D'oh";?>)
  26. 언어를 사용하여 텍스트를 $this->__번역 app/local/en_US/Easylife_Articles.csv하고 최소한 en_US언어에 대해서는 텍스트 ( ) 와 함께 로캘 번역 파일을 추가하십시오 . 모든 웹 사이트가 영어로 작성된 것은 아니며 번역 할 텍스트를 식별하는 데 많은 시간이 소요됩니다.
  27. 확장 프로그램을 판매하는 경우 최소한 기본 지원을 제공하십시오. 또는 적어도 지원 이메일에 답하십시오.
  28. 라이센스 확인을 위해 내선 번호를 통해 서버를 계속 호출하지 마십시오. 한 번 설치하면 충분합니다 (이 방법은 마음에 들지 않지만 항상 전화를 거는 것보다 낫습니다). ( 이 질문에서 영감을 얻음 )
  29. 로그가 활성화 된 상태에서 개발하고 때때로 var/log/system.log파일을 살펴보십시오 . 여기에 나열된 오류는 개발자 모드가 켜져 있어도 표시되지 않습니다. 오류가 하나 이상 있으면 확장 실행 후 몇 개월이 지나면 큰 로그 파일이 생성됩니다.
  30. 확장 프로그램이 결제 프로세스 또는 주문에 어떤 식 으로든 영향을 미치는 경우, 다중 배송에서 작동하는지 확인하거나 다중 배송에서 작동하지 않아야하는지 확인하십시오.
  31. 기본 관리자 알림 표시 줄 (또는 피드 URL)을 바꾸지 마십시오. 내가 제공해야 할 것에 관심이 있다면 뉴스 레터를 구독하겠습니다. 마젠 토의 말을 봅시다. 나에게 더 중요하다.
  32. Ioncube (또는 다른 것)로 코드 파일을 암호화하면 ... 잘 ... 나는 단지 당신을 싫어하고 사업이 파산되기를 바랍니다.

그것이 지금까지 있었던 것입니다. 다른 것을 생각하자마자 더 추가하겠습니다.


나는 당신에게 동의합니다, 그것은 확실히 좋은 시작입니다. 확실히, 모든 다른 종류의 구성과 문제를 항상 다루는 것이 가능하지는 않다는 것을 이해할 것입니다. 최소한 가능한 것을 줄입니다. 내가 다른 확장 프로그램이나 다른 사람들과 만나는 대부분의 문제는 덮어 쓰기와 충돌하기 때문입니다.
Sylvain Rayé

2
@Marius, me에서 1+ 이상 확보하십시오. 개발시 직면하고있는 대부분의 사례와 시나리오를 다룹니다.
liyakat

4
@ColinM. 우선 여기에 귀하의 의견을 제시하게되어 영광입니다. :). 나는 차이가 있다는 데 동의하고, 대답을 수정할 것입니다. 그러나 적어도 PHP 5.3이 "새로운 PHP 4"가 될 때까지 두 가지를 피해야한다고 생각합니다. 나는 그것이 여전히 대규모로 사용된다는 것을 의미합니다.
Marius

4
@ 마리우스, 당신의 요점은 매우 도움이됩니다. # 31까지 나는 각 점에 진지하게 집중하고 있었지만 # 32에서 나는 큰 웃음을 터뜨렸다. 포인트 # 32를 위해 특별히 +1
MTM

1
If you encrypt your code files with Ioncube (or something else)...well...I just hate you and I hope your business goes bankrupt같은 느낌입니다. 업데이트 된 버전을 제공하지 않는 일부 회사가 있습니다. 비용을 지불해야합니다. 실제로 실망스럽고 왜 같은 제품을 반복해서 판매하고 싶어하는지 이해하지 못합니다 (돈을 벌기 위해?). 나는 더 이상 그들의 제품을 사지 않습니다. 내가 누구에 대해 이야기하는지
Adarsh ​​Khatri

31

나는 확장 기능 만 개발하고 소스 제어 할 수 있고 핵심 파일과 폴더 구조를 변경하지 않고 그대로 둘 수 있도록 modman 을 사용하는 데 열심 입니다. 또한 여러 설치에서 테스트를보다 원활하게 수행 할 수 있습니다.

아, 그리고 하나의 거대한 팁은 Magento Connect에 업로드하기 전에 항상 magento를 새로 설치하여 패키지 확장을 로컬로 설치하려고합니다. 패키지 관리자에서 파일을 너무 많이 놓쳤습니다.


3
'패키지 확장 설치 로컬'에 대해 문의하십시오. 나는 이것이 '당신의 신의 확장을 위에서 아래로 테스트하십시오'라는 범주에 속한다고 생각합니다.
Marius

나는 전에도 이것에 사로 잡혔다. 패키지 와 동일 하지 않은 새로 설치에서 패키지를 테스트하십시오 !
Joseph Leedy

22

Andreas von Studnitz와 Nikolai Krambrock 박사는 Meet Magento DE 2014에서 코드 품질에 대한 훌륭한 프레젠테이션을했습니다. 일반적인 코드 품질과 Magento 관련 코드 품질을 구분합니다. 간단히 말해 다음과 같은 일반적인 규칙이 있습니다.

  • 클래스 및 메소드와 마찬가지로 구조 요소의 사용은 중간 점유 클래스에서 배열되어야합니다. 구조의 이러한 요소는 구조화에 사용될 때만 의미가 있습니다. 따라서 중간 크기 여야합니다. 클래스에는 100-200 라인 코드를 사용하고 메소드에는 3-20 라인 코드를 사용하는 것으로 간주됩니다.
  • "if"또는 "while"을 사용하기 때문에 코드가 들여 쓰기됩니다. 들여 쓰기가 3 개 이상이면 수정하는 것이 좋습니다. 들여 쓰기가 너무 많으면 코드의 복잡성을 나타내는 증거이므로 피해야합니다.
  • 데드 코드는 피하고 삭제해야합니다. 정적 분석은 존재하는 경우이를 찾는 데 도움이됩니다.

더욱 중요한 것은 마젠 토별 규칙입니다.

  • 모듈은 독립적으로 작동해야합니다. 그것들은 다른 모듈에만 의존해서는 안되며 템플릿에 의존해서는 안됩니다. 해결책은 템플릿 파일 및 템플릿의 추가 기능을 다루는 모듈에 대한 적응 대신 레이아웃 업데이트 (기본 / 기본)를 사용하는 것입니다.
  • 마젠 토의 코어 핵 및 외부 모듈의 핵에서 업데이트 기능을 유지하려면 피해야합니다. 더 좋은 방법은 Rewriter 또는 Observer를 대신 사용하는 것입니다.
  • 변경의 경우 데이터베이스 나 관리자를 직접 변경하는 대신 설정 스크립트를 사용하는 것이 좋습니다. 덕분에 변경은 한 번만 수행하면됩니다.

다음은 프레젠테이션에 대한 자세한 내용과 비디오입니다. http://www.code4business.de/code-quality-magento/


1
그러나 영어 버전의 링크가 있다면 게시하는 것이 더 좋습니다.
Marius

이 프리젠 테이션의 영어 버전은 곧 작성 될 예정입니다. 나는 당신을 최신 상태로 유지하고 영어 버전이 출판 되 자마자 새로운 링크를 공유 할 것입니다.
user3743859

영어 버전의 프레젠테이션이 현재 온라인 상태입니다. 이에 대한 링크는 다음과 같습니다. code4business.de/code-quality-magento
user3743859

응? 아직 독일어입니다. 하지만 방금 약 2 주 전에 MeetMagentRo에서 영어로이 프레젠테이션에 참석했습니다. 좋은 물건.
Marius

18

확장 프로그램을 판매하거나 다른 사람과 공유하는 경우 사람이 읽을 수있는 코드 작성을 고려하십시오.

  1. 방법을 너무 복잡하게 만들지 마십시오
  2. 메소드에 DOC 블록 추가 *
  3. $productIds대신 적절한 변수 이름을 사용하십시오.$ids
  4. 방법과 동일 public function myOnProductSaveMethod() {...}하지만 ... none이지만 tryDisableInternetOnProductSave()원하는 계획을 암시합니다.
  5. 말이되는 곳에 타입 힌트를 사용하십시오 someMethod(Varien_Data_Db_Collection $collection)
  6. 마법의 숫자 와 문자열을 피하십시오 **
  7. 모델 설정 $_eventPrefix속성 (과 $_eventObject)을 사용하여 관찰자가 더 쉽게 접근 할 수 있도록하는 경우
  8. 시스템 구성 필드를 추가하면
    • 기본값을 설정하다 config.xml
    • <validate>필드에 노드를 추가system.xml
    • ACL 리소스를 추가 adminhtml.xml
  9. 관리자 백엔드에서 쓸모 없거나 광고하는 첫 번째 레벨 메뉴 항목을 추가하지 마십시오.
  10. 모든 컨트롤러 작업에 대한 ACL 리소스 추가
  11. 쿼리가 DB 테이블 접두사 와 작동하는지 확인
  12. 역 호환성에 대한 생각 (아니오 )
    • Mysql4수업을 지원하지 않습니다
    • 더 이상 사용되지 않는 메소드를 사용하지 마십시오
  13. 모든 경우에 extionsion이 예상대로 작동하는지 확인-UnitTests 추가 (예 : PhpUnit)
  14. David Manners 외에도 ... composer.json배포를 쉽게하기 위해 너무 추가
  15. PHP5.6은 EOL이므로 PHP7 용 코드를 작성하십시오. declare(strict_types=1);입출력 유형 사용 및 정의
  16. Magento2 : 정적 코드와 코드를 확인 같은 도구 분석 phpstan을 . 여기서 마술 방법을 지원합니다 . (최신 커밋은 2.3, 2.1 / 2.2 이전에는 작동합니다-phpstan 0.8.5 필요)

* DOC 블록 :

PSR2 표준 또는 PHPMD 용 PHP_CodeSniffer를 사용하여 Magento-1 코드를 확인하는 경우이 줄을 추가하고 싶을 것입니다 ( 적절한 위치) ...

  • 수업에
    • @phpcs:disable PSR1.Classes.ClassDeclaration.MissingNamespace
    • @phpcs:disable PSR2.Classes.PropertyDeclaration.Underscore -상속 된 속성
    • @phpcs:disable Squiz.Classes.ValidClassName.NotCamelCaps
    • @SuppressWarnings(PHPMD.CamelCaseClassName)
    • @SuppressWarnings(PHPMD.CamelCasePropertyName) -상속 된 속성
  • 방법에
    • @SuppressWarnings(PHPMD.CamelCaseMethodName) -상속 된 메소드
    • @SuppressWarnings(PHPMD.StaticAccess)- Mage::또는 다른 정적 호출 을 사용하는 경우

** 종종 사용 :

  • 관리자 저장소 ID
    • 0 > Mage_Core_Model_App::ADMIN_STORE_ID
  • 생성물 status
    • 1 > Mage_Catalog_Model_Product_Status::STATUS_ENABLED
    • 2> Mage_Catalog_Model_Product_Status::STATUS_DISABLED ( 0아마도 예상치 못한 )
  • 생성물 type
    • simple > Mage_Catalog_Model_Product_Type::TYPE_SIMPLE
    • bundle > Mage_Catalog_Model_Product_Type::TYPE_BUNDLE
    • configurable > Mage_Catalog_Model_Product_Type::TYPE_CONFIGURABLE
    • grouped > Mage_Catalog_Model_Product_Type::TYPE_GROUPED
    • virtual > Mage_Catalog_Model_Product_Type::TYPE_VIRTUAL
  • 생성물 visibity
    • 1 > Mage_Catalog_Model_Product_Visibility::VISIBILITY_NOT_VISIBLE
    • 2 > Mage_Catalog_Model_Product_Visibility::VISIBILITY_IN_CATALOG
    • 3 > Mage_Catalog_Model_Product_Visibility::VISIBILITY_IN_SEARCH
    • 4 > Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH

SQL 순서 ASCZend_Db_Select::SQL_ASC (예) 와 동일합니다 .

"이것은 결코 바뀌지 않을 필연적 인 원인이 아닙니다" 라고 말하는가 ? 예를 들어 catalog_product속성의 엔티티 ID 가 Magento 1.5와 1.9 사이에서에서 10로 변경 4되어 확장이 중단 될 수 있습니다.

$collection->addFieldToFilter('entity_type_id', 10)

대신 이것을 사용하면 하나의 쿼리가 추가되지만 안전합니다 ...

$entityTypeId = Mage::getModel('eav/config')
    ->getEntityType(Mage_Catalog_Model_Product::ENTITY)
    ->getEntityTypeId();

$collection->addFieldToFilter('entity_type_id', $entityTypeId)

8

코딩 표준에 관한 @marius (목록의 24 번 지점).

EQP ECG CS 와 함께 PHP_CodeSniffer 를 사용 하여 이러한 표준을 자동으로 적용 하고 싶습니다 .

사용 PHP_CodeSniffer를 교체 할 같은 것들을 잊고에 대해 걱정할 필요가 없습니다 array()함께 []사용하지 마십시오 is_null, 사용되지 않는 지역 변수 나하는 PHPDoc 블록이없는 경우에도 방법을 둡니다.

PHP_CodeSniffer 는 항상 그것에 대해 알려줄 것입니다.


동의했다! 가능한 하우투 : magento.stackexchange.com/questions/178640/…
sv3n

PHPStorm에서 두 가지 CS를 모두 구성 할 수있는 방법은 없지만 (PHPStorm을 사용하는 사람들을 위해) 항상 터미널을 사용하여 코드에서 CS를 확인할 수 있습니다. 또한 grumphp github.com/phpro/grumphp 와 같은 도구가 있습니다 .
diazwatson

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