Skip to content

Commit 20031ed

Browse files
author
Vitaliy
authored
Merge branch '4.3.0-develop' into plugin-for-the-parent-class-methods
2 parents a15a598 + 3997a01 commit 20031ed

31 files changed

+964
-41
lines changed

resources/META-INF/plugin.xml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,19 @@
5656
<add-to-group group-id="PhpGenerateGroup" anchor="last"/>
5757
</group>
5858

59+
<group id="MagentoContextBasedActionsGroup" class="com.intellij.ide.actions.NonEmptyActionGroup" text="Context Actions" popup="false" compact="true" searchable="true">
60+
<separator/>
61+
<!-- Context dependent actions -->
62+
<action id="MagentoCreateRoutesFile" class="com.magento.idea.magento2plugin.actions.context.xml.NewRoutesXmlAction"/>
63+
<action id="MagentoCreateDiFile" class="com.magento.idea.magento2plugin.actions.context.xml.NewDiXmlAction"/>
64+
<action id="MagentoCreateWebapiFile" class="com.magento.idea.magento2plugin.actions.context.xml.NewWebapiXmlAction"/>
65+
<action id="MagentoCreateAclFile" class="com.magento.idea.magento2plugin.actions.context.xml.NewAclXmlAction"/>
66+
<action id="MagentoCreateConfigFile" class="com.magento.idea.magento2plugin.actions.context.xml.NewConfigXmlAction"/>
67+
<!-- Context dependent actions -->
68+
<separator/>
69+
<add-to-group group-id="NewGroup" anchor="before" relative-to-action="NewXml"/>
70+
</group>
71+
5972
<!-- Module file generators -->
6073
<group id="MagentoNewModuleFileGroup" class="com.magento.idea.magento2plugin.actions.groups.NewModuleFileGroup" text="Module File" popup="true">
6174
<action id="MagentoCreateEntity" class="com.magento.idea.magento2plugin.actions.generation.NewEntityAction" />
@@ -159,6 +172,7 @@
159172
<fileBasedIndex implementation="com.magento.idea.magento2plugin.stubs.indexes.mftf.DataIndex" />
160173
<fileBasedIndex implementation="com.magento.idea.magento2plugin.stubs.indexes.mftf.PageIndex" />
161174
<fileBasedIndex implementation="com.magento.idea.magento2plugin.stubs.indexes.mftf.TestNameIndex" />
175+
<fileBasedIndex implementation="com.magento.idea.magento2plugin.stubs.indexes.mftf.TestExtendsIndex" />
162176
<fileBasedIndex implementation="com.magento.idea.magento2plugin.stubs.indexes.js.RequireJsIndex" />
163177
<fileBasedIndex implementation="com.magento.idea.magento2plugin.stubs.indexes.js.MagentoLibJsIndex" />
164178
<fileBasedIndex implementation="com.magento.idea.magento2plugin.stubs.indexes.xml.AclResourceIndex" />
@@ -553,6 +567,7 @@
553567
<internalFileTemplate name="Magento Entity Delete Controller Class"/>
554568
<internalFileTemplate name="Magento Web API XML"/>
555569
<internalFileTemplate name="Web API Interface"/>
570+
<internalFileTemplate name="Magento Config XML"/>
556571

557572
<defaultLiveTemplates file="/liveTemplates/MagentoPWA.xml"/>
558573

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
<?xml version="1.0"?>
22
#parse("XML File Header.xml")
3-
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Acl/etc/acl.xsd">
3+
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:noNamespaceSchemaLocation="urn:magento:framework:Acl/etc/acl.xsd">
45
</config>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<?xml version="1.0"?>
2+
#parse("XML File Header.xml")
3+
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Store:etc/config.xsd">
5+
</config>
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<!--
2+
/*
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
-->
7+
<html>
8+
<body>
9+
<table width="100%" border="0" cellpadding="5" cellspacing="0" style="border-collapse: collapse">
10+
<tr>
11+
<td><font face="verdana" size="-1">
12+
The config.xml file is used to set default values for system configuration
13+
(in Admin under Stores > Settings > Configuration), set in module_folder/etc/adminhtml/system.xml.
14+
</font><br>
15+
</td>
16+
</tr>
17+
</table>
18+
</body>
19+
</html>
Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
<?xml version="1.0"?>
22
#parse("XML File Header.xml")
3-
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
4-
<router id="${ROUTER_ID}">
3+
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
5+
<router id="${ROUTER_ID}">#if (${HAS_ROUTE_DATA})
6+
<route id="${ROUTE_ID}" frontName="${FRONT_NAME}">
7+
<module name="${MODULE_NAME}"/>
8+
</route>
9+
#end
510
</router>
611
</config>

resources/fileTemplates/internal/Magento Routes XML.xml.html

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,43 @@
3030
<tr>
3131
<td valign="top"><nobr><font face="verdana" size="-2"><b>${ROUTER_ID}</b></font></nobr></td>
3232
<td width="10">&nbsp;</td>
33-
<td width="100%" valign="top"><font face="verdana" size="-1">specifies the name of the router in Magento.
33+
<td width="100%" valign="top"><font face="verdana" size="-1">Specifies the name of the router in Magento.
3434
See the reference tables in the
3535
<a href="https://devdocs.magento.com/guides/v2.4/extension-dev-guide/routing.html#router-class">
3636
Router class section
3737
</a>.
3838
</font>
3939
</td>
4040
</tr>
41+
<tr>
42+
<td valign="top"><nobr><font face="verdana" size="-2"><b>${HAS_ROUTE_DATA}</b></font></nobr></td>
43+
<td width="10">&nbsp;</td>
44+
<td width="100%" valign="top"><font face="verdana" size="-1">Technical value used to enable/disable route information rendering
45+
</font>
46+
</td>
47+
</tr>
48+
<tr>
49+
<td valign="top"><nobr><font face="verdana" size="-2"><b>${ROUTE_ID}</b></font></nobr></td>
50+
<td width="10">&nbsp;</td>Specifies the unique node id for this route in Magento,
51+
is also the first segment of its associated layout handle XML filename: routeId_controller_action.xml
52+
<td width="100%" valign="top"><font face="verdana" size="-1">
53+
</font>
54+
</td>
55+
</tr>
56+
<tr>
57+
<td valign="top"><nobr><font face="verdana" size="-2"><b>${FRONT_NAME}</b></font></nobr></td>
58+
<td width="10">&nbsp;</td>
59+
<td width="100%" valign="top"><font face="verdana" size="-1">Specifies the first segment after the base URL of a request
60+
</font>
61+
</td>
62+
</tr>
63+
<tr>
64+
<td valign="top"><nobr><font face="verdana" size="-2"><b>${MODULE_NAME}</b></font></nobr></td>
65+
<td width="10">&nbsp;</td>
66+
<td width="100%" valign="top"><font face="verdana" size="-1">Specifies the name of your module
67+
</font>
68+
</td>
69+
</tr>
4170
</table>
4271
</body>
43-
</html>
72+
</html>

resources/magento2/common.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ common.module.version=Version
55
common.module.license=License(s)
66
common.dependencies=Dependencies
77
common.httpMethod=HTTP Method
8-
common.controller.name=Controller Name
8+
common.controller.name=Action Path
99
common.controller.inheritAction=Inherit Action Class
1010
common.controller.backend.acl=Admin Resource ACL
1111
common.controller.action=Action Name
Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
/*
2+
* Copyright © Magento, Inc. All rights reserved.
3+
* See COPYING.txt for license details.
4+
*/
5+
6+
package com.magento.idea.magento2plugin.actions.context;
7+
8+
import com.intellij.ide.fileTemplates.FileTemplate;
9+
import com.intellij.ide.fileTemplates.FileTemplateManager;
10+
import com.intellij.ide.fileTemplates.actions.AttributesDefaults;
11+
import com.intellij.ide.fileTemplates.actions.CreateFromTemplateActionBase;
12+
import com.intellij.openapi.actionSystem.AnActionEvent;
13+
import com.intellij.openapi.actionSystem.DataContext;
14+
import com.intellij.openapi.actionSystem.DataKey;
15+
import com.intellij.openapi.actionSystem.LangDataKeys;
16+
import com.intellij.openapi.actionSystem.impl.SimpleDataContext;
17+
import com.intellij.openapi.project.Project;
18+
import com.intellij.psi.PsiDirectory;
19+
import com.intellij.psi.PsiElement;
20+
import com.intellij.psi.PsiFile;
21+
import com.magento.idea.magento2plugin.MagentoIcons;
22+
import com.magento.idea.magento2plugin.magento.files.ModuleFileInterface;
23+
import com.magento.idea.magento2plugin.util.magento.GetMagentoModuleUtil;
24+
import org.jetbrains.annotations.NotNull;
25+
import org.jetbrains.annotations.Nullable;
26+
27+
public abstract class AbstractContextAction extends CreateFromTemplateActionBase {
28+
29+
private static final DataKey<AttributesDefaults> ATTRIBUTE_DEFAULTS = DataKey.create(
30+
"attribute.defaults"
31+
);
32+
private final ModuleFileInterface moduleFile;
33+
private DataContext customDataContext;
34+
35+
/**
36+
* Abstract context action constructor.
37+
*
38+
* @param title String
39+
* @param description String
40+
* @param moduleFile ModuleFileInterface
41+
*/
42+
public AbstractContextAction(
43+
final @NotNull String title,
44+
final @NotNull String description,
45+
final @NotNull ModuleFileInterface moduleFile
46+
) {
47+
super(title, description, MagentoIcons.MODULE);
48+
this.moduleFile = moduleFile;
49+
}
50+
51+
@Override
52+
public void update(final @NotNull AnActionEvent event) {
53+
event.getPresentation().setEnabled(false);
54+
event.getPresentation().setVisible(false);
55+
56+
final Project project = event.getProject();
57+
58+
if (project == null) {
59+
return;
60+
}
61+
final DataContext context = event.getDataContext();
62+
final PsiElement targetElement = LangDataKeys.PSI_ELEMENT.getData(context);
63+
64+
if (targetElement == null) {
65+
return;
66+
}
67+
PsiDirectory targetDirectory = null;
68+
PsiFile targetFile = null;
69+
70+
if (targetElement instanceof PsiDirectory) {
71+
targetDirectory = (PsiDirectory) targetElement;
72+
} else if (targetElement instanceof PsiFile) {
73+
targetFile = (PsiFile) targetElement;
74+
targetDirectory = targetFile.getContainingDirectory();
75+
}
76+
77+
if (targetDirectory == null) {
78+
return;
79+
}
80+
final GetMagentoModuleUtil.MagentoModuleData moduleData = GetMagentoModuleUtil
81+
.getByContext(targetDirectory, project);
82+
83+
if (moduleData == null
84+
|| moduleData.getName() == null
85+
|| !isVisible(moduleData, targetDirectory, targetFile)) {
86+
return;
87+
}
88+
customDataContext = SimpleDataContext
89+
.builder()
90+
.add(
91+
ATTRIBUTE_DEFAULTS,
92+
getProperties(
93+
new AttributesDefaults(),
94+
moduleData,
95+
targetDirectory,
96+
targetFile
97+
)
98+
)
99+
.build();
100+
101+
event.getPresentation().setEnabled(true);
102+
event.getPresentation().setVisible(true);
103+
}
104+
105+
/**
106+
* Implement check if an action should be shown in the context defined by the module,
107+
* target directory or target file.
108+
*
109+
* @param moduleData GetMagentoModuleUtil.MagentoModuleData
110+
* @param targetDirectory PsiDirectory
111+
* @param targetFile PsiFile
112+
*
113+
* @return boolean
114+
*/
115+
protected abstract boolean isVisible(
116+
final @NotNull GetMagentoModuleUtil.MagentoModuleData moduleData,
117+
final PsiDirectory targetDirectory,
118+
final PsiFile targetFile
119+
);
120+
121+
/**
122+
* Implement to populate used in the target template variables.
123+
*
124+
* @param defaults AttributesDefaults
125+
* @param moduleData GetMagentoModuleUtil.MagentoModuleData
126+
* @param targetDirectory PsiDirectory
127+
* @param targetFile PsiFile
128+
*
129+
* @return AttributesDefaults
130+
*/
131+
protected abstract AttributesDefaults getProperties(
132+
final @NotNull AttributesDefaults defaults,
133+
final @NotNull GetMagentoModuleUtil.MagentoModuleData moduleData,
134+
final PsiDirectory targetDirectory,
135+
final PsiFile targetFile
136+
);
137+
138+
@Override
139+
protected @Nullable AttributesDefaults getAttributesDefaults(
140+
final @NotNull DataContext dataContext
141+
) {
142+
return customDataContext.getData(ATTRIBUTE_DEFAULTS);
143+
}
144+
145+
@Override
146+
protected FileTemplate getTemplate(
147+
final @NotNull Project project,
148+
final @NotNull PsiDirectory directory
149+
) {
150+
final FileTemplateManager manager = FileTemplateManager.getInstance(project);
151+
final FileTemplate template = manager.findInternalTemplate(moduleFile.getTemplate());
152+
template.setFileName(moduleFile.getFileName());
153+
154+
return template;
155+
}
156+
157+
@Override
158+
public boolean isDumbAware() {
159+
return false;
160+
}
161+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/*
2+
* Copyright © Magento, Inc. All rights reserved.
3+
* See COPYING.txt for license details.
4+
*/
5+
6+
package com.magento.idea.magento2plugin.actions.context.xml;
7+
8+
import com.intellij.ide.fileTemplates.actions.AttributesDefaults;
9+
import com.intellij.psi.PsiDirectory;
10+
import com.intellij.psi.PsiFile;
11+
import com.magento.idea.magento2plugin.actions.context.AbstractContextAction;
12+
import com.magento.idea.magento2plugin.magento.files.ModuleAclXml;
13+
import com.magento.idea.magento2plugin.magento.packages.ComponentType;
14+
import com.magento.idea.magento2plugin.magento.packages.Package;
15+
import com.magento.idea.magento2plugin.util.magento.GetMagentoModuleUtil;
16+
import org.jetbrains.annotations.NotNull;
17+
18+
public class NewAclXmlAction extends AbstractContextAction {
19+
20+
public static final String ACTION_NAME = "Magento 2 ACL File";
21+
public static final String ACTION_DESCRIPTION = "Create a new Magento 2 acl.xml file";
22+
23+
/**
24+
* New acl.xml file generation action constructor.
25+
*/
26+
public NewAclXmlAction() {
27+
super(ACTION_NAME, ACTION_DESCRIPTION, ModuleAclXml.getInstance());
28+
}
29+
30+
@Override
31+
protected boolean isVisible(
32+
final @NotNull GetMagentoModuleUtil.MagentoModuleData moduleData,
33+
final @NotNull PsiDirectory targetDirectory,
34+
final PsiFile targetFile
35+
) {
36+
return targetDirectory.getName().equals(Package.moduleBaseAreaDir)
37+
&& moduleData.getType().equals(ComponentType.module);
38+
}
39+
40+
@Override
41+
protected AttributesDefaults getProperties(
42+
final @NotNull AttributesDefaults defaults,
43+
final @NotNull GetMagentoModuleUtil.MagentoModuleData moduleData,
44+
final PsiDirectory targetDirectory,
45+
final PsiFile targetFile
46+
) {
47+
return defaults;
48+
}
49+
}

0 commit comments

Comments
 (0)