headタグの開始直後にカスタムスクリプトを追加したい。
お気に入り。
<head>
<script>console.log("I'm loaded!");</script>
default_head_blocks.xmlにコードを追加しようとしました
<referenceContainer name="head.additional">
<block class="Custom\Module\Block\Success" template="Custom_Module::success/head.phtml"/>
</referenceContainer>
=>出力:
<script>console.log("I'm loaded!");</script>
</head>
このコードは、headタグの終わりの前に追加スクリプトを使用しています。
以下のコードを確認してください
ブロック=>カスタム/モジュール/ブロック/Onepage/Success.php
namespace Custom\Module\Block\Onepage;
use Magento\Framework\View\Element\Template;
class Success extends \Magento\Checkout\Block\Onepage\Success {
public function getOrder()
{
$objectManager =\Magento\Framework\App\ObjectManager::getInstance();
$helper = $objectManager->get('Custom\Module\Helper\Data');
$lastOrderId = $this->getOrderId();
if (empty($lastOrderId))
{
return null;
}
$orderData = $objectManager->create('Magento\Sales\Model\Order')->loadByIncrementId($this->getOrderId());
return $orderData;
}
}
ヘルパー=> Custom\Module\Helper\Data.php
namespace Custom\Module\Helper;
class Data extends \Magento\Framework\App\Helper\AbstractHelper
{
/**
* @param \Magento\Framework\App\Helper\Context $context
*/
protected $_request;
public function __construct(
\Magento\Framework\App\Helper\Context $context,
\Magento\Framework\App\Request\Http $request
) {
$this->_request = $request;
parent::__construct($context);
}
public function getConfigValue($value = '') {
return $this->scopeConfig
->getValue($value,\Magento\Store\Model\ScopeInterface::SCOPE_STORE);
}
public function getTemplate()
{
if ($this->getConfigValue('custom_general/general/active') == 1) {
$template = 'Custom_Module::checkout/success.phtml';
} else {
$template = 'Magento_Checkout::success.phtml';
}
return $template;
}
}
di.xml => etc\di.xml
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../vendor/magento/framework/ObjectManager/etc/config.xsd">
<preference for="Magento\Checkout\Block\Onepage\Success" type="Custom\Module\Block\Onepage\Success"/>
</config>
レイアウトXml => Custom/Module/view/frontend/layout/default.xml
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceBlock name="require.js">
<action method="setTemplate">
<argument name="template" xsi:type="string">Custom_Module::success/head.phtml</argument>
</action>
</referenceBlock>
</body>
</page>
テンプレート=> Custom/Module/view/frontend/templates/success/head.phtml
<script>
console.log("I'm loaded!");
</script>
私を助けてこの問題を解決してください
前もって感謝します。
これが正しい方法であるかどうかはわかりませんが、リードしています。
デフォルトでは、magento 2はroot.phtml
ファイルを使用してhead
コンテンツをセットアップします。これはvendor/magento/module-theme/view/base/templates/root.phtml
にあります(上書きされていない場合)。
ここでは、$requireJs
変数が最初にheadブロックにロードされます。 $requireJs
変数は、vendor/magento/framework/view/Result/Page.php
にあるrender
クラス内のPage
メソッドで定義されます。
このファイルでは、$requireJs
にはrequire.js
ブロックが含まれています。 require.js
ブロックはvendor/Magento/module-theme/view/frontend/layout/default.xml
で定義されています:
<block name="require.js" class="Magento\Framework\View\Element\Template" template="Magento_Theme::page/js/require_js.phtml" />
ソリューション
1)require_js.phtml
からvendor/magento/module-theme/view/frontend/templates/page/js
からテーマapp/design/frontend/{VENDOR}/{THEME_NAME}/Magento_Theme/templates/page/js/
にコピーします
2)これで、次のようにスクリプトを追加できます。
<script>
console.log("I'm loaded!");
var require = {
"baseUrl": "<?php /* @escapeNotVerified */ echo $block->getViewFileUrl('/') ?>"
};
</script>
PDATE(Using Module)
require.js
ブロックのオーバーライドは、エレガントなソリューションではありません。誰かが良い解決策を持っている場合は答えてください。ここでは、レイアウトxmlを編集します。
<referenceBlock name="require.js">
<action method="setTemplate">
<argument name="template" xsi:type="string">Custom_Module::success/head.phtml</argument>
</action>
</referenceBlock>
そしてsuccess/head.phtml
の中にコードを追加します:
<script>
console.log("I'm loaded!");
var require = {
"baseUrl": "<?php /* @escapeNotVerified */ echo $block->getViewFileUrl('/') ?>"
};
</script>