diff --git a/resources/META-INF/plugin.xml b/resources/META-INF/plugin.xml
index 00fdb1101..2eee35173 100644
--- a/resources/META-INF/plugin.xml
+++ b/resources/META-INF/plugin.xml
@@ -67,6 +67,7 @@
+
@@ -210,6 +211,9 @@
+
+
+
diff --git a/resources/fileTemplates/internal/Magento Collection Class.php.ft b/resources/fileTemplates/internal/Magento Collection Class.php.ft
new file mode 100644
index 000000000..58a15875e
--- /dev/null
+++ b/resources/fileTemplates/internal/Magento Collection Class.php.ft
@@ -0,0 +1,26 @@
+_init(${MODEL}::class, ${RESOURCE_MODEL}::class);
+ }
+}
diff --git a/resources/fileTemplates/internal/Magento Collection Class.php.html b/resources/fileTemplates/internal/Magento Collection Class.php.html
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/fileTemplates/internal/Magento Model Class.php.ft b/resources/fileTemplates/internal/Magento Model Class.php.ft
new file mode 100644
index 000000000..e4ed8d293
--- /dev/null
+++ b/resources/fileTemplates/internal/Magento Model Class.php.ft
@@ -0,0 +1,26 @@
+_init(${RESOURCE_MODEL}::class);
+ }
+}
diff --git a/resources/fileTemplates/internal/Magento Model Class.php.html b/resources/fileTemplates/internal/Magento Model Class.php.html
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/fileTemplates/internal/Magento Resource Model Class.php.ft b/resources/fileTemplates/internal/Magento Resource Model Class.php.ft
new file mode 100644
index 000000000..701392df7
--- /dev/null
+++ b/resources/fileTemplates/internal/Magento Resource Model Class.php.ft
@@ -0,0 +1,26 @@
+_init('${DB_NAME}', '${ENTITY_ID_COLUMN}');
+ }
+}
diff --git a/resources/fileTemplates/internal/Magento Resource Model Class.php.html b/resources/fileTemplates/internal/Magento Resource Model Class.php.html
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/com/magento/idea/magento2plugin/actions/generation/NewModelsAction.java b/src/com/magento/idea/magento2plugin/actions/generation/NewModelsAction.java
new file mode 100644
index 000000000..e9034f882
--- /dev/null
+++ b/src/com/magento/idea/magento2plugin/actions/generation/NewModelsAction.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+package com.magento.idea.magento2plugin.actions.generation;
+
+import com.intellij.ide.IdeView;
+import com.intellij.openapi.actionSystem.AnAction;
+import com.intellij.openapi.actionSystem.AnActionEvent;
+import com.intellij.openapi.actionSystem.CommonDataKeys;
+import com.intellij.openapi.actionSystem.DataContext;
+import com.intellij.openapi.actionSystem.LangDataKeys;
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiDirectory;
+import com.magento.idea.magento2plugin.MagentoIcons;
+import com.magento.idea.magento2plugin.actions.generation.dialog.NewModelsDialog;
+
+public class NewModelsAction extends AnAction {
+ public static final String ACTION_NAME = "Magento 2 Models";
+ public static final String ACTION_DESCRIPTION = "Create a new Magento 2 models";
+
+ /**
+ * New controller action constructor.
+ */
+ public NewModelsAction() {
+ super(ACTION_NAME, ACTION_DESCRIPTION, MagentoIcons.MODULE);
+ }
+
+ @Override
+ public void actionPerformed(final AnActionEvent event) {
+ final DataContext dataContext = event.getDataContext();
+ final IdeView view = LangDataKeys.IDE_VIEW.getData(dataContext);
+
+ if (view == null) {
+ return;
+ }
+
+ final Project project = CommonDataKeys.PROJECT.getData(dataContext);
+ if (project == null) {
+ return;
+ }
+
+ final PsiDirectory directory = view.getOrChooseDirectory();
+ if (directory == null) {
+ return;
+ }
+
+ NewModelsDialog.open(project, directory);
+ }
+
+ @Override
+ public boolean isDumbAware() {
+ return false;
+ }
+}
diff --git a/src/com/magento/idea/magento2plugin/actions/generation/data/CollectionData.java b/src/com/magento/idea/magento2plugin/actions/generation/data/CollectionData.java
new file mode 100644
index 000000000..0ada17e3f
--- /dev/null
+++ b/src/com/magento/idea/magento2plugin/actions/generation/data/CollectionData.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+package com.magento.idea.magento2plugin.actions.generation.data;
+
+@SuppressWarnings({"PMD.ExcessiveParameterList"})
+public class CollectionData {
+ private final String moduleName;
+ private final String dbTableName;
+ private final String modelName;
+ private final String collectionName;
+ private final String collectionFqn;
+ private final String collectionDirectory;
+ private final String collectionNamespace;
+ private final String resourceModelName;
+ private final String resourceModelFqn;
+ private final String modelFqn;
+
+ /**
+ * Models Data.
+ *
+ * @param moduleName String
+ * @param dbTableName String
+ * @param modelName String
+ * @param collectionName String
+ * @param collectionFqn String
+ * @param collectionDirectory String
+ * @param resourceModelName String
+ * @param resourceModelFqn String
+ * @param modelFqn String
+ */
+ public CollectionData(
+ final String moduleName,
+ final String dbTableName,
+ final String modelName,
+ final String collectionName,
+ final String collectionFqn,
+ final String collectionDirectory,
+ final String collectionNamespace,
+ final String resourceModelName,
+ final String resourceModelFqn,
+ final String modelFqn
+ ) {
+ this.moduleName = moduleName;
+ this.dbTableName = dbTableName;
+ this.modelName = modelName;
+ this.collectionName = collectionName;
+ this.collectionFqn = collectionFqn;
+ this.collectionDirectory = collectionDirectory;
+ this.collectionNamespace = collectionNamespace;
+ this.resourceModelName = resourceModelName;
+ this.resourceModelFqn = resourceModelFqn;
+ this.modelFqn = modelFqn;
+ }
+
+ /**
+ * Module Name.
+ *
+ * @return String
+ */
+ public String getModuleName() {
+ return moduleName;
+ }
+
+ /**
+ * DB table Name.
+ *
+ * @return String
+ */
+ public String getDbTableName() {
+ return dbTableName;
+ }
+
+ /**
+ * Model Name.
+ *
+ * @return String
+ */
+ public String getModelName() {
+ return modelName;
+ }
+
+ /**
+ * Collection Name.
+ *
+ * @return String
+ */
+ public String getCollectionName() {
+ return collectionName;
+ }
+
+ /**
+ * Collection FQN.
+ *
+ * @return String
+ */
+ public String getCollectionFqn() {
+ return collectionFqn;
+ }
+
+ /**
+ * Collection Directory.
+ *
+ * @return String
+ */
+ public String getCollectionDirectory() {
+ return collectionDirectory;
+ }
+
+ /**
+ * Collection Namespace.
+ *
+ * @return String
+ */
+ public String getCollectionNamespace() {
+ return collectionNamespace;
+ }
+
+ /**
+ * Resource Model Name.
+ *
+ * @return String
+ */
+ public String getResourceModelName() {
+ return resourceModelName;
+ }
+
+ /**
+ * Resource Model FQN.
+ *
+ * @return String
+ */
+ public String getResourceModelFqn() {
+ return resourceModelFqn;
+ }
+
+ /**
+ * Model FQN.
+ *
+ * @return String
+ */
+ public String getModelFqn() {
+ return modelFqn;
+ }
+}
diff --git a/src/com/magento/idea/magento2plugin/actions/generation/data/ModelData.java b/src/com/magento/idea/magento2plugin/actions/generation/data/ModelData.java
new file mode 100644
index 000000000..a20a2eb4d
--- /dev/null
+++ b/src/com/magento/idea/magento2plugin/actions/generation/data/ModelData.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+package com.magento.idea.magento2plugin.actions.generation.data;
+
+public class ModelData {
+ private final String moduleName;
+ private final String dbTableName;
+ private final String modelName;
+ private final String resourceName;
+ private final String fqn;
+ private final String namespace;
+ private final String resourceModelFqn;
+
+ /**
+ * Model Data.
+ *
+ * @param moduleName String
+ * @param dbTableName String
+ * @param modelName String
+ * @param resourceName String
+ * @param fqn String
+ * @param namespace String
+ * @param resourceModelFqn String
+ */
+ public ModelData(
+ final String moduleName,
+ final String dbTableName,
+ final String modelName,
+ final String resourceName,
+ final String fqn,
+ final String namespace,
+ final String resourceModelFqn
+ ) {
+ this.moduleName = moduleName;
+ this.dbTableName = dbTableName;
+ this.modelName = modelName;
+ this.resourceName = resourceName;
+ this.fqn = fqn;
+ this.namespace = namespace;
+ this.resourceModelFqn = resourceModelFqn;
+ }
+
+ /**
+ * Module Name.
+ *
+ * @return String
+ */
+ public String getModuleName() {
+ return moduleName;
+ }
+
+ /**
+ * DB table Name.
+ *
+ * @return String
+ */
+ public String getDbTableName() {
+ return dbTableName;
+ }
+
+ /**
+ * Model Name.
+ *
+ * @return String
+ */
+ public String getModelName() {
+ return modelName;
+ }
+
+ /**
+ * Resource Name.
+ *
+ * @return String
+ */
+ public String getResourceName() {
+ return resourceName;
+ }
+
+ /**
+ * Class FQN.
+ *
+ * @return String
+ */
+ public String getFqn() {
+ return fqn;
+ }
+
+ /**
+ * Class Namespace.
+ *
+ * @return String
+ */
+ public String getNamespace() {
+ return namespace;
+ }
+
+ /**
+ * Resource model FQN.
+ *
+ * @return String
+ */
+ public String getResourceModelFqn() {
+ return resourceModelFqn;
+ }
+}
diff --git a/src/com/magento/idea/magento2plugin/actions/generation/data/ResourceModelData.java b/src/com/magento/idea/magento2plugin/actions/generation/data/ResourceModelData.java
new file mode 100644
index 000000000..2d265fe32
--- /dev/null
+++ b/src/com/magento/idea/magento2plugin/actions/generation/data/ResourceModelData.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+package com.magento.idea.magento2plugin.actions.generation.data;
+
+public class ResourceModelData {
+ private final String moduleName;
+ private final String dbTableName;
+ private final String resourceModelName;
+ private final String entityIdColumn;
+ private final String namespace;
+ private final String fqn;
+
+ /**
+ * Resource Model Data.
+ *
+ * @param moduleName String
+ * @param dbTableName String
+ * @param resourceModelName String
+ * @param entityIdColumn String
+ * @param namespace String
+ * @param fqn String
+ */
+ public ResourceModelData(
+ final String moduleName,
+ final String dbTableName,
+ final String resourceModelName,
+ final String entityIdColumn,
+ final String namespace,
+ final String fqn
+ ) {
+ this.moduleName = moduleName;
+ this.dbTableName = dbTableName;
+ this.resourceModelName = resourceModelName;
+ this.entityIdColumn = entityIdColumn;
+ this.namespace = namespace;
+ this.fqn = fqn;
+ }
+
+ /**
+ * Module Name.
+ *
+ * @return String
+ */
+ public String getModuleName() {
+ return moduleName;
+ }
+
+ /**
+ * DB table Name.
+ *
+ * @return String
+ */
+ public String getDbTableName() {
+ return dbTableName;
+ }
+
+ /**
+ * Entity ID column.
+ *
+ * @return String
+ */
+ public String getEntityIdColumn() {
+ return entityIdColumn;
+ }
+
+ /**
+ * Resource Model name.
+ *
+ * @return String
+ */
+ public String getResourceModelName() {
+ return resourceModelName;
+ }
+
+ /**
+ * Namespace getter.
+ *
+ * @return String.
+ */
+ public String getNamespace() {
+ return namespace;
+ }
+
+ /**
+ * FQN getter.
+ *
+ * @return String.
+ */
+ public String getFqn() {
+ return fqn;
+ }
+}
diff --git a/src/com/magento/idea/magento2plugin/actions/generation/dialog/NewModelsDialog.form b/src/com/magento/idea/magento2plugin/actions/generation/dialog/NewModelsDialog.form
new file mode 100644
index 000000000..ec6e68d88
--- /dev/null
+++ b/src/com/magento/idea/magento2plugin/actions/generation/dialog/NewModelsDialog.form
@@ -0,0 +1,168 @@
+
+
diff --git a/src/com/magento/idea/magento2plugin/actions/generation/dialog/NewModelsDialog.java b/src/com/magento/idea/magento2plugin/actions/generation/dialog/NewModelsDialog.java
new file mode 100644
index 000000000..8acfe6a4a
--- /dev/null
+++ b/src/com/magento/idea/magento2plugin/actions/generation/dialog/NewModelsDialog.java
@@ -0,0 +1,271 @@
+/*
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+package com.magento.idea.magento2plugin.actions.generation.dialog;
+
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiDirectory;
+import com.intellij.psi.PsiFile;
+import com.intellij.ui.DocumentAdapter;
+import com.magento.idea.magento2plugin.actions.generation.data.CollectionData;
+import com.magento.idea.magento2plugin.actions.generation.data.ModelData;
+import com.magento.idea.magento2plugin.actions.generation.data.ResourceModelData;
+import com.magento.idea.magento2plugin.actions.generation.dialog.validator.annotation.FieldValidation;
+import com.magento.idea.magento2plugin.actions.generation.dialog.validator.annotation.RuleRegistry;
+import com.magento.idea.magento2plugin.actions.generation.dialog.validator.rule.IdentifierRule;
+import com.magento.idea.magento2plugin.actions.generation.dialog.validator.rule.NotEmptyRule;
+import com.magento.idea.magento2plugin.actions.generation.dialog.validator.rule.PhpClassRule;
+import com.magento.idea.magento2plugin.actions.generation.generator.ModuleCollectionGenerator;
+import com.magento.idea.magento2plugin.actions.generation.generator.ModuleModelGenerator;
+import com.magento.idea.magento2plugin.actions.generation.generator.ModuleResourceModelGenerator;
+import com.magento.idea.magento2plugin.actions.generation.generator.util.NamespaceBuilder;
+import com.magento.idea.magento2plugin.magento.files.ModelPhp;
+import com.magento.idea.magento2plugin.magento.files.ResourceModelPhp;
+import com.magento.idea.magento2plugin.magento.packages.File;
+import com.magento.idea.magento2plugin.util.magento.GetModuleNameByDirectoryUtil;
+import java.awt.event.ActionEvent;
+import java.awt.event.KeyEvent;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+import javax.swing.KeyStroke;
+import javax.swing.event.DocumentEvent;
+import org.jetbrains.annotations.NotNull;
+
+@SuppressWarnings({"PMD.TooManyFields", "PMD.ExcessiveImports"})
+public class NewModelsDialog extends AbstractDialog {
+ private final String moduleName;
+ private final Project project;
+ private JPanel contentPane;
+ private JButton buttonOK;
+ private JButton buttonCancel;
+
+ private static final String ACTION_NAME = "Create Models";
+ private static final String MODEL_NAME = "Model Name";
+ private static final String RESOURCE_MODEL_NAME = "Resource Model Name";
+ private static final String DB_TABLE_NAME = "DB Table Name";
+ private static final String ENTITY_ID_COLUMN_NAME = "Entity ID Column Name";
+ private static final String COLLECTION_NAME = "Collection Name";
+ private static final String COLLECTION_DIRECTORY = "Collection Directory";
+
+ @FieldValidation(rule = RuleRegistry.NOT_EMPTY,
+ message = {NotEmptyRule.MESSAGE, MODEL_NAME})
+ @FieldValidation(rule = RuleRegistry.PHP_CLASS,
+ message = {PhpClassRule.MESSAGE, MODEL_NAME})
+ private JTextField modelName;
+
+ @FieldValidation(rule = RuleRegistry.NOT_EMPTY,
+ message = {NotEmptyRule.MESSAGE, RESOURCE_MODEL_NAME})
+ @FieldValidation(rule = RuleRegistry.PHP_CLASS,
+ message = {PhpClassRule.MESSAGE, RESOURCE_MODEL_NAME})
+ private JTextField resourceModelName;
+
+ @FieldValidation(rule = RuleRegistry.NOT_EMPTY,
+ message = {NotEmptyRule.MESSAGE, DB_TABLE_NAME})
+ @FieldValidation(rule = RuleRegistry.IDENTIFIER,
+ message = {IdentifierRule.MESSAGE, DB_TABLE_NAME})
+ private JTextField dbTableName;
+
+ @FieldValidation(rule = RuleRegistry.NOT_EMPTY,
+ message = {NotEmptyRule.MESSAGE, ENTITY_ID_COLUMN_NAME})
+ @FieldValidation(rule = RuleRegistry.IDENTIFIER,
+ message = {IdentifierRule.MESSAGE, ENTITY_ID_COLUMN_NAME})
+ private JTextField entityIdColumn;
+
+ @FieldValidation(rule = RuleRegistry.NOT_EMPTY,
+ message = {NotEmptyRule.MESSAGE, COLLECTION_DIRECTORY})
+ @FieldValidation(rule = RuleRegistry.PHP_CLASS,
+ message = {PhpClassRule.MESSAGE, COLLECTION_DIRECTORY})
+ private JTextField collectionDirectory;
+
+ @FieldValidation(rule = RuleRegistry.NOT_EMPTY,
+ message = {NotEmptyRule.MESSAGE, COLLECTION_NAME})
+ @FieldValidation(rule = RuleRegistry.PHP_CLASS,
+ message = {PhpClassRule.MESSAGE, COLLECTION_NAME})
+ private JTextField collectionName;
+
+ private JLabel modelNameLabel;//NOPMD
+ private JLabel dbTableNameLabel;//NOPMD
+ private JLabel resourceModelLabel;//NOPMD
+ private JLabel entityIdColumnLabel;//NOPMD
+ private JLabel collectionDirectoryLabel;//NOPMD
+ private JLabel collectionNameLabel;//NOPMD
+
+ /**
+ * Open new dialog for adding new controller.
+ *
+ * @param project Project
+ * @param directory PsiDirectory
+ */
+ public NewModelsDialog(final Project project, final PsiDirectory directory) {
+ super();
+ this.project = project;
+ this.moduleName = GetModuleNameByDirectoryUtil.execute(directory, project);
+
+ setContentPane(contentPane);
+ setModal(true);
+ getRootPane().setDefaultButton(buttonOK);
+ buttonOK.addActionListener(e -> onOK());
+ buttonCancel.addActionListener(e -> onCancel());
+
+ // call onCancel() when cross is clicked
+ setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
+ addWindowListener(new WindowAdapter() {
+ @Override
+ public void windowClosing(final WindowEvent event) {
+ onCancel();
+ }
+ });
+
+ // call onCancel() on ESCAPE
+ contentPane.registerKeyboardAction(
+ (final ActionEvent event) -> onCancel(),
+ KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0),
+ JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
+ );
+
+ this.modelName.getDocument().addDocumentListener(new DocumentAdapter() {
+ @Override
+ protected void textChanged(final @NotNull DocumentEvent event) {
+ updateText();
+ }
+ });
+ }
+
+ /**
+ * Update collection and resource model text.
+ */
+ public void updateText() {
+ final String modelName = this.modelName.getText();
+ this.resourceModelName.setText(modelName);
+ this.collectionDirectory.setText(modelName);
+ }
+
+ private String getModuleName() {
+ return moduleName;
+ }
+
+ private String getModelName() {
+ return modelName.getText().trim();
+ }
+
+ private String getCollectionName() {
+ return collectionName.getText().trim();
+ }
+
+ private String getResourceModelName() {
+ return resourceModelName.getText().trim();
+ }
+
+ private String getDbTableName() {
+ return dbTableName.getText().trim();
+ }
+
+ private String getEntityIdColumn() {
+ return entityIdColumn.getText().trim();
+ }
+
+ private String getCollectionDirectory() {
+ return ResourceModelPhp.RESOURCE_MODEL_DIRECTORY + File.separator
+ + collectionDirectory.getText().trim();
+ }
+
+ private NamespaceBuilder getModelNamespace() {
+ return new NamespaceBuilder(getModuleName(), getModelName(), ModelPhp.MODEL_DIRECTORY);
+ }
+
+ private NamespaceBuilder getResourceModelNamespace() {
+ return new NamespaceBuilder(
+ getModuleName(),
+ getResourceModelName(),
+ ResourceModelPhp.RESOURCE_MODEL_DIRECTORY
+ );
+ }
+
+ private NamespaceBuilder getCollectionNamespace() {
+ return new NamespaceBuilder(
+ getModuleName(),
+ getCollectionName(),
+ getCollectionDirectory()
+ );
+ }
+
+ /**
+ * Open new controller dialog.
+ *
+ * @param project Project
+ * @param directory PsiDirectory
+ */
+ public static void open(final Project project, final PsiDirectory directory) {
+ final NewModelsDialog dialog = new NewModelsDialog(project, directory);
+ dialog.pack();
+ dialog.centerDialog(dialog);
+ dialog.setVisible(true);
+ }
+
+ private void onOK() {
+ if (!validateFormFields()) {
+ return;
+ }
+
+ generateModelFile();
+ generateResourceModelFile();
+ generateCollectionFile();
+ this.setVisible(false);
+ }
+
+ private PsiFile generateModelFile() {
+ final NamespaceBuilder modelNamespace = getModelNamespace();
+ final NamespaceBuilder resourceModelNamespace = getResourceModelNamespace();
+ return new ModuleModelGenerator(new ModelData(
+ getModuleName(),
+ getDbTableName(),
+ getModelName(),
+ getResourceModelName(),
+ modelNamespace.getClassFqn(),
+ modelNamespace.getNamespace(),
+ resourceModelNamespace.getClassFqn()
+ ), project).generate(NewModelsDialog.ACTION_NAME, true);
+ }
+
+ private PsiFile generateResourceModelFile() {
+ final NamespaceBuilder resourceModelNamespace = getResourceModelNamespace();
+ return new ModuleResourceModelGenerator(new ResourceModelData(
+ getModuleName(),
+ getDbTableName(),
+ getResourceModelName(),
+ getEntityIdColumn(),
+ resourceModelNamespace.getNamespace(),
+ resourceModelNamespace.getClassFqn()
+ ), project).generate(NewModelsDialog.ACTION_NAME, true);
+ }
+
+ private PsiFile generateCollectionFile() {
+ final NamespaceBuilder resourceModelNamespace = getResourceModelNamespace();
+ final NamespaceBuilder modelNamespace = getModelNamespace();
+ final NamespaceBuilder collectionNamespace = getCollectionNamespace();
+ return new ModuleCollectionGenerator(new CollectionData(
+ getModuleName(),
+ getDbTableName(),
+ getModelName(),
+ getCollectionName(),
+ collectionNamespace.getClassFqn(),
+ getCollectionDirectory(),
+ collectionNamespace.getNamespace(),
+ getResourceModelName(),
+ resourceModelNamespace.getClassFqn(),
+ modelNamespace.getClassFqn()
+ ), project).generate(NewModelsDialog.ACTION_NAME, true);
+ }
+
+ @Override
+ protected void onCancel() {
+ dispose();
+ }
+}
diff --git a/src/com/magento/idea/magento2plugin/actions/generation/generator/ModuleCollectionGenerator.java b/src/com/magento/idea/magento2plugin/actions/generation/generator/ModuleCollectionGenerator.java
new file mode 100644
index 000000000..a9cdac186
--- /dev/null
+++ b/src/com/magento/idea/magento2plugin/actions/generation/generator/ModuleCollectionGenerator.java
@@ -0,0 +1,182 @@
+/*
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+package com.magento.idea.magento2plugin.actions.generation.generator;
+
+import com.intellij.openapi.command.WriteCommandAction;
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiDirectory;
+import com.intellij.psi.PsiFile;
+import com.jetbrains.php.lang.psi.PhpFile;
+import com.jetbrains.php.lang.psi.elements.PhpClass;
+import com.magento.idea.magento2plugin.actions.generation.data.CollectionData;
+import com.magento.idea.magento2plugin.actions.generation.generator.util.DirectoryGenerator;
+import com.magento.idea.magento2plugin.actions.generation.generator.util.FileFromTemplateGenerator;
+import com.magento.idea.magento2plugin.actions.generation.generator.util.PhpClassGeneratorUtil;
+import com.magento.idea.magento2plugin.bundles.CommonBundle;
+import com.magento.idea.magento2plugin.bundles.ValidatorBundle;
+import com.magento.idea.magento2plugin.indexes.ModuleIndex;
+import com.magento.idea.magento2plugin.magento.files.CollectionPhp;
+import com.magento.idea.magento2plugin.magento.packages.File;
+import com.magento.idea.magento2plugin.util.GetFirstClassOfFile;
+import com.magento.idea.magento2plugin.util.GetPhpClassByFQN;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Properties;
+import javax.swing.JOptionPane;
+
+public class ModuleCollectionGenerator extends FileGenerator {
+ private final CollectionData collectionData;
+ private final Project project;
+ private final ValidatorBundle validatorBundle;
+ private final CommonBundle commonBundle;
+ private final GetFirstClassOfFile getFirstClassOfFile;
+ private final DirectoryGenerator directoryGenerator;
+ private final FileFromTemplateGenerator fileFromTemplateGenerator;
+
+ /**
+ * Generates new Collection PHP Class based on provided data.
+ *
+ * @param collectionData CollectionData
+ * @param project Project
+ */
+ public ModuleCollectionGenerator(
+ final CollectionData collectionData,
+ final Project project
+ ) {
+ super(project);
+ this.project = project;
+ this.collectionData = collectionData;
+ this.directoryGenerator = DirectoryGenerator.getInstance();
+ this.fileFromTemplateGenerator = FileFromTemplateGenerator.getInstance(project);
+ this.getFirstClassOfFile = GetFirstClassOfFile.getInstance();
+ this.validatorBundle = new ValidatorBundle();
+ this.commonBundle = new CommonBundle();
+ }
+
+ /**
+ * Generates collection model class.
+ *
+ * @param actionName Action name
+ * @return PsiFile
+ */
+ public PsiFile generate(final String actionName) {
+ final PsiFile[] collectionFiles = new PsiFile[1];
+
+ WriteCommandAction.runWriteCommandAction(project, () -> {
+ PhpClass collection = GetPhpClassByFQN.getInstance(project).execute(
+ getCollectionModelFqn()
+ );
+
+ if (collection != null) {
+ final String errorMessage = this.validatorBundle.message(
+ "validator.file.alreadyExists",
+ "Collection Class"
+ );
+ JOptionPane.showMessageDialog(
+ null,
+ errorMessage,
+ commonBundle.message("common.error"),
+ JOptionPane.ERROR_MESSAGE
+ );
+
+ return;
+ }
+
+ collection = createClass(actionName);
+
+ if (collection == null) {
+ final String errorMessage = this.validatorBundle.message(
+ "validator.file.cantBeCreated",
+ "Collection Class"
+ );
+ JOptionPane.showMessageDialog(
+ null,
+ errorMessage,
+ commonBundle.message("common.error"),
+ JOptionPane.ERROR_MESSAGE
+ );
+
+ return;
+ }
+
+ collectionFiles[0] = collection.getContainingFile();
+ });
+
+ return collectionFiles[0];
+ }
+
+ /**
+ * Get controller module.
+ *
+ * @return String
+ */
+ public String getModuleName() {
+ return collectionData.getModuleName();
+ }
+
+ private String getCollectionModelFqn() {
+ return collectionData.getCollectionFqn();
+ }
+
+ private PhpClass createClass(final String actionName) {
+ PsiDirectory parentDirectory = ModuleIndex.getInstance(project)
+ .getModuleDirectoryByModuleName(getModuleName());
+ final PsiFile modelFile;
+
+ final String[] collectionDirectories = collectionData.getCollectionDirectory().split(
+ File.separator
+ );
+ for (final String directory: collectionDirectories) {
+ parentDirectory = directoryGenerator.findOrCreateSubdirectory(
+ parentDirectory, directory
+ );
+ }
+
+ final Properties attributes = getAttributes();
+ modelFile = fileFromTemplateGenerator.generate(
+ new CollectionPhp(collectionData.getCollectionName()),
+ attributes,
+ parentDirectory,
+ actionName
+ );
+
+ if (modelFile == null) {
+ return null;
+ }
+
+ return getFirstClassOfFile.execute((PhpFile) modelFile);
+ }
+
+ protected void fillAttributes(final Properties attributes) {
+ attributes.setProperty("NAME", collectionData.getCollectionName());
+ attributes.setProperty("NAMESPACE", collectionData.getCollectionNamespace());
+
+ attributes.setProperty("DB_NAME", collectionData.getDbTableName());
+ attributes.setProperty("MODEL", PhpClassGeneratorUtil.getNameFromFqn(
+ collectionData.getModelName())
+ );
+ attributes.setProperty("RESOURCE_MODEL", PhpClassGeneratorUtil.getNameFromFqn(
+ collectionData.getResourceModelName())
+ );
+ final List uses = getUses();
+ uses.add(collectionData.getResourceModelFqn());
+ uses.add(collectionData.getModelFqn());
+
+ attributes.setProperty(
+ "EXTENDS",
+ PhpClassGeneratorUtil.getNameFromFqn(CollectionPhp.ABSTRACT_COLLECTION)
+ );
+
+ attributes.setProperty("USES", PhpClassGeneratorUtil.formatUses(uses));
+ }
+
+ private List getUses() {
+ return new ArrayList<>(Arrays.asList(
+ CollectionPhp.ABSTRACT_COLLECTION
+ ));
+ }
+}
diff --git a/src/com/magento/idea/magento2plugin/actions/generation/generator/ModuleControllerClassGenerator.java b/src/com/magento/idea/magento2plugin/actions/generation/generator/ModuleControllerClassGenerator.java
index b3d04cfd9..ff7ab2d44 100644
--- a/src/com/magento/idea/magento2plugin/actions/generation/generator/ModuleControllerClassGenerator.java
+++ b/src/com/magento/idea/magento2plugin/actions/generation/generator/ModuleControllerClassGenerator.java
@@ -14,6 +14,7 @@
import com.magento.idea.magento2plugin.actions.generation.data.ControllerFileData;
import com.magento.idea.magento2plugin.actions.generation.generator.util.DirectoryGenerator;
import com.magento.idea.magento2plugin.actions.generation.generator.util.FileFromTemplateGenerator;
+import com.magento.idea.magento2plugin.actions.generation.generator.util.PhpClassGeneratorUtil;
import com.magento.idea.magento2plugin.bundles.CommonBundle;
import com.magento.idea.magento2plugin.bundles.ValidatorBundle;
import com.magento.idea.magento2plugin.indexes.ModuleIndex;
@@ -28,7 +29,6 @@
import com.magento.idea.magento2plugin.util.GetPhpClassByFQN;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collections;
import java.util.List;
import java.util.Properties;
import javax.swing.JOptionPane;
@@ -189,7 +189,10 @@ protected void fillAttributes(final Properties attributes) {
final String httpMethodInterface = getHttpMethodInterfaceByMethod(
controllerFileData.getHttpMethodName()
);
- attributes.setProperty("IMPLEMENTS", getNameFromFqn(httpMethodInterface));
+ attributes.setProperty(
+ "IMPLEMENTS",
+ PhpClassGeneratorUtil.getNameFromFqn(httpMethodInterface)
+ );
final List uses = getUses();
uses.add(httpMethodInterface);
@@ -200,22 +203,22 @@ protected void fillAttributes(final Properties attributes) {
uses.add(Controller.ADMINHTML_CONTROLLER_FQN);
attributes.setProperty(
"EXTENDS",
- getNameFromFqn(Controller.ADMINHTML_CONTROLLER_FQN)
+ PhpClassGeneratorUtil.getNameFromFqn(Controller.ADMINHTML_CONTROLLER_FQN)
);
attributes.setProperty(
"ACL",
- getNameFromFqn(controllerFileData.getAcl())
+ PhpClassGeneratorUtil.getNameFromFqn(controllerFileData.getAcl())
);
} else {
uses.add(Controller.FRONTEND_CONTROLLER_FQN);
attributes.setProperty(
"EXTENDS",
- getNameFromFqn(Controller.FRONTEND_CONTROLLER_FQN)
+ PhpClassGeneratorUtil.getNameFromFqn(Controller.FRONTEND_CONTROLLER_FQN)
);
}
}
- attributes.setProperty("USES", formatUses(uses));
+ attributes.setProperty("USES", PhpClassGeneratorUtil.formatUses(uses));
}
private List getUses() {
@@ -225,16 +228,4 @@ private List getUses() {
Controller.EXCEPTION_CLASS_FQN
));
}
-
- private String formatUses(final List uses) {
- Collections.sort(uses);
-
- return String.join(",", uses);
- }
-
- private String getNameFromFqn(final String fqn) {
- final String[] fqnArray = fqn.split("\\\\");
-
- return fqnArray[fqnArray.length - 1];
- }
}
diff --git a/src/com/magento/idea/magento2plugin/actions/generation/generator/ModuleModelGenerator.java b/src/com/magento/idea/magento2plugin/actions/generation/generator/ModuleModelGenerator.java
new file mode 100644
index 000000000..5a746f908
--- /dev/null
+++ b/src/com/magento/idea/magento2plugin/actions/generation/generator/ModuleModelGenerator.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+package com.magento.idea.magento2plugin.actions.generation.generator;
+
+import com.intellij.openapi.command.WriteCommandAction;
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiDirectory;
+import com.intellij.psi.PsiFile;
+import com.jetbrains.php.lang.psi.PhpFile;
+import com.jetbrains.php.lang.psi.elements.PhpClass;
+import com.magento.idea.magento2plugin.actions.generation.data.ModelData;
+import com.magento.idea.magento2plugin.actions.generation.generator.util.DirectoryGenerator;
+import com.magento.idea.magento2plugin.actions.generation.generator.util.FileFromTemplateGenerator;
+import com.magento.idea.magento2plugin.actions.generation.generator.util.PhpClassGeneratorUtil;
+import com.magento.idea.magento2plugin.bundles.CommonBundle;
+import com.magento.idea.magento2plugin.bundles.ValidatorBundle;
+import com.magento.idea.magento2plugin.indexes.ModuleIndex;
+import com.magento.idea.magento2plugin.magento.files.ModelPhp;
+import com.magento.idea.magento2plugin.util.GetFirstClassOfFile;
+import com.magento.idea.magento2plugin.util.GetPhpClassByFQN;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Properties;
+import javax.swing.JOptionPane;
+
+public class ModuleModelGenerator extends FileGenerator {
+ private final ModelData modelData;
+ private final Project project;
+ private final ValidatorBundle validatorBundle;
+ private final CommonBundle commonBundle;
+ private final GetFirstClassOfFile getFirstClassOfFile;
+ private final DirectoryGenerator directoryGenerator;
+ private final FileFromTemplateGenerator fileFromTemplateGenerator;
+
+ /**
+ * Generates new Model PHP Class based on provided data.
+ *
+ * @param modelData ModelData
+ * @param project Project
+ */
+ public ModuleModelGenerator(
+ final ModelData modelData,
+ final Project project
+ ) {
+ super(project);
+ this.project = project;
+ this.modelData = modelData;
+ this.directoryGenerator = DirectoryGenerator.getInstance();
+ this.fileFromTemplateGenerator = FileFromTemplateGenerator.getInstance(project);
+ this.getFirstClassOfFile = GetFirstClassOfFile.getInstance();
+ this.validatorBundle = new ValidatorBundle();
+ this.commonBundle = new CommonBundle();
+ }
+
+ /**
+ * Generates model class.
+ *
+ * @param actionName Action name
+ * @return PsiFile
+ */
+ public PsiFile generate(final String actionName) {
+ final PsiFile[] modelFiles = new PsiFile[1];
+
+ WriteCommandAction.runWriteCommandAction(project, () -> {
+ PhpClass model = GetPhpClassByFQN.getInstance(project).execute(
+ getModelFqn()
+ );
+
+ if (model != null) {
+ final String errorMessage = this.validatorBundle.message(
+ "validator.file.alreadyExists",
+ "Model Class"
+ );
+ JOptionPane.showMessageDialog(
+ null,
+ errorMessage,
+ commonBundle.message("common.error"),
+ JOptionPane.ERROR_MESSAGE
+ );
+
+ return;
+ }
+
+ model = createModelClass(actionName);
+
+ if (model == null) {
+ final String errorMessage = this.validatorBundle.message(
+ "validator.file.cantBeCreated",
+ "Model Class"
+ );
+ JOptionPane.showMessageDialog(
+ null,
+ errorMessage,
+ commonBundle.message("common.error"),
+ JOptionPane.ERROR_MESSAGE
+ );
+
+ return;
+ }
+
+ modelFiles[0] = model.getContainingFile();
+ });
+
+ return modelFiles[0];
+ }
+
+ /**
+ * Get module.
+ *
+ * @return String
+ */
+ public String getModuleName() {
+ return modelData.getModuleName();
+ }
+
+ private String getModelFqn() {
+ return modelData.getFqn();
+ }
+
+ private PhpClass createModelClass(final String actionName) {
+ PsiDirectory parentDirectory = ModuleIndex.getInstance(project)
+ .getModuleDirectoryByModuleName(getModuleName());
+ final PsiFile modelFile;
+
+ parentDirectory = directoryGenerator.findOrCreateSubdirectory(
+ parentDirectory, ModelPhp.MODEL_DIRECTORY
+ );
+
+ final Properties attributes = getAttributes();
+ modelFile = fileFromTemplateGenerator.generate(
+ new ModelPhp(modelData.getModelName()),
+ attributes,
+ parentDirectory,
+ actionName
+ );
+
+ if (modelFile == null) {
+ return null;
+ }
+
+ return getFirstClassOfFile.execute((PhpFile) modelFile);
+ }
+
+ protected void fillAttributes(final Properties attributes) {
+ attributes.setProperty("NAME", modelData.getModelName());
+ attributes.setProperty("NAMESPACE", modelData.getNamespace());
+
+ attributes.setProperty("DB_NAME", modelData.getDbTableName());
+ attributes.setProperty("RESOURCE_MODEL", PhpClassGeneratorUtil.getNameFromFqn(
+ modelData.getResourceModelFqn())
+ );
+ final List uses = getUses();
+
+ attributes.setProperty(
+ "EXTENDS",
+ PhpClassGeneratorUtil.getNameFromFqn(ModelPhp.ABSTRACT_MODEL)
+ );
+
+ attributes.setProperty("USES", PhpClassGeneratorUtil.formatUses(uses));
+ }
+
+ private List getUses() {
+ return new ArrayList<>(Arrays.asList(
+ ModelPhp.ABSTRACT_MODEL,
+ modelData.getResourceModelFqn()
+ ));
+ }
+}
diff --git a/src/com/magento/idea/magento2plugin/actions/generation/generator/ModuleResourceModelGenerator.java b/src/com/magento/idea/magento2plugin/actions/generation/generator/ModuleResourceModelGenerator.java
new file mode 100644
index 000000000..e1a7542ae
--- /dev/null
+++ b/src/com/magento/idea/magento2plugin/actions/generation/generator/ModuleResourceModelGenerator.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+package com.magento.idea.magento2plugin.actions.generation.generator;
+
+import com.intellij.openapi.command.WriteCommandAction;
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiDirectory;
+import com.intellij.psi.PsiFile;
+import com.jetbrains.php.lang.psi.PhpFile;
+import com.jetbrains.php.lang.psi.elements.PhpClass;
+import com.magento.idea.magento2plugin.actions.generation.data.ResourceModelData;
+import com.magento.idea.magento2plugin.actions.generation.generator.util.DirectoryGenerator;
+import com.magento.idea.magento2plugin.actions.generation.generator.util.FileFromTemplateGenerator;
+import com.magento.idea.magento2plugin.actions.generation.generator.util.PhpClassGeneratorUtil;
+import com.magento.idea.magento2plugin.bundles.CommonBundle;
+import com.magento.idea.magento2plugin.bundles.ValidatorBundle;
+import com.magento.idea.magento2plugin.indexes.ModuleIndex;
+import com.magento.idea.magento2plugin.magento.files.ResourceModelPhp;
+import com.magento.idea.magento2plugin.magento.packages.File;
+import com.magento.idea.magento2plugin.util.GetFirstClassOfFile;
+import com.magento.idea.magento2plugin.util.GetPhpClassByFQN;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Properties;
+import javax.swing.JOptionPane;
+
+public class ModuleResourceModelGenerator extends FileGenerator {
+ private final ResourceModelData resourceModelData;
+ private final Project project;
+ private final ValidatorBundle validatorBundle;
+ private final CommonBundle commonBundle;
+ private final GetFirstClassOfFile getFirstClassOfFile;
+ private final DirectoryGenerator directoryGenerator;
+ private final FileFromTemplateGenerator fileFromTemplateGenerator;
+
+ /**
+ * Generates new Resource Model PHP Class based on provided data.
+ *
+ * @param resourceModelData ResourceModelData
+ * @param project Project
+ */
+ public ModuleResourceModelGenerator(
+ final ResourceModelData resourceModelData,
+ final Project project
+ ) {
+ super(project);
+ this.project = project;
+ this.resourceModelData = resourceModelData;
+ this.directoryGenerator = DirectoryGenerator.getInstance();
+ this.fileFromTemplateGenerator = FileFromTemplateGenerator.getInstance(project);
+ this.getFirstClassOfFile = GetFirstClassOfFile.getInstance();
+ this.validatorBundle = new ValidatorBundle();
+ this.commonBundle = new CommonBundle();
+ }
+
+ /**
+ * Generates resource model class.
+ *
+ * @param actionName Action name
+ * @return PsiFile
+ */
+ public PsiFile generate(final String actionName) {
+ final PsiFile[] resourceModelFiles = new PsiFile[1];
+
+ WriteCommandAction.runWriteCommandAction(project, () -> {
+ PhpClass resourceModel = GetPhpClassByFQN.getInstance(project).execute(
+ getResourceModelFqn()
+ );
+
+ if (resourceModel != null) {
+ final String errorMessage = this.validatorBundle.message(
+ "validator.file.alreadyExists",
+ "Resource Model Class"
+ );
+ JOptionPane.showMessageDialog(
+ null,
+ errorMessage,
+ commonBundle.message("common.error"),
+ JOptionPane.ERROR_MESSAGE
+ );
+
+ return;
+ }
+
+ resourceModel = createClass(actionName);
+
+ if (resourceModel == null) {
+ final String errorMessage = this.validatorBundle.message(
+ "validator.file.cantBeCreated",
+ "Resource Model Class"
+ );
+ JOptionPane.showMessageDialog(
+ null,
+ errorMessage,
+ commonBundle.message("common.error"),
+ JOptionPane.ERROR_MESSAGE
+ );
+
+ return;
+ }
+
+ resourceModelFiles[0] = resourceModel.getContainingFile();
+ });
+
+ return resourceModelFiles[0];
+ }
+
+ /**
+ * Get module.
+ *
+ * @return String
+ */
+ public String getModuleName() {
+ return resourceModelData.getModuleName();
+ }
+
+ private String getResourceModelFqn() {
+ return resourceModelData.getFqn();
+ }
+
+ private PhpClass createClass(final String actionName) {
+ PsiDirectory parentDirectory = ModuleIndex.getInstance(project)
+ .getModuleDirectoryByModuleName(getModuleName());
+ final PsiFile modelFile;
+
+ final String[] resourceModelDirectories = ResourceModelPhp.RESOURCE_MODEL_DIRECTORY.split(
+ File.separator
+ );
+ for (final String directory: resourceModelDirectories) {
+ parentDirectory = directoryGenerator.findOrCreateSubdirectory(
+ parentDirectory, directory
+ );
+ }
+
+ final Properties attributes = getAttributes();
+ modelFile = fileFromTemplateGenerator.generate(
+ new ResourceModelPhp(resourceModelData.getResourceModelName()),
+ attributes,
+ parentDirectory,
+ actionName
+ );
+
+ if (modelFile == null) {
+ return null;
+ }
+
+ return getFirstClassOfFile.execute((PhpFile) modelFile);
+ }
+
+ protected void fillAttributes(final Properties attributes) {
+ attributes.setProperty("NAME", resourceModelData.getResourceModelName());
+ attributes.setProperty("NAMESPACE", resourceModelData.getNamespace());
+
+ attributes.setProperty("DB_NAME", resourceModelData.getDbTableName());
+ attributes.setProperty("ENTITY_ID_COLUMN", PhpClassGeneratorUtil.getNameFromFqn(
+ resourceModelData.getEntityIdColumn())
+ );
+ final List uses = getUses();
+
+ attributes.setProperty(
+ "EXTENDS",
+ PhpClassGeneratorUtil.getNameFromFqn(ResourceModelPhp.ABSTRACT_DB)
+ );
+
+ attributes.setProperty("USES", PhpClassGeneratorUtil.formatUses(uses));
+ }
+
+ private List getUses() {
+ return new ArrayList<>(Arrays.asList(
+ ResourceModelPhp.ABSTRACT_DB
+ ));
+ }
+}
diff --git a/src/com/magento/idea/magento2plugin/actions/generation/generator/util/PhpClassGeneratorUtil.java b/src/com/magento/idea/magento2plugin/actions/generation/generator/util/PhpClassGeneratorUtil.java
new file mode 100644
index 000000000..2ad8ab5ed
--- /dev/null
+++ b/src/com/magento/idea/magento2plugin/actions/generation/generator/util/PhpClassGeneratorUtil.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+package com.magento.idea.magento2plugin.actions.generation.generator.util;
+
+import java.util.Collections;
+import java.util.List;
+
+public final class PhpClassGeneratorUtil {
+
+ private PhpClassGeneratorUtil() {}
+
+ /**
+ * Format PHP class uses.
+ *
+ * @param uses List
+ * @return String
+ */
+ public static String formatUses(final List uses) {
+ Collections.sort(uses);
+
+ return String.join(",", uses);
+ }
+
+ /**
+ * Fetches class name from a fully qualified name.
+ *
+ * @param fqn FQN
+ * @return String
+ */
+ public static String getNameFromFqn(final String fqn) {
+ final String[] fqnArray = fqn.split("\\\\");
+
+ return fqnArray[fqnArray.length - 1];
+ }
+}
diff --git a/src/com/magento/idea/magento2plugin/magento/files/AbstractPhpClass.java b/src/com/magento/idea/magento2plugin/magento/files/AbstractPhpClass.java
new file mode 100644
index 000000000..bba99ba24
--- /dev/null
+++ b/src/com/magento/idea/magento2plugin/magento/files/AbstractPhpClass.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+package com.magento.idea.magento2plugin.magento.files;
+
+import com.intellij.lang.Language;
+import com.jetbrains.php.lang.PhpLanguage;
+
+public abstract class AbstractPhpClass implements ModuleFileInterface {
+ private final String fileName;
+
+ public AbstractPhpClass(final String className) {
+ fileName = className.concat(".php");
+ }
+
+ @Override
+ public String getFileName() {
+ return this.fileName;
+ }
+
+ @Override
+ public Language getLanguage() {
+ return PhpLanguage.INSTANCE;
+ }
+}
diff --git a/src/com/magento/idea/magento2plugin/magento/files/CollectionPhp.java b/src/com/magento/idea/magento2plugin/magento/files/CollectionPhp.java
new file mode 100644
index 000000000..bbc55b149
--- /dev/null
+++ b/src/com/magento/idea/magento2plugin/magento/files/CollectionPhp.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+package com.magento.idea.magento2plugin.magento.files;
+
+public class CollectionPhp extends AbstractPhpClass {
+ public static final String ABSTRACT_COLLECTION
+ = "Magento\\Framework\\Model\\ResourceModel\\Db\\Collection\\AbstractCollection";
+
+ public CollectionPhp(final String className) {
+ super(className);
+ }
+
+ @Override
+ public String getTemplate() {
+ return "Magento Collection Class";
+ }
+}
diff --git a/src/com/magento/idea/magento2plugin/magento/files/FormButtonBlockPhp.java b/src/com/magento/idea/magento2plugin/magento/files/FormButtonBlockPhp.java
index 2bb5ba627..f88d51713 100644
--- a/src/com/magento/idea/magento2plugin/magento/files/FormButtonBlockPhp.java
+++ b/src/com/magento/idea/magento2plugin/magento/files/FormButtonBlockPhp.java
@@ -5,10 +5,7 @@
package com.magento.idea.magento2plugin.magento.files;
-import com.intellij.lang.Language;
-import com.jetbrains.php.lang.PhpLanguage;
-
-public class FormButtonBlockPhp implements ModuleFileInterface {
+public class FormButtonBlockPhp extends AbstractPhpClass {
public static String template = "Magento Form Button Block Class";
public static String saveMethodTemplate = "Magento Php Form Button Block Type Save";
@@ -21,28 +18,13 @@ public class FormButtonBlockPhp implements ModuleFileInterface {
public static final String TYPE_CUSTOM = "Custom";
public static final String DEFAULT_METHOD = "getButtonData";
- private String fileName;
public FormButtonBlockPhp(final String className) {
- this.setFileName(className.concat(".php"));
- }
-
- @Override
- public String getFileName() {
- return this.fileName;
+ super(className);
}
@Override
public String getTemplate() {
return template;
}
-
- @Override
- public Language getLanguage() {
- return PhpLanguage.INSTANCE;
- }
-
- private void setFileName(final String filename) {
- this.fileName = filename;
- }
}
diff --git a/src/com/magento/idea/magento2plugin/magento/files/ModelPhp.java b/src/com/magento/idea/magento2plugin/magento/files/ModelPhp.java
new file mode 100644
index 000000000..a2ffec498
--- /dev/null
+++ b/src/com/magento/idea/magento2plugin/magento/files/ModelPhp.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+package com.magento.idea.magento2plugin.magento.files;
+
+public class ModelPhp extends AbstractPhpClass {
+ public static final String ABSTRACT_MODEL =
+ "Magento\\Framework\\Model\\AbstractModel";
+ public static final String MODEL_DIRECTORY = "Model";
+
+ public ModelPhp(final String className) {
+ super(className);
+ }
+
+ @Override
+ public String getTemplate() {
+ return "Magento Model Class";
+ }
+}
diff --git a/src/com/magento/idea/magento2plugin/magento/files/ResourceModelPhp.java b/src/com/magento/idea/magento2plugin/magento/files/ResourceModelPhp.java
new file mode 100644
index 000000000..ee47b6c37
--- /dev/null
+++ b/src/com/magento/idea/magento2plugin/magento/files/ResourceModelPhp.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+package com.magento.idea.magento2plugin.magento.files;
+
+public class ResourceModelPhp extends AbstractPhpClass {
+ public static final String RESOURCE_MODEL_DIRECTORY = "Model/ResourceModel";
+ public static final String ABSTRACT_DB
+ = "Magento\\Framework\\Model\\ResourceModel\\Db\\AbstractDb";
+
+ public ResourceModelPhp(final String className) {
+ super(className);
+ }
+
+ @Override
+ public String getTemplate() {
+ return "Magento Resource Model Class";
+ }
+}
diff --git a/testData/actions/generation/generator/ModuleCollectionGenerator/generateFile/TestCollection.php b/testData/actions/generation/generator/ModuleCollectionGenerator/generateFile/TestCollection.php
new file mode 100644
index 000000000..92dd1e212
--- /dev/null
+++ b/testData/actions/generation/generator/ModuleCollectionGenerator/generateFile/TestCollection.php
@@ -0,0 +1,23 @@
+_init(TestModel::class, TestResource::class);
+ }
+}
diff --git a/testData/actions/generation/generator/ModuleModelGenerator/generateFile/TestModel.php b/testData/actions/generation/generator/ModuleModelGenerator/generateFile/TestModel.php
new file mode 100644
index 000000000..39b7a860a
--- /dev/null
+++ b/testData/actions/generation/generator/ModuleModelGenerator/generateFile/TestModel.php
@@ -0,0 +1,22 @@
+_init(TestResource::class);
+ }
+}
diff --git a/testData/actions/generation/generator/ModuleResourceModelGenerator/generateFile/TestResourceModel.php b/testData/actions/generation/generator/ModuleResourceModelGenerator/generateFile/TestResourceModel.php
new file mode 100644
index 000000000..170b61c18
--- /dev/null
+++ b/testData/actions/generation/generator/ModuleResourceModelGenerator/generateFile/TestResourceModel.php
@@ -0,0 +1,21 @@
+_init('my_table', 'entity_id');
+ }
+}
diff --git a/tests/com/magento/idea/magento2plugin/actions/generation/generator/ModuleCollectionGeneratorTest.java b/tests/com/magento/idea/magento2plugin/actions/generation/generator/ModuleCollectionGeneratorTest.java
new file mode 100644
index 000000000..905539824
--- /dev/null
+++ b/tests/com/magento/idea/magento2plugin/actions/generation/generator/ModuleCollectionGeneratorTest.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+package com.magento.idea.magento2plugin.actions.generation.generator;
+
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiFile;
+import com.magento.idea.magento2plugin.actions.generation.data.CollectionData;
+
+public class ModuleCollectionGeneratorTest extends BaseGeneratorTestCase {
+ /**
+ * Test generation of collection file.
+ */
+ public void testGenerateFile() {
+ final Project project = myFixture.getProject();
+ final CollectionData collectionFileData = new CollectionData(
+ "Foo_Bar",
+ "my_table",
+ "TestModel",
+ "TestCollection",
+ "Foo\\Bar\\Model\\ResourceModel\\TestModel\\TestCollection",
+ "Model/ResourceModel/TestModel",
+ "Foo\\Bar\\Model\\ResourceModel\\TestModel",
+ "TestResource",
+ "Foo\\Bar\\Model\\ResourceModel\\TestModel\\TestResource",
+ "Foo\\Bar\\Model\\TestModel"
+ );
+ final ModuleCollectionGenerator generator = new ModuleCollectionGenerator(
+ collectionFileData,
+ project
+ );
+ final PsiFile controllerFile = generator.generate("test");
+ final String filePath = this.getFixturePath("TestCollection.php");
+ final PsiFile expectedFile = myFixture.configureByFile(filePath);
+
+ assertGeneratedFileIsCorrect(
+ expectedFile,
+ "src/app/code/Foo/Bar/Model/ResourceModel/TestModel",
+ controllerFile
+ );
+ }
+}
diff --git a/tests/com/magento/idea/magento2plugin/actions/generation/generator/ModuleModelGeneratorTest.java b/tests/com/magento/idea/magento2plugin/actions/generation/generator/ModuleModelGeneratorTest.java
new file mode 100644
index 000000000..8a51b9274
--- /dev/null
+++ b/tests/com/magento/idea/magento2plugin/actions/generation/generator/ModuleModelGeneratorTest.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+package com.magento.idea.magento2plugin.actions.generation.generator;
+
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiFile;
+import com.magento.idea.magento2plugin.actions.generation.data.ModelData;
+
+public class ModuleModelGeneratorTest extends BaseGeneratorTestCase {
+ /**
+ * Test generation of model file.
+ */
+ public void testGenerateFile() {
+ final Project project = myFixture.getProject();
+ final ModelData modelData = new ModelData(
+ "Foo_Bar",
+ "my_table",
+ "TestModel",
+ "TestResource",
+ "Foo\\Bar\\Model\\TestModel",
+ "Foo\\Bar\\Model",
+ "Foo\\Bar\\Model\\ResourceModel\\TestResource"
+ );
+ final ModuleModelGenerator generator = new ModuleModelGenerator(
+ modelData,
+ project
+ );
+ final PsiFile controllerFile = generator.generate("test");
+ final String filePath = this.getFixturePath("TestModel.php");
+ final PsiFile expectedFile = myFixture.configureByFile(filePath);
+
+ assertGeneratedFileIsCorrect(
+ expectedFile,
+ "src/app/code/Foo/Bar/Model",
+ controllerFile
+ );
+ }
+}
diff --git a/tests/com/magento/idea/magento2plugin/actions/generation/generator/ModuleResourceModelGeneratorTest.java b/tests/com/magento/idea/magento2plugin/actions/generation/generator/ModuleResourceModelGeneratorTest.java
new file mode 100644
index 000000000..ebf707249
--- /dev/null
+++ b/tests/com/magento/idea/magento2plugin/actions/generation/generator/ModuleResourceModelGeneratorTest.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+package com.magento.idea.magento2plugin.actions.generation.generator;
+
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiFile;
+import com.magento.idea.magento2plugin.actions.generation.data.ResourceModelData;
+
+public class ModuleResourceModelGeneratorTest extends BaseGeneratorTestCase {
+ /**
+ * Test generation of resource model file.
+ */
+ public void testGenerateFile() {
+ final Project project = myFixture.getProject();
+ final ResourceModelData resourceModelData = new ResourceModelData(
+ "Foo_Bar",
+ "my_table",
+ "TestResourceModel",
+ "entity_id",
+ "Foo\\Bar\\Model\\ResourceModel",
+ "Foo\\Bar\\Model\\ResourceModel\\TestModel"
+ );
+ final ModuleResourceModelGenerator generator = new ModuleResourceModelGenerator(
+ resourceModelData,
+ project
+ );
+ final PsiFile controllerFile = generator.generate("test");
+ final String filePath = this.getFixturePath("TestResourceModel.php");
+ final PsiFile expectedFile = myFixture.configureByFile(filePath);
+
+ assertGeneratedFileIsCorrect(
+ expectedFile,
+ "src/app/code/Foo/Bar/Model/ResourceModel",
+ controllerFile
+ );
+ }
+}