Magento 2: So rufen Sie den Webverzeichnispfad des benutzerdefinierten Moduls ab / Abrufen des Bildverzeichnispfads des benutzerdefinierten Moduls

9

Ich habe ein benutzerdefiniertes Modul erstellt, in dem ich überprüfen möchte, ob eine (Bild-) Datei in meinem view/frontend/web/imagesOrdner vorhanden ist.

Ich habe diese Antwort überprüft , aber in zeigt nur, wie man Magentos Verzeichnispfade erhält.

Wie kann ich den vollständigen Pfad für das Verzeichnis meines Moduls abrufen, das mit der statischen Inhaltsbereitstellungsfunktion von Magento 2 unterstützt wird?

BEARBEITEN

Gemäß Rakeshs Antwort kann ich den folgenden Code verwenden.

$mediapath = $this->_filesystem->getDirectoryRead(DirectoryList::APP)->getAbsolutePath();
$modulePath = echo $mediapath.'code/Packagename/Modulename/view/frontend/web/images';

Gibt es eine andere Alternative zu diesem Ansatz?

John
quelle
Alternativ sieht es so aus, als würde der Pfad in der Funktion übergeben: $ mediapath = $ this -> _ filesystem-> getDirectoryRead (DirectoryList :: APP) -> getAbsolutePath ('code / Packagename / Modulename / view / frontend / web / images');
Rakesh Jesadiya
@ RakeshJesadiya, ich sehe so aus, als würden wir eine URL abrufen, z. B.$block->getViewFileUrl('Vendor_Module/images/blank.png');
John
Suchen Sie nach Pfad oder URL?
Rakesh Jesadiya
Ich suche einen Weg. Ich habe gerade ein Beispiel bereitgestellt, wie Magento eine URL erhält. Gibt es also einen solchen Code, der uns einen Pfad geben kann, genau wie das Abrufen einer URL?
John
Überprüfen Sie die Antwort mit Beispiel, rakeshjesadiya.com/…
Rakesh Jesadiya

Antworten:

16

Verwenden Sie den folgenden Code, um den Pfad des Modulverzeichnisses abzurufen

class CustomModel
{
    /**
     * @var \Magento\Framework\Module\Dir\Reader
     */
    protected $moduleReader;

    /**
     * @param \Magento\Framework\Module\Dir\Reader $moduleReader
     */
    public function __construct(
        \Magento\Framework\Module\Dir\Reader $moduleReader
    ) {
        $this->moduleReader = $moduleReader;
    }

    public function getDirectory()
    {
        $viewDir = $this->moduleReader->getModuleDir(
            \Magento\Framework\Module\Dir::MODULE_VIEW_DIR,
            'Vendor_Module'
        );
        return $viewDir . '/frontend/web/images';
    }
}

Wenn Sie jedoch die statische Inhaltsdatei überprüfen müssen, würde ich Ihnen empfehlen, diese Methode zu verwenden ...

class CustomModel
{
/**
     * @var \Magento\Framework\View\Asset\Repository
     */
    protected $assetRepository;

    /**
     * @param \Magento\Framework\View\Asset\Repository $assetRepository
     */
    public function __construct(
        \Magento\Framework\View\Asset\Repository $assetRepository
    ) {
        $this->assetRepository = $assetRepository;
    }

    public function getMyFilePath()
    {
        $fileId = 'Vendor_Module::images/myimage.png';
        $params = [
            'area' => 'frontend'
        ];
        $asset = $this->assetRepository->createAsset($fileId, $params);
        try {
            return $asset->getSourceFile();
        } catch (\Exception $e) {
            return null;
        }
    }
}
Nicholas Miller
quelle
Danke Nicholas. Dies scheint ein besserer Ansatz zu sein als die Verwendung des vollständigen Verzeichnispfads.
John
1
Wenn Sie die statische Inhaltsdatei überprüfen müssen, würde ich eine andere Möglichkeit empfehlen. Zur Antwort hinzugefügt.
Nicholas Miller
Entschuldigung für die Verzögerung, ich habe es gerade mit meinem Code implementiert. Ihre Antwort ist genau das, wonach ich gesucht habe. Danke für das Teilen.
John
1

Holen Sie sich zuerst Ihren App-Ordnerpfad, nachdem Sie den App-Pfad erhalten haben. Sie können ihn erhalten, indem Sie Ihren Unterpfad hinzufügen.

  use Magento\Framework\App\Filesystem\DirectoryList;

    protected $filesystem;

    public function __construct(
        \Magento\Framework\Filesystem $filesystem
    )
    {
        $this->_filesystem = $filesystem;
    }

    public function getPathofmodule(){
        $mediapath = $this->_filesystem->getDirectoryRead(DirectoryList::APP)->getAbsolutePath();
        $modulePath = echo $mediapath.'code/Packagename/Modulename/view/frontend/web/images';
    }
Rakesh Jesadiya
quelle
Danke Rakesh. Das habe ich auch gedacht. Aber gibt es keinen anderen, besseren Weg, als den vollständigen Verzeichnispfad zu verwenden?
John
@RakeshJesadiya Wie kann ich auf dieses Bild im Web zugreifen, nachdem ich den absoluten Pfad erhalten habe?
Aditya Shah
@AdityaShah rakeshjesadiya.com/… Antwort im Detail.
Rakesh Jesadiya
1

Sie können den Bildpfad des Moduls folgendermaßen abrufen : $block->getViewFileUrl('VendorName_ModuleName::images/image.jpg).

Satish Dubariya
quelle
1

Sie können auch Magento\Framework\Module\DirClass verwenden, um den Verzeichnispfad des Moduls abzurufen:

Beispiel:

    $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
    $dir = $objectManager->get('Magento\Framework\Module\Dir');
    /*Retrieve full path to a directory of certain type within a module*/
    echo $dir->getDir('Magento_Customer');
    echo $dir->getDir('Magento_Customer','Controller');

Syntax:

    getDir('Module_Name','Directories');                                      
    /*getDir method not allow to read type of module's directory except these*/
    const MODULE_ETC_DIR = 'etc';
    const MODULE_I18N_DIR = 'i18n';
    const MODULE_VIEW_DIR = 'view';
    const MODULE_CONTROLLER_DIR = 'Controller';
Renga
quelle