Magento 2 Modulentwicklung - Teil 6: Resource Models und Install-Scripts

Weiter geht es mit unserer Magento 2 Blogserie! Dieses Mal kümmern wir uns darum, unser Modul mit der Datenbank zu verbinden. Wir fügen also Resource Models, Collections und Install/Upgrade-Scripts hinzu. Der Prozess ist vom Ablauf her sehr ähnlich zum Ablauf in Magento 1, allerdings gibt es einige Feinheiten, die beim Erstellen der Klassen zu beachten sind.

Erstellen eines Install-Scripts

Zunächst brauchen wir überhaupt einmal eine Tabelle in der Datenbank. Dafür benötigen wir ein Script, das beim Installieren unseres Moduls ausgeführt wird. Dieses Script befindet sich in einer Klasse, die wir unter Setup/InstallSchema.php anlegen. Wir füllen sie zunächst mit folgendem Inhalt:

<?php
namespace Tudock\HelloWorld\Setup;

use Magento\Framework\DB\Ddl\Table;

use Magento\Framework\Setup\InstallSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;

class InstallSchema implements InstallSchemaInterface {
	public function install(SchemaSetupInterface $setup, ModuleContextInterface $context) {
		$setup->startSetup();


		/**
		 * Create table 'tudock_helloworld'
		 */
		$table = $setup->getConnection()->newTable(
			$setup->getTable('tudock_helloworld')
		)->addColumn(
			'id',
			Table::TYPE_INTEGER,
			null,
			['unsigned' => true, 'nullable' => false, 'default' => '0', 'primary' => true],
			'ID of text'
		)->addColumn(
			'product',
			Table::TYPE_INTEGER,
			null,
			['unsigned' => true, 'nullable' => false, 'default' => '0'],
			'Product ID'
		)->addColumn(
			'text',
			Table::TYPE_TEXT,
			255,
			['unsigned' => true, 'nullable' => false, 'default' => '0'],
			'Text'
		)->setComment(
			'HelloWorld demo table'
		)->addIndex(
			$setup->getIdxName('tudock_helloworld', 'id',
				\Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE),
			'id',
			['type' =>\Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE]
		)->addIndex(
			$setup->getIdxName('tudock_helloworld', 'product'),
			'product'
		)->addForeignKey(
			$setup->getFkName(
				'tudock_helloworld',
				'product',
				'catalog_product_entity',
				'entity_id'
			),
			'product',
			$setup->getTable('catalog_product_entity'),
			'entity_id',
			Table::ACTION_CASCADE
		);

		$setup->getConnection()->createTable($table);

		$setup->endSetup();

	}
}

Install-Schema-Scripts in Magento 2 sind PHP-Klassen, die im einfachsten Fall nur die install-Methode implementieren.

In unserem Beispiel generieren wir die Tabelle tudock_helloworld. Wir erstellen die Tabelle mit den Feldern id (der ID unseres Datensatzes), product (das verknüpfte Produkt) und text (Nachricht, die auf der Artikeldetailseite angezeigt werden soll). Die Namen der Felder entsprechen denen im Model.

Nachdem wir die einzelnen Felder definiert haben, legen wir zwei SQL Indizes an. Zunächst den Primärschlüssel id und außerdem einen Schlüssel für product. Diese verknüpfen wir dann über Foreign Keys mit der Produkt-Tabelle, so dass unser Datensatz zusammen mit den Produkten gelöscht wird. Die Syntax kann – so wie oben im Beispiel angegeben – gut als Schablone für eigene Projekte genutzt werden.

Vor Durchführung sämtlicher Befehle muss zunächst beginSetup() auf $setup aufgerufen werden, danach endSetup().

Zusätzlich zu der Install-Schema-Klasse gibt es auch noch eine Install-Data-Klasse. Diese wird unter Setup/InstallData.php angelegt:

namespace Tudock\HelloWorld\Setup;

use Magento\Framework\Setup\InstallDataInterface;

use Magento\Catalog\Model\ResourceModel\Eav\Attribute;
use Magento\Catalog\Model\Product;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;

class InstallData implements InstallDataInterface {

	/**
	 * Hello World Model Factory
	 * @var EavSetupFactory
	 */
	private $_helloTextFactory;

	/**
	 * Init
	 * @param \Tudock\HelloWorld\Model\HelloTextFactory $helloTextFactory
	 */
	public function __construct(
		\Tudock\HelloWorld\Model\HelloTextFactory $helloTextFactory
	)
	{
		$this->_helloTextFactory = $helloTextFactory;
	}

	public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context) {
		$setup->startSetup();
		$helloText = $this->_helloTextFactory->create();
		$helloText
			->setData('product',14)
			->setText('Das ist nur ein Test')
			->save();
		$setup->endSetup();
	}
}

In unser Install-Data-Script laden wir eine HelloTextFactory. Mit dieser erstellen wir ein neues HelloText Model für das Produkt mit der ID 14. Hierbei handelt es sich um das Produkt "Push It Messenger Bag" im Demo-Magento 2-Shop.

Anmerkung: Wir nutzen hier setData, damit wir nicht erst ein Produkt-Model laden müssen – ist nicht so schön, hatte ich bei der Erstellung des Models aber leider nicht bedacht.

Danach speichern wir das Model. Folgende Idee steckt dahinter: Wenn wir fertig sind, präsentiert dieses Produkt den Text auf der Artikeldetailseite. Alle anderen Produkte zeigen aber erst Text, wenn wir auch ihnen Text hinzufügen.

save() speichert das Model in die Datenbank. Voraussetzung ist allerdings, dass wir ein Resource Model einrichten.

Um die Tabelle anzulegen, müssen wir unser Modul einmal aus unserem Demo-Shop deinstallieren und danach wieder installieren – sonst werden die Install-Scripte nicht ausgeführt:

bin/magento module:uninstall Tudock_HelloWorld

Achtung aufpassen: Das könnte je nach Art der Installation auch den Code komplett löschen, daher das Modul lieber vorab sichern.

Bevor wir das Modul wieder installieren, müssen wir das Resource Model anlegen. Nur so ist sichergestellt, dass unser Modul die Daten speichert, die wir im Install-Data-Script generieren.

Anlegen des Resource Models

Ein Model mit dem Namen "HelloText" haben wir ja bereits erstellt. Wir benutzen dieses Model auch in dem Install-Data-Script. Das Resource Model für unser HelloText Model unter Model/HelloText.php wird angelegt unter Model/ResourceModel/HelloText.php:

namespace Tudock\HelloWorld\Model\ResourceModel;

class HelloText extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb {
	/**
	 * Initialize resource model
	 *
	 * @return void
	 */
	protected function _construct() {
		$this->_init('tudock_helloworld', 'id');
	}
}

Das Beispiel zeigt das einfachste Resource Model. In der _construct Methode (nicht verwechseln mit __construct!) wird ähnlich wie in Magento 1 eine Verknüpfung mit der Tabelle und dem ID-Feld in der Tabelle (in unserem Fall id) angelegt.

ResourceModels können auch Hooks (_beforeSave, _afterSave) oder Code zur Validierung enthalten. Unser einfaches Resource Model verknüpft lediglich das Model mit der Datenbank.

Eine Collection für unser Model

Als Letztes müssen wir noch eine Möglichkeit finden, unser HelloText Model auf der Artikeldetailseite der Produkte zu orten. Denn wir wollen auf der ADS von einem Produkt nur den dazugehörigen Text.

Dafür kann man beispielsweise eine Collection nutzen. Collections sammeln alle Instanzen eines Models, die in der Datenbank stehen und bestimmten Kriterien entsprechen. Wir wollen damit genau den Eintrag suchen, zu dem das Produkt gehört.

Die Collection für Model\HelloText.php wird in Model\ResourceModel\HelloText\Collection.php angelegt:

namespace Tudock\HelloWorld\Model\ResourceModel\HelloText;

use Magento\Catalog\Api\Data\ProductInterface;

class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
{
	/**
	 * Initialization here
	 *
	 * @return void
	 */
	protected function _construct()
	{
		$this->_init('Tudock\HelloWorld\Model\HelloText', 'Tudock\HelloWorld\Model\ResourceModel\HelloText');
	}

	/**
	 * Add Product Filter to Collection
	 *
	 * @param int|array|ProductInterface $product
	 * @return $this
	 */
	public function addProductFilter($product){
		$id = -1;
		if($product instanceof ProductInterface){
			$id = $product->getId();
		} else if(is_numeric($product)){
			$id = $product;
		}
		$this->addFieldToFilter('product',$id);
		return $this;
	}
}

Unsere Collection erlaubt es uns standardmäßig, alle verfügbaren Daten in eine Sammlung von Models zu laden. Durch addProductFilter und die internen Methode addFieldToFilter können wir die Collection nach einem Feld, hier der Produkt ID, filtern.

Im Konstruktor wird die Collection mit Model und ResourceModel über Klassenpfade verknüpft.

Collection und ResourceModel am Model registrieren

Als Letztes müssen wir unserem HelloText Model, das wir in Teil 4 dieser Blogserie erstellt haben, noch beibringen, dass wir jetzt ein ResourceModel und eine Collection haben.

Dafür müssen wir im Konstruktor die beiden Klassen laden und an die Superklasse übergeben. Das Ganze sieht dann so aus (neue Zeilen sind makiert):

	/**
	 * @param \Magento\Framework\Model\Context $context
	 * @param \Magento\Framework\Registry $registry
	 * @param array $data
	 * @param \Magento\Catalog\Model\ProductFactory $productFactory
	 */
	public function __construct(
		\Magento\Framework\Model\Context $context,
		\Magento\Framework\Registry $registry,
		\Magento\Catalog\Model\ProductFactory $productFactory,
		\Tudock\HelloWorld\Model\ResourceModel\HelloText $resource = null, // NEU
		\Tudock\HelloWorld\Model\ResourceModel\HelloText\Collection $resourceCollection = null // NEU
	) {
		parent::__construct($context, $registry, $resource, $resourceCollection); // NEU: Die zwei hinteren Parameter

		$this->_productFactory = $productFactory;
	}

Außerdem muss das ResourceModel in der _construct Methode registiert werden:

	/**
	 * Initialize resource model
	 *
	 * @return void
	 */
	protected function _construct()
	{
		$this->_init('Tudock\HelloWorld\Model\ResourceModel\HelloText');
	}

Anzeigen auf der ADS

Jetzt sind wir soweit, die Infos aus der Datenbank zu lesen. Dafür ersetzen wir in dem HelloProduct Block die Methode getText mit einer Methode, die mittels Collection das HelloText Model zum Produkt sucht und bei Fehlschlag eine Standard-Meldung zurückgibt:

	/**
	 * Get product-specifc text
	 * @return string
	 */
	public function getText() {
		$helloTextCollection = $this->_helloTextCollectionFactory->create();
		$helloTextCollection->addProductFilter($this->getProduct());

		$entireText = "";
		foreach($helloTextCollection as $helloText) {
			$entireText .= $helloText->getText();
		}

		if ($entireText == "") {
			$entireText = "Leider hat mich niemand lieb :(";
		}
		return $entireText;
	}

Dabei sammeln wir die Texte aller HelloText Models zusammen und hängen sie aneinander. Wir haben zwar im Beispiel nur einen Text, aber ebenso könnten wir mehrere Texte anlegen.

$this->_helloTextCollectionFactory wird genutzt, um eine neue Instanz der Collection zu erstellen. Diese müssen wir im Block erst laden. Wir ändern den Konstruktor dementsprechend:

	protected $_helloTextCollectionFactory;

	/**
	 * @param \Magento\Catalog\Block\Product\Context $context
	 * @param \Magento\Framework\Stdlib\ArrayUtils $arrayUtils
	 * @param array $data
	 */
	public function __construct(
		\Magento\Catalog\Block\Product\Context $context,
		\Magento\Framework\Stdlib\ArrayUtils $arrayUtils,
		array $data,

		\Tudock\HelloWorld\Model\ResourceModel\HelloText\CollectionFactory $helloTextCollectionFactory
	) {
		parent::__construct($context, $arrayUtils, $data);

		$this->_helloTextCollectionFactory = $helloTextCollectionFactory;
	}

Testen

Jetzt wird es endlich Zeit, das Ganze zu testen! Wir versionieren die Änderungen, installieren das Modul wieder und führen danach bin/magento setup:upgrade aus, da dadurch unser Install-Script überhaupt erst gestartet wird:

composer require tudock/helloworld dev-master # Oder ähnlich, je nach Art der Installation
bin/magento setup:upgrade

Wenn es dabei zu keinem Fehler kam, können wir einen Blick in die Datenbank werfen und schauen, ob unser Eintrag da ist:

Magento2-Model-Eintrag in der Datenbank

Gut, der Eintrag ist da! Gehen wir einmal auf die ADS des Produkts und sehen nach, ob unser Text geladen wird:

Test des Magento2-Models im Frontend

Super! Damit haben wir erfolgreich ein Model mit der Datenbank geladen.

Funktionsweise von Upgrade-Scripts

Upgrade-Scripts funktionieren genau wie Install-Scripte und kommen ebenfalls in zwei Varianten: Data und Schema.

Besonderheit bei Magento 2 ist allerdings, dass es jeweils nur eine Upgrade-Klasse für Data und Schema gibt. Die upgrade Methode der Klasse wird immer ausgeführt, wenn sich die Version des Moduls ändert. In der Klasse muss "per Hand" überprüft werden, was für ein Versionssprung vorliegt. Hier eine Beispielklasse für Upgrade-Data:

use Magento\Framework\Setup\UpgradeDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;

class UpgradeData implements UpgradeDataInterface
{
	public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
	{
		$setup->startSetup();

		if (version_compare($context->getVersion(), '2.0.1', '<')) {
			$this->run201($setup);
		}
		$setup->endSetup();
	}
}

Mittels version_compare wird die Version überprüft und die jeweilige Aktion ausgeführt. Die Version legen wir in der module.xml fest.

Anlegen von Attributen in Install/Upgrade-Scripts

Kleiner Tipp am Rande: Falls Attribute angelegt werden sollen, können dafür Install/Upgrade-Data-Scripts genutzt werden sowie eine EAV-Hilfsklasse. Hier ein Beispiel:

use Magento\Eav\Setup\EavSetup;
use Magento\Eav\Setup\EavSetupFactory;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;

use Magento\Catalog\Model\ResourceModel\Eav\Attribute;
use Magento\Catalog\Model\Product;
 
class InstallData implements InstallDataInterface
{
    /**
     * EAV setup factory
     *
     * @var EavSetupFactory
     */
    private $eavSetupFactory;
 
    /**
     * Init
     *
     * @param EavSetupFactory $eavSetupFactory
     */
    public function __construct(EavSetupFactory $eavSetupFactory)
    {
        $this->eavSetupFactory = $eavSetupFactory;
    }
 
    public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
    {
        /** @var EavSetup $eavSetup */
        $eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);
 
        /**
         * Add attributes to the eav/attribute
         */
        $eavSetup->addAttribute(
            Product::ENTITY,
            'tudock_product_document',
            [
                'type' => 'varchar',
                'backend' => 'Tudock\ProductDocuments\Model\Product\Attribute\Backend\Document',
                'frontend' => '',
                'label' => 'Product Document',
                'input' => 'document',
                'class' => '',
                'source' => '',
                'global' => Attribute::SCOPE_GLOBAL,
                'visible' => true,
                'required' => false,
                'user_defined' => true,
                'default' => 0,
                'searchable' => false,
                'filterable' => false,
                'filterable_in_search' => false,
                'comparable' => false,
                'visible_on_front' => false,
                'visible_in_advanced_search' => false,
                'used_in_product_listing' => false,
                'unique' => false,
                'is_configurable'   => false,
                'apply_to' => 'configurable,simple',
                'used_for_sort_by'  => false,
                'input_renderer'    => 'Tudock\ProductDocuments\Block\Adminhtml\Form\Document',
                'group'             => 'Documents'
            ]
        );
    }
}

Ausblick

Damit sind wir fast fertig mit den Basics der Magento 2 Modulentwicklung. Im nächsten und zunächst letzten Teil folgen noch Observer und Helper.

Autor: Kategorie: E-Commerce
Schlagwörter: Magento2, Wissen
YTo2OntzOjY6ImZldXNlciI7aTowO3M6MzoicGlkIjtpOjk2O3M6MzoiY2lkIjtpOjEwOTYxMjQyNDc7czo0OiJjb25mIjthOjEwOntzOjEwOiJzdG9yYWdlUGlkIjtpOjEyNDtzOjE0OiJleHRlcm5hbFByZWZpeCI7czoxMToidHhfbmV3c19waTEiO3M6MTM6IlVzZXJJbWFnZVNpemUiO2k6MTg7czo5OiJhZHZhbmNlZC4iO2E6MTp7czoyMToic2hvd0NvdW50Q29tbWVudFZpZXdzIjtpOjA7fXM6ODoic2hhcmluZy4iO2E6MTp7czoxMjoidXNlU2hhcmVJY29uIjtOO31zOjg6InJhdGluZ3MuIjthOjM6e3M6MTY6InJhdGluZ0ltYWdlV2lkdGgiO2k6MTE7czoxNjoicmV2aWV3SW1hZ2VXaWR0aCI7aToxNjtzOjg6Im1vZGVwbHVzIjtzOjQ6ImF1dG8iO31zOjY6InRoZW1lLiI7YTo3OntzOjI2OiJib3htb2RlbFRleHRhcmVhTGluZUhlaWdodCI7aTozMDtzOjI0OiJib3htb2RlbFRleHRhcmVhTmJyTGluZXMiO2k6NDtzOjE1OiJib3htb2RlbFNwYWNpbmciO2k6MTA7czoxODoiYm94bW9kZWxMaW5lSGVpZ2h0IjtpOjIwO3M6MTg6ImJveG1vZGVsTGFiZWxXaWR0aCI7aToxMzQ7czoyNjoiYm94bW9kZWxMYWJlbElucHV0UHJlc2VydmUiO2k6MTtzOjIyOiJib3htb2RlbElucHV0RmllbGRTaXplIjtpOjM1O31zOjE3OiJwcmVmaXhUb1RhYmxlTWFwLiI7YToxMDp7czoxNDoidHhfYWxidW0zeF9waTEiO3M6MTc6InR4X2FsYnVtM3hfaW1hZ2VzIjtzOjE1OiJ0eF9jb21tZXJjZV9waTEiO3M6MjA6InR4X2NvbW1lcmNlX3Byb2R1Y3RzIjtzOjEyOiJ0eF9pcmZhcV9waTEiO3M6MTA6InR4X2lyZmFxX3EiO3M6MTU6InR4X21pbmluZXdzX3BpMSI7czoxNjoidHhfbWluaW5ld3NfbmV3cyI7czo5OiJ0eF90dG5ld3MiO3M6NzoidHRfbmV3cyI7czoxMToidHRfcHJvZHVjdHMiO3M6MTE6InR0X3Byb2R1Y3RzIjtzOjI0OiJ0eF93ZWNzdGFmZmRpcmVjdG9yeV9waTEiO3M6MjU6InR4X3dlY3N0YWZmZGlyZWN0b3J5X2luZm8iO3M6MTI6InR4X2NvbW11bml0eSI7czo4OiJmZV91c2VycyI7czoxOToidHhfY3d0Y29tbXVuaXR5X3BpMSI7czo4OiJmZV91c2VycyI7czoxMToidHhfbmV3c19waTEiO3M6MjU6InR4X25ld3NfZG9tYWluX21vZGVsX25ld3MiO31zOjExOiJzaG93VWlkTWFwLiI7YTo1OntzOjk6InR4X3R0bmV3cyI7czo3OiJ0dF9uZXdzIjtzOjExOiJ0dF9wcm9kdWN0cyI7czo3OiJwcm9kdWN0IjtzOjEyOiJ0eF9jb21tdW5pdHkiO3M6NDoidXNlciI7czoxOToidHhfY3d0Y29tbXVuaXR5X3BpMSI7czoyNToiYWN0aW9uPWdldHZpZXdwcm9maWxlJnVpZCI7czoxMToidHhfbmV3c19waTEiO3M6NDoibmV3cyI7fXM6MTI6IlJlcXVpcmVkTWFyayI7czoxOiIqIjt9czo0OiJsYW5nIjtzOjI6ImRlIjtzOjM6InJlZiI7czoyOToidHhfbmV3c19kb21haW5fbW9kZWxfbmV3c18yNDciO30%3DYTo0OntzOjQ6ImNvbmYiO2E6MzU6e3M6MTc6InVzZVdlYnBhZ2VQcmV2aWV3IjtzOjE6IjEiO3M6MjI6InVzZVdlYnBhZ2VWaWRlb1ByZXZpZXciO3M6MToiMSI7czoyMDoid2VicGFnZVByZXZpZXdIZWlnaHQiO3M6MjoiNzAiO3M6MjA6Im1heENoYXJzUHJldmlld1RpdGxlIjtzOjI6IjcwIjtzOjMxOiJ3ZWJwYWdlUHJldmlld0Rlc2NyaXB0aW9uTGVuZ3RoIjtzOjM6IjE2MCI7czozODoid2VicGFnZVByZXZpZXdEZXNjcmlwdGlvbk1pbmltYWxMZW5ndGgiO3M6MjoiNjAiO3M6Mjc6IndlYnBhZ2VQcmV2aWV3Q2FjaGVUaW1lUGFnZSI7czozOiIxODAiO3M6MzM6IndlYnBhZ2VQcmV2aWV3Q2FjaGVUaW1lVGVtcEltYWdlcyI7czoyOiI2MCI7czozMDoid2VicGFnZVByZXZpZXdDYWNoZUNsZWFyTWFudWFsIjtzOjE6IjAiO3M6Mjg6IndlYnBhZ2VQcmV2aWV3TnVtYmVyT2ZJbWFnZXMiO3M6MjoiMTAiO3M6Mzg6IndlYnBhZ2VQcmV2aWV3U2Nhbk1pbmltYWxJbWFnZUZpbGVTaXplIjtzOjQ6IjE1MDAiO3M6MzA6IndlYnBhZ2VQcmV2aWV3U2Nhbk1pbkltYWdlU2l6ZSI7czoyOiI0MCI7czozMDoid2VicGFnZVByZXZpZXdTY2FuTWF4SW1hZ2VTaXplIjtzOjM6IjQ1MCI7czoyOToid2VicGFnZVByZXZpZXdTY2FuTWluTG9nb1NpemUiO3M6MjoiMzAiO3M6MzE6IndlYnBhZ2VQcmV2aWV3U2Nhbk1heEltYWdlU2NhbnMiO3M6MjoiNDAiO3M6Mzg6IndlYnBhZ2VQcmV2aWV3U2Nhbk1heEltYWdlU2NhbnNGb3JMb2dvIjtzOjI6IjU1IjtzOjQwOiJ3ZWJwYWdlUHJldmlld1NjYW5NYXhIb3J6aXpvbnRhbFJlbGF0aW9uIjtzOjI6IjU7IjtzOjM3OiJ3ZWJwYWdlUHJldmlld1NjYW5tYXh2ZXJ0aWNhbHJlbGF0aW9uIjtzOjE6IjMiO3M6MzA6IndlYnBhZ2VQcmV2aWV3U2NhbkxvZ29QYXR0ZXJucyI7czoxMDoibG9nbyxjcmdodCI7czozODoid2VicGFnZVByZXZpZXdTY2FuRXhjbHVkZUltYWdlUGF0dGVybnMiO3M6NTc6InBpeGVsdHJhbnMsc3BhY2VyLHlvdXR1YmUscmNsb2dvcyx3aGl0ZSx0cmFuc3BhLGJnX3RlYXNlciI7czozODoid2VicGFnZVByZXZpZXdEZXNjcmlwdGlvblBvcnRpb25MZW5ndGgiO3M6MjoiNDAiO3M6MjU6IndlYnBhZ2VQcmV2aWV3Q3VybFRpbWVvdXQiO3M6NDoiNzAwMCI7czoxMjoidXNlUGljVXBsb2FkIjtzOjE6IjAiO3M6MTI6InVzZVBkZlVwbG9hZCI7czoxOiIwIjtzOjEzOiJwaWNVcGxvYWREaW1zIjtzOjM6IjEwMCI7czoxNjoicGljVXBsb2FkTWF4RGltWCI7czozOiI4MDAiO3M6MTY6InBpY1VwbG9hZE1heERpbVkiO3M6MzoiOTAwIjtzOjIyOiJwaWNVcGxvYWRNYXhEaW1XZWJwYWdlIjtzOjM6IjQ3MCI7czoyMzoicGljVXBsb2FkTWF4RGltWVdlYnBhZ2UiO3M6MzoiMzAwIjtzOjIwOiJwaWNVcGxvYWRNYXhmaWxlc2l6ZSI7czo0OiIyNTAwIjtzOjIwOiJwZGZVcGxvYWRNYXhmaWxlc2l6ZSI7czo0OiIzMDAwIjtzOjE4OiJzb3VuZGNsb3VkQ2xpZW50SUQiO3M6MDoiIjtzOjIyOiJzb3VuZGNsb3VkQ2xpZW50U2VjcmV0IjtzOjA6IiI7czoyMDoidXNlVG9wV2VicGFnZVByZXZpZXciO3M6MDoiIjtzOjI0OiJ0b3BXZWJwYWdlUHJldmlld1BpY3R1cmUiO2k6MDt9czoxMToiYXdhaXRnb29nbGUiO3M6Mjg6IldhcnRlIGF1ZiBBbnR3b3J0IHZvbiBHb29nbGUiO3M6ODoidHh0aW1hZ2UiO3M6MTM6IkJpbGQgZ2VmdW5kZW4iO3M6OToidHh0aW1hZ2VzIjtzOjE1OiJCaWxkZXIgZ2VmdW5kZW4iO30%3DYTowOnt9YTowOnt9YTo3OntzOjE2OiJjb21tZW50TGlzdEluZGV4IjthOjE6e3M6MzI6ImNpZHR4X25ld3NfZG9tYWluX21vZGVsX25ld3NfMjQ3IjthOjE6e3M6MTA6InN0YXJ0SW5kZXgiO2k6MTU7fX1zOjE0OiJjb21tZW50c1BhZ2VJZCI7aTo5NjtzOjE2OiJjb21tZW50TGlzdENvdW50IjtpOjEwOTYxMjQyNDc7czoxMjoiYWN0aXZlbGFuZ2lkIjtpOjA7czoxNzoiY29tbWVudExpc3RSZWNvcmQiO3M6Mjk6InR4X25ld3NfZG9tYWluX21vZGVsX25ld3NfMjQ3IjtzOjEyOiJmaW5kYW5jaG9yb2siO3M6MToiMCI7czoxMjoibmV3Y29tbWVudGlkIjtOO30%3D YTo1OntzOjExOiJleHRlcm5hbFVpZCI7aToyNDc7czoxMjoic2hvd1VpZFBhcmFtIjtzOjQ6Im5ld3MiO3M6MTY6ImZvcmVpZ25UYWJsZU5hbWUiO3M6MjU6InR4X25ld3NfZG9tYWluX21vZGVsX25ld3MiO3M6NToid2hlcmUiO3M6MTcwOiJhcHByb3ZlZD0xIEFORCBleHRlcm5hbF9yZWY9J3R4X25ld3NfZG9tYWluX21vZGVsX25ld3NfMjQ3JyBBTkQgcGlkPTEyNCBBTkQgdHhfdG9jdG9jX2NvbW1lbnRzX2NvbW1lbnRzLmRlbGV0ZWQ9MCBBTkQgdHhfdG9jdG9jX2NvbW1lbnRzX2NvbW1lbnRzLmhpZGRlbj0wIEFORCBwYXJlbnR1aWQ9MCI7czoxMDoid2hlcmVfZHBjayI7czoxMzk6ImV4dGVybmFsX3JlZj0ndHhfbmV3c19kb21haW5fbW9kZWxfbmV3c18yNDcnIEFORCBwaWQ9MTI0IEFORCB0eF90b2N0b2NfY29tbWVudHNfY29tbWVudHMuZGVsZXRlZD0wIEFORCB0eF90b2N0b2NfY29tbWVudHNfY29tbWVudHMuaGlkZGVuPTAiO30%3D YToyOntpOjA7czoxNDk6IjxpbWcgc3JjPSIvdHlwbzNjb25mL2V4dC90b2N0b2NfY29tbWVudHMvcmVzL2Nzcy90aGVtZXMvdHVkb2NrL2ltZy9wcm9maWxlLnBuZyIgY2xhc3M9InR4LXRjLXVzZXJwaWMgdHgtdGMtdWltZ3NpemUiIHRpdGxlPSIiICBpZD0idHgtdGMtY3RzLWltZy0iIC8%2BIjtpOjk5OTk5O3M6MTUxOiI8aW1nIHNyYz0iL3R5cG8zY29uZi9leHQvdG9jdG9jX2NvbW1lbnRzL3Jlcy9jc3MvdGhlbWVzL3R1ZG9jay9pbWcvcHJvZmlsZWYucG5nIiBjbGFzcz0idHgtdGMtdXNlcnBpY2YgdHgtdGMtdWltZ3NpemUiIHRpdGxlPSIiICBpZD0idHgtdGMtY3RzLWltZy0iIC8%2BIjt9
2 Kommentare verfügbar
Bitte bestätigen Sie
Nein
Ja
Information
Ok
Vorschau wird geladen ...
* Pflichtfeld
Ihr Kommentar ist eine Antwort auf den folgenden Kommentar

Martin Eisenführer () schrieb am 13.10.2017  

Hallo Marco,

du sagst zur Version: "Die Version legen wir in der module.xml fest.". Im ersten Kapital hast du aber gesagt:
"Wichtig ist zu beachten, dass "setup_version" nicht die Modulversion, sondern die Version der Magento-Installation
mehr anzeigen ...
beinhalten muss."
Meinst du damit nur die erste Stelle (major-version), oder eben die ganze "setup_version="2.0.0".

Hier für die Updates macht es für mich Sinn, habe mich schon im ersten Teil gefragt, warum das die Version der Magento installation sein soll/muss.

Kannst mich aufklären?
danke
Martin

Antworten
Vorschau wird geladen ...
* Pflichtfeld

Marco Köpcke (https://www.tudock.de) schrieb am 18.10.2017  

Hallo Martin,
danke für dein Feedback!

Es stimmt tatsächlich, dass hier nicht die Magento Version hinkommt, sondern natürlich die des Moduls. Ich habe den Artikel damals geschrieben, als Magento 2 (und auch die Dokumentation dafür) noch nicht ganz ausgereift
mehr anzeigen ...
war. D
amals war die gängigste Meinung, dass sich die Setup Version jetzt an der Magento Versionsnummer orientieren muss. War wohl ein Missverständnis, weil die Core-Module alle als Setup Version die Magento Version genutzt haben, als Composer Version aber etwas anderes.

Also: Sowohl in der composer.json, als auch in der module.xml einfach die Version des Moduls eintragen. Ich habe den alten Beitrag korrigiert.

Viele Grüße
Marco

Antworten
Vorschau wird geladen ...
* Pflichtfeld

Wir behalten uns vor, Kommentare zu löschen, beispielsweise wenn sich diese nicht auf den Beitrag beziehen, zur Eigenwerbung missbraucht werden, persönliche Daten anderer enthalten, diskriminieren, beleidigen oder Rechte verletzen.

Datenschutzhinweis: Wenn Sie einen Kommentar oder sonstigen Beitrag in unserem Blog hinterlassen, speichern wir neben Ihren Angaben Ihre IP-Adresse. Darüber hinaus können Sie die Beiträge und Kommentare unseres Blogs abonnieren. Das Kommentarabonnement können Sie jederzeit abbestellen. Weitere Informationen finden Sie in unserer Datenschutzerklärung.

E-Commerce & Webentwicklung: Wir realisieren und optimieren Internetprojekte. Unser Fachgebiet sind Onlineshops, Rich Internet Applications und anspruchsvolle Onlineauftritte. Über unsere Arbeit schreiben wir. Hier im Blog von TUDOCK.