Joomla 5의 ModalSelect Form 필드 유형을 사용하면 확장 프로그램 개발 시 카테고리, 제조업체 및 검색을 사용하여 모달 창에서 필터링하여 수천 개 중에서 올바른 제품을 쉽게 찾을 수 있습니다.
클라이언트와 작업하는 과정에는 다양한 수준의 작업이 있습니다. 누군가는 5~6페이지의 간단한 웹사이트가 필요합니다. 누군가는 REST API를 사용하여 타사 시스템과 통합된 대규모 상품 카탈로그 또는 온라인 상점이 필요합니다. 다른 누군가에게는 널리 사용되는 솔루션이 없는 비표준 기능이 필요합니다.
Joomla는 개발에 적합하며 쉽게 유지 관리할 수 있는 코드를 만들 수 있습니다. 요구 사항이 CMS 핵심을 따른다면 이 모든 경우에 대한 답이 있습니다.
대규모 프로젝트를 완료하려면 작은 작업으로 나누어야 하는데, 이 글에서는 이러한 작업 중 하나를 해결하는 방법에 대해 이야기하고 싶습니다.
고객은 이미 Joomla(JoomShopping) 온라인 상점의 인기 구성 요소 중 하나에 제품 카탈로그를 만들었습니다. 제품의 매개변수를 선택하고 장바구니에 담은 후 구매할 수 있습니다. 모든 것이 평소와 같습니다. 그러나 이제 제품에 대한 그래픽 레이아웃을 생성하는 기능을 추가해야 합니다. 예를 들어 제품은 머그잔이나 티셔츠입니다. 구매하기 전에 제품 디자이너에게 가서 로고나 사진을 업로드하고 텍스트를 작성하면 이 레이아웃이 온라인 상점 주문에 첨부됩니다. 결제 후 레이아웃이 바로 제작에 들어가고 이미지와 텍스트가 머그에 적용되어 주소로 전송됩니다.
이 기능을 구현하는 데는 상당한 시간이 소요되므로 별도의 제품 디자이너 구성 요소로 생성됩니다. 그리고 데이터 제공자 플러그인이 이미 생성되어 있어 하나 또는 다른 전자 상거래 구성 요소와 함께 작업할 수 있습니다.
작은 응용 작업 중 하나는 온라인 상점 구성 요소의 상품과 제품 디자이너 구성 요소의 상품 간의 연결을 만드는 것입니다. 이는 향후 콘텐츠 작업을 수행할 콘텐츠 관리자에게 편리하고 직관적이어야 합니다. 따라서 원하는 제품의 ID 번호가 표시될 텍스트 필드를 만드는 것만으로는 충분하지 않습니다. 온라인 상점에는 수십 개의 제품만 있을 수 있으며 커뮤니케이션을 위한 제품을 선택하는 것은 그리 어렵지 않습니다. 수천 개의 제품이 있는 경우 매개변수별로 제품을 검색하고 필터링하는 기능이 중요합니다. 카테고리, 제조업체별로 제품 목록을 필터링하거나 수백 개의 다른 제품 중에서 이름으로 찾을 수 있다면 작업이 훨씬 빠르고 쉬워질 것입니다.
영상보기
이 필드는 선택을 위한 데이터가 모달 창에 표시되는 편집기 버튼 플러그인(editors-xtd 그룹) 작업과 매우 유사합니다(기사 링크, 모듈 단축 코드 등).
Joomla 관리자 패널에는 기사, 메뉴 항목, 연락처, 제품 등을 지정하는 등 다른 구성 요소의 데이터로 채워야 하는 다양한 필드가 있습니다. 일반적으로 이러한 필드는 선택 옵션 드롭다운 목록으로 설계됩니다. , 데이터 목록을 사용하여 입력 유형="텍스트"로 설계할 수 있지만 필터링, 검색 및 페이지 매김을 사용하여 원하는 엔터티 목록을 표시하는 편리한 필드도 있습니다. 사이트 내의 소스(다양한 구성 요소, 플러그인)뿐만 아니라 REST API를 통해 제공되는 타사 서비스(CRM, 배달 서비스, 외부 데이터베이스, 기타 Joomla 사이트 등)도 데이터 소스로 작동할 수 있습니다.
"기사 - 단일 기사", "연락처 - 단일 연락처"와 같은 메뉴 항목에서 기사를 선택하거나 메뉴 항목의 별칭 - "시스템 링크 - 메뉴를 생성할 때 이러한 필드가 작동하는 것을 모두 확인했습니다. 항목 별칭". 하지만 그들이 어떻게 생겼는지 생각해 봅시다.
모달 기사 선택 창
모달 단일 접점 선택 창.
이러한 필드를 자세히 살펴보겠습니다. 정확히 어떤 작업을 수행할 수 있는지 살펴보겠습니다. 우리는 이 필드의 주요 작업이 선택한 엔터티의 ID를 가져와 이 ID를 텍스트 필드에 입력하는 것임을 알고 있습니다. 그러나 화면에는 ID 번호 대신 기사 제목이나 연락처가 표시되는 다른 내용이 표시됩니다. 좋고 편리합니다. ID가 1452704인 기사 이름을 기억할 필요가 없습니다. 또한 비디오에는 필드에 이미 값이 있으면 "지우기" 버튼이 나타나는 것을 명확하게 보여줍니다. 필드 값을 재설정하고 "선택" 버튼을 다시 클릭할 수 있게 해줍니다.
어떤 경우에는 메뉴 항목을 만드는 과정에서 바로 기사, 연락처 등 선택한 유형의 엔터티를 만들 수 있는 기회가 있습니다. 이 버튼은 ACL(Joomla의 액세스 권한 분리)을 고려하여 작동합니다.
웹사이트를 구축하고 '연락처' 페이지를 만들고 있다고 상상해 보세요. 복잡한 구조를 가진 여러 회사 지점이 없다면 이것은 "분류되지 않음" 범주에 있는 일반적인 Joomla 기사일 뿐입니다. 그리고 이미 텍스트나 변수 형태의 모든 연락처가 있습니다. 고대에는 먼저 기사를 생성한 다음 메뉴 항목으로 이동하여 해당 항목을 생성해야 했습니다. 이제는 그러실 필요가 없습니다.
필드에 이미 값이 있는 경우 메뉴 항목을 생성하는 과정에서 선택한 엔터티(기사, 메뉴 항목 등)를 바로 편집할 수 있는 경우도 있습니다.
모달 창의 선택 필드를 사용하여 다음을 수행할 수 있습니다.
이것이 내 눈앞에 있다. 그러나 Joomla에는 선택한 값을 필드에 지정된 URL로 보낼 수 있는 흥미로운 urlCheckin 매개 변수도 있습니다. Joomla의 이 기능은 꽤 오랫동안 점진적으로 발전해 왔다는 점은 주목할 가치가 있습니다. 하지만 필요에 따라 사용할 수 있는 별도의 범용 필드 유형은 Joomla 5에서만 나타났습니다. Joomla 4에도 없습니다.
이전에는 이 생성자를 JForm이라고 했습니다. 나는 모든 독자가 PHP Storm 또는 VS Code와 같은 IDE(개발 환경)와 같은 개발 도구를 손에 갖고 있지는 않다고 가정할 것이므로 코드 베이스 탐색을 위한 추가 지침을 제공하려고 노력할 것입니다.
Joomla에서는 로직이 뷰(실제 HTML 출력)와 분리되어 있으므로 동시에 여러 곳에서 살펴보겠습니다.
Logic은 Form 클래스입니다. Joomla 5에서 Form 클래스 파일은 libraries/src/Form에 있습니다. 논리 자체, 데이터에 어떤 일이 발생하는지, 데이터를 사용하는 방법을 이해하기 위해 이러한 파일을 검사합니다.
간단히 말하면 Form 생성자는 필드에 대한 설명이 포함된 XML을 받습니다. 데이터(필드 유형, addfieldprefix 속성의 사용자 정의 필드 클래스 등)를 읽고 FormHelper를 사용하여 필수 필드 클래스를 로드합니다. 필드에 출력 데이터 필터링을 위한 몇 가지 규칙이 있는 경우(FormRule 클래스가 사용됨) 필터링 매개변수를 지정하고 예를 들어 PHP만 또는 CSS 파일만 선택할 수 있는 파일 목록 유형의 Joomla 필드를 기억하세요.
Joomla 양식 필드 클래스 파일은 libraries/src/Form/Field에 있습니다. 가볍게 말하면 그것들이 많이 있습니다. 이는 관리자 패널의 구성 요소이며 때로는 프런트엔드이기도 합니다.
클래스 파일은 $type, $layout 등 작업에 필요한 클래스 속성을 설명합니다. 대부분의 필드에는 getInput() 메소드가 있습니다. - 실제로 필드의 HTML 출력을 반환하고, getLayoutData() - 필드에 대한 데이터를 렌더링으로 보내기 전에 사전 처리하고, getLabel() - 필드 레이블 작업 등을 수행합니다.
필드 클래스는 상위 FormField 클래스를 상속한다는 것을 기억합니다. 클래스 파일 libraries/src/Form/FormField.php에는 XML 설명에 사용할 수 있는 필드의 가능한 속성이 설명되어 있습니다. 그것이 무엇인지, 왜 그런지에 대한 간략한 설명이 있습니다.
하위 클래스(상속자)는 상위 클래스의 메서드를 사용하여 작업할 수 있으며 필요한 경우 이를 재정의할 수 있습니다.
각 필드 클래스에는 HTML 출력이 있습니다. 클래식 MVC에서 보기는 데이터 출력과 함께 즉시 작동하지만 Joomla에는 추가 레이어인 레이아웃이 있습니다. 이 레이어를 사용하면 레이아웃을 재정의할 수 있습니다. 이는 이 CMS의 가장 중요한 기능 중 하나입니다 핵심 레이아웃은 다음과 같습니다. 사이트 루트의 레이아웃 폴더에 있을 것으로 예상됩니다. getLayoutData() 메서드에서 받은 모든 데이터와 함께 $displayData 배열을 전달합니다. $layout 클래스 속성에서 사용할 출력 레이아웃을 지정합니다.
<?php /** * Name of the layout being used to render the field * * @var string * @since 3.7 */ protected $layout = 'joomla.form.field.email';
이런 유형의 녹음은 매우 일반적입니다. Joomla에서 레이아웃은 사이트 루트에 있는 레이아웃 폴더의 레이아웃 파일에 대한 점으로 구분된 경로입니다. 즉, $layout = 'joomla.form.field.email' 항목은 다음을 의미합니다. 필드를 렌더링할 때 레이아웃이 사용됩니다 layouts/joomla/form/field/email.php.
<?php use Joomla\CMS\Layout\LayoutHelper; $displayData = [ 'src' => $this->item->image, 'alt' => $this->item->name, ]; echo LayoutHelper::render( 'joomla.html.image', $displayData );
마찬가지로 이 예에서는 layouts/joomla/html/image.php 레이아웃을 사용합니다. 일부 레이아웃은 사이트 템플릿과 관리 패널의 html 폴더에서 재정의될 수 있습니다.
따라서 최종적으로 레이아웃에 어떤 데이터가 들어오고 어떻게 표시되는지 정확히 알고 싶으시면 레이아웃 파일에 가서 보시면 됩니다.
이제 기사의 주요 작업으로 돌아가겠습니다.
우리가 공부하는 데에는 예제가 중요합니다(이 글을 쓰는 시점에서는 Joomla 5.0.1):
이 글을 작성할 당시 com_contacts의 단일 접점 모달 선택 필드는 아직 범용 필드 유형으로 변환되지 않았으며 단지 (이 글이 작성되었을 때 Joomla 5.0.2에서) administrator에 있었습니다. /comComponents/com_contact/src/Field/Modal/ContactField.php. ModalSelectField가 아닌 FormField를 직접 상속합니다.
자신의 필드를 추가하는 작업 알고리즘은 다음과 같습니다.
<?php /** * Name of the layout being used to render the field * * @var string * @since 3.7 */ protected $layout = 'joomla.form.field.email';
PHP에서 일어나는 모든 일을 명확하게 하려면 먼저 필드 출력의 레이아웃을 살펴봐야 합니다. layouts/joomla/form/field/modal-select.php 파일에 있습니다. 실제로 2개의 입력 필드가 출력됩니다. 하나는 표시되고 다른 하나는 표시되지 않습니다. 선택한 기사, 연락처 또는 제품의 제목은 자리 표시자($valueTitle 매개변수) 형식으로 표시되는 필드에 입력됩니다. 두 번째는 그의 ID인 $value입니다. 아직 아무것도 선택하지 않은 경우 필드에 "기사 선택" 또는 "제품 선택"과 같은 문구가 있어야 합니다. 이는 XML 필드의 힌트 속성이나 필드 클래스의 setup() 메소드에 넣는 언어 상수입니다.
출력 레이아웃에 사용 가능한 모든 매개변수(프로그래밍 방식으로 또는 XML 파일에서 사용할 수 있는 매개변수를 의미):
<?php /** * Name of the layout being used to render the field * * @var string * @since 3.7 */ protected $layout = 'joomla.form.field.email';
짐작하셨겠지만 필드 클래스는 제 플러그인에 있습니다. 그 방법은 plugins/wtproductbuilder/providerjoomshopping/src/Field/ProductlistField.php입니다. 저는 단일 모달 기사 선택 필드를 기본으로 삼아 필요에 맞게 다시 디자인했습니다. 즉, JoomShopping 온라인 상점에서 제품을 선택했습니다. 상위 ModalSelectField 클래스를 자체 클래스로 확장합니다.
내 작업에는 제품 선택만 포함되고 편집 및 생성은 포함되지 않으므로 기사 텍스트에서는 제품 선택에 대해서만 이야기합니다. PHP 수업은 규모가 작아서 전체적으로 올려드리고 댓글로 달겠습니다.
<?php use Joomla\CMS\Layout\LayoutHelper; $displayData = [ 'src' => $this->item->image, 'alt' => $this->item->name, ]; echo LayoutHelper::render( 'joomla.html.image', $displayData );
이미 선택되어 저장된 경우 선택한 엔터티(제품 이름, 기사 제목 등)의 이름을 표시하는 getValueTitle() 메서드가 별도로 도입되었습니다. 즉, 메뉴 항목을 편집하러 갔지만 필드를 터치하지 않고 ID뿐만 아니라 사람들이 이해할 수 있는 기사 제목/제품명을 보고 싶습니다. 이 방법을 사용하면 원하는 제목이 표시됩니다.
<field type="productlist" name="product_id" addfieldprefix="Joomla\Plugin\Wtproductbuilder\Providerjoomshopping\Field" label="Field label" hint="Field placeholder" />
다국어 연결 등 더 복잡한 기능이 필요한 일부 필드에는 FormField 클래스의 기본 메서드를 재정의하는 필드 클래스의 다른 메서드가 있습니다.
저희 경우에는 그럴 필요가 없어서 사용하지 않습니다.
'선택' 버튼을 클릭하면
내 플러그인에서 onAjaxProviderjoomshopping() 메서드는 제품 목록의 HTML 출력을 반환합니다. 거기에서 우리는 그들과 함께 배열을 반복하고 사진, 이름 및 출력을 찍습니다. 코드는 일반적으로 방대하므로 가장 중요한 부분만 게시하겠습니다.
단순화된 루프 코드 예:
<?php extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attribute for eg, data-* * @var string $valueTitle * @var array $canDo * @var string[] $urls * @var string[] $modalTitles * @var string[] $buttonIcons */
두 번째. 링크 태그 코드에는 필요한 데이터가 포함된 데이터 속성이 포함되어야 합니다. 상품 출력 주기의 샘플 코드에서 이 조각을 보았습니다.
<?php /** * Name of the layout being used to render the field * * @var string * @since 3.7 */ protected $layout = 'joomla.form.field.email';
이제 JavaScript 작업을 시작해 보겠습니다. 기사를 작성하는 과정에서 기존 작업 방식과 새로운 작업 방식에 대해 이야기할 수 있는 뉘앙스가 나타났습니다.
작업 과정에서 다음 js 스크립트를 연결했던 것을 기억합니다
자체 자바스크립트부터 시작해 보겠습니다. 여기에서는 선택 링크 클래스를 사용하여 모든 선택기를 가져오고 여기에 클릭 이벤트 리스너를 걸어 놓습니다.
<?php use Joomla\CMS\Layout\LayoutHelper; $displayData = [ 'src' => $this->item->image, 'alt' => $this->item->name, ]; echo LayoutHelper::render( 'joomla.html.image', $displayData );
ID와 제목이 모든 것이 직관적이라면 데이터 객체와 postMessage는 Joomla 작업에 익숙한 사람들에게는 명확하지 않을 수 있습니다.
이전에는 Joomla 2.5, 3.x, 심지어 4.x에서도 다음 접근 방식이 사용되었습니다. 필드 출력 레이아웃에서 인라인 스크립트를 사용하여 창에 핸들러 함수를 걸어두었고 < ;아이프레임> 우리는 그것을 window.parent[functionName]이라고 불렀습니다. 이 코드를 살펴보세요
<field type="productlist" name="product_id" addfieldprefix="Joomla\Plugin\Wtproductbuilder\Providerjoomshopping\Field" label="Field label" hint="Field placeholder" />
이 양식에서는 기사/연락처/메뉴 항목 목록에 있는 각 링크의 data-function 속성에 함수 이름이 지정되었습니다. 그리고 함수 자체는 인라인으로 배치되었으며 때로는 이름을 추가 ID와 통합했습니다. 예: "jSelectArticle_".$this->id.
jSelectArticle() 함수 또는 유사한 함수(jSelectProduct()가 있음)는 modal-fields.min.js 파일의 표준 processModalSelect() 함수에 대한 래퍼입니다. 그런 다음 processModalParent() 함수를 호출하고 실행 후 모달 창을 닫습니다.
이 함수는 작동하기 위해 여러 매개변수를 지정해야 했습니다. 엔터티 유형(기사, 연락처 등), 필드 접두사(실제로는 HTML 필드 선택기의 ID로 밝혀짐), 실제 ID 제목 - 필요한 매개변수 등
하나의 기능에서 모든 경우에 대한 모든 것이 수집되었습니다. 그것이 우리 분야의 데이터가 배치된 곳입니다.
그러나 이제 Joomla 5에서는 이 파일이 더 이상 필요하지 않습니다. 필드 출력의 표준 레이아웃을 사용하면 modal-content-select-field 자산이 여기에 연결되어 새로운 방식으로 작동합니다.
이제 Joomla 5 프런트엔드는 JavaScript postMessages를 사용하도록 전환됩니다. 모든 기존 확장이 아직 새 레일로 전환할 준비가 되지 않았기 때문에 JoomlaExpectingPostMessage 플래그가 구현되어 오래된 이벤트 호출 방법을 구별할 수 있습니다. 설명된 작업 방법과 간접적인 관계가 있지만 누군가에게는 유용할 수 있습니다. 이 플래그는 postMessages로의 전체 전환 후에 제거됩니다.
이제 호출된 함수 이름이 포함된 링크의 추가 속성이 필요하지 않습니다. 대신 postMessage 메커니즘을 사용합니다. 이를 수행하려면 데이터 개체에서 joomla:content-select와 동일한 messageType 매개 변수를 지정해야 합니다. 왜? JavaScript 관점에서 보면 Joomla에서의 작업은 다음과 같습니다.
Joomla 핵심 코드를 공부하고 해결책을 찾는 과정에서 자연스럽게 jSelectArticle() 등의 함수를 접하게 되었습니다. 그런 다음 postMessage를 발견하고 긴 고유 이름을 지정하여 MessageType을 만들기로 결정했습니다. 이를 작동시키기 위해 (나중에는 구식인) processModalSelect() 함수를 호출하여 자체 처리를 작성했습니다. 그리고 데이터가 필드에 올바르게 삽입되었음에도 불구하고 모달 창이 어떤 식으로든 닫히고 싶지 않다는 사실에 직면했습니다. 추가 검색을 통해 먼저 올바른 이벤트 유형을 찾은 다음 불필요한 스크립트를 제거하고 코드 전체를 단순화했습니다.
Joomla는 개발자에게 타사 소스에서 데이터를 작업하고 가져오며 이를 코드에서 사용할 수 있는 풍부한 도구 세트를 제공합니다. 개발자가 자체 확장을 생성할 때, 특히 일반적인 범위를 넘어서는 작업을 해결해야 할 때 JForm 필드를 사용하여 작업하는 것이 중요합니다. 물론, 이러한 모달 창과 그 안의 데이터 선택은 다소 특별한 경우이지만, 이 방법을 사용하면 다른 JForm 필드를 재정의하고 고유한 UX 로직을 사용하여 고유한 유형을 생성할 수 있습니다.
위 내용은 Modal Select 예제를 사용하여 Joomla에서 사용자 정의 양식 필드 유형 만들기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!