Skip to content

Commit bf76b18

Browse files
author
Vitaliy
authored
Merge pull request #130 from magento/53-project-template
Added Magento 2 module project template
2 parents c1d0dfa + 85428e3 commit bf76b18

33 files changed

+1481
-90
lines changed

CHANGELOG.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* RequireJS mapping support (reference navigation, completion)
77
* Plugin class methods generation
88
* Plugin declaration inspection in the scope of a Plugin Class
9-
* MFTF support (reference navigation, completion)
9+
* MFTF support MVP (reference navigation, completion)
1010
* Fixed support of 2020.* versions of IDE's
1111
* Create a New Magento 2 Module action
1212
* Code Inspection: Duplicated Observer Usage in events XML
@@ -15,6 +15,10 @@
1515
* Create a Preference for a class action
1616
* Create a Block action
1717
* Line markers for navigation from a plugin class to a target class
18+
* Magento 2 Module Project template on the start up
19+
* Create an observer for an event action
20+
* Plugin - Target line markers
21+
* GraphQL resolver inspection in the scope of a PHP Class
1822

1923
0.3.0
2024
=============

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ This is a plugin for Magento 2 development in the PhpStorm IDE. It is available
1111
2. Navigate to `Plugins`
1212
3. Click the `Browse repositories...` button and search for "Magento PhpStorm"
1313
4. Install the plugin and restart PhpStorm
14-
5. Go to `Settings > Preferences > Languages & Frameworks > PHP > Magento` in the PhpStorm IDE
14+
5. Go to `Settings > Preferences > Languages & Frameworks > PHP > Frameworks > Magento` in the PhpStorm IDE
1515
6. Check `Enable` and `OK` button.
1616

1717
## Works with

resources/META-INF/plugin.xml

+8-7
Original file line numberDiff line numberDiff line change
@@ -79,13 +79,9 @@
7979
</actions>
8080

8181
<extensions defaultExtensionNs="com.intellij">
82-
<projectConfigurable instance="com.magento.idea.magento2plugin.project.SettingsForm"
83-
id="Magento2.SettingsForm"
84-
displayName="Magento"
85-
nonDefaultProject="true"
86-
groupId="language"
87-
parentId="reference.webide.settings.project.settings.php"
88-
/>
82+
<directoryProjectGenerator implementation="com.magento.idea.magento2plugin.generation.MagentoModuleGenerator"/>
83+
<projectTemplatesFactory implementation="com.magento.idea.magento2plugin.generation.MagentoTemplatesFactory"/>
84+
8985
<projectService serviceImplementation="com.magento.idea.magento2plugin.project.Settings"/>
9086

9187
<completion.contributor language="XML" implementationClass="com.magento.idea.magento2plugin.completion.xml.XmlCompletionContributor" />
@@ -153,4 +149,9 @@
153149
<internalFileTemplate name="Magento Module Events Xml"/>
154150
</extensions>
155151

152+
<extensions defaultExtensionNs="com.jetbrains.php">
153+
<frameworkProjectConfigurableProvider implementation="com.magento.idea.magento2plugin.project.ConfigurableProvider"/>
154+
<frameworkUsageProvider implementation="com.magento.idea.magento2plugin.project.UsagesProvider"/>
155+
</extensions>
156+
156157
</idea-plugin>

src/com/magento/idea/magento2plugin/actions/generation/NewModuleAction.java

+39-5
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,20 @@
55
package com.magento.idea.magento2plugin.actions.generation;
66

77
import com.intellij.ide.IdeView;
8-
import com.intellij.openapi.actionSystem.AnActionEvent;
9-
import com.intellij.openapi.actionSystem.CommonDataKeys;
10-
import com.intellij.openapi.actionSystem.DataContext;
11-
import com.intellij.openapi.actionSystem.LangDataKeys;
8+
import com.intellij.openapi.actionSystem.*;
129
import com.intellij.openapi.editor.Editor;
1310
import com.intellij.openapi.project.Project;
11+
import com.intellij.openapi.util.Pair;
1412
import com.intellij.psi.PsiDirectory;
13+
import com.intellij.psi.PsiElement;
1514
import com.intellij.psi.PsiFile;
15+
import com.jetbrains.php.lang.psi.PhpFile;
16+
import com.jetbrains.php.lang.psi.elements.PhpClass;
1617
import com.magento.idea.magento2plugin.MagentoIcons;
1718
import com.magento.idea.magento2plugin.actions.generation.dialog.NewModuleDialog;
19+
import com.magento.idea.magento2plugin.actions.generation.util.IsClickedDirectoryInsideProject;
20+
import com.magento.idea.magento2plugin.project.Settings;
21+
import com.magento.idea.magento2plugin.util.magento.GetModuleNameByDirectory;
1822
import org.jetbrains.annotations.NotNull;
1923
import org.jetbrains.annotations.Nullable;
2024

@@ -57,5 +61,35 @@ private String getActionName() {
5761
public PsiFile getFile(DataContext dataContext) {
5862
return CommonDataKeys.PSI_FILE.getData(dataContext);
5963
}
60-
}
6164

65+
public void update(AnActionEvent event) {
66+
Project project = event.getData(PlatformDataKeys.PROJECT);
67+
68+
if (Settings.isEnabled(project)) {
69+
String magentoPath = Settings.getMagentoPath(project);
70+
if (magentoPath == null) {
71+
event.getPresentation().setVisible(false);
72+
return;
73+
}
74+
PsiElement psiElement = event.getData(PlatformDataKeys.PSI_ELEMENT);
75+
if (!(psiElement instanceof PsiDirectory)) {
76+
event.getPresentation().setVisible(false);
77+
return;
78+
}
79+
80+
if(!IsClickedDirectoryInsideProject.getInstance().execute(project, (PsiDirectory) psiElement)) {
81+
event.getPresentation().setVisible(false);
82+
return;
83+
}
84+
85+
GetModuleNameByDirectory getModuleName = GetModuleNameByDirectory.getInstance(project);
86+
String moduleName = getModuleName.execute((PsiDirectory) psiElement);
87+
if (moduleName == null) {
88+
event.getPresentation().setVisible(true);
89+
return;
90+
}
91+
}
92+
93+
event.getPresentation().setVisible(false);
94+
}
95+
}

src/com/magento/idea/magento2plugin/actions/generation/data/ModuleComposerJsonData.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public class ModuleComposerJsonData {
1616
private final String moduleVersion;
1717
private final List<String> moduleLicense;
1818
private final List<String> moduleDependencies;
19+
private final boolean createModuleDirs;
1920

2021
public ModuleComposerJsonData(
2122
String packageName,
@@ -25,7 +26,8 @@ public ModuleComposerJsonData(
2526
String composerPackageName,
2627
String moduleVersion,
2728
List<String> moduleLicense,
28-
List<String> moduleDependencies
29+
List<String> moduleDependencies,
30+
boolean createModuleDirs
2931
) {
3032
this.packageName = packageName;
3133
this.moduleName = moduleName;
@@ -35,6 +37,7 @@ public ModuleComposerJsonData(
3537
this.moduleVersion = moduleVersion;
3638
this.moduleLicense = moduleLicense;
3739
this.moduleDependencies = moduleDependencies;
40+
this.createModuleDirs = createModuleDirs;
3841
}
3942

4043
public String getPackageName() {
@@ -68,4 +71,8 @@ public List<String> getModuleLicense() {
6871
public List<String> getModuleDependencies() {
6972
return moduleDependencies;
7073
}
74+
75+
public boolean getCreateModuleDirs() {
76+
return this.createModuleDirs;
77+
}
7178
}

src/com/magento/idea/magento2plugin/actions/generation/data/ModuleRegistrationPhpData.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,18 @@ public class ModuleRegistrationPhpData {
1010
private final String packageName;
1111
private final String moduleName;
1212
private PsiDirectory baseDir;
13+
private boolean createModuleDirs;
1314

1415
public ModuleRegistrationPhpData(
1516
String packageName,
1617
String moduleName,
17-
PsiDirectory baseDir
18+
PsiDirectory baseDir,
19+
boolean createModuleDirs
1820
) {
1921
this.packageName = packageName;
2022
this.moduleName = moduleName;
2123
this.baseDir = baseDir;
24+
this.createModuleDirs = createModuleDirs;
2225
}
2326

2427
public String getPackageName() {
@@ -32,4 +35,8 @@ public String getModuleName() {
3235
public PsiDirectory getBaseDir() {
3336
return this.baseDir;
3437
}
38+
39+
public boolean getCreateModuleDirs() {
40+
return this.createModuleDirs;
41+
}
3542
}

src/com/magento/idea/magento2plugin/actions/generation/data/ModuleXmlData.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,18 @@ public class ModuleXmlData {
1010
private final String packageName;
1111
private final String moduleName;
1212
private PsiDirectory baseDir;
13+
private boolean createModuleDirs;
1314

1415
public ModuleXmlData(
1516
String packageName,
1617
String moduleName,
17-
PsiDirectory baseDir
18+
PsiDirectory baseDir,
19+
boolean createModuleDirs
1820
) {
1921
this.packageName = packageName;
2022
this.moduleName = moduleName;
2123
this.baseDir = baseDir;
24+
this.createModuleDirs = createModuleDirs;
2225
}
2326

2427
public String getPackageName() {
@@ -32,4 +35,8 @@ public String getModuleName() {
3235
public PsiDirectory getBaseDir() {
3336
return this.baseDir;
3437
}
38+
39+
public boolean getCreateModuleDirs() {
40+
return this.createModuleDirs;
41+
}
3542
}

src/com/magento/idea/magento2plugin/actions/generation/dialog/NewModuleDialog.java

+6-7
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import com.intellij.openapi.project.Project;
1010
import com.intellij.psi.PsiDirectory;
1111
import com.intellij.psi.PsiFile;
12-
import com.intellij.util.indexing.FileBasedIndex;
1312
import com.magento.idea.magento2plugin.actions.generation.NewModuleAction;
1413
import com.magento.idea.magento2plugin.actions.generation.data.ModuleComposerJsonData;
1514
import com.magento.idea.magento2plugin.actions.generation.data.ModuleRegistrationPhpData;
@@ -24,16 +23,13 @@
2423
import com.magento.idea.magento2plugin.indexes.ModuleIndex;
2524
import com.magento.idea.magento2plugin.magento.packages.Package;
2625
import com.magento.idea.magento2plugin.project.Settings;
27-
import com.magento.idea.magento2plugin.stubs.indexes.ModuleNameIndex;
2826
import com.magento.idea.magento2plugin.util.CamelCaseToHyphen;
2927
import org.jetbrains.annotations.NotNull;
3028
import org.jetbrains.annotations.Nullable;
3129
import javax.swing.*;
3230
import javax.swing.event.ListSelectionEvent;
3331
import javax.swing.event.ListSelectionListener;
3432
import java.awt.event.*;
35-
import java.util.ArrayList;
36-
import java.util.Collection;
3733
import java.util.List;
3834
import java.util.Vector;
3935

@@ -168,23 +164,26 @@ private PsiFile generateComposerJson() {
168164
getComposerPackageName(),
169165
getModuleVersion(),
170166
getModuleLicense(),
171-
getModuleDependencies()
167+
getModuleDependencies(),
168+
true
172169
), project).generate(NewModuleAction.ACTION_NAME);
173170
}
174171

175172
private PsiFile generateRegistrationPhp() {
176173
return new ModuleRegistrationPhpGenerator(new ModuleRegistrationPhpData(
177174
getPackageName(),
178175
getModuleName(),
179-
getBaseDir()
176+
getBaseDir(),
177+
true
180178
), project).generate(NewModuleAction.ACTION_NAME);
181179
}
182180

183181
private void generateModuleXml() {
184182
new ModuleXmlGenerator(new ModuleXmlData(
185183
getPackageName(),
186184
getModuleName(),
187-
getBaseDir()
185+
getBaseDir(),
186+
true
188187
), project).generate(NewModuleAction.ACTION_NAME, true);
189188
}
190189

src/com/magento/idea/magento2plugin/actions/generation/generator/ModuleComposerJsonGenerator.java

+12-6
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
package com.magento.idea.magento2plugin.actions.generation.generator;
66

77
import com.google.gson.JsonElement;
8-
import com.google.gson.JsonObject;
98
import com.google.gson.JsonParser;
109
import com.intellij.openapi.project.Project;
1110
import com.intellij.openapi.vfs.VirtualFile;
@@ -18,10 +17,8 @@
1817
import com.magento.idea.magento2plugin.magento.files.ComposerJson;
1918
import com.magento.idea.magento2plugin.util.CamelCaseToHyphen;
2019
import org.jetbrains.annotations.NotNull;
21-
2220
import java.io.FileNotFoundException;
2321
import java.io.FileReader;
24-
import java.util.ArrayList;
2522
import java.util.Properties;
2623
import java.util.List;
2724

@@ -45,8 +42,11 @@ public ModuleComposerJsonGenerator(@NotNull ModuleComposerJsonData moduleCompose
4542
}
4643

4744
public PsiFile generate(String actionName) {
48-
ModuleDirectoriesData moduleDirectoriesData = directoryGenerator.createOrFindModuleDirectories(moduleComposerJsonData.getPackageName(), moduleComposerJsonData.getModuleName(), moduleComposerJsonData.getBaseDir());
49-
return fileFromTemplateGenerator.generate(ComposerJson.getInstance(), getAttributes(), moduleDirectoriesData.getModuleDirectory(), actionName);
45+
if (moduleComposerJsonData.getCreateModuleDirs()) {
46+
ModuleDirectoriesData moduleDirectoriesData = directoryGenerator.createOrFindModuleDirectories(moduleComposerJsonData.getPackageName(), moduleComposerJsonData.getModuleName(), moduleComposerJsonData.getBaseDir());
47+
return fileFromTemplateGenerator.generate(ComposerJson.getInstance(), getAttributes(), moduleDirectoriesData.getModuleDirectory(), actionName);
48+
}
49+
return fileFromTemplateGenerator.generate(ComposerJson.getInstance(), getAttributes(), moduleComposerJsonData.getBaseDir(), actionName);
5050
}
5151

5252
protected void fillAttributes(Properties attributes) {
@@ -81,6 +81,12 @@ protected String getLicensesString(List licensesList) {
8181
private String getDependenciesString(List dependenciesList) {
8282
String result = "";
8383
Object[] dependencies = dependenciesList.toArray();
84+
result = result.concat(ComposerJson.DEFAULT_DEPENDENCY);
85+
if (dependencies.length == 0) {
86+
result = result.concat("\n");
87+
} else {
88+
result = result.concat(",\n");
89+
}
8490

8591
for (int i = 0; i < dependencies.length; i++) {
8692
String dependency = dependencies[i].toString();
@@ -105,7 +111,7 @@ private String getDependencyVersion(String dependency) {
105111
String version = "*";
106112
try {
107113
VirtualFile virtualFile = moduleIndex.getModuleDirectoryByModuleName(dependency)
108-
.findFile("composer.json")
114+
.findFile(ComposerJson.FILE_NAME)
109115
.getVirtualFile();
110116
if (virtualFile.exists()) {
111117
JsonElement jsonElement = new JsonParser().parse(new FileReader(virtualFile.getPath()));

src/com/magento/idea/magento2plugin/actions/generation/generator/ModuleRegistrationPhpGenerator.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,11 @@ public ModuleRegistrationPhpGenerator(@NotNull ModuleRegistrationPhpData moduleR
2828
}
2929

3030
public PsiFile generate(String actionName) {
31-
ModuleDirectoriesData moduleDirectoriesData = directoryGenerator.createOrFindModuleDirectories(moduleRegistrationPhpData.getPackageName(), moduleRegistrationPhpData.getModuleName(), moduleRegistrationPhpData.getBaseDir());
32-
return fileFromTemplateGenerator.generate(RegistrationPhp.getInstance(), getAttributes(), moduleDirectoriesData.getModuleDirectory(), actionName);
31+
if (moduleRegistrationPhpData.getCreateModuleDirs()) {
32+
ModuleDirectoriesData moduleDirectoriesData = directoryGenerator.createOrFindModuleDirectories(moduleRegistrationPhpData.getPackageName(), moduleRegistrationPhpData.getModuleName(), moduleRegistrationPhpData.getBaseDir());
33+
return fileFromTemplateGenerator.generate(RegistrationPhp.getInstance(), getAttributes(), moduleDirectoriesData.getModuleDirectory(), actionName);
34+
}
35+
return fileFromTemplateGenerator.generate(RegistrationPhp.getInstance(), getAttributes(), moduleRegistrationPhpData.getBaseDir(), actionName);
3336
}
3437

3538
protected void fillAttributes(Properties attributes) {

src/com/magento/idea/magento2plugin/actions/generation/generator/ModuleXmlGenerator.java

+8-4
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@
55
package com.magento.idea.magento2plugin.actions.generation.generator;
66

77
import com.intellij.openapi.project.Project;
8+
import com.intellij.psi.PsiDirectory;
89
import com.intellij.psi.PsiFile;
910
import com.magento.idea.magento2plugin.actions.generation.data.ModuleXmlData;
1011
import com.magento.idea.magento2plugin.actions.generation.generator.data.ModuleDirectoriesData;
1112
import com.magento.idea.magento2plugin.actions.generation.generator.util.DirectoryGenerator;
1213
import com.magento.idea.magento2plugin.actions.generation.generator.util.FileFromTemplateGenerator;
1314
import com.magento.idea.magento2plugin.magento.files.ModuleXml;
15+
import com.magento.idea.magento2plugin.magento.packages.Package;
1416
import org.jetbrains.annotations.NotNull;
15-
16-
import java.util.List;
1717
import java.util.Properties;
1818

1919
public class ModuleXmlGenerator extends FileGenerator {
@@ -31,8 +31,12 @@ public ModuleXmlGenerator(@NotNull ModuleXmlData moduleXmlData, Project project)
3131

3232
@Override
3333
public PsiFile generate(String actionName) {
34-
ModuleDirectoriesData moduleDirectoriesData = directoryGenerator.createOrFindModuleDirectories(moduleXmlData.getPackageName(), moduleXmlData.getModuleName(), moduleXmlData.getBaseDir());
35-
return fileFromTemplateGenerator.generate(ModuleXml.getInstance(), getAttributes(), moduleDirectoriesData.getModuleEtcDirectory(), actionName);
34+
if (moduleXmlData.getCreateModuleDirs()) {
35+
ModuleDirectoriesData moduleDirectoriesData = directoryGenerator.createOrFindModuleDirectories(moduleXmlData.getPackageName(), moduleXmlData.getModuleName(), moduleXmlData.getBaseDir());
36+
return fileFromTemplateGenerator.generate(ModuleXml.getInstance(), getAttributes(), moduleDirectoriesData.getModuleEtcDirectory(), actionName);
37+
}
38+
PsiDirectory etcDirectory = directoryGenerator.findOrCreateSubdirectory(moduleXmlData.getBaseDir(), Package.MODULE_BASE_AREA_DIR);
39+
return fileFromTemplateGenerator.generate(ModuleXml.getInstance(), getAttributes(), etcDirectory, actionName);
3640
}
3741

3842
protected void fillAttributes(Properties attributes) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/**
2+
* Copyright © Magento, Inc. All rights reserved.
3+
* See COPYING.txt for license details.
4+
*/
5+
package com.magento.idea.magento2plugin.actions.generation.util;
6+
7+
import com.intellij.openapi.project.Project;
8+
import com.intellij.openapi.vfs.VfsUtilCore;
9+
import com.intellij.psi.PsiDirectory;
10+
import com.magento.idea.magento2plugin.project.util.GetProjectBasePath;
11+
import org.jetbrains.annotations.NotNull;
12+
13+
public class IsClickedDirectoryInsideProject {
14+
15+
private static IsClickedDirectoryInsideProject INSTANCE = null;
16+
17+
public static IsClickedDirectoryInsideProject getInstance() {
18+
if (null == INSTANCE) {
19+
INSTANCE = new IsClickedDirectoryInsideProject();
20+
}
21+
return INSTANCE;
22+
}
23+
24+
public boolean execute(@NotNull Project project, PsiDirectory directory) {
25+
return VfsUtilCore.isAncestor(GetProjectBasePath.execute(project), directory.getVirtualFile(), false);
26+
}
27+
}

0 commit comments

Comments
 (0)