das komplette Routing von Isotope muss umgebaut werden. Ich habe da schon etwas begonnen, wenn du das vorerst ignorieren kannst (einfach die Hooks auskommentieren) dann wär das vielleicht zielführender :)
Druckbare Version
das komplette Routing von Isotope muss umgebaut werden. Ich habe da schon etwas begonnen, wenn du das vorerst ignorieren kannst (einfach die Hooks auskommentieren) dann wär das vielleicht zielführender :)
Warum enthält Haste 5 diese Klassen nicht mehr?
Gibt es mittlerweile im Contao oder Isotope Core entsprechende features? (Wenn ja, bitte einen Tipp, wo ich die finden könnte).
Oder ist es einfach deswegen:
Zitat:
90% of the code was dropped because Haste predates the world of Composer. Now we have Packagist and acccess to a wonderful world of libraries that are way better, well tested and used by millions of projects.
ich denke Hintergrund war, dass nur Isotope diese Klassen genutzt hat. Und wir das entweder direkt in Isotope integrieren, oder noch besser ein öffentliches Paket finden dass sich um Gewichtsberechnung kümmert. Auf die Schnelle konnte ich nichts finden, vielleicht wäre es auch sinnvoll dieses Paket auszulagern. Vielleicht braucht ja jemand anderes mal eine Gewichtsberechnung. Allerdings müsste man den Code sicherlich modernisieren. Ist \Isotope\Units\Mass das einzige mit diesem Bezug?
https://github.com/jordanbrauer/unit-converter wäre zum Beispiel eine Library. Getestet habe ich sie aber nicht.
Habe nach weiterem Nachforschen auf das PHP Attribut verzichtet - das wird nicht benötigt. Die services.yaml und die Weight::createFromTimePeriod() korrigiert.
Könnte das so stimmen und ist es ein sinniger Weg?
Ich nehme den UnitConverter von jordanbrauer. Der soll Haste\Unit\Mass ersetzen (es werden nur Mass Units verwendet in Isotope).
Bitte gebt mir ein Feedback, ob ich mit dieser Konstruktion richtig (und auf der Höhe der Zeit) liege:
1. Die Weight Klasse (und das Interface Weighable) aus Haste ersetze ich durch eine Isotope Klasse (und Interface) gleichen Namens und wende DI an, um den UnitConverterProvider Service zu injecten:
PHP-Code:
<?php
namespace Isotope;
use Contao\StringUtil;
use Isotope\Interfaces\IsotopeWeighable;
use Isotope\UnitConverterProvider;
use UnitConverter\UnitConverter;
class Weight implements IsotopeWeighable
{
protected UnitConverterProvider $unitConverterProvider;
protected UnitConverter $unitConverter;
protected float $fltValue;
protected float $strUnit;
public function __construct($fltValue, $strUnit)
{
$this->fltValue = $fltValue;
$this->strUnit = (string) $strUnit;
}
public function getWeightValue()
{
return $this->fltValue;
}
public function getWeightUnit()
{
return $this->strUnit;
}
/**
* Create weight object from timePeriod widget value
* @param mixed $arrData
* @return Weight|null
*/
public static function createFromTimePeriod($unitConverterProvider, $arrData)
{
$unitConverter = $unitConverterProvider->create();
$arrData = StringUtil::deserialize($arrData);
if (
empty($arrData)
|| !is_array($arrData)
|| $arrData['value'] === ''
|| $arrData['unit'] === ''
|| !in_array($arrData['unit'], $unitConverter->getRegistry()->listUnits('Mass'))
) {
return null;
}
return new static($arrData['value'], $arrData['unit']);
}
}
2. Services.yaml
Code:isotope.unit_converter:
class: UnitConverter\UnitConverter
arguments:
- '@isotope.unit_registry'
- '@isotope.binary_calculator'
isotope.unit_registry:
class: UnitConverter\Registry\UnitRegistry
isotope.binary_calculator:
class: UnitConverter\Calculator\BinaryCalculator
isotope.unit_converter_provider:
class: Isotope\UnitConverterProvider
4. Der UnitConverter ServiceProvider:
(Die in Haste aber nicht in jordanbrauer vorhandenen Units muss ich noch implementieren)PHP-Code:
<?php
declare(strict_types=1);
namespace Isotope;
use UnitConverter\Calculator\BinaryCalculator;
use UnitConverter\Calculator\CalculatorInterface;
// use UnitConverter\Unit\Mass\Carat;
// use UnitConverter\Unit\Mass\Grain;
use UnitConverter\Unit\Mass\Gram;
use UnitConverter\Unit\Mass\Kilogram;
// use UnitConverter\Unit\Mass\Metricton;
use UnitConverter\Unit\Mass\Milligram;
use UnitConverter\Unit\Mass\Ounce;
use UnitConverter\Unit\Mass\Pound;
use UnitConverter\Unit\Mass\Stone;
use UnitConverter\Registry\UnitRegistry;
use UnitConverter\UnitConverter;
class UnitConverterProvider
{
public function create(): UnitConverter
{
/**
* @var CalculatorInterface $binaryCalculator
*/
$binaryCalculator = new BinaryCalculator(5, 2);
// TODO: Set precision and rounding mode
$units = [
new Milligram(),
new Gram(),
new Kilogram(),
// new Metricton(),
// new Carat(),
new Ounce(),
new Pound(),
new Stone(),
// new Grain(),
// Add more units if needed
];
$unitRegistry = new UnitRegistry($units);
$unitConverter = new UnitConverter($unitRegistry, $binaryCalculator);
return $unitConverter;
}
}
Das erstmal als Idee, um zu sehen, ob ich auf dem richtigen Dampfer bin.
Habe den letzten Post bearbeitet, so könnte es gehen, oder?
brauchen wir eine eigene Weight-Klasse? Kann das nicht direkt an den entsprechenden Stellen angepasst werde? (ohne dass ich mir den Code im Detail angesehen hätte).
Ich kriege DI einfach nicht zum Laufen; bei Constructor Injection wird der Service nicht von Symfony übergeben.
Nach "alter" Art geht es wohl:
PHP-Code:
<?php
namespace Isotope;
use Contao\StringUtil;
use Contao\System;
use Isotope\Interfaces\IsotopeWeighable;
use UnitConverter\UnitConverter;
class Weight implements IsotopeWeighable
{
private static UnitConverter $unitConverter;
public function __construct(
private float $fltValue,
private string $strUnit
) {
}
public function getWeightValue()
{
return $this->fltValue;
}
public function getWeightUnit()
{
return $this->strUnit;
}
/**
* Create weight object from timePeriod widget value
* @param mixed $arrData
* @return Weight|null
*/
public static function createFromTimePeriod($arrData)
{
$container = System::getContainer();
self::$unitConverter = $container->get('isotope.unit_converter');
$arrData = StringUtil::deserialize($arrData);
if (
empty($arrData)
|| !is_array($arrData)
|| $arrData['value'] === ''
|| $arrData['unit'] === ''
|| !in_array($arrData['unit'], self::$unitConverter->getRegistry()->listUnits('Mass'))
) {
return null;
}
return new static($arrData['value'], $arrData['unit']);
}
}
services.yaml:
PHP-Code:
isotope.unit_converter:
class: UnitConverter\UnitConverter
arguments:
- '@isotope.unit_registry'
- '@isotope.binary_calculator'
public: true
isotope.unit_registry:
class: UnitConverter\Registry\UnitRegistry
arguments:
- ['@unit.milligram', '@unit.gram', '@unit.kilogram', '@unit.ounce', '@unit.pound', '@unit.stone']
unit.milligram:
class: UnitConverter\Unit\Mass\Milligram
unit.gram:
class: UnitConverter\Unit\Mass\Gram
unit.kilogram:
class: UnitConverter\Unit\Mass\Kilogram
unit.ounce:
class: UnitConverter\Unit\Mass\Ounce
unit.pound:
class: UnitConverter\Unit\Mass\Pound
unit.stone:
class: UnitConverter\Unit\Mass\Stone
isotope.binary_calculator:
class: UnitConverter\Calculator\BinaryCalculator
arguments:
- 2 # Precision
- 1 # PHP_ROUND_HALF_UP - Rounding mode
Isotope\Weight:
arguments:
- '@isotope.unit_converter'
public: true
Unveränderte Methode in Standard.php:
PHP-Code:
/**
* Get the weight of the product (as object)
*
* @return Weight
*/
public function getWeight()
{
if (!isset($this->arrData['shipping_weight'])) {
return null;
}
return Weight::createFromTimePeriod($this->arrData['shipping_weight']);
}
Eigentlich sollte beim Erzeugen eines Weight Objektes der UnitConverter service von Symfony übergeben werden, jedoch passiert das nicht:
Hier wird der Service als expliziter Parameter erwartet:PHP-Code:
class Weight implements IsotopeWeighable
{
public function __construct(
private UnitConverter $unitConverter,
private float $fltValue,
private string $strUnit
) {
}
...
}
PHP-Code:
new Weight(1, "kg")
Gehe auf PHP ^8.0 in der composer.json, ok?
Moin,
habe Haste\Units in Isotope ersetzt durch jordanbrauer\unitconverter. Cypress tests (Regressionstest mit einfachen usecases anhand der Isotope Demo) erfolgreich. Vor weiteren Tests (PHPUnit), die ich noch schreiben werde, prüft bitte einmal, ob die Änderungen euren Vorstellungen entsprechen (damit ich keinen unnötigen Testaufwand treibe). Danke!
https://github.com/isotope/core/pull/2501
Haste hats nicht mehr drin, weil "obsolet"...
Was heisst das jetzt für Isotope? Die Methode Debug::uncompressedFile() z.B. im CompatibilityHelper ergänzen oder ist die ganze Mimik nicht mehr benötigt?
Was es macht: "Get uncompressed version (file path) of a file if debug is enabled " - fügt file gleichen Pfades/Namens - aber .min. durch . ersetzt - zum array hinzu, z.B. hier:
PHP-Code:
// Load Isotope JavaScript and style sheet
if (CompatibilityHelper::isFrontend()) {
$GLOBALS['TL_JAVASCRIPT'][] = Debug::uncompressedFile(
'system/modules/isotope/assets/js/isotope.min.js|static'
);
$GLOBALS['TL_CSS'][] = Debug::uncompressedFile(
'system/modules/isotope/assets/css/isotope.min.css|screen|static'
);
Die Uncompressed-Varianten sind aus meiner Sicht mittlerweile obsolet.
Aktuell werden die uncompressed Dateien als einfache Kopie (mit angepasstem Dateinamen) der compressed Dateien zum Array hinzugefügt.
Verwendet werden sie z.B. in BackendTemplate.php:
PHP-Code:
// JavaScripts
if (!empty($GLOBALS['TL_JAVASCRIPT']) && \is_array($GLOBALS['TL_JAVASCRIPT']))
{
$strJavaScripts = '';
foreach (array_unique($GLOBALS['TL_JAVASCRIPT']) as $javascript)
{
$options = StringUtil::resolveFlaggedUrl($javascript);
$strJavaScripts .= Template::generateScriptTag($this->addStaticUrlTo($javascript), $options->async, $options->mtime);
}
$this->javascripts .= $strJavaScripts;
}
Leider kenne ich die Hintergründe nicht und denke, bevor ich mich da umständlich einarbeite, wäre eine Aussage, wie zu verfahren ist, ganz gut.
Contao: tl_user erbt von Contao\Backend
Isotope: tl_user erbt von Isotope\Backend das von Contao\Backend erbt
Meine Arbeit an diesem Projekt ruht und ich warte auf Antworten / Bearbeitung meiner PR
Contao "Standard" ist, dass man dann die Klasse bspw. tl_user_isotope nennt. Siehe auch https://github.com/contao/contao/blo...ontent.php#L30 bspw.
Best-practice wäre jedoch "echte" Klassen bzw. echte Eventlistener zu nutzen.
Ich beende meine Arbeit an der Umstellung von Isotope auf Contao5. Ein wenig wurde erreicht, hätte gerne noch mehr gemacht.
Hallo,
ich habe mal eine allgemeine Frage an die Isotope-Entwickler:
Wird aktuell an der Kompatibilität zu Contao 5.3 gearbeitet?
Ich würde neue Projekte gern mit der aktuellen LTS machen. Im Moment lässt sich Isotope aber unter Contao 5.3 nicht installieren.
Vielen Dank.
Steffen
@sgei
Einer der Isotope-Entwickler hatte im Slack folgendes gesagt:
Sollte es eine Isotope-Version für Contao 5 geben, wird diese ähnlich dem Notification-Center erst auf den komplett neuesten Stand der Dinge gebracht werden müssen.Zitat:
Isotope ist nicht mit Contao 5 kompatibel und das wird vorerst so bleiben.
Wir reden hier von 14 Jahre altem Code, welcher immer wieder angepasst wurde (https://github.com/isotope/core/releases/tag/0.1.0).
Wahrscheinlich würde eine komplette Finanzierung der 100+ Arbeitsstunden für eine Contao 5 kompatible Version den Prozess beschleunigen können.
Ich kann dazu nur auf Github verweisen https://github.com/isotope/core/issues/2450
Mit genügend Finanzierung z.B. als Mitglied im Isotop Circle oder einmaliges Sponsoring https://www.isotopeecommerce.org/de/circle.html kann das Vorhaben sicher beschleunigt werden.
Ziel dürfte sein, mit Auslaufen von Contao 4(.13) im Februar 2026 ein neues Isotope zu haben - ist die Frage, ob da genügend vorab eingezahlt wird oder man das wie bei MM über ein "EAP" macht