<!-- Matomo -->
<script>
  var _paq = window._paq = window._paq || [];
    /* tracker methods like "setCustomDimension" should be called before "trackPageView" */
    _paq.push(['trackPageView']);
    _paq.push(['enableLinkTracking']);
      (function() {
	          var u="//analytics.wasya.co/";
		      _paq.push(['setTrackerUrl', u+'matomo.php']);
		      _paq.push(['setSiteId', '15']);
		          var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
		          g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
			    })();
    </script>
<!-- End Matomo Code -->
<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://wiki.wasya.co/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Piousbox</id>
		<title>Wasya Wiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.wasya.co/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Piousbox"/>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php/Special:Contributions/Piousbox"/>
		<updated>2026-07-05T14:04:58Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.26.0</generator>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Cool&amp;diff=3488</id>
		<title>Cool</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Cool&amp;diff=3488"/>
				<updated>2026-06-28T19:48:51Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: /* 2022 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cool websites (latest first) ==&lt;br /&gt;
&lt;br /&gt;
=== 2026q1 ===&lt;br /&gt;
* https://hotglue.com/pricing&lt;br /&gt;
* https://www.micro1.ai/&lt;br /&gt;
* https://getmysocial.com/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* https://www.paycom.com/&lt;br /&gt;
* https://www.qed42.com/services/drupal&lt;br /&gt;
&lt;br /&gt;
* https://www.fulcrumapp.com/industries/environmental/&lt;br /&gt;
* https://www.dotsquares.com/&lt;br /&gt;
* https://moneyhub.com/&lt;br /&gt;
* https://skillenai.com/external-post/how-to-build-an-agentic-email-workflow/&lt;br /&gt;
&lt;br /&gt;
=== 2025q4 ===&lt;br /&gt;
* https://vitaminak.design/en&lt;br /&gt;
&lt;br /&gt;
=== 2024Q3 ===&lt;br /&gt;
&lt;br /&gt;
* SEO&lt;br /&gt;
** https://www.targetedwebtraffic.com/&lt;br /&gt;
** https://serpclix.com/&lt;br /&gt;
&lt;br /&gt;
* Design&lt;br /&gt;
** https://truesocialmarketing.com/our-portfolio/&lt;br /&gt;
** https://pitturagroup.com/&lt;br /&gt;
** https://www.devsinc.com/&lt;br /&gt;
** https://wearesocial.com/us/&lt;br /&gt;
&lt;br /&gt;
* Hosting&lt;br /&gt;
** https://www.turnkeylinux.org/&lt;br /&gt;
** https://www.acquia.com/&lt;br /&gt;
&lt;br /&gt;
* Misc services, nice designs&lt;br /&gt;
** https://macarthursociety.org/&lt;br /&gt;
&lt;br /&gt;
* spam recruiters&lt;br /&gt;
** https://inficarehealth.com/&lt;br /&gt;
&lt;br /&gt;
* products&lt;br /&gt;
** https://www.notion.so/product/docs&lt;br /&gt;
** https://quillbot.com/&lt;br /&gt;
** https://www.copy.ai/prices&lt;br /&gt;
&lt;br /&gt;
=== 2024Q1 ===&lt;br /&gt;
&lt;br /&gt;
* https://www.tylertech.com/&lt;br /&gt;
* https://www.liatrio.com/&lt;br /&gt;
* https://cypress.io&lt;br /&gt;
&lt;br /&gt;
=== 2023Q4 ===&lt;br /&gt;
* https://apexfintechsolutions.com/resources/#custody-clearing&lt;br /&gt;
* https://www.springsapartments.com/apartments/tx/austin/springs-at-lakeline&lt;br /&gt;
&lt;br /&gt;
=== 2023Q3 ===&lt;br /&gt;
* https://trustedquote.com/disability-insurance&lt;br /&gt;
* https://stripe.com/billing&lt;br /&gt;
* https://www.assemblyai.com/&lt;br /&gt;
* https://www.eidos.ai/&lt;br /&gt;
* https://www.vardot.com/en-us/services/digital-strategy&lt;br /&gt;
* https://osome.com/sg/&lt;br /&gt;
* https://bitbag.io/&lt;br /&gt;
* https://arends-inc.com/&lt;br /&gt;
&lt;br /&gt;
=== 2023Q2 ===&lt;br /&gt;
examples&lt;br /&gt;
* https://www.sdssinc.com/&lt;br /&gt;
&lt;br /&gt;
other&lt;br /&gt;
* recruiter example: https://www.trigent.com/&lt;br /&gt;
* https://www.foley.com/en/offices/austin&lt;br /&gt;
* https://callummurraycomposer.com/&lt;br /&gt;
* https://www.austinresidentialsolutions.online/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2023Q1 ===&lt;br /&gt;
* https://www.intrafinetworkdeposits.com/&lt;br /&gt;
* https://codebasics.io/&lt;br /&gt;
* https://devforth.io/&lt;br /&gt;
* https://www.michaeljcasey.com/&lt;br /&gt;
&lt;br /&gt;
=== 2022-11 ===&lt;br /&gt;
* https://www.netlify.com/&lt;br /&gt;
* https://kore.ai/platform/virtual-assistant/&lt;br /&gt;
* https://chain.link/&lt;br /&gt;
* https://www.blackknightinc.com/&lt;br /&gt;
* https://www.fancyhands.com/&lt;br /&gt;
* https://www.prialto.com/&lt;br /&gt;
* https://rewind.com/products/backups/github/&lt;br /&gt;
* https://gitcoin.co/hackathon/reserve-launch/onboard&lt;br /&gt;
* https://angel.co/ - a clean narrative&lt;br /&gt;
&lt;br /&gt;
=== 2022 ===&lt;br /&gt;
* https://katalon.com/ - I have a lot to learn!&lt;br /&gt;
* excellent blog format: https://www.git-tower.com/blog/developing-for-the-desktop-vscode/&lt;br /&gt;
* https://www.circle.com/en/euro-coin&lt;br /&gt;
* https://brooksource.com - its okay, the page feels &amp;quot;full&amp;quot;&lt;br /&gt;
* https://discord.com/&lt;br /&gt;
* https://dribbble.com/&lt;br /&gt;
* https://mailtrap.io/&lt;br /&gt;
* https://badgirlsbible.com/&lt;br /&gt;
* https://www.balena.io/etcher/&lt;br /&gt;
* https://railsware.com/&lt;br /&gt;
* https://sentry.io/welcome/&lt;br /&gt;
* https://saeloun.com&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [[ To read ]]&lt;br /&gt;
* [[ Tools ]]&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Cool&amp;diff=3487</id>
		<title>Cool</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Cool&amp;diff=3487"/>
				<updated>2026-06-28T18:31:43Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: /* 2022 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cool websites (latest first) ==&lt;br /&gt;
&lt;br /&gt;
=== 2026q1 ===&lt;br /&gt;
* https://hotglue.com/pricing&lt;br /&gt;
* https://www.micro1.ai/&lt;br /&gt;
* https://getmysocial.com/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* https://www.paycom.com/&lt;br /&gt;
* https://www.qed42.com/services/drupal&lt;br /&gt;
&lt;br /&gt;
* https://www.fulcrumapp.com/industries/environmental/&lt;br /&gt;
* https://www.dotsquares.com/&lt;br /&gt;
* https://moneyhub.com/&lt;br /&gt;
* https://skillenai.com/external-post/how-to-build-an-agentic-email-workflow/&lt;br /&gt;
&lt;br /&gt;
=== 2025q4 ===&lt;br /&gt;
* https://vitaminak.design/en&lt;br /&gt;
&lt;br /&gt;
=== 2024Q3 ===&lt;br /&gt;
&lt;br /&gt;
* SEO&lt;br /&gt;
** https://www.targetedwebtraffic.com/&lt;br /&gt;
** https://serpclix.com/&lt;br /&gt;
&lt;br /&gt;
* Design&lt;br /&gt;
** https://truesocialmarketing.com/our-portfolio/&lt;br /&gt;
** https://pitturagroup.com/&lt;br /&gt;
** https://www.devsinc.com/&lt;br /&gt;
** https://wearesocial.com/us/&lt;br /&gt;
&lt;br /&gt;
* Hosting&lt;br /&gt;
** https://www.turnkeylinux.org/&lt;br /&gt;
** https://www.acquia.com/&lt;br /&gt;
&lt;br /&gt;
* Misc services, nice designs&lt;br /&gt;
** https://macarthursociety.org/&lt;br /&gt;
&lt;br /&gt;
* spam recruiters&lt;br /&gt;
** https://inficarehealth.com/&lt;br /&gt;
&lt;br /&gt;
* products&lt;br /&gt;
** https://www.notion.so/product/docs&lt;br /&gt;
** https://quillbot.com/&lt;br /&gt;
** https://www.copy.ai/prices&lt;br /&gt;
&lt;br /&gt;
=== 2024Q1 ===&lt;br /&gt;
&lt;br /&gt;
* https://www.tylertech.com/&lt;br /&gt;
* https://www.liatrio.com/&lt;br /&gt;
* https://cypress.io&lt;br /&gt;
&lt;br /&gt;
=== 2023Q4 ===&lt;br /&gt;
* https://apexfintechsolutions.com/resources/#custody-clearing&lt;br /&gt;
* https://www.springsapartments.com/apartments/tx/austin/springs-at-lakeline&lt;br /&gt;
&lt;br /&gt;
=== 2023Q3 ===&lt;br /&gt;
* https://trustedquote.com/disability-insurance&lt;br /&gt;
* https://stripe.com/billing&lt;br /&gt;
* https://www.assemblyai.com/&lt;br /&gt;
* https://www.eidos.ai/&lt;br /&gt;
* https://www.vardot.com/en-us/services/digital-strategy&lt;br /&gt;
* https://osome.com/sg/&lt;br /&gt;
* https://bitbag.io/&lt;br /&gt;
* https://arends-inc.com/&lt;br /&gt;
&lt;br /&gt;
=== 2023Q2 ===&lt;br /&gt;
examples&lt;br /&gt;
* https://www.sdssinc.com/&lt;br /&gt;
&lt;br /&gt;
other&lt;br /&gt;
* recruiter example: https://www.trigent.com/&lt;br /&gt;
* https://www.foley.com/en/offices/austin&lt;br /&gt;
* https://callummurraycomposer.com/&lt;br /&gt;
* https://www.austinresidentialsolutions.online/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2023Q1 ===&lt;br /&gt;
* https://www.intrafinetworkdeposits.com/&lt;br /&gt;
* https://codebasics.io/&lt;br /&gt;
* https://devforth.io/&lt;br /&gt;
* https://www.michaeljcasey.com/&lt;br /&gt;
&lt;br /&gt;
=== 2022-11 ===&lt;br /&gt;
* https://www.netlify.com/&lt;br /&gt;
* https://kore.ai/platform/virtual-assistant/&lt;br /&gt;
* https://chain.link/&lt;br /&gt;
* https://www.blackknightinc.com/&lt;br /&gt;
* https://www.fancyhands.com/&lt;br /&gt;
* https://www.prialto.com/&lt;br /&gt;
* https://rewind.com/products/backups/github/&lt;br /&gt;
* https://gitcoin.co/hackathon/reserve-launch/onboard&lt;br /&gt;
* https://angel.co/ - a clean narrative&lt;br /&gt;
&lt;br /&gt;
=== 2022 ===&lt;br /&gt;
* https://katalon.com/ - I have a lot to learn!&lt;br /&gt;
* excellent blog format: https://www.git-tower.com/blog/developing-for-the-desktop-vscode/&lt;br /&gt;
* https://www.circle.com/en/euro-coin&lt;br /&gt;
* https://www.drsgme.org/&lt;br /&gt;
* https://brooksource.com - its okay, the page feels &amp;quot;full&amp;quot;&lt;br /&gt;
* https://discord.com/&lt;br /&gt;
* https://dribbble.com/&lt;br /&gt;
* https://mailtrap.io/&lt;br /&gt;
* https://badgirlsbible.com/&lt;br /&gt;
* https://www.balena.io/etcher/&lt;br /&gt;
* https://railsware.com/&lt;br /&gt;
* https://sentry.io/welcome/&lt;br /&gt;
* https://saeloun.com&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [[ To read ]]&lt;br /&gt;
* [[ Tools ]]&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Cool&amp;diff=3486</id>
		<title>Cool</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Cool&amp;diff=3486"/>
				<updated>2026-06-28T18:30:37Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: /* 2022 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cool websites (latest first) ==&lt;br /&gt;
&lt;br /&gt;
=== 2026q1 ===&lt;br /&gt;
* https://hotglue.com/pricing&lt;br /&gt;
* https://www.micro1.ai/&lt;br /&gt;
* https://getmysocial.com/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* https://www.paycom.com/&lt;br /&gt;
* https://www.qed42.com/services/drupal&lt;br /&gt;
&lt;br /&gt;
* https://www.fulcrumapp.com/industries/environmental/&lt;br /&gt;
* https://www.dotsquares.com/&lt;br /&gt;
* https://moneyhub.com/&lt;br /&gt;
* https://skillenai.com/external-post/how-to-build-an-agentic-email-workflow/&lt;br /&gt;
&lt;br /&gt;
=== 2025q4 ===&lt;br /&gt;
* https://vitaminak.design/en&lt;br /&gt;
&lt;br /&gt;
=== 2024Q3 ===&lt;br /&gt;
&lt;br /&gt;
* SEO&lt;br /&gt;
** https://www.targetedwebtraffic.com/&lt;br /&gt;
** https://serpclix.com/&lt;br /&gt;
&lt;br /&gt;
* Design&lt;br /&gt;
** https://truesocialmarketing.com/our-portfolio/&lt;br /&gt;
** https://pitturagroup.com/&lt;br /&gt;
** https://www.devsinc.com/&lt;br /&gt;
** https://wearesocial.com/us/&lt;br /&gt;
&lt;br /&gt;
* Hosting&lt;br /&gt;
** https://www.turnkeylinux.org/&lt;br /&gt;
** https://www.acquia.com/&lt;br /&gt;
&lt;br /&gt;
* Misc services, nice designs&lt;br /&gt;
** https://macarthursociety.org/&lt;br /&gt;
&lt;br /&gt;
* spam recruiters&lt;br /&gt;
** https://inficarehealth.com/&lt;br /&gt;
&lt;br /&gt;
* products&lt;br /&gt;
** https://www.notion.so/product/docs&lt;br /&gt;
** https://quillbot.com/&lt;br /&gt;
** https://www.copy.ai/prices&lt;br /&gt;
&lt;br /&gt;
=== 2024Q1 ===&lt;br /&gt;
&lt;br /&gt;
* https://www.tylertech.com/&lt;br /&gt;
* https://www.liatrio.com/&lt;br /&gt;
* https://cypress.io&lt;br /&gt;
&lt;br /&gt;
=== 2023Q4 ===&lt;br /&gt;
* https://apexfintechsolutions.com/resources/#custody-clearing&lt;br /&gt;
* https://www.springsapartments.com/apartments/tx/austin/springs-at-lakeline&lt;br /&gt;
&lt;br /&gt;
=== 2023Q3 ===&lt;br /&gt;
* https://trustedquote.com/disability-insurance&lt;br /&gt;
* https://stripe.com/billing&lt;br /&gt;
* https://www.assemblyai.com/&lt;br /&gt;
* https://www.eidos.ai/&lt;br /&gt;
* https://www.vardot.com/en-us/services/digital-strategy&lt;br /&gt;
* https://osome.com/sg/&lt;br /&gt;
* https://bitbag.io/&lt;br /&gt;
* https://arends-inc.com/&lt;br /&gt;
&lt;br /&gt;
=== 2023Q2 ===&lt;br /&gt;
examples&lt;br /&gt;
* https://www.sdssinc.com/&lt;br /&gt;
&lt;br /&gt;
other&lt;br /&gt;
* recruiter example: https://www.trigent.com/&lt;br /&gt;
* https://www.foley.com/en/offices/austin&lt;br /&gt;
* https://callummurraycomposer.com/&lt;br /&gt;
* https://www.austinresidentialsolutions.online/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2023Q1 ===&lt;br /&gt;
* https://www.intrafinetworkdeposits.com/&lt;br /&gt;
* https://codebasics.io/&lt;br /&gt;
* https://devforth.io/&lt;br /&gt;
* https://www.michaeljcasey.com/&lt;br /&gt;
&lt;br /&gt;
=== 2022-11 ===&lt;br /&gt;
* https://www.netlify.com/&lt;br /&gt;
* https://kore.ai/platform/virtual-assistant/&lt;br /&gt;
* https://chain.link/&lt;br /&gt;
* https://www.blackknightinc.com/&lt;br /&gt;
* https://www.fancyhands.com/&lt;br /&gt;
* https://www.prialto.com/&lt;br /&gt;
* https://rewind.com/products/backups/github/&lt;br /&gt;
* https://gitcoin.co/hackathon/reserve-launch/onboard&lt;br /&gt;
* https://angel.co/ - a clean narrative&lt;br /&gt;
&lt;br /&gt;
=== 2022 ===&lt;br /&gt;
* https://katalon.com/ - I have a lot to learn!&lt;br /&gt;
* excellent blog format: https://www.git-tower.com/blog/developing-for-the-desktop-vscode/&lt;br /&gt;
* https://www.circle.com/en/euro-coin&lt;br /&gt;
* https://www.drsgme.org/&lt;br /&gt;
* https://brooksource.com - its okay, the page feels &amp;quot;full&amp;quot;&lt;br /&gt;
* https://www.pinata.cloud/&lt;br /&gt;
* https://discord.com/&lt;br /&gt;
* https://dribbble.com/&lt;br /&gt;
* https://mailtrap.io/&lt;br /&gt;
* https://badgirlsbible.com/&lt;br /&gt;
* https://www.balena.io/etcher/&lt;br /&gt;
* https://railsware.com/&lt;br /&gt;
* https://sentry.io/welcome/&lt;br /&gt;
* https://saeloun.com&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [[ To read ]]&lt;br /&gt;
* [[ Tools ]]&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Cool&amp;diff=3485</id>
		<title>Cool</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Cool&amp;diff=3485"/>
				<updated>2026-06-28T18:29:06Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: /* 2022 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cool websites (latest first) ==&lt;br /&gt;
&lt;br /&gt;
=== 2026q1 ===&lt;br /&gt;
* https://hotglue.com/pricing&lt;br /&gt;
* https://www.micro1.ai/&lt;br /&gt;
* https://getmysocial.com/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* https://www.paycom.com/&lt;br /&gt;
* https://www.qed42.com/services/drupal&lt;br /&gt;
&lt;br /&gt;
* https://www.fulcrumapp.com/industries/environmental/&lt;br /&gt;
* https://www.dotsquares.com/&lt;br /&gt;
* https://moneyhub.com/&lt;br /&gt;
* https://skillenai.com/external-post/how-to-build-an-agentic-email-workflow/&lt;br /&gt;
&lt;br /&gt;
=== 2025q4 ===&lt;br /&gt;
* https://vitaminak.design/en&lt;br /&gt;
&lt;br /&gt;
=== 2024Q3 ===&lt;br /&gt;
&lt;br /&gt;
* SEO&lt;br /&gt;
** https://www.targetedwebtraffic.com/&lt;br /&gt;
** https://serpclix.com/&lt;br /&gt;
&lt;br /&gt;
* Design&lt;br /&gt;
** https://truesocialmarketing.com/our-portfolio/&lt;br /&gt;
** https://pitturagroup.com/&lt;br /&gt;
** https://www.devsinc.com/&lt;br /&gt;
** https://wearesocial.com/us/&lt;br /&gt;
&lt;br /&gt;
* Hosting&lt;br /&gt;
** https://www.turnkeylinux.org/&lt;br /&gt;
** https://www.acquia.com/&lt;br /&gt;
&lt;br /&gt;
* Misc services, nice designs&lt;br /&gt;
** https://macarthursociety.org/&lt;br /&gt;
&lt;br /&gt;
* spam recruiters&lt;br /&gt;
** https://inficarehealth.com/&lt;br /&gt;
&lt;br /&gt;
* products&lt;br /&gt;
** https://www.notion.so/product/docs&lt;br /&gt;
** https://quillbot.com/&lt;br /&gt;
** https://www.copy.ai/prices&lt;br /&gt;
&lt;br /&gt;
=== 2024Q1 ===&lt;br /&gt;
&lt;br /&gt;
* https://www.tylertech.com/&lt;br /&gt;
* https://www.liatrio.com/&lt;br /&gt;
* https://cypress.io&lt;br /&gt;
&lt;br /&gt;
=== 2023Q4 ===&lt;br /&gt;
* https://apexfintechsolutions.com/resources/#custody-clearing&lt;br /&gt;
* https://www.springsapartments.com/apartments/tx/austin/springs-at-lakeline&lt;br /&gt;
&lt;br /&gt;
=== 2023Q3 ===&lt;br /&gt;
* https://trustedquote.com/disability-insurance&lt;br /&gt;
* https://stripe.com/billing&lt;br /&gt;
* https://www.assemblyai.com/&lt;br /&gt;
* https://www.eidos.ai/&lt;br /&gt;
* https://www.vardot.com/en-us/services/digital-strategy&lt;br /&gt;
* https://osome.com/sg/&lt;br /&gt;
* https://bitbag.io/&lt;br /&gt;
* https://arends-inc.com/&lt;br /&gt;
&lt;br /&gt;
=== 2023Q2 ===&lt;br /&gt;
examples&lt;br /&gt;
* https://www.sdssinc.com/&lt;br /&gt;
&lt;br /&gt;
other&lt;br /&gt;
* recruiter example: https://www.trigent.com/&lt;br /&gt;
* https://www.foley.com/en/offices/austin&lt;br /&gt;
* https://callummurraycomposer.com/&lt;br /&gt;
* https://www.austinresidentialsolutions.online/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2023Q1 ===&lt;br /&gt;
* https://www.intrafinetworkdeposits.com/&lt;br /&gt;
* https://codebasics.io/&lt;br /&gt;
* https://devforth.io/&lt;br /&gt;
* https://www.michaeljcasey.com/&lt;br /&gt;
&lt;br /&gt;
=== 2022-11 ===&lt;br /&gt;
* https://www.netlify.com/&lt;br /&gt;
* https://kore.ai/platform/virtual-assistant/&lt;br /&gt;
* https://chain.link/&lt;br /&gt;
* https://www.blackknightinc.com/&lt;br /&gt;
* https://www.fancyhands.com/&lt;br /&gt;
* https://www.prialto.com/&lt;br /&gt;
* https://rewind.com/products/backups/github/&lt;br /&gt;
* https://gitcoin.co/hackathon/reserve-launch/onboard&lt;br /&gt;
* https://angel.co/ - a clean narrative&lt;br /&gt;
&lt;br /&gt;
=== 2022 ===&lt;br /&gt;
* https://katalon.com/ - I have a lot to learn!&lt;br /&gt;
* excellent blog format: https://www.git-tower.com/blog/developing-for-the-desktop-vscode/&lt;br /&gt;
* https://www.circle.com/en/euro-coin&lt;br /&gt;
* https://www.drsgme.org/&lt;br /&gt;
* https://brooksource.com - its okay, the page feels &amp;quot;full&amp;quot;&lt;br /&gt;
* https://www.pinata.cloud/&lt;br /&gt;
* https://discord.com/&lt;br /&gt;
* https://dribbble.com/DmiT&lt;br /&gt;
* https://mailtrap.io/&lt;br /&gt;
* https://badgirlsbible.com/&lt;br /&gt;
* https://www.balena.io/etcher/&lt;br /&gt;
* https://railsware.com/&lt;br /&gt;
* https://sentry.io/welcome/&lt;br /&gt;
* https://saeloun.com&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [[ To read ]]&lt;br /&gt;
* [[ Tools ]]&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Cool&amp;diff=3484</id>
		<title>Cool</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Cool&amp;diff=3484"/>
				<updated>2026-06-28T18:26:22Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: /* 2022 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cool websites (latest first) ==&lt;br /&gt;
&lt;br /&gt;
=== 2026q1 ===&lt;br /&gt;
* https://hotglue.com/pricing&lt;br /&gt;
* https://www.micro1.ai/&lt;br /&gt;
* https://getmysocial.com/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* https://www.paycom.com/&lt;br /&gt;
* https://www.qed42.com/services/drupal&lt;br /&gt;
&lt;br /&gt;
* https://www.fulcrumapp.com/industries/environmental/&lt;br /&gt;
* https://www.dotsquares.com/&lt;br /&gt;
* https://moneyhub.com/&lt;br /&gt;
* https://skillenai.com/external-post/how-to-build-an-agentic-email-workflow/&lt;br /&gt;
&lt;br /&gt;
=== 2025q4 ===&lt;br /&gt;
* https://vitaminak.design/en&lt;br /&gt;
&lt;br /&gt;
=== 2024Q3 ===&lt;br /&gt;
&lt;br /&gt;
* SEO&lt;br /&gt;
** https://www.targetedwebtraffic.com/&lt;br /&gt;
** https://serpclix.com/&lt;br /&gt;
&lt;br /&gt;
* Design&lt;br /&gt;
** https://truesocialmarketing.com/our-portfolio/&lt;br /&gt;
** https://pitturagroup.com/&lt;br /&gt;
** https://www.devsinc.com/&lt;br /&gt;
** https://wearesocial.com/us/&lt;br /&gt;
&lt;br /&gt;
* Hosting&lt;br /&gt;
** https://www.turnkeylinux.org/&lt;br /&gt;
** https://www.acquia.com/&lt;br /&gt;
&lt;br /&gt;
* Misc services, nice designs&lt;br /&gt;
** https://macarthursociety.org/&lt;br /&gt;
&lt;br /&gt;
* spam recruiters&lt;br /&gt;
** https://inficarehealth.com/&lt;br /&gt;
&lt;br /&gt;
* products&lt;br /&gt;
** https://www.notion.so/product/docs&lt;br /&gt;
** https://quillbot.com/&lt;br /&gt;
** https://www.copy.ai/prices&lt;br /&gt;
&lt;br /&gt;
=== 2024Q1 ===&lt;br /&gt;
&lt;br /&gt;
* https://www.tylertech.com/&lt;br /&gt;
* https://www.liatrio.com/&lt;br /&gt;
* https://cypress.io&lt;br /&gt;
&lt;br /&gt;
=== 2023Q4 ===&lt;br /&gt;
* https://apexfintechsolutions.com/resources/#custody-clearing&lt;br /&gt;
* https://www.springsapartments.com/apartments/tx/austin/springs-at-lakeline&lt;br /&gt;
&lt;br /&gt;
=== 2023Q3 ===&lt;br /&gt;
* https://trustedquote.com/disability-insurance&lt;br /&gt;
* https://stripe.com/billing&lt;br /&gt;
* https://www.assemblyai.com/&lt;br /&gt;
* https://www.eidos.ai/&lt;br /&gt;
* https://www.vardot.com/en-us/services/digital-strategy&lt;br /&gt;
* https://osome.com/sg/&lt;br /&gt;
* https://bitbag.io/&lt;br /&gt;
* https://arends-inc.com/&lt;br /&gt;
&lt;br /&gt;
=== 2023Q2 ===&lt;br /&gt;
examples&lt;br /&gt;
* https://www.sdssinc.com/&lt;br /&gt;
&lt;br /&gt;
other&lt;br /&gt;
* recruiter example: https://www.trigent.com/&lt;br /&gt;
* https://www.foley.com/en/offices/austin&lt;br /&gt;
* https://callummurraycomposer.com/&lt;br /&gt;
* https://www.austinresidentialsolutions.online/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2023Q1 ===&lt;br /&gt;
* https://www.intrafinetworkdeposits.com/&lt;br /&gt;
* https://codebasics.io/&lt;br /&gt;
* https://devforth.io/&lt;br /&gt;
* https://www.michaeljcasey.com/&lt;br /&gt;
&lt;br /&gt;
=== 2022-11 ===&lt;br /&gt;
* https://www.netlify.com/&lt;br /&gt;
* https://kore.ai/platform/virtual-assistant/&lt;br /&gt;
* https://chain.link/&lt;br /&gt;
* https://www.blackknightinc.com/&lt;br /&gt;
* https://www.fancyhands.com/&lt;br /&gt;
* https://www.prialto.com/&lt;br /&gt;
* https://rewind.com/products/backups/github/&lt;br /&gt;
* https://gitcoin.co/hackathon/reserve-launch/onboard&lt;br /&gt;
* https://angel.co/ - a clean narrative&lt;br /&gt;
&lt;br /&gt;
=== 2022 ===&lt;br /&gt;
* https://katalon.com/ - I have a lot to learn!&lt;br /&gt;
* excellent blog format: https://www.git-tower.com/blog/developing-for-the-desktop-vscode/&lt;br /&gt;
* https://www.circle.com/en/euro-coin&lt;br /&gt;
* https://www.drsgme.org/&lt;br /&gt;
* https://brooksource.com - its okay, the page feels &amp;quot;full&amp;quot;&lt;br /&gt;
* https://www.pinata.cloud/&lt;br /&gt;
* https://discord.com/&lt;br /&gt;
* https://dribbble.com/DmiT&lt;br /&gt;
* https://mailtrap.io/&lt;br /&gt;
* https://www.thebalance.com/&lt;br /&gt;
* https://badgirlsbible.com/&lt;br /&gt;
* https://www.balena.io/etcher/&lt;br /&gt;
* https://railsware.com/&lt;br /&gt;
* https://sentry.io/welcome/&lt;br /&gt;
* https://saeloun.com&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [[ To read ]]&lt;br /&gt;
* [[ Tools ]]&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Cool&amp;diff=3483</id>
		<title>Cool</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Cool&amp;diff=3483"/>
				<updated>2026-06-28T18:25:22Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: /* 2022 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cool websites (latest first) ==&lt;br /&gt;
&lt;br /&gt;
=== 2026q1 ===&lt;br /&gt;
* https://hotglue.com/pricing&lt;br /&gt;
* https://www.micro1.ai/&lt;br /&gt;
* https://getmysocial.com/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* https://www.paycom.com/&lt;br /&gt;
* https://www.qed42.com/services/drupal&lt;br /&gt;
&lt;br /&gt;
* https://www.fulcrumapp.com/industries/environmental/&lt;br /&gt;
* https://www.dotsquares.com/&lt;br /&gt;
* https://moneyhub.com/&lt;br /&gt;
* https://skillenai.com/external-post/how-to-build-an-agentic-email-workflow/&lt;br /&gt;
&lt;br /&gt;
=== 2025q4 ===&lt;br /&gt;
* https://vitaminak.design/en&lt;br /&gt;
&lt;br /&gt;
=== 2024Q3 ===&lt;br /&gt;
&lt;br /&gt;
* SEO&lt;br /&gt;
** https://www.targetedwebtraffic.com/&lt;br /&gt;
** https://serpclix.com/&lt;br /&gt;
&lt;br /&gt;
* Design&lt;br /&gt;
** https://truesocialmarketing.com/our-portfolio/&lt;br /&gt;
** https://pitturagroup.com/&lt;br /&gt;
** https://www.devsinc.com/&lt;br /&gt;
** https://wearesocial.com/us/&lt;br /&gt;
&lt;br /&gt;
* Hosting&lt;br /&gt;
** https://www.turnkeylinux.org/&lt;br /&gt;
** https://www.acquia.com/&lt;br /&gt;
&lt;br /&gt;
* Misc services, nice designs&lt;br /&gt;
** https://macarthursociety.org/&lt;br /&gt;
&lt;br /&gt;
* spam recruiters&lt;br /&gt;
** https://inficarehealth.com/&lt;br /&gt;
&lt;br /&gt;
* products&lt;br /&gt;
** https://www.notion.so/product/docs&lt;br /&gt;
** https://quillbot.com/&lt;br /&gt;
** https://www.copy.ai/prices&lt;br /&gt;
&lt;br /&gt;
=== 2024Q1 ===&lt;br /&gt;
&lt;br /&gt;
* https://www.tylertech.com/&lt;br /&gt;
* https://www.liatrio.com/&lt;br /&gt;
* https://cypress.io&lt;br /&gt;
&lt;br /&gt;
=== 2023Q4 ===&lt;br /&gt;
* https://apexfintechsolutions.com/resources/#custody-clearing&lt;br /&gt;
* https://www.springsapartments.com/apartments/tx/austin/springs-at-lakeline&lt;br /&gt;
&lt;br /&gt;
=== 2023Q3 ===&lt;br /&gt;
* https://trustedquote.com/disability-insurance&lt;br /&gt;
* https://stripe.com/billing&lt;br /&gt;
* https://www.assemblyai.com/&lt;br /&gt;
* https://www.eidos.ai/&lt;br /&gt;
* https://www.vardot.com/en-us/services/digital-strategy&lt;br /&gt;
* https://osome.com/sg/&lt;br /&gt;
* https://bitbag.io/&lt;br /&gt;
* https://arends-inc.com/&lt;br /&gt;
&lt;br /&gt;
=== 2023Q2 ===&lt;br /&gt;
examples&lt;br /&gt;
* https://www.sdssinc.com/&lt;br /&gt;
&lt;br /&gt;
other&lt;br /&gt;
* recruiter example: https://www.trigent.com/&lt;br /&gt;
* https://www.foley.com/en/offices/austin&lt;br /&gt;
* https://callummurraycomposer.com/&lt;br /&gt;
* https://www.austinresidentialsolutions.online/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2023Q1 ===&lt;br /&gt;
* https://www.intrafinetworkdeposits.com/&lt;br /&gt;
* https://codebasics.io/&lt;br /&gt;
* https://devforth.io/&lt;br /&gt;
* https://www.michaeljcasey.com/&lt;br /&gt;
&lt;br /&gt;
=== 2022-11 ===&lt;br /&gt;
* https://www.netlify.com/&lt;br /&gt;
* https://kore.ai/platform/virtual-assistant/&lt;br /&gt;
* https://chain.link/&lt;br /&gt;
* https://www.blackknightinc.com/&lt;br /&gt;
* https://www.fancyhands.com/&lt;br /&gt;
* https://www.prialto.com/&lt;br /&gt;
* https://rewind.com/products/backups/github/&lt;br /&gt;
* https://gitcoin.co/hackathon/reserve-launch/onboard&lt;br /&gt;
* https://angel.co/ - a clean narrative&lt;br /&gt;
&lt;br /&gt;
=== 2022 ===&lt;br /&gt;
* https://katalon.com/ - I have a lot to learn!&lt;br /&gt;
* excellent blog format: https://www.git-tower.com/blog/developing-for-the-desktop-vscode/&lt;br /&gt;
* https://www.circle.com/en/euro-coin&lt;br /&gt;
* https://www.drsgme.org/&lt;br /&gt;
* https://brooksource.com - its okay, the page feels &amp;quot;full&amp;quot;&lt;br /&gt;
* https://www.pinata.cloud/&lt;br /&gt;
* https://discord.com/&lt;br /&gt;
* https://dribbble.com/DmiT&lt;br /&gt;
* https://mailtrap.io/&lt;br /&gt;
* https://www.thebalance.com/&lt;br /&gt;
* https://badgirlsbible.com/&lt;br /&gt;
* https://www.balena.io/etcher/&lt;br /&gt;
* https://railsware.com/&lt;br /&gt;
* https://sentry.io/welcome/&lt;br /&gt;
* https://www.confluent.io/&lt;br /&gt;
* https://saeloun.com&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [[ To read ]]&lt;br /&gt;
* [[ Tools ]]&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=MySQL&amp;diff=3482</id>
		<title>MySQL</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=MySQL&amp;diff=3482"/>
				<updated>2026-06-13T00:13:10Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: /* start/stop service */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== mysql binlog files grow too large ==&lt;br /&gt;
&lt;br /&gt;
set expiry of binlogs to 3 days:&lt;br /&gt;
&lt;br /&gt;
  SET GLOBAL  binlog_expire_logs_seconds = (60*60*24*3);&lt;br /&gt;
  SET PERSIST binlog_expire_logs_seconds = (60*60*24*3);&lt;br /&gt;
&lt;br /&gt;
list them and purge them:&lt;br /&gt;
&lt;br /&gt;
  SHOW BINARY LOGS;&lt;br /&gt;
  PURGE BINARY LOGS TO 'binlog.000142';&lt;br /&gt;
&lt;br /&gt;
== Configure External Access ==&lt;br /&gt;
&lt;br /&gt;
Don't forget to change bind_ip in /etc/mysql/my.cfg to 0.0.0.0 to allow external connections.&lt;br /&gt;
&lt;br /&gt;
Allow root to login from anywhere. From: http://stackoverflow.com/questions/11223235/mysql-root-access-from-all-hosts&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';&lt;br /&gt;
 &lt;br /&gt;
 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password';&lt;br /&gt;
 # better:&lt;br /&gt;
 GRANT ALL PRIVILEGES ON microsites3_test.* TO 'tester'@'localhost';&lt;br /&gt;
 &lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  CREATE USER 'bjjc_prod_user'@'%' IDENTIFIED BY '&amp;lt;some-pass&amp;gt;';&lt;br /&gt;
  GRANT ALL PRIVILEGES ON bjjc_wordpress.* TO 'bjjc_prod_user'@'%' WITH GRANT OPTION;&lt;br /&gt;
  FLUSH PRIVILEGES;&lt;br /&gt;
&lt;br /&gt;
== Show privileges of a user ==&lt;br /&gt;
&lt;br /&gt;
 SHOW GRANTS;&lt;br /&gt;
 SHOW GRANTS FOR CURRENT_USER;&lt;br /&gt;
&lt;br /&gt;
 SHOW GRANTS FOR 'jeffrey'@'localhost';&lt;br /&gt;
&lt;br /&gt;
== Create a user ==&lt;br /&gt;
 # CREATE USER 'sammy'@'localhost' IDENTIFIED BY 'password'; ## may or may not work with php ?&lt;br /&gt;
 CREATE USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';&lt;br /&gt;
 ALTER USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';&lt;br /&gt;
&lt;br /&gt;
 GRANT &amp;lt;PRIVILEGE&amp;gt;, &amp;lt;PRIVILEGE&amp;gt; ON database.table TO 'username'@'host';&lt;br /&gt;
 GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'sammy'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
 GRANT ALL PRIVILEGES ON *.* TO 'sammy'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
&lt;br /&gt;
== restart ==&lt;br /&gt;
 sudo /usr/local/bin/mysql.server restart&lt;br /&gt;
&lt;br /&gt;
== dump/restore ==&lt;br /&gt;
 mysql -u username -p database_name &amp;lt; file.sql&lt;br /&gt;
&lt;br /&gt;
= Troubleshoot =&lt;br /&gt;
&lt;br /&gt;
== some timeout ==&lt;br /&gt;
From: https://stackoverflow.com/questions/2766785/fixing-lock-wait-timeout-exceeded-try-restarting-transaction-for-a-stuck-my&lt;br /&gt;
&lt;br /&gt;
  SHOW PROCESSLIST;&lt;br /&gt;
  KILL &amp;lt;id&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
see long-running transactions:&lt;br /&gt;
&lt;br /&gt;
  SELECT * FROM `information_schema`.`innodb_trx` ORDER BY `trx_started`;&lt;br /&gt;
&lt;br /&gt;
== ActiveRecord::StatementInvalid: Mysql2::Error: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) ==&lt;br /&gt;
From: https://stackoverflow.com/questions/1008287/illegal-mix-of-collations-mysql-error&lt;br /&gt;
&lt;br /&gt;
  SET collation_connection = 'utf8_general_ci';&lt;br /&gt;
  ALTER DATABASE your_database_name CHARACTER SET utf8 COLLATE utf8_general_ci;&lt;br /&gt;
  ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;&lt;br /&gt;
&lt;br /&gt;
== Unknown collation: utf8mb4_0900_ai_ci ==&lt;br /&gt;
From: https://tecadmin.net/resolved-unknown-collation-utf8mb4_0900_ai_ci/&lt;br /&gt;
&lt;br /&gt;
Replace the below string:&lt;br /&gt;
&lt;br /&gt;
 ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;&lt;br /&gt;
&lt;br /&gt;
with:&lt;br /&gt;
&lt;br /&gt;
 ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;&lt;br /&gt;
&lt;br /&gt;
also:&lt;br /&gt;
&lt;br /&gt;
 ALTER DATABASE moodle_development DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci&lt;br /&gt;
&lt;br /&gt;
== Mysql. The server requested authentication method unknown to the client [caching_sha2_password] ==&lt;br /&gt;
&lt;br /&gt;
From: https://github.com/laradock/laradock/issues/1390&lt;br /&gt;
&lt;br /&gt;
 alter user 'username'@'localhost' identified with mysql_native_password by 'password';&lt;br /&gt;
&lt;br /&gt;
== kill long quaries ==&lt;br /&gt;
&lt;br /&gt;
 SHOW FULL PROCESSLIST;&lt;br /&gt;
&lt;br /&gt;
== start/stop service  ==&lt;br /&gt;
&lt;br /&gt;
  brew services list&lt;br /&gt;
  brew services start/stop mysql&lt;br /&gt;
&lt;br /&gt;
  sudo /usr/local/mysql/support-files/mysql.server stop&lt;br /&gt;
&lt;br /&gt;
  sudo launchctl unload -w /Library/LaunchDaemons/com.oracle.oss.mysql.mysqld.plist&lt;br /&gt;
&lt;br /&gt;
In the end it was just this:&lt;br /&gt;
&lt;br /&gt;
  ps aux | grep mysql&lt;br /&gt;
  sudo kill -TERM 46377&lt;br /&gt;
  sudo kill -TERM 46293&lt;br /&gt;
&lt;br /&gt;
== find largest tables ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT &lt;br /&gt;
    table_name AS &amp;quot;Table&amp;quot;,&lt;br /&gt;
    ROUND((data_length + index_length) / 1024 / 1024, 2) AS &amp;quot;Size_MB&amp;quot;&lt;br /&gt;
FROM information_schema.TABLES&lt;br /&gt;
WHERE table_schema = DATABASE()&lt;br /&gt;
ORDER BY (data_length + index_length) DESC;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== more ==&lt;br /&gt;
&lt;br /&gt;
  brew install mysql@8.4 ## this fails.&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=MySQL&amp;diff=3481</id>
		<title>MySQL</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=MySQL&amp;diff=3481"/>
				<updated>2026-06-13T00:10:18Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: /* Control on a mac */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== mysql binlog files grow too large ==&lt;br /&gt;
&lt;br /&gt;
set expiry of binlogs to 3 days:&lt;br /&gt;
&lt;br /&gt;
  SET GLOBAL  binlog_expire_logs_seconds = (60*60*24*3);&lt;br /&gt;
  SET PERSIST binlog_expire_logs_seconds = (60*60*24*3);&lt;br /&gt;
&lt;br /&gt;
list them and purge them:&lt;br /&gt;
&lt;br /&gt;
  SHOW BINARY LOGS;&lt;br /&gt;
  PURGE BINARY LOGS TO 'binlog.000142';&lt;br /&gt;
&lt;br /&gt;
== Configure External Access ==&lt;br /&gt;
&lt;br /&gt;
Don't forget to change bind_ip in /etc/mysql/my.cfg to 0.0.0.0 to allow external connections.&lt;br /&gt;
&lt;br /&gt;
Allow root to login from anywhere. From: http://stackoverflow.com/questions/11223235/mysql-root-access-from-all-hosts&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';&lt;br /&gt;
 &lt;br /&gt;
 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password';&lt;br /&gt;
 # better:&lt;br /&gt;
 GRANT ALL PRIVILEGES ON microsites3_test.* TO 'tester'@'localhost';&lt;br /&gt;
 &lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  CREATE USER 'bjjc_prod_user'@'%' IDENTIFIED BY '&amp;lt;some-pass&amp;gt;';&lt;br /&gt;
  GRANT ALL PRIVILEGES ON bjjc_wordpress.* TO 'bjjc_prod_user'@'%' WITH GRANT OPTION;&lt;br /&gt;
  FLUSH PRIVILEGES;&lt;br /&gt;
&lt;br /&gt;
== Show privileges of a user ==&lt;br /&gt;
&lt;br /&gt;
 SHOW GRANTS;&lt;br /&gt;
 SHOW GRANTS FOR CURRENT_USER;&lt;br /&gt;
&lt;br /&gt;
 SHOW GRANTS FOR 'jeffrey'@'localhost';&lt;br /&gt;
&lt;br /&gt;
== Create a user ==&lt;br /&gt;
 # CREATE USER 'sammy'@'localhost' IDENTIFIED BY 'password'; ## may or may not work with php ?&lt;br /&gt;
 CREATE USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';&lt;br /&gt;
 ALTER USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';&lt;br /&gt;
&lt;br /&gt;
 GRANT &amp;lt;PRIVILEGE&amp;gt;, &amp;lt;PRIVILEGE&amp;gt; ON database.table TO 'username'@'host';&lt;br /&gt;
 GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'sammy'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
 GRANT ALL PRIVILEGES ON *.* TO 'sammy'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
&lt;br /&gt;
== restart ==&lt;br /&gt;
 sudo /usr/local/bin/mysql.server restart&lt;br /&gt;
&lt;br /&gt;
== dump/restore ==&lt;br /&gt;
 mysql -u username -p database_name &amp;lt; file.sql&lt;br /&gt;
&lt;br /&gt;
= Troubleshoot =&lt;br /&gt;
&lt;br /&gt;
== some timeout ==&lt;br /&gt;
From: https://stackoverflow.com/questions/2766785/fixing-lock-wait-timeout-exceeded-try-restarting-transaction-for-a-stuck-my&lt;br /&gt;
&lt;br /&gt;
  SHOW PROCESSLIST;&lt;br /&gt;
  KILL &amp;lt;id&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
see long-running transactions:&lt;br /&gt;
&lt;br /&gt;
  SELECT * FROM `information_schema`.`innodb_trx` ORDER BY `trx_started`;&lt;br /&gt;
&lt;br /&gt;
== ActiveRecord::StatementInvalid: Mysql2::Error: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) ==&lt;br /&gt;
From: https://stackoverflow.com/questions/1008287/illegal-mix-of-collations-mysql-error&lt;br /&gt;
&lt;br /&gt;
  SET collation_connection = 'utf8_general_ci';&lt;br /&gt;
  ALTER DATABASE your_database_name CHARACTER SET utf8 COLLATE utf8_general_ci;&lt;br /&gt;
  ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;&lt;br /&gt;
&lt;br /&gt;
== Unknown collation: utf8mb4_0900_ai_ci ==&lt;br /&gt;
From: https://tecadmin.net/resolved-unknown-collation-utf8mb4_0900_ai_ci/&lt;br /&gt;
&lt;br /&gt;
Replace the below string:&lt;br /&gt;
&lt;br /&gt;
 ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;&lt;br /&gt;
&lt;br /&gt;
with:&lt;br /&gt;
&lt;br /&gt;
 ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;&lt;br /&gt;
&lt;br /&gt;
also:&lt;br /&gt;
&lt;br /&gt;
 ALTER DATABASE moodle_development DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci&lt;br /&gt;
&lt;br /&gt;
== Mysql. The server requested authentication method unknown to the client [caching_sha2_password] ==&lt;br /&gt;
&lt;br /&gt;
From: https://github.com/laradock/laradock/issues/1390&lt;br /&gt;
&lt;br /&gt;
 alter user 'username'@'localhost' identified with mysql_native_password by 'password';&lt;br /&gt;
&lt;br /&gt;
== kill long quaries ==&lt;br /&gt;
&lt;br /&gt;
 SHOW FULL PROCESSLIST;&lt;br /&gt;
&lt;br /&gt;
== start/stop service  ==&lt;br /&gt;
&lt;br /&gt;
  brew services list&lt;br /&gt;
  brew services start/stop mysql&lt;br /&gt;
&lt;br /&gt;
  sudo /usr/local/mysql/support-files/mysql.server stop&lt;br /&gt;
&lt;br /&gt;
  sudo launchctl unload -w /Library/LaunchDaemons/com.oracle.oss.mysql.mysqld.plist&lt;br /&gt;
&lt;br /&gt;
== find largest tables ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT &lt;br /&gt;
    table_name AS &amp;quot;Table&amp;quot;,&lt;br /&gt;
    ROUND((data_length + index_length) / 1024 / 1024, 2) AS &amp;quot;Size_MB&amp;quot;&lt;br /&gt;
FROM information_schema.TABLES&lt;br /&gt;
WHERE table_schema = DATABASE()&lt;br /&gt;
ORDER BY (data_length + index_length) DESC;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== more ==&lt;br /&gt;
&lt;br /&gt;
  brew install mysql@8.4 ## this fails.&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=MySQL&amp;diff=3480</id>
		<title>MySQL</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=MySQL&amp;diff=3480"/>
				<updated>2026-06-13T00:07:21Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: /* more */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== mysql binlog files grow too large ==&lt;br /&gt;
&lt;br /&gt;
set expiry of binlogs to 3 days:&lt;br /&gt;
&lt;br /&gt;
  SET GLOBAL  binlog_expire_logs_seconds = (60*60*24*3);&lt;br /&gt;
  SET PERSIST binlog_expire_logs_seconds = (60*60*24*3);&lt;br /&gt;
&lt;br /&gt;
list them and purge them:&lt;br /&gt;
&lt;br /&gt;
  SHOW BINARY LOGS;&lt;br /&gt;
  PURGE BINARY LOGS TO 'binlog.000142';&lt;br /&gt;
&lt;br /&gt;
== Configure External Access ==&lt;br /&gt;
&lt;br /&gt;
Don't forget to change bind_ip in /etc/mysql/my.cfg to 0.0.0.0 to allow external connections.&lt;br /&gt;
&lt;br /&gt;
Allow root to login from anywhere. From: http://stackoverflow.com/questions/11223235/mysql-root-access-from-all-hosts&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';&lt;br /&gt;
 &lt;br /&gt;
 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password';&lt;br /&gt;
 # better:&lt;br /&gt;
 GRANT ALL PRIVILEGES ON microsites3_test.* TO 'tester'@'localhost';&lt;br /&gt;
 &lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  CREATE USER 'bjjc_prod_user'@'%' IDENTIFIED BY '&amp;lt;some-pass&amp;gt;';&lt;br /&gt;
  GRANT ALL PRIVILEGES ON bjjc_wordpress.* TO 'bjjc_prod_user'@'%' WITH GRANT OPTION;&lt;br /&gt;
  FLUSH PRIVILEGES;&lt;br /&gt;
&lt;br /&gt;
== Show privileges of a user ==&lt;br /&gt;
&lt;br /&gt;
 SHOW GRANTS;&lt;br /&gt;
 SHOW GRANTS FOR CURRENT_USER;&lt;br /&gt;
&lt;br /&gt;
 SHOW GRANTS FOR 'jeffrey'@'localhost';&lt;br /&gt;
&lt;br /&gt;
== Create a user ==&lt;br /&gt;
 # CREATE USER 'sammy'@'localhost' IDENTIFIED BY 'password'; ## may or may not work with php ?&lt;br /&gt;
 CREATE USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';&lt;br /&gt;
 ALTER USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';&lt;br /&gt;
&lt;br /&gt;
 GRANT &amp;lt;PRIVILEGE&amp;gt;, &amp;lt;PRIVILEGE&amp;gt; ON database.table TO 'username'@'host';&lt;br /&gt;
 GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'sammy'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
 GRANT ALL PRIVILEGES ON *.* TO 'sammy'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
&lt;br /&gt;
== restart ==&lt;br /&gt;
 sudo /usr/local/bin/mysql.server restart&lt;br /&gt;
&lt;br /&gt;
== dump/restore ==&lt;br /&gt;
 mysql -u username -p database_name &amp;lt; file.sql&lt;br /&gt;
&lt;br /&gt;
= Troubleshoot =&lt;br /&gt;
&lt;br /&gt;
== some timeout ==&lt;br /&gt;
From: https://stackoverflow.com/questions/2766785/fixing-lock-wait-timeout-exceeded-try-restarting-transaction-for-a-stuck-my&lt;br /&gt;
&lt;br /&gt;
  SHOW PROCESSLIST;&lt;br /&gt;
  KILL &amp;lt;id&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
see long-running transactions:&lt;br /&gt;
&lt;br /&gt;
  SELECT * FROM `information_schema`.`innodb_trx` ORDER BY `trx_started`;&lt;br /&gt;
&lt;br /&gt;
== ActiveRecord::StatementInvalid: Mysql2::Error: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) ==&lt;br /&gt;
From: https://stackoverflow.com/questions/1008287/illegal-mix-of-collations-mysql-error&lt;br /&gt;
&lt;br /&gt;
  SET collation_connection = 'utf8_general_ci';&lt;br /&gt;
  ALTER DATABASE your_database_name CHARACTER SET utf8 COLLATE utf8_general_ci;&lt;br /&gt;
  ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;&lt;br /&gt;
&lt;br /&gt;
== Unknown collation: utf8mb4_0900_ai_ci ==&lt;br /&gt;
From: https://tecadmin.net/resolved-unknown-collation-utf8mb4_0900_ai_ci/&lt;br /&gt;
&lt;br /&gt;
Replace the below string:&lt;br /&gt;
&lt;br /&gt;
 ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;&lt;br /&gt;
&lt;br /&gt;
with:&lt;br /&gt;
&lt;br /&gt;
 ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;&lt;br /&gt;
&lt;br /&gt;
also:&lt;br /&gt;
&lt;br /&gt;
 ALTER DATABASE moodle_development DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci&lt;br /&gt;
&lt;br /&gt;
== Mysql. The server requested authentication method unknown to the client [caching_sha2_password] ==&lt;br /&gt;
&lt;br /&gt;
From: https://github.com/laradock/laradock/issues/1390&lt;br /&gt;
&lt;br /&gt;
 alter user 'username'@'localhost' identified with mysql_native_password by 'password';&lt;br /&gt;
&lt;br /&gt;
== kill long quaries ==&lt;br /&gt;
&lt;br /&gt;
 SHOW FULL PROCESSLIST;&lt;br /&gt;
&lt;br /&gt;
== Control on a mac ==&lt;br /&gt;
&lt;br /&gt;
  brew services list&lt;br /&gt;
  brew services start/stop mysql&lt;br /&gt;
&lt;br /&gt;
== find largest tables ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT &lt;br /&gt;
    table_name AS &amp;quot;Table&amp;quot;,&lt;br /&gt;
    ROUND((data_length + index_length) / 1024 / 1024, 2) AS &amp;quot;Size_MB&amp;quot;&lt;br /&gt;
FROM information_schema.TABLES&lt;br /&gt;
WHERE table_schema = DATABASE()&lt;br /&gt;
ORDER BY (data_length + index_length) DESC;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== more ==&lt;br /&gt;
&lt;br /&gt;
  brew install mysql@8.4 ## this fails.&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=MySQL&amp;diff=3479</id>
		<title>MySQL</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=MySQL&amp;diff=3479"/>
				<updated>2026-06-12T22:26:08Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== mysql binlog files grow too large ==&lt;br /&gt;
&lt;br /&gt;
set expiry of binlogs to 3 days:&lt;br /&gt;
&lt;br /&gt;
  SET GLOBAL  binlog_expire_logs_seconds = (60*60*24*3);&lt;br /&gt;
  SET PERSIST binlog_expire_logs_seconds = (60*60*24*3);&lt;br /&gt;
&lt;br /&gt;
list them and purge them:&lt;br /&gt;
&lt;br /&gt;
  SHOW BINARY LOGS;&lt;br /&gt;
  PURGE BINARY LOGS TO 'binlog.000142';&lt;br /&gt;
&lt;br /&gt;
== Configure External Access ==&lt;br /&gt;
&lt;br /&gt;
Don't forget to change bind_ip in /etc/mysql/my.cfg to 0.0.0.0 to allow external connections.&lt;br /&gt;
&lt;br /&gt;
Allow root to login from anywhere. From: http://stackoverflow.com/questions/11223235/mysql-root-access-from-all-hosts&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';&lt;br /&gt;
 &lt;br /&gt;
 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password';&lt;br /&gt;
 # better:&lt;br /&gt;
 GRANT ALL PRIVILEGES ON microsites3_test.* TO 'tester'@'localhost';&lt;br /&gt;
 &lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  CREATE USER 'bjjc_prod_user'@'%' IDENTIFIED BY '&amp;lt;some-pass&amp;gt;';&lt;br /&gt;
  GRANT ALL PRIVILEGES ON bjjc_wordpress.* TO 'bjjc_prod_user'@'%' WITH GRANT OPTION;&lt;br /&gt;
  FLUSH PRIVILEGES;&lt;br /&gt;
&lt;br /&gt;
== Show privileges of a user ==&lt;br /&gt;
&lt;br /&gt;
 SHOW GRANTS;&lt;br /&gt;
 SHOW GRANTS FOR CURRENT_USER;&lt;br /&gt;
&lt;br /&gt;
 SHOW GRANTS FOR 'jeffrey'@'localhost';&lt;br /&gt;
&lt;br /&gt;
== Create a user ==&lt;br /&gt;
 # CREATE USER 'sammy'@'localhost' IDENTIFIED BY 'password'; ## may or may not work with php ?&lt;br /&gt;
 CREATE USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';&lt;br /&gt;
 ALTER USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';&lt;br /&gt;
&lt;br /&gt;
 GRANT &amp;lt;PRIVILEGE&amp;gt;, &amp;lt;PRIVILEGE&amp;gt; ON database.table TO 'username'@'host';&lt;br /&gt;
 GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'sammy'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
 GRANT ALL PRIVILEGES ON *.* TO 'sammy'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
&lt;br /&gt;
== restart ==&lt;br /&gt;
 sudo /usr/local/bin/mysql.server restart&lt;br /&gt;
&lt;br /&gt;
== dump/restore ==&lt;br /&gt;
 mysql -u username -p database_name &amp;lt; file.sql&lt;br /&gt;
&lt;br /&gt;
= Troubleshoot =&lt;br /&gt;
&lt;br /&gt;
== some timeout ==&lt;br /&gt;
From: https://stackoverflow.com/questions/2766785/fixing-lock-wait-timeout-exceeded-try-restarting-transaction-for-a-stuck-my&lt;br /&gt;
&lt;br /&gt;
  SHOW PROCESSLIST;&lt;br /&gt;
  KILL &amp;lt;id&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
see long-running transactions:&lt;br /&gt;
&lt;br /&gt;
  SELECT * FROM `information_schema`.`innodb_trx` ORDER BY `trx_started`;&lt;br /&gt;
&lt;br /&gt;
== ActiveRecord::StatementInvalid: Mysql2::Error: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) ==&lt;br /&gt;
From: https://stackoverflow.com/questions/1008287/illegal-mix-of-collations-mysql-error&lt;br /&gt;
&lt;br /&gt;
  SET collation_connection = 'utf8_general_ci';&lt;br /&gt;
  ALTER DATABASE your_database_name CHARACTER SET utf8 COLLATE utf8_general_ci;&lt;br /&gt;
  ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;&lt;br /&gt;
&lt;br /&gt;
== Unknown collation: utf8mb4_0900_ai_ci ==&lt;br /&gt;
From: https://tecadmin.net/resolved-unknown-collation-utf8mb4_0900_ai_ci/&lt;br /&gt;
&lt;br /&gt;
Replace the below string:&lt;br /&gt;
&lt;br /&gt;
 ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;&lt;br /&gt;
&lt;br /&gt;
with:&lt;br /&gt;
&lt;br /&gt;
 ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;&lt;br /&gt;
&lt;br /&gt;
also:&lt;br /&gt;
&lt;br /&gt;
 ALTER DATABASE moodle_development DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci&lt;br /&gt;
&lt;br /&gt;
== Mysql. The server requested authentication method unknown to the client [caching_sha2_password] ==&lt;br /&gt;
&lt;br /&gt;
From: https://github.com/laradock/laradock/issues/1390&lt;br /&gt;
&lt;br /&gt;
 alter user 'username'@'localhost' identified with mysql_native_password by 'password';&lt;br /&gt;
&lt;br /&gt;
== kill long quaries ==&lt;br /&gt;
&lt;br /&gt;
 SHOW FULL PROCESSLIST;&lt;br /&gt;
&lt;br /&gt;
== Control on a mac ==&lt;br /&gt;
&lt;br /&gt;
  brew services list&lt;br /&gt;
  brew services start/stop mysql&lt;br /&gt;
&lt;br /&gt;
== find largest tables ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT &lt;br /&gt;
    table_name AS &amp;quot;Table&amp;quot;,&lt;br /&gt;
    ROUND((data_length + index_length) / 1024 / 1024, 2) AS &amp;quot;Size_MB&amp;quot;&lt;br /&gt;
FROM information_schema.TABLES&lt;br /&gt;
WHERE table_schema = DATABASE()&lt;br /&gt;
ORDER BY (data_length + index_length) DESC;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== more ==&lt;br /&gt;
&lt;br /&gt;
  brew install mysql@8.4&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Linux_utils&amp;diff=3478</id>
		<title>Linux utils</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Linux_utils&amp;diff=3478"/>
				<updated>2026-06-09T23:07:01Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Utils =&lt;br /&gt;
* [[ css ]]&lt;br /&gt;
&lt;br /&gt;
* [[ Git cheatsheet ]]&lt;br /&gt;
* [[ IO Utils ]]&lt;br /&gt;
* [[ json ]]&lt;br /&gt;
* [[ kubernetes ]]&lt;br /&gt;
* [[ Memory Utils ]]&lt;br /&gt;
&lt;br /&gt;
* [[ Network Utils ]]&lt;br /&gt;
* [[ Process Utils ]]&lt;br /&gt;
* [[ xml ]]&lt;br /&gt;
&lt;br /&gt;
=== disable unattended upgrades ===&lt;br /&gt;
&lt;br /&gt;
  # sudo nano /etc/apt/apt.conf.d/20auto-upgrades&lt;br /&gt;
  #&lt;br /&gt;
  APT::Periodic::Update-Package-Lists &amp;quot;0&amp;quot;;&lt;br /&gt;
  APT::Periodic::Unattended-Upgrade &amp;quot;0&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl disable --now unattended-upgrades.service&lt;br /&gt;
  systemctl is-enabled unattended-upgrades &lt;br /&gt;
  cat /etc/apt/apt.conf.d/20auto-upgrades&lt;br /&gt;
 &lt;br /&gt;
=== remove a large number of files ===&lt;br /&gt;
&lt;br /&gt;
  find . -maxdepth 1 -name &amp;quot;passenger_native*&amp;quot; -print0 | xargs -0 rm&lt;br /&gt;
&lt;br /&gt;
=== Replace all occurrences of a string in a folder ===&lt;br /&gt;
ubuntu?&lt;br /&gt;
 find /home/user/ -type f | xargs sed -i  's/a.example.com/b.example.com/g'&lt;br /&gt;
mac:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 LC_ALL=C find . -type f -name &amp;quot;*.html&amp;quot; -exec sed -i '' &amp;quot;s/UA-47088821-3/UA-47088821-4/&amp;quot; {} +&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== last 3 accessed files ===&lt;br /&gt;
  find . -type f -exec stat -c '%X %n' {} \; | sort -nr | awk 'NR==1,NR==3 {print $2}'&lt;br /&gt;
&lt;br /&gt;
=== last 3 modified files ===&lt;br /&gt;
   find . -type f -exec stat -c '%Y %n' {} \; | sort -nr | awk 'NR==1,NR==3 {print $2}'&lt;br /&gt;
&lt;br /&gt;
=== Find 10 largest files in a folder ===&lt;br /&gt;
&lt;br /&gt;
  du -a /var | sort -n -r | head -n 10&lt;br /&gt;
  du -a .    | sort -n -r | head -n 15&lt;br /&gt;
&lt;br /&gt;
For mac: &lt;br /&gt;
&lt;br /&gt;
  find . -type f -exec du -h {} + | sort -rh | head -- -n 20&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Limit how much logs journalctl keeps:&lt;br /&gt;
&lt;br /&gt;
  journalctl --vacuum-time=2d&lt;br /&gt;
  journalctl --vacuum-size=500M&lt;br /&gt;
&lt;br /&gt;
=== Count Lines in a Folder ===&lt;br /&gt;
 find . -name &amp;quot;*js&amp;quot; -print | grep -v node_modules | xargs cat | grep -v &amp;quot;^//&amp;quot; | grep -v &amp;quot;^$&amp;quot; | wc -l&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== cut after ag for shorter lines ===&lt;br /&gt;
&lt;br /&gt;
 ag &amp;lt;your-search-keyword&amp;gt; | cut -c-800&lt;br /&gt;
&lt;br /&gt;
=== increase number of open files, file descriptors ===&lt;br /&gt;
&lt;br /&gt;
From: /etc/security/limits.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* - nofile 131072&lt;br /&gt;
&lt;br /&gt;
*    soft nofile 64000&lt;br /&gt;
*    hard nofile 64000&lt;br /&gt;
root soft nofile 64000&lt;br /&gt;
root hard nofile 64000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reload services after making changes, logout.&lt;br /&gt;
&lt;br /&gt;
=== count open files ===&lt;br /&gt;
 lsof | wc -&lt;br /&gt;
Per user:&lt;br /&gt;
 lsof | grep ' opera ' | awk '{print $NF}' | sort | wc -l&lt;br /&gt;
&lt;br /&gt;
=== Set date ===&lt;br /&gt;
 sudo date --set &amp;quot;25 Sep 2013 15:00:00&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Get date in milliseconds ===&lt;br /&gt;
 date -d 2017-05-05 +%s&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Disks, Storage ==&lt;br /&gt;
&lt;br /&gt;
=== check disks on ubuntu === &lt;br /&gt;
&lt;br /&gt;
  sudo lsblk&lt;br /&gt;
&lt;br /&gt;
=== Mount a block device ===&lt;br /&gt;
&lt;br /&gt;
From: https://www.digitalocean.com/community/tutorials/how-to-use-block-storage-on-digitalocean&lt;br /&gt;
&lt;br /&gt;
  parted /dev/sda mklabel gpt&lt;br /&gt;
  parted -a opt /dev/sda mkpart primary ext4 0% 100% &lt;br /&gt;
  mkfs.ext4 /dev/sda&lt;br /&gt;
  mkdir -p /data&lt;br /&gt;
  '/dev/sda /data ext4 defaults,nofail,discard 0 2' | sudo tee -a /etc/fstab&lt;br /&gt;
  mount -a&lt;br /&gt;
&lt;br /&gt;
=== Find large files ===&lt;br /&gt;
 find / -xdev -type f -size +100M&lt;br /&gt;
&lt;br /&gt;
=== see timestamps in history ===&lt;br /&gt;
 echo 'export HISTTIMEFORMAT=&amp;quot;%d/%m/%y %T &amp;quot;' &amp;gt;&amp;gt; ~/.bashrc ; source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
=== Generate large random file ===&lt;br /&gt;
 dd if=/dev/urandom of=/var/log/mongodb/randomFile bs=1M count=200&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Create a user ===&lt;br /&gt;
&lt;br /&gt;
 su - &amp;lt;username&amp;gt;&lt;br /&gt;
 sudo visudo -f /etc/sudoers&lt;br /&gt;
 usernameusedforlogin ALL=(ALL) NOPASSWD:ALL&lt;br /&gt;
 sudo adduser --disabled-password &amp;lt;username&amp;gt;&lt;br /&gt;
&lt;br /&gt;
add user to group:&lt;br /&gt;
&lt;br /&gt;
 usermod -a -G wheel niceguy&lt;br /&gt;
 useradd -g wheel niceguy ## only is user doesn't exist!&lt;br /&gt;
&lt;br /&gt;
or in rhel:&lt;br /&gt;
&lt;br /&gt;
 passwd -f -u deploy&lt;br /&gt;
 (and there is deluser)&lt;br /&gt;
 (I don't think I need this: usermod -aG sudo username ) - for making him a sudoer&lt;br /&gt;
&lt;br /&gt;
useradd? adduser?&lt;br /&gt;
&lt;br /&gt;
adduser : add user with full profile and info (pass, quota, permission, etc.) adduser is friendlier in that it sets up the account's home folders and other settings (e.g. automatically loading system stats and notifications on login),&lt;br /&gt;
&lt;br /&gt;
whereas useradd just creates the user&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Delete files older than 5 days ===&lt;br /&gt;
 find /path/to/files* -mtime +5 -exec rm {} \;&lt;br /&gt;
 find /path/to/files* -type f -mtime +5 -exec rm {} -v \;&lt;br /&gt;
&lt;br /&gt;
=== get children of a process ===&lt;br /&gt;
 pgrep -P $your_process1_pid&lt;br /&gt;
&lt;br /&gt;
=== restrict resources given to a process ===&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install cgroup-bin -y&lt;br /&gt;
 sudo cgcreate -g memory:/rmGroup&lt;br /&gt;
 sudo&lt;br /&gt;
  echo $(( 500 * 1024 * 1024 )) &amp;gt; /sys/fs/cgroup/memory/rmGroup/memory.limit_in_bytes&lt;br /&gt;
  # echo $(( 5000 * 1024 * 1024 )) &amp;gt; /sys/fs/cgroup/memory/rmGroup/memory.memsw.limit_in_bytes # swap only&lt;br /&gt;
 # cgexec -g memory:rmGroup &amp;lt;command&amp;gt;&lt;br /&gt;
 cgexec -g memory:rmGroup find cache/ -type f -mtime +10 -exec rm {} -v \;&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Ffmpeg&amp;diff=3477</id>
		<title>Ffmpeg</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Ffmpeg&amp;diff=3477"/>
				<updated>2026-05-23T21:18:40Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
  ffmpeg -i &amp;lt;input&amp;gt;.mp4 &amp;lt;output&amp;gt;.webm&lt;br /&gt;
  ffmpeg -framerate 24 -i frame_%04d.png -c:v libvpx-vp9 -pix_fmt yuv420p output.webm&lt;br /&gt;
  ffmpeg -stream_loop 4 -i input.webm -c copy output_5x.webm&lt;br /&gt;
&lt;br /&gt;
  ffmpeg -i MVI_0083.MP4 -s 960x540 -crf 18 20190322_out.webm&lt;br /&gt;
  ffmpeg -i MVI_0083.MP4 -s 960x540 20190322_out.mp4&lt;br /&gt;
  ffmpeg.exe -i &amp;quot;test.avi&amp;quot; -c:v libx264 -crf 20 -c:a aac -strict -2 &amp;quot;test.mp4&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You might want to use the -ss and -t options to create short test encodes. -ss being the start time and -t being the duration — both in seconds. You probably don’t need to encode the entire video to determine what’s acceptable.&lt;br /&gt;
&lt;br /&gt;
=== mp4 to gif ===&lt;br /&gt;
  ffmpeg -i $inn -filter_complex &amp;quot;fps=10,scale=480:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse&amp;quot; outt.gif&lt;br /&gt;
&lt;br /&gt;
=== crf ===&lt;br /&gt;
* 0 = lossless&lt;br /&gt;
* 18 = visually lossless&lt;br /&gt;
* 23 = default&lt;br /&gt;
* 28 = sane low quality&lt;br /&gt;
* 51 = worst quality possible&lt;br /&gt;
* The range is exponential, so increasing the CRF value +6 results in roughly half the bitrate / file size, while -6 leads to roughly twice the bitrate.&lt;br /&gt;
&lt;br /&gt;
=== Common Video Screen Sizes ===&lt;br /&gt;
* [https://wasyaco.com/wp-content/uploads/2024/02/Vector_Video_Standards8.jpeg screens]&lt;br /&gt;
&lt;br /&gt;
* 960x540 horizontal (540x960 vertical)&lt;br /&gt;
* 640x360&lt;br /&gt;
* 512x288 (288x512)&lt;br /&gt;
* 340x202&lt;br /&gt;
&lt;br /&gt;
* 360x240 3:2&lt;br /&gt;
* 720x480 3:2&lt;br /&gt;
&lt;br /&gt;
== video to frames ==&lt;br /&gt;
&lt;br /&gt;
  mkdir frames&lt;br /&gt;
  ffmpeg -i &amp;quot;%1&amp;quot; -r 1 frames/out-%03d.jpg&lt;br /&gt;
&lt;br /&gt;
== frames to video ==&lt;br /&gt;
&lt;br /&gt;
  ffmpeg -f image2 -i out-%03d.jpg tmp.avi&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Ffmpeg&amp;diff=3476</id>
		<title>Ffmpeg</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Ffmpeg&amp;diff=3476"/>
				<updated>2026-05-23T21:18:34Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
  ffmpeg -i &amp;lt;input&amp;gt;.mp4 &amp;lt;output&amp;gt;.webm&lt;br /&gt;
  ffmpeg -framerate 24 -i frame_%04d.png -c:v libvpx-vp9 -pix_fmt yuv420p output.webm&lt;br /&gt;
  ffmpeg -stream_loop 4 -i input.webm -c copy output_5x.webm&lt;br /&gt;
&lt;br /&gt;
  ffmpeg -i MVI_0083.MP4 -s 960x540 -crf 18 20190322_out.webm&lt;br /&gt;
  ffmpeg -i MVI_0083.MP4 -s 960x540 20190322_out.mp4&lt;br /&gt;
  ffmpeg.exe -i &amp;quot;test.avi&amp;quot; -c:v libx264 -crf 20 -c:a aac -strict -2 &amp;quot;test.mp4&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You might want to use the -ss and -t options to create short test encodes. -ss being the start time and -t being the duration — both in seconds. You probably don’t need to encode the entire video to determine what’s acceptable.&lt;br /&gt;
&lt;br /&gt;
mp4 to gif:&lt;br /&gt;
  ffmpeg -i $inn -filter_complex &amp;quot;fps=10,scale=480:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse&amp;quot; outt.gif&lt;br /&gt;
&lt;br /&gt;
=== crf ===&lt;br /&gt;
* 0 = lossless&lt;br /&gt;
* 18 = visually lossless&lt;br /&gt;
* 23 = default&lt;br /&gt;
* 28 = sane low quality&lt;br /&gt;
* 51 = worst quality possible&lt;br /&gt;
* The range is exponential, so increasing the CRF value +6 results in roughly half the bitrate / file size, while -6 leads to roughly twice the bitrate.&lt;br /&gt;
&lt;br /&gt;
=== Common Video Screen Sizes ===&lt;br /&gt;
* [https://wasyaco.com/wp-content/uploads/2024/02/Vector_Video_Standards8.jpeg screens]&lt;br /&gt;
&lt;br /&gt;
* 960x540 horizontal (540x960 vertical)&lt;br /&gt;
* 640x360&lt;br /&gt;
* 512x288 (288x512)&lt;br /&gt;
* 340x202&lt;br /&gt;
&lt;br /&gt;
* 360x240 3:2&lt;br /&gt;
* 720x480 3:2&lt;br /&gt;
&lt;br /&gt;
== video to frames ==&lt;br /&gt;
&lt;br /&gt;
  mkdir frames&lt;br /&gt;
  ffmpeg -i &amp;quot;%1&amp;quot; -r 1 frames/out-%03d.jpg&lt;br /&gt;
&lt;br /&gt;
== frames to video ==&lt;br /&gt;
&lt;br /&gt;
  ffmpeg -f image2 -i out-%03d.jpg tmp.avi&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Wget&amp;diff=3475</id>
		<title>Wget</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Wget&amp;diff=3475"/>
				<updated>2026-05-12T12:55:09Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
  wget --mirror --convert-links --adjust-extension --page-requisites --no-parent $domain&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Limit download scope ===&lt;br /&gt;
&lt;br /&gt;
-l 2 → only go 2 levels deep&lt;br /&gt;
&lt;br /&gt;
  wget -r -np -k -p -E -l 1 $domain&lt;br /&gt;
&lt;br /&gt;
=== other ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-r → recursive download (follows links)&lt;br /&gt;
-np → no parent (won’t go above the starting directory)&lt;br /&gt;
-k → convert links for local viewing&lt;br /&gt;
-p → download all page assets (images, CSS, etc.)&lt;br /&gt;
-E → save files with proper extensions (like .html)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  wget -r -np -k -p -E https://example.com&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal_Performance&amp;diff=3474</id>
		<title>Drupal Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal_Performance&amp;diff=3474"/>
				<updated>2026-05-08T02:00:05Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: /* changes I'm making */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Add these to settings.php:&lt;br /&gt;
&lt;br /&gt;
  $settings['cache']['bins']['render'] = 'cache.backend.database'&lt;br /&gt;
  $settings['cache']['bins']['dynamic_page_cache'] = 'cache.backend.database'&lt;br /&gt;
  $settings['cache']['bins']['page'] = 'cache.backend.database'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
reconfigure /etc/mysql/conf.d/docker.conf&lt;br /&gt;
&lt;br /&gt;
  [mysqld]&lt;br /&gt;
  # skip-host-cache&lt;br /&gt;
  # skip-name-resolve&lt;br /&gt;
  max_connections = 300&lt;br /&gt;
&lt;br /&gt;
= part IV =&lt;br /&gt;
&lt;br /&gt;
See how long the request takes:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  curl -o /dev/null -s \&lt;br /&gt;
    -w 'dns=%{time_namelookup} connect=%{time_connect} tls=%{time_appconnect} ttfb=%{time_starttransfer} total=%{time_total}\n' \&lt;br /&gt;
    https://piousbox.com/issues/2025q2-issue&lt;br /&gt;
&lt;br /&gt;
Add nginx log temporarily:&lt;br /&gt;
&lt;br /&gt;
  log_format timing '$remote_addr - $request '&lt;br /&gt;
                  'rt=$request_time '&lt;br /&gt;
                  'urt=$upstream_response_time '&lt;br /&gt;
                  'uht=$upstream_header_time '&lt;br /&gt;
                  'uct=$upstream_connect_time';&lt;br /&gt;
  #&lt;br /&gt;
  access_log /var/log/nginx/timing.log timing;&lt;br /&gt;
&lt;br /&gt;
Interpretation:&lt;br /&gt;
* high request_time + high upstream_*&lt;br /&gt;
**  → backend app is slow&lt;br /&gt;
* high request_time + no upstream times&lt;br /&gt;
**  → nginx/static filesystem issue&lt;br /&gt;
* high upstream_connect_time&lt;br /&gt;
**  → nginx struggling to reach upstream&lt;br /&gt;
* high upstream_header_time&lt;br /&gt;
**  → app slow before first byte&lt;br /&gt;
&lt;br /&gt;
For containerized Drupal, a 3–4 second first-hit delay is commonly one of:&lt;br /&gt;
* PHP-FPM worker cold start&lt;br /&gt;
* Drupal cache rebuild/bootstrap&lt;br /&gt;
* slow DB query&lt;br /&gt;
* uncached Twig/container compilation&lt;br /&gt;
* network latency to DB/Redis&lt;br /&gt;
* bind-mounted filesystem slowness&lt;br /&gt;
* OPCache not configured&lt;br /&gt;
* reverse DNS / external HTTP calls&lt;br /&gt;
&lt;br /&gt;
== check php cache ==&lt;br /&gt;
&lt;br /&gt;
  php -i | grep opcache&lt;br /&gt;
&lt;br /&gt;
== changes I'm making ==&lt;br /&gt;
&lt;br /&gt;
  opcache.validate_timestamps=0 # made no difference&lt;br /&gt;
  realpath_cache_ttl = 600&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal_Performance&amp;diff=3473</id>
		<title>Drupal Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal_Performance&amp;diff=3473"/>
				<updated>2026-05-08T01:59:05Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: /* changes I'm making */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Add these to settings.php:&lt;br /&gt;
&lt;br /&gt;
  $settings['cache']['bins']['render'] = 'cache.backend.database'&lt;br /&gt;
  $settings['cache']['bins']['dynamic_page_cache'] = 'cache.backend.database'&lt;br /&gt;
  $settings['cache']['bins']['page'] = 'cache.backend.database'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
reconfigure /etc/mysql/conf.d/docker.conf&lt;br /&gt;
&lt;br /&gt;
  [mysqld]&lt;br /&gt;
  # skip-host-cache&lt;br /&gt;
  # skip-name-resolve&lt;br /&gt;
  max_connections = 300&lt;br /&gt;
&lt;br /&gt;
= part IV =&lt;br /&gt;
&lt;br /&gt;
See how long the request takes:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  curl -o /dev/null -s \&lt;br /&gt;
    -w 'dns=%{time_namelookup} connect=%{time_connect} tls=%{time_appconnect} ttfb=%{time_starttransfer} total=%{time_total}\n' \&lt;br /&gt;
    https://piousbox.com/issues/2025q2-issue&lt;br /&gt;
&lt;br /&gt;
Add nginx log temporarily:&lt;br /&gt;
&lt;br /&gt;
  log_format timing '$remote_addr - $request '&lt;br /&gt;
                  'rt=$request_time '&lt;br /&gt;
                  'urt=$upstream_response_time '&lt;br /&gt;
                  'uht=$upstream_header_time '&lt;br /&gt;
                  'uct=$upstream_connect_time';&lt;br /&gt;
  #&lt;br /&gt;
  access_log /var/log/nginx/timing.log timing;&lt;br /&gt;
&lt;br /&gt;
Interpretation:&lt;br /&gt;
* high request_time + high upstream_*&lt;br /&gt;
**  → backend app is slow&lt;br /&gt;
* high request_time + no upstream times&lt;br /&gt;
**  → nginx/static filesystem issue&lt;br /&gt;
* high upstream_connect_time&lt;br /&gt;
**  → nginx struggling to reach upstream&lt;br /&gt;
* high upstream_header_time&lt;br /&gt;
**  → app slow before first byte&lt;br /&gt;
&lt;br /&gt;
For containerized Drupal, a 3–4 second first-hit delay is commonly one of:&lt;br /&gt;
* PHP-FPM worker cold start&lt;br /&gt;
* Drupal cache rebuild/bootstrap&lt;br /&gt;
* slow DB query&lt;br /&gt;
* uncached Twig/container compilation&lt;br /&gt;
* network latency to DB/Redis&lt;br /&gt;
* bind-mounted filesystem slowness&lt;br /&gt;
* OPCache not configured&lt;br /&gt;
* reverse DNS / external HTTP calls&lt;br /&gt;
&lt;br /&gt;
== check php cache ==&lt;br /&gt;
&lt;br /&gt;
  php -i | grep opcache&lt;br /&gt;
&lt;br /&gt;
== changes I'm making ==&lt;br /&gt;
&lt;br /&gt;
  opcache.validate_timestamps=0 # made no difference&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal_Performance&amp;diff=3472</id>
		<title>Drupal Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal_Performance&amp;diff=3472"/>
				<updated>2026-05-08T01:58:16Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: /* check php cache */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Add these to settings.php:&lt;br /&gt;
&lt;br /&gt;
  $settings['cache']['bins']['render'] = 'cache.backend.database'&lt;br /&gt;
  $settings['cache']['bins']['dynamic_page_cache'] = 'cache.backend.database'&lt;br /&gt;
  $settings['cache']['bins']['page'] = 'cache.backend.database'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
reconfigure /etc/mysql/conf.d/docker.conf&lt;br /&gt;
&lt;br /&gt;
  [mysqld]&lt;br /&gt;
  # skip-host-cache&lt;br /&gt;
  # skip-name-resolve&lt;br /&gt;
  max_connections = 300&lt;br /&gt;
&lt;br /&gt;
= part IV =&lt;br /&gt;
&lt;br /&gt;
See how long the request takes:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  curl -o /dev/null -s \&lt;br /&gt;
    -w 'dns=%{time_namelookup} connect=%{time_connect} tls=%{time_appconnect} ttfb=%{time_starttransfer} total=%{time_total}\n' \&lt;br /&gt;
    https://piousbox.com/issues/2025q2-issue&lt;br /&gt;
&lt;br /&gt;
Add nginx log temporarily:&lt;br /&gt;
&lt;br /&gt;
  log_format timing '$remote_addr - $request '&lt;br /&gt;
                  'rt=$request_time '&lt;br /&gt;
                  'urt=$upstream_response_time '&lt;br /&gt;
                  'uht=$upstream_header_time '&lt;br /&gt;
                  'uct=$upstream_connect_time';&lt;br /&gt;
  #&lt;br /&gt;
  access_log /var/log/nginx/timing.log timing;&lt;br /&gt;
&lt;br /&gt;
Interpretation:&lt;br /&gt;
* high request_time + high upstream_*&lt;br /&gt;
**  → backend app is slow&lt;br /&gt;
* high request_time + no upstream times&lt;br /&gt;
**  → nginx/static filesystem issue&lt;br /&gt;
* high upstream_connect_time&lt;br /&gt;
**  → nginx struggling to reach upstream&lt;br /&gt;
* high upstream_header_time&lt;br /&gt;
**  → app slow before first byte&lt;br /&gt;
&lt;br /&gt;
For containerized Drupal, a 3–4 second first-hit delay is commonly one of:&lt;br /&gt;
* PHP-FPM worker cold start&lt;br /&gt;
* Drupal cache rebuild/bootstrap&lt;br /&gt;
* slow DB query&lt;br /&gt;
* uncached Twig/container compilation&lt;br /&gt;
* network latency to DB/Redis&lt;br /&gt;
* bind-mounted filesystem slowness&lt;br /&gt;
* OPCache not configured&lt;br /&gt;
* reverse DNS / external HTTP calls&lt;br /&gt;
&lt;br /&gt;
== check php cache ==&lt;br /&gt;
&lt;br /&gt;
  php -i | grep opcache&lt;br /&gt;
&lt;br /&gt;
== changes I'm making ==&lt;br /&gt;
&lt;br /&gt;
  opcache.validate_timestamps=0&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal_Performance&amp;diff=3471</id>
		<title>Drupal Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal_Performance&amp;diff=3471"/>
				<updated>2026-05-08T01:53:15Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: /* part IV */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Add these to settings.php:&lt;br /&gt;
&lt;br /&gt;
  $settings['cache']['bins']['render'] = 'cache.backend.database'&lt;br /&gt;
  $settings['cache']['bins']['dynamic_page_cache'] = 'cache.backend.database'&lt;br /&gt;
  $settings['cache']['bins']['page'] = 'cache.backend.database'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
reconfigure /etc/mysql/conf.d/docker.conf&lt;br /&gt;
&lt;br /&gt;
  [mysqld]&lt;br /&gt;
  # skip-host-cache&lt;br /&gt;
  # skip-name-resolve&lt;br /&gt;
  max_connections = 300&lt;br /&gt;
&lt;br /&gt;
= part IV =&lt;br /&gt;
&lt;br /&gt;
See how long the request takes:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  curl -o /dev/null -s \&lt;br /&gt;
    -w 'dns=%{time_namelookup} connect=%{time_connect} tls=%{time_appconnect} ttfb=%{time_starttransfer} total=%{time_total}\n' \&lt;br /&gt;
    https://piousbox.com/issues/2025q2-issue&lt;br /&gt;
&lt;br /&gt;
Add nginx log temporarily:&lt;br /&gt;
&lt;br /&gt;
  log_format timing '$remote_addr - $request '&lt;br /&gt;
                  'rt=$request_time '&lt;br /&gt;
                  'urt=$upstream_response_time '&lt;br /&gt;
                  'uht=$upstream_header_time '&lt;br /&gt;
                  'uct=$upstream_connect_time';&lt;br /&gt;
  #&lt;br /&gt;
  access_log /var/log/nginx/timing.log timing;&lt;br /&gt;
&lt;br /&gt;
Interpretation:&lt;br /&gt;
* high request_time + high upstream_*&lt;br /&gt;
**  → backend app is slow&lt;br /&gt;
* high request_time + no upstream times&lt;br /&gt;
**  → nginx/static filesystem issue&lt;br /&gt;
* high upstream_connect_time&lt;br /&gt;
**  → nginx struggling to reach upstream&lt;br /&gt;
* high upstream_header_time&lt;br /&gt;
**  → app slow before first byte&lt;br /&gt;
&lt;br /&gt;
For containerized Drupal, a 3–4 second first-hit delay is commonly one of:&lt;br /&gt;
* PHP-FPM worker cold start&lt;br /&gt;
* Drupal cache rebuild/bootstrap&lt;br /&gt;
* slow DB query&lt;br /&gt;
* uncached Twig/container compilation&lt;br /&gt;
* network latency to DB/Redis&lt;br /&gt;
* bind-mounted filesystem slowness&lt;br /&gt;
* OPCache not configured&lt;br /&gt;
* reverse DNS / external HTTP calls&lt;br /&gt;
&lt;br /&gt;
== check php cache ==&lt;br /&gt;
&lt;br /&gt;
  php -i | grep opcache&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal_Performance&amp;diff=3470</id>
		<title>Drupal Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal_Performance&amp;diff=3470"/>
				<updated>2026-05-08T01:51:30Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: /* part IV */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Add these to settings.php:&lt;br /&gt;
&lt;br /&gt;
  $settings['cache']['bins']['render'] = 'cache.backend.database'&lt;br /&gt;
  $settings['cache']['bins']['dynamic_page_cache'] = 'cache.backend.database'&lt;br /&gt;
  $settings['cache']['bins']['page'] = 'cache.backend.database'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
reconfigure /etc/mysql/conf.d/docker.conf&lt;br /&gt;
&lt;br /&gt;
  [mysqld]&lt;br /&gt;
  # skip-host-cache&lt;br /&gt;
  # skip-name-resolve&lt;br /&gt;
  max_connections = 300&lt;br /&gt;
&lt;br /&gt;
= part IV =&lt;br /&gt;
&lt;br /&gt;
See how long the request takes:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  curl -o /dev/null -s \&lt;br /&gt;
    -w 'dns=%{time_namelookup} connect=%{time_connect} tls=%{time_appconnect} ttfb=%{time_starttransfer} total=%{time_total}\n' \&lt;br /&gt;
    https://piousbox.com/issues/2025q2-issue&lt;br /&gt;
&lt;br /&gt;
Add nginx log temporarily:&lt;br /&gt;
&lt;br /&gt;
  log_format timing '$remote_addr - $request '&lt;br /&gt;
                  'rt=$request_time '&lt;br /&gt;
                  'urt=$upstream_response_time '&lt;br /&gt;
                  'uht=$upstream_header_time '&lt;br /&gt;
                  'uct=$upstream_connect_time';&lt;br /&gt;
  #&lt;br /&gt;
  access_log /var/log/nginx/timing.log timing;&lt;br /&gt;
&lt;br /&gt;
Interpretation:&lt;br /&gt;
* high request_time + high upstream_*&lt;br /&gt;
**  → backend app is slow&lt;br /&gt;
* high request_time + no upstream times&lt;br /&gt;
**  → nginx/static filesystem issue&lt;br /&gt;
* high upstream_connect_time&lt;br /&gt;
**  → nginx struggling to reach upstream&lt;br /&gt;
* high upstream_header_time&lt;br /&gt;
**  → app slow before first byte&lt;br /&gt;
&lt;br /&gt;
For containerized Drupal, a 3–4 second first-hit delay is commonly one of:&lt;br /&gt;
* PHP-FPM worker cold start&lt;br /&gt;
* Drupal cache rebuild/bootstrap&lt;br /&gt;
* slow DB query&lt;br /&gt;
* uncached Twig/container compilation&lt;br /&gt;
* network latency to DB/Redis&lt;br /&gt;
* bind-mounted filesystem slowness&lt;br /&gt;
* OPCache not configured&lt;br /&gt;
* reverse DNS / external HTTP calls&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal_Performance&amp;diff=3469</id>
		<title>Drupal Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal_Performance&amp;diff=3469"/>
				<updated>2026-05-08T01:48:17Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: /* part IV */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Add these to settings.php:&lt;br /&gt;
&lt;br /&gt;
  $settings['cache']['bins']['render'] = 'cache.backend.database'&lt;br /&gt;
  $settings['cache']['bins']['dynamic_page_cache'] = 'cache.backend.database'&lt;br /&gt;
  $settings['cache']['bins']['page'] = 'cache.backend.database'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
reconfigure /etc/mysql/conf.d/docker.conf&lt;br /&gt;
&lt;br /&gt;
  [mysqld]&lt;br /&gt;
  # skip-host-cache&lt;br /&gt;
  # skip-name-resolve&lt;br /&gt;
  max_connections = 300&lt;br /&gt;
&lt;br /&gt;
= part IV =&lt;br /&gt;
&lt;br /&gt;
See how long the request takes:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  curl -o /dev/null -s \&lt;br /&gt;
    -w 'dns=%{time_namelookup} connect=%{time_connect} tls=%{time_appconnect} ttfb=%{time_starttransfer} total=%{time_total}\n' \&lt;br /&gt;
    https://piousbox.com/issues/2025q2-issue&lt;br /&gt;
&lt;br /&gt;
Add nginx log temporarily:&lt;br /&gt;
&lt;br /&gt;
  log_format timing '$remote_addr - $request '&lt;br /&gt;
                  'rt=$request_time '&lt;br /&gt;
                  'urt=$upstream_response_time '&lt;br /&gt;
                  'uht=$upstream_header_time '&lt;br /&gt;
                  'uct=$upstream_connect_time';&lt;br /&gt;
  #&lt;br /&gt;
  access_log /var/log/nginx/timing.log timing;&lt;br /&gt;
&lt;br /&gt;
Interpretation:&lt;br /&gt;
* high request_time + high upstream_*&lt;br /&gt;
**  → backend app is slow&lt;br /&gt;
* high request_time + no upstream times&lt;br /&gt;
**  → nginx/static filesystem issue&lt;br /&gt;
* high upstream_connect_time&lt;br /&gt;
**  → nginx struggling to reach upstream&lt;br /&gt;
* high upstream_header_time&lt;br /&gt;
**  → app slow before first byte&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal_Performance&amp;diff=3468</id>
		<title>Drupal Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal_Performance&amp;diff=3468"/>
				<updated>2026-05-08T01:48:01Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: /* part IV */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Add these to settings.php:&lt;br /&gt;
&lt;br /&gt;
  $settings['cache']['bins']['render'] = 'cache.backend.database'&lt;br /&gt;
  $settings['cache']['bins']['dynamic_page_cache'] = 'cache.backend.database'&lt;br /&gt;
  $settings['cache']['bins']['page'] = 'cache.backend.database'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
reconfigure /etc/mysql/conf.d/docker.conf&lt;br /&gt;
&lt;br /&gt;
  [mysqld]&lt;br /&gt;
  # skip-host-cache&lt;br /&gt;
  # skip-name-resolve&lt;br /&gt;
  max_connections = 300&lt;br /&gt;
&lt;br /&gt;
= part IV =&lt;br /&gt;
&lt;br /&gt;
See how long the request takes:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  curl -o /dev/null -s \&lt;br /&gt;
    -w 'dns=%{time_namelookup} connect=%{time_connect} tls=%{time_appconnect} ttfb=%{time_starttransfer} total=%{time_total}\n' \&lt;br /&gt;
    https://piousbox.com/issues/2025q2-issue&lt;br /&gt;
&lt;br /&gt;
Add nginx log temporarily:&lt;br /&gt;
&lt;br /&gt;
  log_format timing '$remote_addr - $request '&lt;br /&gt;
                  'rt=$request_time '&lt;br /&gt;
                  'urt=$upstream_response_time '&lt;br /&gt;
                  'uht=$upstream_header_time '&lt;br /&gt;
                  'uct=$upstream_connect_time';&lt;br /&gt;
  #&lt;br /&gt;
  access_log /var/log/nginx/timing.log timing;&lt;br /&gt;
&lt;br /&gt;
Interpretation:&lt;br /&gt;
* high request_time + high upstream_*&lt;br /&gt;
  → backend app is slow&lt;br /&gt;
* high request_time + no upstream times&lt;br /&gt;
  → nginx/static filesystem issue&lt;br /&gt;
* high upstream_connect_time&lt;br /&gt;
  → nginx struggling to reach upstream&lt;br /&gt;
* high upstream_header_time&lt;br /&gt;
  → app slow before first byte&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal_Performance&amp;diff=3467</id>
		<title>Drupal Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal_Performance&amp;diff=3467"/>
				<updated>2026-05-08T01:44:59Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: /* part IV */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Add these to settings.php:&lt;br /&gt;
&lt;br /&gt;
  $settings['cache']['bins']['render'] = 'cache.backend.database'&lt;br /&gt;
  $settings['cache']['bins']['dynamic_page_cache'] = 'cache.backend.database'&lt;br /&gt;
  $settings['cache']['bins']['page'] = 'cache.backend.database'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
reconfigure /etc/mysql/conf.d/docker.conf&lt;br /&gt;
&lt;br /&gt;
  [mysqld]&lt;br /&gt;
  # skip-host-cache&lt;br /&gt;
  # skip-name-resolve&lt;br /&gt;
  max_connections = 300&lt;br /&gt;
&lt;br /&gt;
= part IV =&lt;br /&gt;
&lt;br /&gt;
See how long the request takes:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  curl -o /dev/null -s \&lt;br /&gt;
    -w 'dns=%{time_namelookup} connect=%{time_connect} tls=%{time_appconnect} ttfb=%{time_starttransfer} total=%{time_total}\n' \&lt;br /&gt;
    https://piousbox.com/issues/2025q2-issue&lt;br /&gt;
&lt;br /&gt;
Add nginx log temporarily:&lt;br /&gt;
&lt;br /&gt;
  log_format timing '$remote_addr - $request '&lt;br /&gt;
                  'rt=$request_time '&lt;br /&gt;
                  'urt=$upstream_response_time '&lt;br /&gt;
                  'uht=$upstream_header_time '&lt;br /&gt;
                  'uct=$upstream_connect_time';&lt;br /&gt;
  #&lt;br /&gt;
  access_log /var/log/nginx/timing.log timing;&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal_Performance&amp;diff=3466</id>
		<title>Drupal Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal_Performance&amp;diff=3466"/>
				<updated>2026-05-08T01:41:31Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Add these to settings.php:&lt;br /&gt;
&lt;br /&gt;
  $settings['cache']['bins']['render'] = 'cache.backend.database'&lt;br /&gt;
  $settings['cache']['bins']['dynamic_page_cache'] = 'cache.backend.database'&lt;br /&gt;
  $settings['cache']['bins']['page'] = 'cache.backend.database'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
reconfigure /etc/mysql/conf.d/docker.conf&lt;br /&gt;
&lt;br /&gt;
  [mysqld]&lt;br /&gt;
  # skip-host-cache&lt;br /&gt;
  # skip-name-resolve&lt;br /&gt;
  max_connections = 300&lt;br /&gt;
&lt;br /&gt;
= part IV =&lt;br /&gt;
&lt;br /&gt;
  curl -o /dev/null -s \&lt;br /&gt;
    -w 'dns=%{time_namelookup} connect=%{time_connect} tls=%{time_appconnect} ttfb=%{time_starttransfer} total=%{time_total}\n' \&lt;br /&gt;
    https://piousbox.com/issues/2025q2-issue&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3465</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3465"/>
				<updated>2026-05-05T17:33:47Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* A great book: https://drupalatyourfingertips.com&lt;br /&gt;
* How to clear cache: /devel/cache/clear&lt;br /&gt;
* [[ Drupal Performance ]]&lt;br /&gt;
&lt;br /&gt;
= Install &amp;amp; Configure =&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:9.5.10 html&lt;br /&gt;
&lt;br /&gt;
  COMPOSER_PROCESS_TIMEOUT=2000 composer install&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:10.6.7 html&lt;br /&gt;
  composer update &amp;quot;drupal/core-*&amp;quot; --with-all-dependencies&lt;br /&gt;
  composer require drupal/core-recommended:10.6.7 drupal/core-composer-scaffold:10.6.7 drupal/core-project-message:10.6.7 --update-with-all-dependencies&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  composer require drupal/openid_connect:^1.0&lt;br /&gt;
  drush cr&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/devel:^5.1'&lt;br /&gt;
  composer require 'drupal/s3fs:^3.3'&lt;br /&gt;
  # composer require 'wasya-co/consent_popup: 1.0.4.x-dev'&lt;br /&gt;
  composer require 'drupal/consent_popup:^1.0'&lt;br /&gt;
  composer require 'drush/drush:^11.6'&lt;br /&gt;
  composer require 'drupal/metatag:^2.0'&lt;br /&gt;
  composer require 'drupal/redirect:^1.9'&lt;br /&gt;
  composer require 'drupal/superfish:^1.6'&lt;br /&gt;
  composer require 'drupal/webform:^6.0'&lt;br /&gt;
  composer require 'drupal/captcha:^1.14'&lt;br /&gt;
  composer require 'drupal/typed_data:^1.0@alpha'&lt;br /&gt;
  composer require 'drupal/rules:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smtp:^1.2'&lt;br /&gt;
  composer require 'drupal/hal:^1.0'&lt;br /&gt;
  composer require 'drupal/restui:^1.21'&lt;br /&gt;
  composer require 'drupal/keycloak:^2.2@beta'&lt;br /&gt;
  composer require 'drupal/nodeaccess:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/email_registration:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/content_access:^2.0'&lt;br /&gt;
  composer require 'drupal/social_media:^2.0'&lt;br /&gt;
  composer require 'drupal/wordpress_migrate:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/codefilter:^2.0'&lt;br /&gt;
  composer require 'drupal/views_taxonomy_term_name_depth:^7.2'&lt;br /&gt;
  composer require 'drupal/pathauto:^1.12'&lt;br /&gt;
  composer require 'drupal/twig_tweak:^3.3'&lt;br /&gt;
  composer require 'drupal/simplenews:^4.0'&lt;br /&gt;
  composer require 'drupal/ctools:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/commerce:^2.40' ## drupal 9.5&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    apt install php-bcmath php8.1-bcmath&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^1.1'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/commerce:^3.3'  ## drupal 10&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^2.2'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/linkit:^6.0'&lt;br /&gt;
  composer require 'drupal/redirect_after_login:^3.0'&lt;br /&gt;
  composer require 'drupal/symfony_mailer:^1.4'&lt;br /&gt;
  composer require 'drupal/custom_search:^1.0@beta'&lt;br /&gt;
  composer require 'drupal/fullcalendar_view:^5.2' &lt;br /&gt;
  composer require 'drupal/date_recur:^3.3@RC'&lt;br /&gt;
  composer require 'drupal/date_recur_modular:^3.1'&lt;br /&gt;
  composer require 'drupal/colorbox:2.0.2'&lt;br /&gt;
  composer require 'drupal/tagclouds:^2.0'&lt;br /&gt;
  composer require 'drupal/filelog:^3.0'&lt;br /&gt;
  composer require 'drupal/message:^1.6'&lt;br /&gt;
  composer require 'drupal/flag:^4.0@beta'&lt;br /&gt;
  composer require 'drupal/message_subscribe:^1.4'&lt;br /&gt;
  composer require 'drupal/message_digest:^1.5'&lt;br /&gt;
  composer require 'drupal/message_ui:^1.3'&lt;br /&gt;
  composer require 'drupal/layout_builder_usage_reports:^1.0'&lt;br /&gt;
  composer require 'drupal/views_tree:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/vote_up_down:^1.0@alpha'&lt;br /&gt;
    composer require 'drupal/votingapi:^3.0@beta' ## need the explicit version here&lt;br /&gt;
  composer require 'drupal/formblock:^2.0@beta'&lt;br /&gt;
  composer require 'drupal/views_pdf:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/field_permissions:^1.4'&lt;br /&gt;
  composer require 'drupal/scheduler:^2.2'&lt;br /&gt;
  composer require 'drupal/simplenews_scheduler:^4.0@alpha'&lt;br /&gt;
  composer require 'drupal/insert_view:^2.1'&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  composer require 'drupal/keycloak:^1.8'&lt;br /&gt;
  composer require 'drupal/simple_oauth:^5.2'&lt;br /&gt;
  composer require 'drupal/group:^1.6'&lt;br /&gt;
    composer require 'drupal/group_join_link:^1.0'&lt;br /&gt;
  composer require 'drupal/social_auth:^4.1'&lt;br /&gt;
    composer require 'drupal/social_auth_google:^4.0' &lt;br /&gt;
    composer require 'drupal/social_auth_facebook:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_linkedin:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_microsoft:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/twilio:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smssystem:^1.1'&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require 'drupal/smsframework:^2.3'&lt;br /&gt;
  composer require symfony/dom-crawler symfony/css-selector&lt;br /&gt;
  composer require drupal/markdown&lt;br /&gt;
  composer require drupal/markdown_easy&lt;br /&gt;
  composer require 'drupal/crm_core:3.x-dev@dev'&lt;br /&gt;
  composer require 'drupal/name:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/dynamic_entity_reference:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/default_content:^2.0@beta'&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
  composer require 'drupal/single_content_sync:^1.4' ## yep its this one&lt;br /&gt;
  # composer require drupal/views_show_more ## I don't use it?&lt;br /&gt;
  composer require 'drupal/matomo:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/paragraphs:^1.20'&lt;br /&gt;
    composer require drupal/search_api_db&lt;br /&gt;
    composer require drupal/search_api&lt;br /&gt;
    composer require 'drupal/entity_usage:^2.0@beta'&lt;br /&gt;
    composer require drupal/entity_browser&lt;br /&gt;
    composer require drupal/svg_image_field&lt;br /&gt;
  composer require 'drupal/admin_toolbar:^3.6'&lt;br /&gt;
&lt;br /&gt;
== evaluating ==&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/seo_checklist:^5.2'&lt;br /&gt;
  composer require 'drupal/yoast_seo:^1.9'&lt;br /&gt;
  composer require 'drupal/tvi:^2.0' ## From: https://www.drupal.org/project/tvi&lt;br /&gt;
  composer require 'drupal/advanced_text_formatter:^3.0@RC'&lt;br /&gt;
  composer require 'drupal/token_filter:^2.1'&lt;br /&gt;
  composer require 'drupal/form_mode_control:^2.4'&lt;br /&gt;
  composer require 'drupal/queue_mail:^1.7'&lt;br /&gt;
  composer require 'drupal/googlelogin-googlelogin:^9.5'&lt;br /&gt;
  composer require 'drupal/dark_mode_toggle:^1.0'&lt;br /&gt;
  composer require 'drupal/imce:^3.1'&lt;br /&gt;
  composer require 'drupal/bootstrap_barrio:^5.5'&lt;br /&gt;
&lt;br /&gt;
== not gonna use ==&lt;br /&gt;
  composer require 'drupal/backup_migrate:^5.1' ## was 5.0 ## so-so, unused&lt;br /&gt;
  composer require 'drupal/migrate_tools:^6.0' ## unused&lt;br /&gt;
  # composer require 'drupal/migrate_plus:^6.0' ## didn't need it the second time&lt;br /&gt;
&lt;br /&gt;
Not gonna use ebt_core, because (1) they have way too many modules, it should have been just one, and (2) their &amp;quot;hero&amp;quot; module doesn't honor container and isn't a hero.&lt;br /&gt;
&lt;br /&gt;
  # composer require 'drupal/layout_library:^1.0@beta' ## looks poor, just use blocks&lt;br /&gt;
  # composer require 'drupal/section_library:^2.0' ## looks poor, just use blocks&lt;br /&gt;
&lt;br /&gt;
== Upgrade 9 to 10 ==&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require drupal/core-recommended:^10 drupal/core-composer-scaffold:^10 drupal/core-project-message:^10 --update-with-all-dependencies&lt;br /&gt;
    composer require drupal/core-recommended:10.6.7 drupal/core-composer-scaffold drupal/core-project-message -W&lt;br /&gt;
    composer require drupal/typed_data:^2.0 -W&lt;br /&gt;
&lt;br /&gt;
  composer update --with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
== Setting up dev environment ==&lt;br /&gt;
&lt;br /&gt;
* From: https://github.com/composer/composer/issues/9393&lt;br /&gt;
* From: https://www.drupal.org/docs/develop/automated-testing&lt;br /&gt;
* probably not useful: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/creating-functional-tests-simulated-browser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require --dev --no-update symfony/filesystem:4.4.42&lt;br /&gt;
  composer require --dev drupal/core-dev:9.5.11 --with-all-dependencies&lt;br /&gt;
    composer require --dev behat/mink jcalderonzumba/mink-phantomjs-driver&lt;br /&gt;
    composer update -W&lt;br /&gt;
    composer update symfony/filesystem:4.4.42 drush/drush -W&lt;br /&gt;
    composer require --dev drupal/core-dev -W&lt;br /&gt;
    composer require --dev phpspec/prophecy-phpunit:^2&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
Not useful:&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/examples:^4.0'&lt;br /&gt;
&lt;br /&gt;
== Configure s3fs ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,&lt;br /&gt;
    &amp;quot;Statement&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement0&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:ListBucket&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:ListBucketVersions&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement1&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:PutObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectAcl&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:PutObjectAcl&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;/*&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Disable caching ==&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/development-tools/disable-caching&lt;br /&gt;
&lt;br /&gt;
* Add the settings.local.php and&lt;br /&gt;
* Modify development.services.yml:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parameters:&lt;br /&gt;
  http.response.debug_cacheability_headers: true&lt;br /&gt;
  twig.config:&lt;br /&gt;
    debug: true&lt;br /&gt;
    auto_reload: true&lt;br /&gt;
    cache: false&lt;br /&gt;
services:&lt;br /&gt;
  cache.backend.null:&lt;br /&gt;
    class: Drupal\Core\Cache\NullBackendFactory&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== cleanup template debug ==&lt;br /&gt;
&lt;br /&gt;
Use in twig:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  |preg_replace('/&amp;lt;!--.*?--&amp;gt;/s','')|striptags|replace({&amp;quot;\n&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\r&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\t&amp;quot;:&amp;quot;&amp;quot;})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ReST ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
curl --include \&lt;br /&gt;
  --request POST \&lt;br /&gt;
  --user admin:&amp;lt;&amp;gt; \&lt;br /&gt;
  --header 'Content-type: application/hal+json' \&lt;br /&gt;
  http://pi.local/node?_format=hal_json \&lt;br /&gt;
  --data-binary '{&lt;br /&gt;
    &amp;quot;_links&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;http://pi.local/rest/type/node/article&amp;quot;}&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;title&amp;quot;:[{&amp;quot;value&amp;quot;:&amp;quot;Node +++ 123 bac +++&amp;quot; }],&lt;br /&gt;
    &amp;quot;body&amp;quot;:[{&amp;quot;value&amp;quot;: &amp;quot;&amp;lt;b&amp;gt;hello, wor&amp;lt;/b&amp;gt;ld!&amp;quot;, &amp;quot;format&amp;quot;: &amp;quot;full_html&amp;quot; }],&lt;br /&gt;
    &amp;quot;type&amp;quot;:[{&amp;quot;target_id&amp;quot;:&amp;quot;article&amp;quot;}],&lt;br /&gt;
    &amp;quot;status&amp;quot;: [{&amp;quot;value&amp;quot;: 1}],&lt;br /&gt;
    &amp;quot;_embedded&amp;quot;: {&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_issue&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;56229a95-d675-43e1-99b1-f9e11b5579c5&amp;quot; }] }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_tags&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;45646a7d-1a16-42e8-b758-f6e1c8d976f7&amp;quot; }] },&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;834e34e2-05ae-498d-b876-453798872ce1&amp;quot; }] }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  }'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Default Attachments ==&lt;br /&gt;
  txt pdf doc docx html csv xlsx xlsm sh json svg&lt;br /&gt;
  cer pem pub key kdbx&lt;br /&gt;
  png jpg jpeg gif&lt;br /&gt;
  mkv sfv avi mp3 mp4 webm mov&lt;br /&gt;
  zip tar gz&lt;br /&gt;
&lt;br /&gt;
== set password ==&lt;br /&gt;
&lt;br /&gt;
 drush user:password USERNAME NEW_PASSWORD&lt;br /&gt;
&lt;br /&gt;
== change ownership ==&lt;br /&gt;
&lt;br /&gt;
of all simplenews_issue &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval &amp;quot;&lt;br /&gt;
\$nids = \Drupal::entityQuery('node')&lt;br /&gt;
  -&amp;gt;condition('type', 'simplenews_issue')&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
\$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage('node');&lt;br /&gt;
\$nodes = \$storage-&amp;gt;loadMultiple(\$nids);&lt;br /&gt;
&lt;br /&gt;
foreach (\$nodes as \$node) {&lt;br /&gt;
  \$node-&amp;gt;setOwnerId(252);&lt;br /&gt;
  \$node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
of all content with &amp;quot;generated&amp;quot; in title:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval '&lt;br /&gt;
$nids = \Drupal::entityQuery(&amp;quot;node&amp;quot;)&lt;br /&gt;
  -&amp;gt;condition(&amp;quot;title&amp;quot;, &amp;quot;%enerated%&amp;quot;, &amp;quot;LIKE&amp;quot;)&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage(&amp;quot;node&amp;quot;);&lt;br /&gt;
$nodes = $storage-&amp;gt;loadMultiple($nids);&lt;br /&gt;
&lt;br /&gt;
foreach ($nodes as $node) {&lt;br /&gt;
  $node-&amp;gt;setOwnerId(129);&lt;br /&gt;
  $node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Updated &amp;quot; . count($nodes) . &amp;quot; nodes\n&amp;quot;;&lt;br /&gt;
'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Testing =&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/running-phpunit-tests&lt;br /&gt;
&lt;br /&gt;
For me, in my drupal images and containers, drupal is installed in the following folder, which is also my workdir:&lt;br /&gt;
&lt;br /&gt;
  WORKDIR /var/www/html&lt;br /&gt;
&lt;br /&gt;
The below is optional, I call the specific phpunit executable every time:&lt;br /&gt;
&lt;br /&gt;
  export PATH=&amp;quot;$PATH:/var/www/html/vendor/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You need to change minimum stability to &amp;quot;dev&amp;quot; for the testing libraries to be loaded.&lt;br /&gt;
&lt;br /&gt;
DO NOT RUN THIS IN PRODUCTION!&lt;br /&gt;
&lt;br /&gt;
  composer require --dev phpunit/phpunit # trash&lt;br /&gt;
    composer require --dev phpunit/phpunit:^9.5 --with-all-dependencies&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
    composer require --dev drupal/core-dev --update-with-all-dependencies # trash&lt;br /&gt;
  composer require --dev behat/mink:1.8.0 --with-all-dependencies&lt;br /&gt;
  composer require --dev symfony/phpunit-bridge&lt;br /&gt;
  composer require --dev phpspec/prophecy-phpunit&lt;br /&gt;
  composer require --dev behat/mink-browserkit-driver&lt;br /&gt;
&lt;br /&gt;
Copy and configure phpunit.xml:&lt;br /&gt;
&lt;br /&gt;
  phpunit --testsuite unit --filter CurrentUserBlock # trash?&lt;br /&gt;
  cd /var/www/html&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php -v --debug&lt;br /&gt;
&lt;br /&gt;
= update =&lt;br /&gt;
== 10 to 10 ==&lt;br /&gt;
  composer require \&lt;br /&gt;
  drupal/core-recommended:10.6.7 \&lt;br /&gt;
  drupal/core-composer-scaffold:10.6.7 \&lt;br /&gt;
  drupal/core-project-message:10.6.7 \&lt;br /&gt;
  --update-with-all-dependencies&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal_Performance&amp;diff=3464</id>
		<title>Drupal Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal_Performance&amp;diff=3464"/>
				<updated>2026-05-02T21:28:33Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Add these to settings.php:&lt;br /&gt;
&lt;br /&gt;
  $settings['cache']['bins']['render'] = 'cache.backend.database'&lt;br /&gt;
  $settings['cache']['bins']['dynamic_page_cache'] = 'cache.backend.database'&lt;br /&gt;
  $settings['cache']['bins']['page'] = 'cache.backend.database'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
reconfigure /etc/mysql/conf.d/docker.conf&lt;br /&gt;
&lt;br /&gt;
  [mysqld]&lt;br /&gt;
  # skip-host-cache&lt;br /&gt;
  # skip-name-resolve&lt;br /&gt;
  max_connections = 300&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal_Performance&amp;diff=3463</id>
		<title>Drupal Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal_Performance&amp;diff=3463"/>
				<updated>2026-05-02T21:19:08Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: Created page with &amp;quot; Add these to settings.php:    $settings['cache']['bins']['render'] = 'cache.backend.database'   $settings['cache']['bins']['dynamic_page_cache'] = 'cache.backend.database'...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Add these to settings.php:&lt;br /&gt;
&lt;br /&gt;
  $settings['cache']['bins']['render'] = 'cache.backend.database'&lt;br /&gt;
  $settings['cache']['bins']['dynamic_page_cache'] = 'cache.backend.database'&lt;br /&gt;
  $settings['cache']['bins']['page'] = 'cache.backend.database'&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3462</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3462"/>
				<updated>2026-05-02T21:18:52Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* A great book: https://drupalatyourfingertips.com&lt;br /&gt;
* How to clear cache: /devel/cache/clear&lt;br /&gt;
* [[ Drupal Performance ]]&lt;br /&gt;
&lt;br /&gt;
= Install &amp;amp; Configure =&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:9.5.10 html&lt;br /&gt;
&lt;br /&gt;
  COMPOSER_PROCESS_TIMEOUT=2000 composer install&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:10.6.7 html&lt;br /&gt;
  composer update &amp;quot;drupal/core-*&amp;quot; --with-all-dependencies&lt;br /&gt;
  composer require drupal/core-recommended:10.6.7 drupal/core-composer-scaffold:10.6.7 drupal/core-project-message:10.6.7 --update-with-all-dependencies&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  composer require drupal/openid_connect:^1.0&lt;br /&gt;
  drush cr&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/devel:^5.1'&lt;br /&gt;
  composer require 'drupal/s3fs:^3.3'&lt;br /&gt;
  # composer require 'wasya-co/consent_popup: 1.0.4.x-dev'&lt;br /&gt;
  composer require 'drupal/consent_popup:^1.0'&lt;br /&gt;
  composer require 'drush/drush:^11.6'&lt;br /&gt;
  composer require 'drupal/metatag:^2.0'&lt;br /&gt;
  composer require 'drupal/redirect:^1.9'&lt;br /&gt;
  composer require 'drupal/superfish:^1.6'&lt;br /&gt;
  composer require 'drupal/webform:^6.0'&lt;br /&gt;
  composer require 'drupal/captcha:^1.14'&lt;br /&gt;
  composer require 'drupal/typed_data:^1.0@alpha'&lt;br /&gt;
  composer require 'drupal/rules:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smtp:^1.2'&lt;br /&gt;
  composer require 'drupal/hal:^1.0'&lt;br /&gt;
  composer require 'drupal/restui:^1.21'&lt;br /&gt;
  composer require 'drupal/keycloak:^2.2@beta'&lt;br /&gt;
  composer require 'drupal/nodeaccess:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/email_registration:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/content_access:^2.0'&lt;br /&gt;
  composer require 'drupal/social_media:^2.0'&lt;br /&gt;
  composer require 'drupal/wordpress_migrate:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/codefilter:^2.0'&lt;br /&gt;
  composer require 'drupal/views_taxonomy_term_name_depth:^7.2'&lt;br /&gt;
  composer require 'drupal/pathauto:^1.12'&lt;br /&gt;
  composer require 'drupal/twig_tweak:^3.3'&lt;br /&gt;
  composer require 'drupal/simplenews:^4.0'&lt;br /&gt;
  composer require 'drupal/ctools:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/commerce:^2.40' ## drupal 9.5&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    apt install php-bcmath php8.1-bcmath&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^1.1'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/commerce:^3.3'  ## drupal 10&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^2.2'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/linkit:^6.0'&lt;br /&gt;
  composer require 'drupal/redirect_after_login:^3.0'&lt;br /&gt;
  composer require 'drupal/symfony_mailer:^1.4'&lt;br /&gt;
  composer require 'drupal/custom_search:^1.0@beta'&lt;br /&gt;
  composer require 'drupal/fullcalendar_view:^5.2' &lt;br /&gt;
  composer require 'drupal/date_recur:^3.3@RC'&lt;br /&gt;
  composer require 'drupal/date_recur_modular:^3.1'&lt;br /&gt;
  composer require 'drupal/colorbox:2.0.2'&lt;br /&gt;
  composer require 'drupal/tagclouds:^2.0'&lt;br /&gt;
  composer require 'drupal/filelog:^3.0'&lt;br /&gt;
  composer require 'drupal/message:^1.6'&lt;br /&gt;
  composer require 'drupal/flag:^4.0@beta'&lt;br /&gt;
  composer require 'drupal/message_subscribe:^1.4'&lt;br /&gt;
  composer require 'drupal/message_digest:^1.5'&lt;br /&gt;
  composer require 'drupal/message_ui:^1.3'&lt;br /&gt;
  composer require 'drupal/layout_builder_usage_reports:^1.0'&lt;br /&gt;
  composer require 'drupal/views_tree:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/vote_up_down:^1.0@alpha'&lt;br /&gt;
    composer require 'drupal/votingapi:^3.0@beta'&lt;br /&gt;
  composer require 'drupal/formblock:^2.0@beta'&lt;br /&gt;
  composer require 'drupal/views_pdf:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/field_permissions:^1.4'&lt;br /&gt;
  composer require 'drupal/scheduler:^2.2'&lt;br /&gt;
  composer require 'drupal/simplenews_scheduler:^4.0@alpha'&lt;br /&gt;
  composer require 'drupal/insert_view:^2.1'&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  composer require 'drupal/keycloak:^1.8'&lt;br /&gt;
  composer require 'drupal/simple_oauth:^5.2'&lt;br /&gt;
  composer require 'drupal/group:^1.6'&lt;br /&gt;
    composer require 'drupal/group_join_link:^1.0'&lt;br /&gt;
  composer require 'drupal/social_auth:^4.1'&lt;br /&gt;
    composer require 'drupal/social_auth_google:^4.0' &lt;br /&gt;
    composer require 'drupal/social_auth_facebook:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_linkedin:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_microsoft:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/twilio:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smssystem:^1.1'&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require 'drupal/smsframework:^2.3'&lt;br /&gt;
  composer require symfony/dom-crawler symfony/css-selector&lt;br /&gt;
  composer require drupal/markdown&lt;br /&gt;
  composer require drupal/markdown_easy&lt;br /&gt;
  composer require 'drupal/crm_core:3.x-dev@dev'&lt;br /&gt;
  composer require 'drupal/name:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/dynamic_entity_reference:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/default_content:^2.0@beta'&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
  composer require 'drupal/single_content_sync:^1.4' ## yep its this one&lt;br /&gt;
  # composer require drupal/views_show_more ## I don't use it?&lt;br /&gt;
  composer require 'drupal/matomo:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/paragraphs:^1.20'&lt;br /&gt;
    composer require drupal/search_api_db&lt;br /&gt;
    composer require drupal/search_api&lt;br /&gt;
    composer require 'drupal/entity_usage:^2.0@beta'&lt;br /&gt;
    composer require drupal/entity_browser&lt;br /&gt;
    composer require drupal/svg_image_field&lt;br /&gt;
  composer require 'drupal/admin_toolbar:^3.6'&lt;br /&gt;
&lt;br /&gt;
== evaluating ==&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/seo_checklist:^5.2'&lt;br /&gt;
  composer require 'drupal/yoast_seo:^1.9'&lt;br /&gt;
  composer require 'drupal/tvi:^2.0' ## From: https://www.drupal.org/project/tvi&lt;br /&gt;
  composer require 'drupal/advanced_text_formatter:^3.0@RC'&lt;br /&gt;
  composer require 'drupal/token_filter:^2.1'&lt;br /&gt;
  composer require 'drupal/form_mode_control:^2.4'&lt;br /&gt;
  composer require 'drupal/queue_mail:^1.7'&lt;br /&gt;
  composer require 'drupal/googlelogin-googlelogin:^9.5'&lt;br /&gt;
  composer require 'drupal/dark_mode_toggle:^1.0'&lt;br /&gt;
  composer require 'drupal/imce:^3.1'&lt;br /&gt;
  composer require 'drupal/bootstrap_barrio:^5.5'&lt;br /&gt;
&lt;br /&gt;
== not gonna use ==&lt;br /&gt;
  composer require 'drupal/backup_migrate:^5.1' ## was 5.0 ## so-so, unused&lt;br /&gt;
  composer require 'drupal/migrate_tools:^6.0' ## unused&lt;br /&gt;
  # composer require 'drupal/migrate_plus:^6.0' ## didn't need it the second time&lt;br /&gt;
&lt;br /&gt;
Not gonna use ebt_core, because (1) they have way too many modules, it should have been just one, and (2) their &amp;quot;hero&amp;quot; module doesn't honor container and isn't a hero.&lt;br /&gt;
&lt;br /&gt;
  # composer require 'drupal/layout_library:^1.0@beta' ## looks poor, just use blocks&lt;br /&gt;
  # composer require 'drupal/section_library:^2.0' ## looks poor, just use blocks&lt;br /&gt;
&lt;br /&gt;
== Upgrade 9 to 10 ==&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require drupal/core-recommended:^10 drupal/core-composer-scaffold:^10 drupal/core-project-message:^10 --update-with-all-dependencies&lt;br /&gt;
    composer require drupal/core-recommended:10.6.7 drupal/core-composer-scaffold drupal/core-project-message -W&lt;br /&gt;
    composer require drupal/typed_data:^2.0 -W&lt;br /&gt;
&lt;br /&gt;
  composer update --with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
== Setting up dev environment ==&lt;br /&gt;
&lt;br /&gt;
* From: https://github.com/composer/composer/issues/9393&lt;br /&gt;
* From: https://www.drupal.org/docs/develop/automated-testing&lt;br /&gt;
* probably not useful: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/creating-functional-tests-simulated-browser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require --dev --no-update symfony/filesystem:4.4.42&lt;br /&gt;
  composer require --dev drupal/core-dev:9.5.11 --with-all-dependencies&lt;br /&gt;
    composer require --dev behat/mink jcalderonzumba/mink-phantomjs-driver&lt;br /&gt;
    composer update -W&lt;br /&gt;
    composer update symfony/filesystem:4.4.42 drush/drush -W&lt;br /&gt;
    composer require --dev drupal/core-dev -W&lt;br /&gt;
    composer require --dev phpspec/prophecy-phpunit:^2&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
Not useful:&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/examples:^4.0'&lt;br /&gt;
&lt;br /&gt;
== Configure s3fs ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,&lt;br /&gt;
    &amp;quot;Statement&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement0&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:ListBucket&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:ListBucketVersions&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement1&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:PutObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectAcl&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:PutObjectAcl&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;/*&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Disable caching ==&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/development-tools/disable-caching&lt;br /&gt;
&lt;br /&gt;
* Add the settings.local.php and&lt;br /&gt;
* Modify development.services.yml:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parameters:&lt;br /&gt;
  http.response.debug_cacheability_headers: true&lt;br /&gt;
  twig.config:&lt;br /&gt;
    debug: true&lt;br /&gt;
    auto_reload: true&lt;br /&gt;
    cache: false&lt;br /&gt;
services:&lt;br /&gt;
  cache.backend.null:&lt;br /&gt;
    class: Drupal\Core\Cache\NullBackendFactory&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== cleanup template debug ==&lt;br /&gt;
&lt;br /&gt;
Use in twig:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  |preg_replace('/&amp;lt;!--.*?--&amp;gt;/s','')|striptags|replace({&amp;quot;\n&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\r&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\t&amp;quot;:&amp;quot;&amp;quot;})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ReST ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
curl --include \&lt;br /&gt;
  --request POST \&lt;br /&gt;
  --user admin:&amp;lt;&amp;gt; \&lt;br /&gt;
  --header 'Content-type: application/hal+json' \&lt;br /&gt;
  http://pi.local/node?_format=hal_json \&lt;br /&gt;
  --data-binary '{&lt;br /&gt;
    &amp;quot;_links&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;http://pi.local/rest/type/node/article&amp;quot;}&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;title&amp;quot;:[{&amp;quot;value&amp;quot;:&amp;quot;Node +++ 123 bac +++&amp;quot; }],&lt;br /&gt;
    &amp;quot;body&amp;quot;:[{&amp;quot;value&amp;quot;: &amp;quot;&amp;lt;b&amp;gt;hello, wor&amp;lt;/b&amp;gt;ld!&amp;quot;, &amp;quot;format&amp;quot;: &amp;quot;full_html&amp;quot; }],&lt;br /&gt;
    &amp;quot;type&amp;quot;:[{&amp;quot;target_id&amp;quot;:&amp;quot;article&amp;quot;}],&lt;br /&gt;
    &amp;quot;status&amp;quot;: [{&amp;quot;value&amp;quot;: 1}],&lt;br /&gt;
    &amp;quot;_embedded&amp;quot;: {&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_issue&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;56229a95-d675-43e1-99b1-f9e11b5579c5&amp;quot; }] }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_tags&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;45646a7d-1a16-42e8-b758-f6e1c8d976f7&amp;quot; }] },&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;834e34e2-05ae-498d-b876-453798872ce1&amp;quot; }] }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  }'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Default Attachments ==&lt;br /&gt;
  txt pdf doc docx html csv xlsx xlsm sh json svg&lt;br /&gt;
  cer pem pub key kdbx&lt;br /&gt;
  png jpg jpeg gif&lt;br /&gt;
  mkv sfv avi mp3 mp4 webm mov&lt;br /&gt;
  zip tar gz&lt;br /&gt;
&lt;br /&gt;
== set password ==&lt;br /&gt;
&lt;br /&gt;
 drush user:password USERNAME NEW_PASSWORD&lt;br /&gt;
&lt;br /&gt;
== change ownership ==&lt;br /&gt;
&lt;br /&gt;
of all simplenews_issue &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval &amp;quot;&lt;br /&gt;
\$nids = \Drupal::entityQuery('node')&lt;br /&gt;
  -&amp;gt;condition('type', 'simplenews_issue')&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
\$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage('node');&lt;br /&gt;
\$nodes = \$storage-&amp;gt;loadMultiple(\$nids);&lt;br /&gt;
&lt;br /&gt;
foreach (\$nodes as \$node) {&lt;br /&gt;
  \$node-&amp;gt;setOwnerId(252);&lt;br /&gt;
  \$node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
of all content with &amp;quot;generated&amp;quot; in title:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval '&lt;br /&gt;
$nids = \Drupal::entityQuery(&amp;quot;node&amp;quot;)&lt;br /&gt;
  -&amp;gt;condition(&amp;quot;title&amp;quot;, &amp;quot;%enerated%&amp;quot;, &amp;quot;LIKE&amp;quot;)&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage(&amp;quot;node&amp;quot;);&lt;br /&gt;
$nodes = $storage-&amp;gt;loadMultiple($nids);&lt;br /&gt;
&lt;br /&gt;
foreach ($nodes as $node) {&lt;br /&gt;
  $node-&amp;gt;setOwnerId(129);&lt;br /&gt;
  $node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Updated &amp;quot; . count($nodes) . &amp;quot; nodes\n&amp;quot;;&lt;br /&gt;
'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Testing =&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/running-phpunit-tests&lt;br /&gt;
&lt;br /&gt;
For me, in my drupal images and containers, drupal is installed in the following folder, which is also my workdir:&lt;br /&gt;
&lt;br /&gt;
  WORKDIR /var/www/html&lt;br /&gt;
&lt;br /&gt;
The below is optional, I call the specific phpunit executable every time:&lt;br /&gt;
&lt;br /&gt;
  export PATH=&amp;quot;$PATH:/var/www/html/vendor/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You need to change minimum stability to &amp;quot;dev&amp;quot; for the testing libraries to be loaded.&lt;br /&gt;
&lt;br /&gt;
DO NOT RUN THIS IN PRODUCTION!&lt;br /&gt;
&lt;br /&gt;
  composer require --dev phpunit/phpunit # trash&lt;br /&gt;
    composer require --dev phpunit/phpunit:^9.5 --with-all-dependencies&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
    composer require --dev drupal/core-dev --update-with-all-dependencies # trash&lt;br /&gt;
  composer require --dev behat/mink:1.8.0 --with-all-dependencies&lt;br /&gt;
  composer require --dev symfony/phpunit-bridge&lt;br /&gt;
  composer require --dev phpspec/prophecy-phpunit&lt;br /&gt;
  composer require --dev behat/mink-browserkit-driver&lt;br /&gt;
&lt;br /&gt;
Copy and configure phpunit.xml:&lt;br /&gt;
&lt;br /&gt;
  phpunit --testsuite unit --filter CurrentUserBlock # trash?&lt;br /&gt;
  cd /var/www/html&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php -v --debug&lt;br /&gt;
&lt;br /&gt;
= update =&lt;br /&gt;
== 10 to 10 ==&lt;br /&gt;
  composer require \&lt;br /&gt;
  drupal/core-recommended:10.6.7 \&lt;br /&gt;
  drupal/core-composer-scaffold:10.6.7 \&lt;br /&gt;
  drupal/core-project-message:10.6.7 \&lt;br /&gt;
  --update-with-all-dependencies&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Cool&amp;diff=3461</id>
		<title>Cool</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Cool&amp;diff=3461"/>
				<updated>2026-04-29T16:18:26Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cool websites (latest first) ==&lt;br /&gt;
&lt;br /&gt;
=== 2026q1 ===&lt;br /&gt;
* https://hotglue.com/pricing&lt;br /&gt;
* https://www.micro1.ai/&lt;br /&gt;
* https://getmysocial.com/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* https://www.paycom.com/&lt;br /&gt;
* https://www.qed42.com/services/drupal&lt;br /&gt;
&lt;br /&gt;
* https://www.fulcrumapp.com/industries/environmental/&lt;br /&gt;
* https://www.dotsquares.com/&lt;br /&gt;
* https://moneyhub.com/&lt;br /&gt;
* https://skillenai.com/external-post/how-to-build-an-agentic-email-workflow/&lt;br /&gt;
&lt;br /&gt;
=== 2025q4 ===&lt;br /&gt;
* https://vitaminak.design/en&lt;br /&gt;
&lt;br /&gt;
=== 2024Q3 ===&lt;br /&gt;
&lt;br /&gt;
* SEO&lt;br /&gt;
** https://www.targetedwebtraffic.com/&lt;br /&gt;
** https://serpclix.com/&lt;br /&gt;
&lt;br /&gt;
* Design&lt;br /&gt;
** https://truesocialmarketing.com/our-portfolio/&lt;br /&gt;
** https://pitturagroup.com/&lt;br /&gt;
** https://www.devsinc.com/&lt;br /&gt;
** https://wearesocial.com/us/&lt;br /&gt;
&lt;br /&gt;
* Hosting&lt;br /&gt;
** https://www.turnkeylinux.org/&lt;br /&gt;
** https://www.acquia.com/&lt;br /&gt;
&lt;br /&gt;
* Misc services, nice designs&lt;br /&gt;
** https://macarthursociety.org/&lt;br /&gt;
&lt;br /&gt;
* spam recruiters&lt;br /&gt;
** https://inficarehealth.com/&lt;br /&gt;
&lt;br /&gt;
* products&lt;br /&gt;
** https://www.notion.so/product/docs&lt;br /&gt;
** https://quillbot.com/&lt;br /&gt;
** https://www.copy.ai/prices&lt;br /&gt;
&lt;br /&gt;
=== 2024Q1 ===&lt;br /&gt;
&lt;br /&gt;
* https://www.tylertech.com/&lt;br /&gt;
* https://www.liatrio.com/&lt;br /&gt;
* https://cypress.io&lt;br /&gt;
&lt;br /&gt;
=== 2023Q4 ===&lt;br /&gt;
* https://apexfintechsolutions.com/resources/#custody-clearing&lt;br /&gt;
* https://www.springsapartments.com/apartments/tx/austin/springs-at-lakeline&lt;br /&gt;
&lt;br /&gt;
=== 2023Q3 ===&lt;br /&gt;
* https://trustedquote.com/disability-insurance&lt;br /&gt;
* https://stripe.com/billing&lt;br /&gt;
* https://www.assemblyai.com/&lt;br /&gt;
* https://www.eidos.ai/&lt;br /&gt;
* https://www.vardot.com/en-us/services/digital-strategy&lt;br /&gt;
* https://osome.com/sg/&lt;br /&gt;
* https://bitbag.io/&lt;br /&gt;
* https://arends-inc.com/&lt;br /&gt;
&lt;br /&gt;
=== 2023Q2 ===&lt;br /&gt;
examples&lt;br /&gt;
* https://www.sdssinc.com/&lt;br /&gt;
&lt;br /&gt;
other&lt;br /&gt;
* recruiter example: https://www.trigent.com/&lt;br /&gt;
* https://www.foley.com/en/offices/austin&lt;br /&gt;
* https://callummurraycomposer.com/&lt;br /&gt;
* https://www.austinresidentialsolutions.online/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2023Q1 ===&lt;br /&gt;
* https://www.intrafinetworkdeposits.com/&lt;br /&gt;
* https://codebasics.io/&lt;br /&gt;
* https://devforth.io/&lt;br /&gt;
* https://www.michaeljcasey.com/&lt;br /&gt;
&lt;br /&gt;
=== 2022-11 ===&lt;br /&gt;
* https://www.netlify.com/&lt;br /&gt;
* https://kore.ai/platform/virtual-assistant/&lt;br /&gt;
* https://chain.link/&lt;br /&gt;
* https://www.blackknightinc.com/&lt;br /&gt;
* https://www.fancyhands.com/&lt;br /&gt;
* https://www.prialto.com/&lt;br /&gt;
* https://rewind.com/products/backups/github/&lt;br /&gt;
* https://gitcoin.co/hackathon/reserve-launch/onboard&lt;br /&gt;
* https://angel.co/ - a clean narrative&lt;br /&gt;
&lt;br /&gt;
=== 2022 ===&lt;br /&gt;
* https://katalon.com/ - I have a lot to learn!&lt;br /&gt;
* excellent blog format: https://www.git-tower.com/blog/developing-for-the-desktop-vscode/&lt;br /&gt;
* https://www.circle.com/en/euro-coin&lt;br /&gt;
* https://www.drsgme.org/&lt;br /&gt;
* https://brooksource.com - its okay, the page feels &amp;quot;full&amp;quot;&lt;br /&gt;
* https://www.pinata.cloud/&lt;br /&gt;
* https://discord.com/&lt;br /&gt;
* https://dribbble.com/DmiT&lt;br /&gt;
* https://mailtrap.io/&lt;br /&gt;
* https://www.thebalance.com/&lt;br /&gt;
* https://badgirlsbible.com/&lt;br /&gt;
* https://www.balena.io/etcher/&lt;br /&gt;
* https://railsware.com/&lt;br /&gt;
* https://sentry.io/welcome/&lt;br /&gt;
* https://www.confluent.io/&lt;br /&gt;
* https://www.wecraftapps.com/&lt;br /&gt;
* https://saeloun.com&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [[ To read ]]&lt;br /&gt;
* [[ Tools ]]&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3460</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3460"/>
				<updated>2026-04-23T00:39:50Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* A great book: https://drupalatyourfingertips.com&lt;br /&gt;
* How to clear cache: /devel/cache/clear&lt;br /&gt;
&lt;br /&gt;
= Install &amp;amp; Configure =&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:9.5.10 html&lt;br /&gt;
&lt;br /&gt;
  COMPOSER_PROCESS_TIMEOUT=2000 composer install&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:10.6.7 html&lt;br /&gt;
  composer update &amp;quot;drupal/core-*&amp;quot; --with-all-dependencies&lt;br /&gt;
  composer require drupal/core-recommended:10.6.7 drupal/core-composer-scaffold:10.6.7 drupal/core-project-message:10.6.7 --update-with-all-dependencies&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  composer require drupal/openid_connect:^1.0&lt;br /&gt;
  drush cr&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/devel:^5.1'&lt;br /&gt;
  composer require 'drupal/s3fs:^3.3'&lt;br /&gt;
  # composer require 'wasya-co/consent_popup: 1.0.4.x-dev'&lt;br /&gt;
  composer require 'drupal/consent_popup:^1.0'&lt;br /&gt;
  composer require 'drush/drush:^11.6'&lt;br /&gt;
  composer require 'drupal/metatag:^2.0'&lt;br /&gt;
  composer require 'drupal/redirect:^1.9'&lt;br /&gt;
  composer require 'drupal/superfish:^1.6'&lt;br /&gt;
  composer require 'drupal/webform:^6.0'&lt;br /&gt;
  composer require 'drupal/captcha:^1.14'&lt;br /&gt;
  composer require 'drupal/typed_data:^1.0@alpha'&lt;br /&gt;
  composer require 'drupal/rules:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smtp:^1.2'&lt;br /&gt;
  composer require 'drupal/hal:^1.0'&lt;br /&gt;
  composer require 'drupal/restui:^1.21'&lt;br /&gt;
  composer require 'drupal/keycloak:^2.2@beta'&lt;br /&gt;
  composer require 'drupal/nodeaccess:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/email_registration:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/content_access:^2.0'&lt;br /&gt;
  composer require 'drupal/social_media:^2.0'&lt;br /&gt;
  composer require 'drupal/wordpress_migrate:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/codefilter:^2.0'&lt;br /&gt;
  composer require 'drupal/views_taxonomy_term_name_depth:^7.2'&lt;br /&gt;
  composer require 'drupal/pathauto:^1.12'&lt;br /&gt;
  composer require 'drupal/twig_tweak:^3.3'&lt;br /&gt;
  composer require 'drupal/simplenews:^4.0'&lt;br /&gt;
  composer require 'drupal/ctools:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/commerce:^2.40' ## drupal 9.5&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    apt install php-bcmath php8.1-bcmath&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^1.1'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/commerce:^3.3'  ## drupal 10&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^2.2'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/linkit:^6.0'&lt;br /&gt;
  composer require 'drupal/redirect_after_login:^3.0'&lt;br /&gt;
  composer require 'drupal/symfony_mailer:^1.4'&lt;br /&gt;
  composer require 'drupal/custom_search:^1.0@beta'&lt;br /&gt;
  composer require 'drupal/fullcalendar_view:^5.2' &lt;br /&gt;
  composer require 'drupal/date_recur:^3.3@RC'&lt;br /&gt;
  composer require 'drupal/date_recur_modular:^3.1'&lt;br /&gt;
  composer require 'drupal/colorbox:2.0.2'&lt;br /&gt;
  composer require 'drupal/tagclouds:^2.0'&lt;br /&gt;
  composer require 'drupal/filelog:^3.0'&lt;br /&gt;
  composer require 'drupal/message:^1.6'&lt;br /&gt;
  composer require 'drupal/flag:^4.0@beta'&lt;br /&gt;
  composer require 'drupal/message_subscribe:^1.4'&lt;br /&gt;
  composer require 'drupal/message_digest:^1.5'&lt;br /&gt;
  composer require 'drupal/message_ui:^1.3'&lt;br /&gt;
  composer require 'drupal/layout_builder_usage_reports:^1.0'&lt;br /&gt;
  composer require 'drupal/views_tree:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/vote_up_down:^1.0@alpha'&lt;br /&gt;
    composer require 'drupal/votingapi:^3.0@beta'&lt;br /&gt;
  composer require 'drupal/formblock:^2.0@beta'&lt;br /&gt;
  composer require 'drupal/views_pdf:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/field_permissions:^1.4'&lt;br /&gt;
  composer require 'drupal/scheduler:^2.2'&lt;br /&gt;
  composer require 'drupal/simplenews_scheduler:^4.0@alpha'&lt;br /&gt;
  composer require 'drupal/insert_view:^2.1'&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  composer require 'drupal/keycloak:^1.8'&lt;br /&gt;
  composer require 'drupal/simple_oauth:^5.2'&lt;br /&gt;
  composer require 'drupal/group:^1.6'&lt;br /&gt;
    composer require 'drupal/group_join_link:^1.0'&lt;br /&gt;
  composer require 'drupal/social_auth:^4.1'&lt;br /&gt;
    composer require 'drupal/social_auth_google:^4.0' &lt;br /&gt;
    composer require 'drupal/social_auth_facebook:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_linkedin:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_microsoft:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/twilio:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smssystem:^1.1'&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require 'drupal/smsframework:^2.3'&lt;br /&gt;
  composer require symfony/dom-crawler symfony/css-selector&lt;br /&gt;
  composer require drupal/markdown&lt;br /&gt;
  composer require drupal/markdown_easy&lt;br /&gt;
  composer require 'drupal/crm_core:3.x-dev@dev'&lt;br /&gt;
  composer require 'drupal/name:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/dynamic_entity_reference:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/default_content:^2.0@beta'&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
  composer require 'drupal/single_content_sync:^1.4' ## yep its this one&lt;br /&gt;
  # composer require drupal/views_show_more ## I don't use it?&lt;br /&gt;
  composer require 'drupal/matomo:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/paragraphs:^1.20'&lt;br /&gt;
    composer require drupal/search_api_db&lt;br /&gt;
    composer require drupal/search_api&lt;br /&gt;
    composer require 'drupal/entity_usage:^2.0@beta'&lt;br /&gt;
    composer require drupal/entity_browser&lt;br /&gt;
    composer require drupal/svg_image_field&lt;br /&gt;
  composer require 'drupal/admin_toolbar:^3.6'&lt;br /&gt;
&lt;br /&gt;
== evaluating ==&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/seo_checklist:^5.2'&lt;br /&gt;
  composer require 'drupal/yoast_seo:^1.9'&lt;br /&gt;
  composer require 'drupal/tvi:^2.0' ## From: https://www.drupal.org/project/tvi&lt;br /&gt;
  composer require 'drupal/advanced_text_formatter:^3.0@RC'&lt;br /&gt;
  composer require 'drupal/token_filter:^2.1'&lt;br /&gt;
  composer require 'drupal/form_mode_control:^2.4'&lt;br /&gt;
  composer require 'drupal/queue_mail:^1.7'&lt;br /&gt;
  composer require 'drupal/googlelogin-googlelogin:^9.5'&lt;br /&gt;
  composer require 'drupal/dark_mode_toggle:^1.0'&lt;br /&gt;
  composer require 'drupal/imce:^3.1'&lt;br /&gt;
  composer require 'drupal/bootstrap_barrio:^5.5'&lt;br /&gt;
&lt;br /&gt;
== not gonna use ==&lt;br /&gt;
  composer require 'drupal/backup_migrate:^5.1' ## was 5.0 ## so-so, unused&lt;br /&gt;
  composer require 'drupal/migrate_tools:^6.0' ## unused&lt;br /&gt;
  # composer require 'drupal/migrate_plus:^6.0' ## didn't need it the second time&lt;br /&gt;
&lt;br /&gt;
Not gonna use ebt_core, because (1) they have way too many modules, it should have been just one, and (2) their &amp;quot;hero&amp;quot; module doesn't honor container and isn't a hero.&lt;br /&gt;
&lt;br /&gt;
  # composer require 'drupal/layout_library:^1.0@beta' ## looks poor, just use blocks&lt;br /&gt;
  # composer require 'drupal/section_library:^2.0' ## looks poor, just use blocks&lt;br /&gt;
&lt;br /&gt;
== Upgrade 9 to 10 ==&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require drupal/core-recommended:^10 drupal/core-composer-scaffold:^10 drupal/core-project-message:^10 --update-with-all-dependencies&lt;br /&gt;
    composer require drupal/core-recommended:10.6.7 drupal/core-composer-scaffold drupal/core-project-message -W&lt;br /&gt;
    composer require drupal/typed_data:^2.0 -W&lt;br /&gt;
&lt;br /&gt;
  composer update --with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
== Setting up dev environment ==&lt;br /&gt;
&lt;br /&gt;
* From: https://github.com/composer/composer/issues/9393&lt;br /&gt;
* From: https://www.drupal.org/docs/develop/automated-testing&lt;br /&gt;
* probably not useful: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/creating-functional-tests-simulated-browser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require --dev --no-update symfony/filesystem:4.4.42&lt;br /&gt;
  composer require --dev drupal/core-dev:9.5.11 --with-all-dependencies&lt;br /&gt;
    composer require --dev behat/mink jcalderonzumba/mink-phantomjs-driver&lt;br /&gt;
    composer update -W&lt;br /&gt;
    composer update symfony/filesystem:4.4.42 drush/drush -W&lt;br /&gt;
    composer require --dev drupal/core-dev -W&lt;br /&gt;
    composer require --dev phpspec/prophecy-phpunit:^2&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
Not useful:&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/examples:^4.0'&lt;br /&gt;
&lt;br /&gt;
== Configure s3fs ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,&lt;br /&gt;
    &amp;quot;Statement&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement0&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:ListBucket&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:ListBucketVersions&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement1&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:PutObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectAcl&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:PutObjectAcl&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;/*&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Disable caching ==&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/development-tools/disable-caching&lt;br /&gt;
&lt;br /&gt;
* Add the settings.local.php and&lt;br /&gt;
* Modify development.services.yml:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parameters:&lt;br /&gt;
  http.response.debug_cacheability_headers: true&lt;br /&gt;
  twig.config:&lt;br /&gt;
    debug: true&lt;br /&gt;
    auto_reload: true&lt;br /&gt;
    cache: false&lt;br /&gt;
services:&lt;br /&gt;
  cache.backend.null:&lt;br /&gt;
    class: Drupal\Core\Cache\NullBackendFactory&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== cleanup template debug ==&lt;br /&gt;
&lt;br /&gt;
Use in twig:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  |preg_replace('/&amp;lt;!--.*?--&amp;gt;/s','')|striptags|replace({&amp;quot;\n&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\r&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\t&amp;quot;:&amp;quot;&amp;quot;})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ReST ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
curl --include \&lt;br /&gt;
  --request POST \&lt;br /&gt;
  --user admin:&amp;lt;&amp;gt; \&lt;br /&gt;
  --header 'Content-type: application/hal+json' \&lt;br /&gt;
  http://pi.local/node?_format=hal_json \&lt;br /&gt;
  --data-binary '{&lt;br /&gt;
    &amp;quot;_links&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;http://pi.local/rest/type/node/article&amp;quot;}&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;title&amp;quot;:[{&amp;quot;value&amp;quot;:&amp;quot;Node +++ 123 bac +++&amp;quot; }],&lt;br /&gt;
    &amp;quot;body&amp;quot;:[{&amp;quot;value&amp;quot;: &amp;quot;&amp;lt;b&amp;gt;hello, wor&amp;lt;/b&amp;gt;ld!&amp;quot;, &amp;quot;format&amp;quot;: &amp;quot;full_html&amp;quot; }],&lt;br /&gt;
    &amp;quot;type&amp;quot;:[{&amp;quot;target_id&amp;quot;:&amp;quot;article&amp;quot;}],&lt;br /&gt;
    &amp;quot;status&amp;quot;: [{&amp;quot;value&amp;quot;: 1}],&lt;br /&gt;
    &amp;quot;_embedded&amp;quot;: {&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_issue&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;56229a95-d675-43e1-99b1-f9e11b5579c5&amp;quot; }] }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_tags&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;45646a7d-1a16-42e8-b758-f6e1c8d976f7&amp;quot; }] },&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;834e34e2-05ae-498d-b876-453798872ce1&amp;quot; }] }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  }'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Default Attachments ==&lt;br /&gt;
  txt pdf doc docx html csv xlsx xlsm sh json svg&lt;br /&gt;
  cer pem pub key kdbx&lt;br /&gt;
  png jpg jpeg gif&lt;br /&gt;
  mkv sfv avi mp3 mp4 webm mov&lt;br /&gt;
  zip tar gz&lt;br /&gt;
&lt;br /&gt;
== set password ==&lt;br /&gt;
&lt;br /&gt;
 drush user:password USERNAME NEW_PASSWORD&lt;br /&gt;
&lt;br /&gt;
== change ownership ==&lt;br /&gt;
&lt;br /&gt;
of all simplenews_issue &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval &amp;quot;&lt;br /&gt;
\$nids = \Drupal::entityQuery('node')&lt;br /&gt;
  -&amp;gt;condition('type', 'simplenews_issue')&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
\$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage('node');&lt;br /&gt;
\$nodes = \$storage-&amp;gt;loadMultiple(\$nids);&lt;br /&gt;
&lt;br /&gt;
foreach (\$nodes as \$node) {&lt;br /&gt;
  \$node-&amp;gt;setOwnerId(252);&lt;br /&gt;
  \$node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
of all content with &amp;quot;generated&amp;quot; in title:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval '&lt;br /&gt;
$nids = \Drupal::entityQuery(&amp;quot;node&amp;quot;)&lt;br /&gt;
  -&amp;gt;condition(&amp;quot;title&amp;quot;, &amp;quot;%enerated%&amp;quot;, &amp;quot;LIKE&amp;quot;)&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage(&amp;quot;node&amp;quot;);&lt;br /&gt;
$nodes = $storage-&amp;gt;loadMultiple($nids);&lt;br /&gt;
&lt;br /&gt;
foreach ($nodes as $node) {&lt;br /&gt;
  $node-&amp;gt;setOwnerId(129);&lt;br /&gt;
  $node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Updated &amp;quot; . count($nodes) . &amp;quot; nodes\n&amp;quot;;&lt;br /&gt;
'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Testing =&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/running-phpunit-tests&lt;br /&gt;
&lt;br /&gt;
For me, in my drupal images and containers, drupal is installed in the following folder, which is also my workdir:&lt;br /&gt;
&lt;br /&gt;
  WORKDIR /var/www/html&lt;br /&gt;
&lt;br /&gt;
The below is optional, I call the specific phpunit executable every time:&lt;br /&gt;
&lt;br /&gt;
  export PATH=&amp;quot;$PATH:/var/www/html/vendor/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You need to change minimum stability to &amp;quot;dev&amp;quot; for the testing libraries to be loaded.&lt;br /&gt;
&lt;br /&gt;
DO NOT RUN THIS IN PRODUCTION!&lt;br /&gt;
&lt;br /&gt;
  composer require --dev phpunit/phpunit # trash&lt;br /&gt;
    composer require --dev phpunit/phpunit:^9.5 --with-all-dependencies&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
    composer require --dev drupal/core-dev --update-with-all-dependencies # trash&lt;br /&gt;
  composer require --dev behat/mink:1.8.0 --with-all-dependencies&lt;br /&gt;
  composer require --dev symfony/phpunit-bridge&lt;br /&gt;
  composer require --dev phpspec/prophecy-phpunit&lt;br /&gt;
  composer require --dev behat/mink-browserkit-driver&lt;br /&gt;
&lt;br /&gt;
Copy and configure phpunit.xml:&lt;br /&gt;
&lt;br /&gt;
  phpunit --testsuite unit --filter CurrentUserBlock # trash?&lt;br /&gt;
  cd /var/www/html&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php -v --debug&lt;br /&gt;
&lt;br /&gt;
= update =&lt;br /&gt;
== 10 to 10 ==&lt;br /&gt;
  composer require \&lt;br /&gt;
  drupal/core-recommended:10.6.7 \&lt;br /&gt;
  drupal/core-composer-scaffold:10.6.7 \&lt;br /&gt;
  drupal/core-project-message:10.6.7 \&lt;br /&gt;
  --update-with-all-dependencies&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3459</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3459"/>
				<updated>2026-04-22T23:13:12Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* A great book: https://drupalatyourfingertips.com&lt;br /&gt;
* How to clear cache: /devel/cache/clear&lt;br /&gt;
&lt;br /&gt;
= Install &amp;amp; Configure =&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:9.5.10 html&lt;br /&gt;
&lt;br /&gt;
  COMPOSER_PROCESS_TIMEOUT=2000 composer install&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:10.6.7 html&lt;br /&gt;
  composer update &amp;quot;drupal/core-*&amp;quot; --with-all-dependencies&lt;br /&gt;
  composer require drupal/core-recommended:10.6.7 drupal/core-composer-scaffold:10.6.7 drupal/core-project-message:10.6.7 --update-with-all-dependencies&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  composer require drupal/openid_connect:^1.0&lt;br /&gt;
  drush cr&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/devel:^5.1'&lt;br /&gt;
  composer require 'drupal/s3fs:^3.3'&lt;br /&gt;
  # composer require 'wasya-co/consent_popup: 1.0.4.x-dev'&lt;br /&gt;
  composer require 'drupal/consent_popup:^1.0'&lt;br /&gt;
  composer require 'drush/drush:^11.6'&lt;br /&gt;
  composer require 'drupal/metatag:^2.0'&lt;br /&gt;
  composer require 'drupal/redirect:^1.9'&lt;br /&gt;
  composer require 'drupal/superfish:^1.6'&lt;br /&gt;
  composer require 'drupal/webform:^6.0'&lt;br /&gt;
  composer require 'drupal/captcha:^1.14'&lt;br /&gt;
  composer require 'drupal/typed_data:^1.0@alpha'&lt;br /&gt;
  composer require 'drupal/rules:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smtp:^1.2'&lt;br /&gt;
  composer require 'drupal/hal:^1.0'&lt;br /&gt;
  composer require 'drupal/restui:^1.21'&lt;br /&gt;
  composer require 'drupal/keycloak:^2.2@beta'&lt;br /&gt;
  composer require 'drupal/nodeaccess:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/email_registration:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/content_access:^2.0'&lt;br /&gt;
  composer require 'drupal/social_media:^2.0'&lt;br /&gt;
  composer require 'drupal/wordpress_migrate:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/codefilter:^2.0'&lt;br /&gt;
  composer require 'drupal/views_taxonomy_term_name_depth:^7.2'&lt;br /&gt;
  composer require 'drupal/pathauto:^1.12'&lt;br /&gt;
  composer require 'drupal/twig_tweak:^3.3'&lt;br /&gt;
  composer require 'drupal/simplenews:^4.0'&lt;br /&gt;
  composer require 'drupal/ctools:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/commerce:^2.40' ## drupal 9.5&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    apt install php-bcmath php8.1-bcmath&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^1.1'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/commerce:^3.3'  ## drupal 10&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^2.2'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/linkit:^6.0'&lt;br /&gt;
  composer require 'drupal/redirect_after_login:^3.0'&lt;br /&gt;
  composer require 'drupal/symfony_mailer:^1.4'&lt;br /&gt;
  composer require 'drupal/custom_search:^1.0@beta'&lt;br /&gt;
  composer require 'drupal/fullcalendar_view:^5.2' &lt;br /&gt;
  composer require 'drupal/date_recur:^3.3@RC'&lt;br /&gt;
  composer require 'drupal/date_recur_modular:^3.1'&lt;br /&gt;
  composer require 'drupal/colorbox:2.0.2'&lt;br /&gt;
  composer require 'drupal/tagclouds:^2.0'&lt;br /&gt;
  composer require 'drupal/filelog:^3.0'&lt;br /&gt;
  composer require 'drupal/message:^1.6'&lt;br /&gt;
  composer require 'drupal/flag:^4.0@beta'&lt;br /&gt;
  composer require 'drupal/message_subscribe:^1.4'&lt;br /&gt;
  composer require 'drupal/message_digest:^1.5'&lt;br /&gt;
  composer require 'drupal/message_ui:^1.3'&lt;br /&gt;
  composer require 'drupal/layout_builder_usage_reports:^1.0'&lt;br /&gt;
  composer require 'drupal/views_tree:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/vote_up_down:^1.0@alpha'&lt;br /&gt;
    composer require 'drupal/votingapi:^3.0@beta'&lt;br /&gt;
  composer require 'drupal/formblock:^2.0@beta'&lt;br /&gt;
  composer require 'drupal/views_pdf:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/field_permissions:^1.4'&lt;br /&gt;
  composer require 'drupal/scheduler:^2.2'&lt;br /&gt;
  composer require 'drupal/simplenews_scheduler:^4.0@alpha'&lt;br /&gt;
  composer require 'drupal/insert_view:^2.1'&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  composer require 'drupal/keycloak:^1.8'&lt;br /&gt;
  composer require 'drupal/simple_oauth:^5.2'&lt;br /&gt;
  composer require 'drupal/group:^1.6'&lt;br /&gt;
    composer require 'drupal/group_join_link:^1.0'&lt;br /&gt;
  composer require 'drupal/social_auth:^4.1'&lt;br /&gt;
    composer require 'drupal/social_auth_google:^4.0' &lt;br /&gt;
    composer require 'drupal/social_auth_facebook:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_linkedin:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_microsoft:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/twilio:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smssystem:^1.1'&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require 'drupal/smsframework:^2.3'&lt;br /&gt;
  composer require symfony/dom-crawler symfony/css-selector&lt;br /&gt;
  composer require drupal/markdown&lt;br /&gt;
  composer require drupal/markdown_easy&lt;br /&gt;
  composer require 'drupal/crm_core:3.x-dev@dev'&lt;br /&gt;
  composer require 'drupal/name:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/dynamic_entity_reference:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/default_content:^2.0@beta'&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
  composer require 'drupal/single_content_sync:^1.4' ## yep its this one&lt;br /&gt;
  # composer require drupal/views_show_more ## I don't use it?&lt;br /&gt;
  composer require 'drupal/matomo:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/paragraphs:^1.20'&lt;br /&gt;
    composer require drupal/search_api_db&lt;br /&gt;
    composer require drupal/search_api&lt;br /&gt;
    composer require 'drupal/entity_usage:^2.0@beta'&lt;br /&gt;
    composer require drupal/entity_browser&lt;br /&gt;
  composer require 'drupal/admin_toolbar:^3.6'&lt;br /&gt;
&lt;br /&gt;
== evaluating ==&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/seo_checklist:^5.2'&lt;br /&gt;
  composer require 'drupal/yoast_seo:^1.9'&lt;br /&gt;
  composer require 'drupal/tvi:^2.0' ## From: https://www.drupal.org/project/tvi&lt;br /&gt;
  composer require 'drupal/advanced_text_formatter:^3.0@RC'&lt;br /&gt;
  composer require 'drupal/token_filter:^2.1'&lt;br /&gt;
  composer require 'drupal/form_mode_control:^2.4'&lt;br /&gt;
  composer require 'drupal/queue_mail:^1.7'&lt;br /&gt;
  composer require 'drupal/googlelogin-googlelogin:^9.5'&lt;br /&gt;
  composer require 'drupal/dark_mode_toggle:^1.0'&lt;br /&gt;
  composer require 'drupal/imce:^3.1'&lt;br /&gt;
  composer require 'drupal/bootstrap_barrio:^5.5'&lt;br /&gt;
&lt;br /&gt;
== not gonna use ==&lt;br /&gt;
  composer require 'drupal/backup_migrate:^5.1' ## was 5.0 ## so-so, unused&lt;br /&gt;
  composer require 'drupal/migrate_tools:^6.0' ## unused&lt;br /&gt;
  # composer require 'drupal/migrate_plus:^6.0' ## didn't need it the second time&lt;br /&gt;
&lt;br /&gt;
Not gonna use ebt_core, because (1) they have way too many modules, it should have been just one, and (2) their &amp;quot;hero&amp;quot; module doesn't honor container and isn't a hero.&lt;br /&gt;
&lt;br /&gt;
  # composer require 'drupal/layout_library:^1.0@beta' ## looks poor, just use blocks&lt;br /&gt;
  # composer require 'drupal/section_library:^2.0' ## looks poor, just use blocks&lt;br /&gt;
&lt;br /&gt;
== Upgrade 9 to 10 ==&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require drupal/core-recommended:^10 drupal/core-composer-scaffold:^10 drupal/core-project-message:^10 --update-with-all-dependencies&lt;br /&gt;
    composer require drupal/core-recommended:10.6.7 drupal/core-composer-scaffold drupal/core-project-message -W&lt;br /&gt;
    composer require drupal/typed_data:^2.0 -W&lt;br /&gt;
&lt;br /&gt;
  composer update --with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
== Setting up dev environment ==&lt;br /&gt;
&lt;br /&gt;
* From: https://github.com/composer/composer/issues/9393&lt;br /&gt;
* From: https://www.drupal.org/docs/develop/automated-testing&lt;br /&gt;
* probably not useful: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/creating-functional-tests-simulated-browser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require --dev --no-update symfony/filesystem:4.4.42&lt;br /&gt;
  composer require --dev drupal/core-dev:9.5.11 --with-all-dependencies&lt;br /&gt;
    composer require --dev behat/mink jcalderonzumba/mink-phantomjs-driver&lt;br /&gt;
    composer update -W&lt;br /&gt;
    composer update symfony/filesystem:4.4.42 drush/drush -W&lt;br /&gt;
    composer require --dev drupal/core-dev -W&lt;br /&gt;
    composer require --dev phpspec/prophecy-phpunit:^2&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
Not useful:&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/examples:^4.0'&lt;br /&gt;
&lt;br /&gt;
== Configure s3fs ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,&lt;br /&gt;
    &amp;quot;Statement&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement0&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:ListBucket&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:ListBucketVersions&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement1&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:PutObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectAcl&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:PutObjectAcl&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;/*&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Disable caching ==&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/development-tools/disable-caching&lt;br /&gt;
&lt;br /&gt;
* Add the settings.local.php and&lt;br /&gt;
* Modify development.services.yml:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parameters:&lt;br /&gt;
  http.response.debug_cacheability_headers: true&lt;br /&gt;
  twig.config:&lt;br /&gt;
    debug: true&lt;br /&gt;
    auto_reload: true&lt;br /&gt;
    cache: false&lt;br /&gt;
services:&lt;br /&gt;
  cache.backend.null:&lt;br /&gt;
    class: Drupal\Core\Cache\NullBackendFactory&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== cleanup template debug ==&lt;br /&gt;
&lt;br /&gt;
Use in twig:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  |preg_replace('/&amp;lt;!--.*?--&amp;gt;/s','')|striptags|replace({&amp;quot;\n&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\r&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\t&amp;quot;:&amp;quot;&amp;quot;})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ReST ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
curl --include \&lt;br /&gt;
  --request POST \&lt;br /&gt;
  --user admin:&amp;lt;&amp;gt; \&lt;br /&gt;
  --header 'Content-type: application/hal+json' \&lt;br /&gt;
  http://pi.local/node?_format=hal_json \&lt;br /&gt;
  --data-binary '{&lt;br /&gt;
    &amp;quot;_links&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;http://pi.local/rest/type/node/article&amp;quot;}&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;title&amp;quot;:[{&amp;quot;value&amp;quot;:&amp;quot;Node +++ 123 bac +++&amp;quot; }],&lt;br /&gt;
    &amp;quot;body&amp;quot;:[{&amp;quot;value&amp;quot;: &amp;quot;&amp;lt;b&amp;gt;hello, wor&amp;lt;/b&amp;gt;ld!&amp;quot;, &amp;quot;format&amp;quot;: &amp;quot;full_html&amp;quot; }],&lt;br /&gt;
    &amp;quot;type&amp;quot;:[{&amp;quot;target_id&amp;quot;:&amp;quot;article&amp;quot;}],&lt;br /&gt;
    &amp;quot;status&amp;quot;: [{&amp;quot;value&amp;quot;: 1}],&lt;br /&gt;
    &amp;quot;_embedded&amp;quot;: {&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_issue&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;56229a95-d675-43e1-99b1-f9e11b5579c5&amp;quot; }] }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_tags&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;45646a7d-1a16-42e8-b758-f6e1c8d976f7&amp;quot; }] },&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;834e34e2-05ae-498d-b876-453798872ce1&amp;quot; }] }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  }'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Default Attachments ==&lt;br /&gt;
  txt pdf doc docx html csv xlsx xlsm sh json svg&lt;br /&gt;
  cer pem pub key kdbx&lt;br /&gt;
  png jpg jpeg gif&lt;br /&gt;
  mkv sfv avi mp3 mp4 webm mov&lt;br /&gt;
  zip tar gz&lt;br /&gt;
&lt;br /&gt;
== set password ==&lt;br /&gt;
&lt;br /&gt;
 drush user:password USERNAME NEW_PASSWORD&lt;br /&gt;
&lt;br /&gt;
== change ownership ==&lt;br /&gt;
&lt;br /&gt;
of all simplenews_issue &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval &amp;quot;&lt;br /&gt;
\$nids = \Drupal::entityQuery('node')&lt;br /&gt;
  -&amp;gt;condition('type', 'simplenews_issue')&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
\$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage('node');&lt;br /&gt;
\$nodes = \$storage-&amp;gt;loadMultiple(\$nids);&lt;br /&gt;
&lt;br /&gt;
foreach (\$nodes as \$node) {&lt;br /&gt;
  \$node-&amp;gt;setOwnerId(252);&lt;br /&gt;
  \$node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
of all content with &amp;quot;generated&amp;quot; in title:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval '&lt;br /&gt;
$nids = \Drupal::entityQuery(&amp;quot;node&amp;quot;)&lt;br /&gt;
  -&amp;gt;condition(&amp;quot;title&amp;quot;, &amp;quot;%enerated%&amp;quot;, &amp;quot;LIKE&amp;quot;)&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage(&amp;quot;node&amp;quot;);&lt;br /&gt;
$nodes = $storage-&amp;gt;loadMultiple($nids);&lt;br /&gt;
&lt;br /&gt;
foreach ($nodes as $node) {&lt;br /&gt;
  $node-&amp;gt;setOwnerId(129);&lt;br /&gt;
  $node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Updated &amp;quot; . count($nodes) . &amp;quot; nodes\n&amp;quot;;&lt;br /&gt;
'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Testing =&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/running-phpunit-tests&lt;br /&gt;
&lt;br /&gt;
For me, in my drupal images and containers, drupal is installed in the following folder, which is also my workdir:&lt;br /&gt;
&lt;br /&gt;
  WORKDIR /var/www/html&lt;br /&gt;
&lt;br /&gt;
The below is optional, I call the specific phpunit executable every time:&lt;br /&gt;
&lt;br /&gt;
  export PATH=&amp;quot;$PATH:/var/www/html/vendor/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You need to change minimum stability to &amp;quot;dev&amp;quot; for the testing libraries to be loaded.&lt;br /&gt;
&lt;br /&gt;
DO NOT RUN THIS IN PRODUCTION!&lt;br /&gt;
&lt;br /&gt;
  composer require --dev phpunit/phpunit # trash&lt;br /&gt;
    composer require --dev phpunit/phpunit:^9.5 --with-all-dependencies&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
    composer require --dev drupal/core-dev --update-with-all-dependencies # trash&lt;br /&gt;
  composer require --dev behat/mink:1.8.0 --with-all-dependencies&lt;br /&gt;
  composer require --dev symfony/phpunit-bridge&lt;br /&gt;
  composer require --dev phpspec/prophecy-phpunit&lt;br /&gt;
  composer require --dev behat/mink-browserkit-driver&lt;br /&gt;
&lt;br /&gt;
Copy and configure phpunit.xml:&lt;br /&gt;
&lt;br /&gt;
  phpunit --testsuite unit --filter CurrentUserBlock # trash?&lt;br /&gt;
  cd /var/www/html&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php -v --debug&lt;br /&gt;
&lt;br /&gt;
= update =&lt;br /&gt;
== 10 to 10 ==&lt;br /&gt;
  composer require \&lt;br /&gt;
  drupal/core-recommended:10.6.7 \&lt;br /&gt;
  drupal/core-composer-scaffold:10.6.7 \&lt;br /&gt;
  drupal/core-project-message:10.6.7 \&lt;br /&gt;
  --update-with-all-dependencies&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3458</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3458"/>
				<updated>2026-04-22T03:06:22Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: /* Install &amp;amp; Configure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* A great book: https://drupalatyourfingertips.com&lt;br /&gt;
* How to clear cache: /devel/cache/clear&lt;br /&gt;
&lt;br /&gt;
= Install &amp;amp; Configure =&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:9.5.10 html&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:10.6.7 html&lt;br /&gt;
  composer update &amp;quot;drupal/core-*&amp;quot; --with-all-dependencies&lt;br /&gt;
  composer require drupal/core-recommended:10.6.7 drupal/core-composer-scaffold:10.6.7 drupal/core-project-message:10.6.7 --update-with-all-dependencies&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  composer require drupal/openid_connect:^1.0&lt;br /&gt;
  drush cr&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/devel:^5.1'&lt;br /&gt;
  composer require 'drupal/s3fs:^3.3'&lt;br /&gt;
  # composer require 'wasya-co/consent_popup: 1.0.4.x-dev'&lt;br /&gt;
  composer require 'drupal/consent_popup:^1.0'&lt;br /&gt;
  composer require 'drush/drush:^11.6'&lt;br /&gt;
  composer require 'drupal/metatag:^2.0'&lt;br /&gt;
  composer require 'drupal/redirect:^1.9'&lt;br /&gt;
  composer require 'drupal/superfish:^1.6'&lt;br /&gt;
  composer require 'drupal/webform:^6.0'&lt;br /&gt;
  composer require 'drupal/captcha:^1.14'&lt;br /&gt;
  composer require 'drupal/typed_data:^1.0@alpha'&lt;br /&gt;
  composer require 'drupal/rules:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smtp:^1.2'&lt;br /&gt;
  composer require 'drupal/hal:^1.0'&lt;br /&gt;
  composer require 'drupal/restui:^1.21'&lt;br /&gt;
  composer require 'drupal/keycloak:^2.2@beta'&lt;br /&gt;
  composer require 'drupal/nodeaccess:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/email_registration:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/content_access:^2.0'&lt;br /&gt;
  composer require 'drupal/social_media:^2.0'&lt;br /&gt;
  composer require 'drupal/wordpress_migrate:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/codefilter:^2.0'&lt;br /&gt;
  composer require 'drupal/views_taxonomy_term_name_depth:^7.2'&lt;br /&gt;
  composer require 'drupal/pathauto:^1.12'&lt;br /&gt;
  composer require 'drupal/twig_tweak:^3.3'&lt;br /&gt;
  composer require 'drupal/simplenews:^4.0'&lt;br /&gt;
  composer require 'drupal/ctools:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/commerce:^2.40' ## drupal 9.5&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    apt install php-bcmath php8.1-bcmath&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^1.1'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/commerce:^3.3'  ## drupal 10&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^2.2'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/linkit:^6.0'&lt;br /&gt;
  composer require 'drupal/redirect_after_login:^3.0'&lt;br /&gt;
  composer require 'drupal/symfony_mailer:^1.4'&lt;br /&gt;
  composer require 'drupal/custom_search:^1.0@beta'&lt;br /&gt;
  composer require 'drupal/fullcalendar_view:^5.2' &lt;br /&gt;
  composer require 'drupal/date_recur:^3.3@RC'&lt;br /&gt;
  composer require 'drupal/date_recur_modular:^3.1'&lt;br /&gt;
  composer require 'drupal/colorbox:2.0.2'&lt;br /&gt;
  composer require 'drupal/tagclouds:^2.0'&lt;br /&gt;
  composer require 'drupal/filelog:^3.0'&lt;br /&gt;
  composer require 'drupal/message:^1.6'&lt;br /&gt;
  composer require 'drupal/flag:^4.0@beta'&lt;br /&gt;
  composer require 'drupal/message_subscribe:^1.4'&lt;br /&gt;
  composer require 'drupal/message_digest:^1.5'&lt;br /&gt;
  composer require 'drupal/message_ui:^1.3'&lt;br /&gt;
  composer require 'drupal/layout_builder_usage_reports:^1.0'&lt;br /&gt;
  composer require 'drupal/views_tree:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/vote_up_down:^1.0@alpha'&lt;br /&gt;
    composer require 'drupal/votingapi:^3.0@beta'&lt;br /&gt;
  composer require 'drupal/formblock:^2.0@beta'&lt;br /&gt;
  composer require 'drupal/views_pdf:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/field_permissions:^1.4'&lt;br /&gt;
  composer require 'drupal/scheduler:^2.2'&lt;br /&gt;
  composer require 'drupal/simplenews_scheduler:^4.0@alpha'&lt;br /&gt;
  composer require 'drupal/insert_view:^2.1'&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  composer require 'drupal/keycloak:^1.8'&lt;br /&gt;
  composer require 'drupal/simple_oauth:^5.2'&lt;br /&gt;
  composer require 'drupal/group:^1.6'&lt;br /&gt;
    composer require 'drupal/group_join_link:^1.0'&lt;br /&gt;
  composer require 'drupal/social_auth:^4.1'&lt;br /&gt;
    composer require 'drupal/social_auth_google:^4.0' &lt;br /&gt;
    composer require 'drupal/social_auth_facebook:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_linkedin:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_microsoft:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/twilio:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smssystem:^1.1'&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require 'drupal/smsframework:^2.3'&lt;br /&gt;
  composer require symfony/dom-crawler symfony/css-selector&lt;br /&gt;
  composer require drupal/markdown&lt;br /&gt;
  composer require drupal/markdown_easy&lt;br /&gt;
  composer require 'drupal/crm_core:3.x-dev@dev'&lt;br /&gt;
  composer require 'drupal/name:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/dynamic_entity_reference:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/default_content:^2.0@beta'&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
  composer require 'drupal/single_content_sync:^1.4' ## yep its this one&lt;br /&gt;
  # composer require drupal/views_show_more ## I don't use it?&lt;br /&gt;
  composer require 'drupal/matomo:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/paragraphs:^1.20'&lt;br /&gt;
    composer require drupal/search_api_db&lt;br /&gt;
    composer require drupal/search_api&lt;br /&gt;
    composer require 'drupal/entity_usage:^2.0@beta'&lt;br /&gt;
    composer require drupal/entity_browser&lt;br /&gt;
  composer require 'drupal/admin_toolbar:^3.6'&lt;br /&gt;
&lt;br /&gt;
== evaluating ==&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/seo_checklist:^5.2'&lt;br /&gt;
  composer require 'drupal/yoast_seo:^1.9'&lt;br /&gt;
  composer require 'drupal/tvi:^2.0' ## From: https://www.drupal.org/project/tvi&lt;br /&gt;
  composer require 'drupal/advanced_text_formatter:^3.0@RC'&lt;br /&gt;
  composer require 'drupal/token_filter:^2.1'&lt;br /&gt;
  composer require 'drupal/form_mode_control:^2.4'&lt;br /&gt;
  composer require 'drupal/queue_mail:^1.7'&lt;br /&gt;
  composer require 'drupal/googlelogin-googlelogin:^9.5'&lt;br /&gt;
  composer require 'drupal/dark_mode_toggle:^1.0'&lt;br /&gt;
  composer require 'drupal/imce:^3.1'&lt;br /&gt;
  composer require 'drupal/bootstrap_barrio:^5.5'&lt;br /&gt;
&lt;br /&gt;
== not gonna use ==&lt;br /&gt;
  composer require 'drupal/backup_migrate:^5.1' ## was 5.0 ## so-so, unused&lt;br /&gt;
  composer require 'drupal/migrate_tools:^6.0' ## unused&lt;br /&gt;
  # composer require 'drupal/migrate_plus:^6.0' ## didn't need it the second time&lt;br /&gt;
&lt;br /&gt;
Not gonna use ebt_core, because (1) they have way too many modules, it should have been just one, and (2) their &amp;quot;hero&amp;quot; module doesn't honor container and isn't a hero.&lt;br /&gt;
&lt;br /&gt;
  # composer require 'drupal/layout_library:^1.0@beta' ## looks poor, just use blocks&lt;br /&gt;
  # composer require 'drupal/section_library:^2.0' ## looks poor, just use blocks&lt;br /&gt;
&lt;br /&gt;
== Upgrade 9 to 10 ==&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require drupal/core-recommended:^10 drupal/core-composer-scaffold:^10 drupal/core-project-message:^10 --update-with-all-dependencies&lt;br /&gt;
    composer require drupal/core-recommended:10.6.7 drupal/core-composer-scaffold drupal/core-project-message -W&lt;br /&gt;
    composer require drupal/typed_data:^2.0 -W&lt;br /&gt;
&lt;br /&gt;
  composer update --with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
== Setting up dev environment ==&lt;br /&gt;
&lt;br /&gt;
* From: https://github.com/composer/composer/issues/9393&lt;br /&gt;
* From: https://www.drupal.org/docs/develop/automated-testing&lt;br /&gt;
* probably not useful: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/creating-functional-tests-simulated-browser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require --dev --no-update symfony/filesystem:4.4.42&lt;br /&gt;
  composer require --dev drupal/core-dev:9.5.11 --with-all-dependencies&lt;br /&gt;
    composer require --dev behat/mink jcalderonzumba/mink-phantomjs-driver&lt;br /&gt;
    composer update -W&lt;br /&gt;
    composer update symfony/filesystem:4.4.42 drush/drush -W&lt;br /&gt;
    composer require --dev drupal/core-dev -W&lt;br /&gt;
    composer require --dev phpspec/prophecy-phpunit:^2&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
Not useful:&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/examples:^4.0'&lt;br /&gt;
&lt;br /&gt;
== Configure s3fs ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,&lt;br /&gt;
    &amp;quot;Statement&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement0&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:ListBucket&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:ListBucketVersions&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement1&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:PutObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectAcl&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:PutObjectAcl&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;/*&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Disable caching ==&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/development-tools/disable-caching&lt;br /&gt;
&lt;br /&gt;
* Add the settings.local.php and&lt;br /&gt;
* Modify development.services.yml:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parameters:&lt;br /&gt;
  http.response.debug_cacheability_headers: true&lt;br /&gt;
  twig.config:&lt;br /&gt;
    debug: true&lt;br /&gt;
    auto_reload: true&lt;br /&gt;
    cache: false&lt;br /&gt;
services:&lt;br /&gt;
  cache.backend.null:&lt;br /&gt;
    class: Drupal\Core\Cache\NullBackendFactory&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== cleanup template debug ==&lt;br /&gt;
&lt;br /&gt;
Use in twig:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  |preg_replace('/&amp;lt;!--.*?--&amp;gt;/s','')|striptags|replace({&amp;quot;\n&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\r&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\t&amp;quot;:&amp;quot;&amp;quot;})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ReST ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
curl --include \&lt;br /&gt;
  --request POST \&lt;br /&gt;
  --user admin:&amp;lt;&amp;gt; \&lt;br /&gt;
  --header 'Content-type: application/hal+json' \&lt;br /&gt;
  http://pi.local/node?_format=hal_json \&lt;br /&gt;
  --data-binary '{&lt;br /&gt;
    &amp;quot;_links&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;http://pi.local/rest/type/node/article&amp;quot;}&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;title&amp;quot;:[{&amp;quot;value&amp;quot;:&amp;quot;Node +++ 123 bac +++&amp;quot; }],&lt;br /&gt;
    &amp;quot;body&amp;quot;:[{&amp;quot;value&amp;quot;: &amp;quot;&amp;lt;b&amp;gt;hello, wor&amp;lt;/b&amp;gt;ld!&amp;quot;, &amp;quot;format&amp;quot;: &amp;quot;full_html&amp;quot; }],&lt;br /&gt;
    &amp;quot;type&amp;quot;:[{&amp;quot;target_id&amp;quot;:&amp;quot;article&amp;quot;}],&lt;br /&gt;
    &amp;quot;status&amp;quot;: [{&amp;quot;value&amp;quot;: 1}],&lt;br /&gt;
    &amp;quot;_embedded&amp;quot;: {&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_issue&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;56229a95-d675-43e1-99b1-f9e11b5579c5&amp;quot; }] }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_tags&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;45646a7d-1a16-42e8-b758-f6e1c8d976f7&amp;quot; }] },&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;834e34e2-05ae-498d-b876-453798872ce1&amp;quot; }] }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  }'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Default Attachments ==&lt;br /&gt;
  txt pdf doc docx html csv xlsx xlsm sh json svg&lt;br /&gt;
  cer pem pub key kdbx&lt;br /&gt;
  png jpg jpeg gif&lt;br /&gt;
  mkv sfv avi mp3 mp4 webm mov&lt;br /&gt;
  zip tar gz&lt;br /&gt;
&lt;br /&gt;
== set password ==&lt;br /&gt;
&lt;br /&gt;
 drush user:password USERNAME NEW_PASSWORD&lt;br /&gt;
&lt;br /&gt;
== change ownership ==&lt;br /&gt;
&lt;br /&gt;
of all simplenews_issue &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval &amp;quot;&lt;br /&gt;
\$nids = \Drupal::entityQuery('node')&lt;br /&gt;
  -&amp;gt;condition('type', 'simplenews_issue')&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
\$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage('node');&lt;br /&gt;
\$nodes = \$storage-&amp;gt;loadMultiple(\$nids);&lt;br /&gt;
&lt;br /&gt;
foreach (\$nodes as \$node) {&lt;br /&gt;
  \$node-&amp;gt;setOwnerId(252);&lt;br /&gt;
  \$node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
of all content with &amp;quot;generated&amp;quot; in title:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval '&lt;br /&gt;
$nids = \Drupal::entityQuery(&amp;quot;node&amp;quot;)&lt;br /&gt;
  -&amp;gt;condition(&amp;quot;title&amp;quot;, &amp;quot;%enerated%&amp;quot;, &amp;quot;LIKE&amp;quot;)&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage(&amp;quot;node&amp;quot;);&lt;br /&gt;
$nodes = $storage-&amp;gt;loadMultiple($nids);&lt;br /&gt;
&lt;br /&gt;
foreach ($nodes as $node) {&lt;br /&gt;
  $node-&amp;gt;setOwnerId(129);&lt;br /&gt;
  $node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Updated &amp;quot; . count($nodes) . &amp;quot; nodes\n&amp;quot;;&lt;br /&gt;
'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Testing =&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/running-phpunit-tests&lt;br /&gt;
&lt;br /&gt;
For me, in my drupal images and containers, drupal is installed in the following folder, which is also my workdir:&lt;br /&gt;
&lt;br /&gt;
  WORKDIR /var/www/html&lt;br /&gt;
&lt;br /&gt;
The below is optional, I call the specific phpunit executable every time:&lt;br /&gt;
&lt;br /&gt;
  export PATH=&amp;quot;$PATH:/var/www/html/vendor/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You need to change minimum stability to &amp;quot;dev&amp;quot; for the testing libraries to be loaded.&lt;br /&gt;
&lt;br /&gt;
DO NOT RUN THIS IN PRODUCTION!&lt;br /&gt;
&lt;br /&gt;
  composer require --dev phpunit/phpunit # trash&lt;br /&gt;
    composer require --dev phpunit/phpunit:^9.5 --with-all-dependencies&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
    composer require --dev drupal/core-dev --update-with-all-dependencies # trash&lt;br /&gt;
  composer require --dev behat/mink:1.8.0 --with-all-dependencies&lt;br /&gt;
  composer require --dev symfony/phpunit-bridge&lt;br /&gt;
  composer require --dev phpspec/prophecy-phpunit&lt;br /&gt;
  composer require --dev behat/mink-browserkit-driver&lt;br /&gt;
&lt;br /&gt;
Copy and configure phpunit.xml:&lt;br /&gt;
&lt;br /&gt;
  phpunit --testsuite unit --filter CurrentUserBlock # trash?&lt;br /&gt;
  cd /var/www/html&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php -v --debug&lt;br /&gt;
&lt;br /&gt;
= update =&lt;br /&gt;
== 10 to 10 ==&lt;br /&gt;
  composer require \&lt;br /&gt;
  drupal/core-recommended:10.6.7 \&lt;br /&gt;
  drupal/core-composer-scaffold:10.6.7 \&lt;br /&gt;
  drupal/core-project-message:10.6.7 \&lt;br /&gt;
  --update-with-all-dependencies&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3457</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3457"/>
				<updated>2026-04-22T02:29:57Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: /* Upgrade 9 to 10 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* A great book: https://drupalatyourfingertips.com&lt;br /&gt;
* How to clear cache: /devel/cache/clear&lt;br /&gt;
&lt;br /&gt;
= Install &amp;amp; Configure =&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:9.5.10 html&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:10.6.7 html&lt;br /&gt;
  composer update &amp;quot;drupal/core-*&amp;quot; --with-all-dependencies&lt;br /&gt;
  composer require drupal/core-recommended:10.6.7 drupal/core-composer-scaffold:10.6.7 drupal/core-project-message:10.6.7 --update-with-all-dependencies&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  drush cr&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/devel:^5.1'&lt;br /&gt;
  composer require 'drupal/s3fs:^3.3'&lt;br /&gt;
  # composer require 'wasya-co/consent_popup: 1.0.4.x-dev'&lt;br /&gt;
  composer require 'drupal/consent_popup:^1.0'&lt;br /&gt;
  composer require 'drush/drush:^11.6'&lt;br /&gt;
  composer require 'drupal/metatag:^2.0'&lt;br /&gt;
  composer require 'drupal/redirect:^1.9'&lt;br /&gt;
  composer require 'drupal/superfish:^1.6'&lt;br /&gt;
  composer require 'drupal/webform:^6.0'&lt;br /&gt;
  composer require 'drupal/captcha:^1.14'&lt;br /&gt;
  composer require 'drupal/typed_data:^1.0@alpha'&lt;br /&gt;
  composer require 'drupal/rules:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smtp:^1.2'&lt;br /&gt;
  composer require 'drupal/hal:^1.0'&lt;br /&gt;
  composer require 'drupal/restui:^1.21'&lt;br /&gt;
  composer require 'drupal/keycloak:^2.2@beta'&lt;br /&gt;
  composer require 'drupal/nodeaccess:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/email_registration:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/content_access:^2.0'&lt;br /&gt;
  composer require 'drupal/social_media:^2.0'&lt;br /&gt;
  composer require 'drupal/wordpress_migrate:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/codefilter:^2.0'&lt;br /&gt;
  composer require 'drupal/views_taxonomy_term_name_depth:^7.2'&lt;br /&gt;
  composer require 'drupal/pathauto:^1.12'&lt;br /&gt;
  composer require 'drupal/twig_tweak:^3.3'&lt;br /&gt;
  composer require 'drupal/simplenews:^4.0'&lt;br /&gt;
  composer require 'drupal/ctools:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/commerce:^2.40' ## drupal 9.5&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    apt install php-bcmath php8.1-bcmath&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^1.1'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/commerce:^3.3'  ## drupal 10&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^2.2'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/linkit:^6.0'&lt;br /&gt;
  composer require 'drupal/redirect_after_login:^3.0'&lt;br /&gt;
  composer require 'drupal/symfony_mailer:^1.4'&lt;br /&gt;
  composer require 'drupal/custom_search:^1.0@beta'&lt;br /&gt;
  composer require 'drupal/fullcalendar_view:^5.2' &lt;br /&gt;
  composer require 'drupal/date_recur:^3.3@RC'&lt;br /&gt;
  composer require 'drupal/date_recur_modular:^3.1'&lt;br /&gt;
  composer require 'drupal/colorbox:2.0.2'&lt;br /&gt;
  composer require 'drupal/tagclouds:^2.0'&lt;br /&gt;
  composer require 'drupal/filelog:^3.0'&lt;br /&gt;
  composer require 'drupal/message:^1.6'&lt;br /&gt;
  composer require 'drupal/flag:^4.0@beta'&lt;br /&gt;
  composer require 'drupal/message_subscribe:^1.4'&lt;br /&gt;
  composer require 'drupal/message_digest:^1.5'&lt;br /&gt;
  composer require 'drupal/message_ui:^1.3'&lt;br /&gt;
  composer require 'drupal/layout_builder_usage_reports:^1.0'&lt;br /&gt;
  composer require 'drupal/views_tree:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/vote_up_down:^1.0@alpha'&lt;br /&gt;
    composer require 'drupal/votingapi:^3.0@beta'&lt;br /&gt;
  composer require 'drupal/formblock:^2.0@beta'&lt;br /&gt;
  composer require 'drupal/views_pdf:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/field_permissions:^1.4'&lt;br /&gt;
  composer require 'drupal/scheduler:^2.2'&lt;br /&gt;
  composer require 'drupal/simplenews_scheduler:^4.0@alpha'&lt;br /&gt;
  composer require 'drupal/insert_view:^2.1'&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  composer require 'drupal/keycloak:^1.8'&lt;br /&gt;
  composer require 'drupal/simple_oauth:^5.2'&lt;br /&gt;
  composer require 'drupal/group:^1.6'&lt;br /&gt;
    composer require 'drupal/group_join_link:^1.0'&lt;br /&gt;
  composer require 'drupal/social_auth:^4.1'&lt;br /&gt;
    composer require 'drupal/social_auth_google:^4.0' &lt;br /&gt;
    composer require 'drupal/social_auth_facebook:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_linkedin:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_microsoft:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/twilio:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smssystem:^1.1'&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require 'drupal/smsframework:^2.3'&lt;br /&gt;
  composer require symfony/dom-crawler symfony/css-selector&lt;br /&gt;
  composer require drupal/markdown&lt;br /&gt;
  composer require drupal/markdown_easy&lt;br /&gt;
  composer require 'drupal/crm_core:3.x-dev@dev'&lt;br /&gt;
  composer require 'drupal/name:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/dynamic_entity_reference:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/default_content:^2.0@beta'&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
  composer require 'drupal/single_content_sync:^1.4' ## yep its this one&lt;br /&gt;
  # composer require drupal/views_show_more ## I don't use it?&lt;br /&gt;
  composer require 'drupal/matomo:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/paragraphs:^1.20'&lt;br /&gt;
    composer require drupal/search_api_db&lt;br /&gt;
    composer require drupal/search_api&lt;br /&gt;
    composer require 'drupal/entity_usage:^2.0@beta'&lt;br /&gt;
    composer require drupal/entity_browser&lt;br /&gt;
  composer require 'drupal/admin_toolbar:^3.6'&lt;br /&gt;
&lt;br /&gt;
== evaluating ==&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/seo_checklist:^5.2'&lt;br /&gt;
  composer require 'drupal/yoast_seo:^1.9'&lt;br /&gt;
  composer require 'drupal/tvi:^2.0' ## From: https://www.drupal.org/project/tvi&lt;br /&gt;
  composer require 'drupal/advanced_text_formatter:^3.0@RC'&lt;br /&gt;
  composer require 'drupal/token_filter:^2.1'&lt;br /&gt;
  composer require 'drupal/form_mode_control:^2.4'&lt;br /&gt;
  composer require 'drupal/queue_mail:^1.7'&lt;br /&gt;
  composer require 'drupal/googlelogin-googlelogin:^9.5'&lt;br /&gt;
  composer require 'drupal/dark_mode_toggle:^1.0'&lt;br /&gt;
  composer require 'drupal/imce:^3.1'&lt;br /&gt;
  composer require 'drupal/bootstrap_barrio:^5.5'&lt;br /&gt;
&lt;br /&gt;
== not gonna use ==&lt;br /&gt;
  composer require 'drupal/backup_migrate:^5.1' ## was 5.0 ## so-so, unused&lt;br /&gt;
  composer require 'drupal/migrate_tools:^6.0' ## unused&lt;br /&gt;
  # composer require 'drupal/migrate_plus:^6.0' ## didn't need it the second time&lt;br /&gt;
&lt;br /&gt;
Not gonna use ebt_core, because (1) they have way too many modules, it should have been just one, and (2) their &amp;quot;hero&amp;quot; module doesn't honor container and isn't a hero.&lt;br /&gt;
&lt;br /&gt;
  # composer require 'drupal/layout_library:^1.0@beta' ## looks poor, just use blocks&lt;br /&gt;
  # composer require 'drupal/section_library:^2.0' ## looks poor, just use blocks&lt;br /&gt;
&lt;br /&gt;
== Upgrade 9 to 10 ==&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require drupal/core-recommended:^10 drupal/core-composer-scaffold:^10 drupal/core-project-message:^10 --update-with-all-dependencies&lt;br /&gt;
    composer require drupal/core-recommended:10.6.7 drupal/core-composer-scaffold drupal/core-project-message -W&lt;br /&gt;
    composer require drupal/typed_data:^2.0 -W&lt;br /&gt;
&lt;br /&gt;
  composer update --with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
== Setting up dev environment ==&lt;br /&gt;
&lt;br /&gt;
* From: https://github.com/composer/composer/issues/9393&lt;br /&gt;
* From: https://www.drupal.org/docs/develop/automated-testing&lt;br /&gt;
* probably not useful: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/creating-functional-tests-simulated-browser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require --dev --no-update symfony/filesystem:4.4.42&lt;br /&gt;
  composer require --dev drupal/core-dev:9.5.11 --with-all-dependencies&lt;br /&gt;
    composer require --dev behat/mink jcalderonzumba/mink-phantomjs-driver&lt;br /&gt;
    composer update -W&lt;br /&gt;
    composer update symfony/filesystem:4.4.42 drush/drush -W&lt;br /&gt;
    composer require --dev drupal/core-dev -W&lt;br /&gt;
    composer require --dev phpspec/prophecy-phpunit:^2&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
Not useful:&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/examples:^4.0'&lt;br /&gt;
&lt;br /&gt;
== Configure s3fs ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,&lt;br /&gt;
    &amp;quot;Statement&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement0&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:ListBucket&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:ListBucketVersions&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement1&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:PutObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectAcl&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:PutObjectAcl&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;/*&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Disable caching ==&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/development-tools/disable-caching&lt;br /&gt;
&lt;br /&gt;
* Add the settings.local.php and&lt;br /&gt;
* Modify development.services.yml:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parameters:&lt;br /&gt;
  http.response.debug_cacheability_headers: true&lt;br /&gt;
  twig.config:&lt;br /&gt;
    debug: true&lt;br /&gt;
    auto_reload: true&lt;br /&gt;
    cache: false&lt;br /&gt;
services:&lt;br /&gt;
  cache.backend.null:&lt;br /&gt;
    class: Drupal\Core\Cache\NullBackendFactory&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== cleanup template debug ==&lt;br /&gt;
&lt;br /&gt;
Use in twig:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  |preg_replace('/&amp;lt;!--.*?--&amp;gt;/s','')|striptags|replace({&amp;quot;\n&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\r&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\t&amp;quot;:&amp;quot;&amp;quot;})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ReST ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
curl --include \&lt;br /&gt;
  --request POST \&lt;br /&gt;
  --user admin:&amp;lt;&amp;gt; \&lt;br /&gt;
  --header 'Content-type: application/hal+json' \&lt;br /&gt;
  http://pi.local/node?_format=hal_json \&lt;br /&gt;
  --data-binary '{&lt;br /&gt;
    &amp;quot;_links&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;http://pi.local/rest/type/node/article&amp;quot;}&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;title&amp;quot;:[{&amp;quot;value&amp;quot;:&amp;quot;Node +++ 123 bac +++&amp;quot; }],&lt;br /&gt;
    &amp;quot;body&amp;quot;:[{&amp;quot;value&amp;quot;: &amp;quot;&amp;lt;b&amp;gt;hello, wor&amp;lt;/b&amp;gt;ld!&amp;quot;, &amp;quot;format&amp;quot;: &amp;quot;full_html&amp;quot; }],&lt;br /&gt;
    &amp;quot;type&amp;quot;:[{&amp;quot;target_id&amp;quot;:&amp;quot;article&amp;quot;}],&lt;br /&gt;
    &amp;quot;status&amp;quot;: [{&amp;quot;value&amp;quot;: 1}],&lt;br /&gt;
    &amp;quot;_embedded&amp;quot;: {&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_issue&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;56229a95-d675-43e1-99b1-f9e11b5579c5&amp;quot; }] }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_tags&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;45646a7d-1a16-42e8-b758-f6e1c8d976f7&amp;quot; }] },&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;834e34e2-05ae-498d-b876-453798872ce1&amp;quot; }] }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  }'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Default Attachments ==&lt;br /&gt;
  txt pdf doc docx html csv xlsx xlsm sh json svg&lt;br /&gt;
  cer pem pub key kdbx&lt;br /&gt;
  png jpg jpeg gif&lt;br /&gt;
  mkv sfv avi mp3 mp4 webm mov&lt;br /&gt;
  zip tar gz&lt;br /&gt;
&lt;br /&gt;
== set password ==&lt;br /&gt;
&lt;br /&gt;
 drush user:password USERNAME NEW_PASSWORD&lt;br /&gt;
&lt;br /&gt;
== change ownership ==&lt;br /&gt;
&lt;br /&gt;
of all simplenews_issue &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval &amp;quot;&lt;br /&gt;
\$nids = \Drupal::entityQuery('node')&lt;br /&gt;
  -&amp;gt;condition('type', 'simplenews_issue')&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
\$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage('node');&lt;br /&gt;
\$nodes = \$storage-&amp;gt;loadMultiple(\$nids);&lt;br /&gt;
&lt;br /&gt;
foreach (\$nodes as \$node) {&lt;br /&gt;
  \$node-&amp;gt;setOwnerId(252);&lt;br /&gt;
  \$node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
of all content with &amp;quot;generated&amp;quot; in title:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval '&lt;br /&gt;
$nids = \Drupal::entityQuery(&amp;quot;node&amp;quot;)&lt;br /&gt;
  -&amp;gt;condition(&amp;quot;title&amp;quot;, &amp;quot;%enerated%&amp;quot;, &amp;quot;LIKE&amp;quot;)&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage(&amp;quot;node&amp;quot;);&lt;br /&gt;
$nodes = $storage-&amp;gt;loadMultiple($nids);&lt;br /&gt;
&lt;br /&gt;
foreach ($nodes as $node) {&lt;br /&gt;
  $node-&amp;gt;setOwnerId(129);&lt;br /&gt;
  $node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Updated &amp;quot; . count($nodes) . &amp;quot; nodes\n&amp;quot;;&lt;br /&gt;
'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Testing =&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/running-phpunit-tests&lt;br /&gt;
&lt;br /&gt;
For me, in my drupal images and containers, drupal is installed in the following folder, which is also my workdir:&lt;br /&gt;
&lt;br /&gt;
  WORKDIR /var/www/html&lt;br /&gt;
&lt;br /&gt;
The below is optional, I call the specific phpunit executable every time:&lt;br /&gt;
&lt;br /&gt;
  export PATH=&amp;quot;$PATH:/var/www/html/vendor/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You need to change minimum stability to &amp;quot;dev&amp;quot; for the testing libraries to be loaded.&lt;br /&gt;
&lt;br /&gt;
DO NOT RUN THIS IN PRODUCTION!&lt;br /&gt;
&lt;br /&gt;
  composer require --dev phpunit/phpunit # trash&lt;br /&gt;
    composer require --dev phpunit/phpunit:^9.5 --with-all-dependencies&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
    composer require --dev drupal/core-dev --update-with-all-dependencies # trash&lt;br /&gt;
  composer require --dev behat/mink:1.8.0 --with-all-dependencies&lt;br /&gt;
  composer require --dev symfony/phpunit-bridge&lt;br /&gt;
  composer require --dev phpspec/prophecy-phpunit&lt;br /&gt;
  composer require --dev behat/mink-browserkit-driver&lt;br /&gt;
&lt;br /&gt;
Copy and configure phpunit.xml:&lt;br /&gt;
&lt;br /&gt;
  phpunit --testsuite unit --filter CurrentUserBlock # trash?&lt;br /&gt;
  cd /var/www/html&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php -v --debug&lt;br /&gt;
&lt;br /&gt;
= update =&lt;br /&gt;
== 10 to 10 ==&lt;br /&gt;
  composer require \&lt;br /&gt;
  drupal/core-recommended:10.6.7 \&lt;br /&gt;
  drupal/core-composer-scaffold:10.6.7 \&lt;br /&gt;
  drupal/core-project-message:10.6.7 \&lt;br /&gt;
  --update-with-all-dependencies&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3456</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3456"/>
				<updated>2026-04-21T23:35:40Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* A great book: https://drupalatyourfingertips.com&lt;br /&gt;
* How to clear cache: /devel/cache/clear&lt;br /&gt;
&lt;br /&gt;
= Install &amp;amp; Configure =&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:9.5.10 html&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:10.6.7 html&lt;br /&gt;
  composer update &amp;quot;drupal/core-*&amp;quot; --with-all-dependencies&lt;br /&gt;
  composer require drupal/core-recommended:10.6.7 drupal/core-composer-scaffold:10.6.7 drupal/core-project-message:10.6.7 --update-with-all-dependencies&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  drush cr&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/devel:^5.1'&lt;br /&gt;
  composer require 'drupal/s3fs:^3.3'&lt;br /&gt;
  # composer require 'wasya-co/consent_popup: 1.0.4.x-dev'&lt;br /&gt;
  composer require 'drupal/consent_popup:^1.0'&lt;br /&gt;
  composer require 'drush/drush:^11.6'&lt;br /&gt;
  composer require 'drupal/metatag:^2.0'&lt;br /&gt;
  composer require 'drupal/redirect:^1.9'&lt;br /&gt;
  composer require 'drupal/superfish:^1.6'&lt;br /&gt;
  composer require 'drupal/webform:^6.0'&lt;br /&gt;
  composer require 'drupal/captcha:^1.14'&lt;br /&gt;
  composer require 'drupal/typed_data:^1.0@alpha'&lt;br /&gt;
  composer require 'drupal/rules:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smtp:^1.2'&lt;br /&gt;
  composer require 'drupal/hal:^1.0'&lt;br /&gt;
  composer require 'drupal/restui:^1.21'&lt;br /&gt;
  composer require 'drupal/keycloak:^2.2@beta'&lt;br /&gt;
  composer require 'drupal/nodeaccess:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/email_registration:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/content_access:^2.0'&lt;br /&gt;
  composer require 'drupal/social_media:^2.0'&lt;br /&gt;
  composer require 'drupal/wordpress_migrate:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/codefilter:^2.0'&lt;br /&gt;
  composer require 'drupal/views_taxonomy_term_name_depth:^7.2'&lt;br /&gt;
  composer require 'drupal/pathauto:^1.12'&lt;br /&gt;
  composer require 'drupal/twig_tweak:^3.3'&lt;br /&gt;
  composer require 'drupal/simplenews:^4.0'&lt;br /&gt;
  composer require 'drupal/ctools:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/commerce:^2.40' ## drupal 9.5&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    apt install php-bcmath php8.1-bcmath&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^1.1'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/commerce:^3.3'  ## drupal 10&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^2.2'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/linkit:^6.0'&lt;br /&gt;
  composer require 'drupal/redirect_after_login:^3.0'&lt;br /&gt;
  composer require 'drupal/symfony_mailer:^1.4'&lt;br /&gt;
  composer require 'drupal/custom_search:^1.0@beta'&lt;br /&gt;
  composer require 'drupal/fullcalendar_view:^5.2' &lt;br /&gt;
  composer require 'drupal/date_recur:^3.3@RC'&lt;br /&gt;
  composer require 'drupal/date_recur_modular:^3.1'&lt;br /&gt;
  composer require 'drupal/colorbox:2.0.2'&lt;br /&gt;
  composer require 'drupal/tagclouds:^2.0'&lt;br /&gt;
  composer require 'drupal/filelog:^3.0'&lt;br /&gt;
  composer require 'drupal/message:^1.6'&lt;br /&gt;
  composer require 'drupal/flag:^4.0@beta'&lt;br /&gt;
  composer require 'drupal/message_subscribe:^1.4'&lt;br /&gt;
  composer require 'drupal/message_digest:^1.5'&lt;br /&gt;
  composer require 'drupal/message_ui:^1.3'&lt;br /&gt;
  composer require 'drupal/layout_builder_usage_reports:^1.0'&lt;br /&gt;
  composer require 'drupal/views_tree:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/vote_up_down:^1.0@alpha'&lt;br /&gt;
    composer require 'drupal/votingapi:^3.0@beta'&lt;br /&gt;
  composer require 'drupal/formblock:^2.0@beta'&lt;br /&gt;
  composer require 'drupal/views_pdf:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/field_permissions:^1.4'&lt;br /&gt;
  composer require 'drupal/scheduler:^2.2'&lt;br /&gt;
  composer require 'drupal/simplenews_scheduler:^4.0@alpha'&lt;br /&gt;
  composer require 'drupal/insert_view:^2.1'&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  composer require 'drupal/keycloak:^1.8'&lt;br /&gt;
  composer require 'drupal/simple_oauth:^5.2'&lt;br /&gt;
  composer require 'drupal/group:^1.6'&lt;br /&gt;
    composer require 'drupal/group_join_link:^1.0'&lt;br /&gt;
  composer require 'drupal/social_auth:^4.1'&lt;br /&gt;
    composer require 'drupal/social_auth_google:^4.0' &lt;br /&gt;
    composer require 'drupal/social_auth_facebook:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_linkedin:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_microsoft:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/twilio:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smssystem:^1.1'&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require 'drupal/smsframework:^2.3'&lt;br /&gt;
  composer require symfony/dom-crawler symfony/css-selector&lt;br /&gt;
  composer require drupal/markdown&lt;br /&gt;
  composer require drupal/markdown_easy&lt;br /&gt;
  composer require 'drupal/crm_core:3.x-dev@dev'&lt;br /&gt;
  composer require 'drupal/name:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/dynamic_entity_reference:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/default_content:^2.0@beta'&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
  composer require 'drupal/single_content_sync:^1.4' ## yep its this one&lt;br /&gt;
  # composer require drupal/views_show_more ## I don't use it?&lt;br /&gt;
  composer require 'drupal/matomo:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/paragraphs:^1.20'&lt;br /&gt;
    composer require drupal/search_api_db&lt;br /&gt;
    composer require drupal/search_api&lt;br /&gt;
    composer require 'drupal/entity_usage:^2.0@beta'&lt;br /&gt;
    composer require drupal/entity_browser&lt;br /&gt;
  composer require 'drupal/admin_toolbar:^3.6'&lt;br /&gt;
&lt;br /&gt;
== evaluating ==&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/seo_checklist:^5.2'&lt;br /&gt;
  composer require 'drupal/yoast_seo:^1.9'&lt;br /&gt;
  composer require 'drupal/tvi:^2.0' ## From: https://www.drupal.org/project/tvi&lt;br /&gt;
  composer require 'drupal/advanced_text_formatter:^3.0@RC'&lt;br /&gt;
  composer require 'drupal/token_filter:^2.1'&lt;br /&gt;
  composer require 'drupal/form_mode_control:^2.4'&lt;br /&gt;
  composer require 'drupal/queue_mail:^1.7'&lt;br /&gt;
  composer require 'drupal/googlelogin-googlelogin:^9.5'&lt;br /&gt;
  composer require 'drupal/dark_mode_toggle:^1.0'&lt;br /&gt;
  composer require 'drupal/imce:^3.1'&lt;br /&gt;
  composer require 'drupal/bootstrap_barrio:^5.5'&lt;br /&gt;
&lt;br /&gt;
== not gonna use ==&lt;br /&gt;
  composer require 'drupal/backup_migrate:^5.1' ## was 5.0 ## so-so, unused&lt;br /&gt;
  composer require 'drupal/migrate_tools:^6.0' ## unused&lt;br /&gt;
  # composer require 'drupal/migrate_plus:^6.0' ## didn't need it the second time&lt;br /&gt;
&lt;br /&gt;
Not gonna use ebt_core, because (1) they have way too many modules, it should have been just one, and (2) their &amp;quot;hero&amp;quot; module doesn't honor container and isn't a hero.&lt;br /&gt;
&lt;br /&gt;
  # composer require 'drupal/layout_library:^1.0@beta' ## looks poor, just use blocks&lt;br /&gt;
  # composer require 'drupal/section_library:^2.0' ## looks poor, just use blocks&lt;br /&gt;
&lt;br /&gt;
== Upgrade 9 to 10 ==&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require drupal/core-recommended:^10 drupal/core-composer-scaffold:^10 drupal/core-project-message:^10 --update-with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
  composer update --with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
== Setting up dev environment ==&lt;br /&gt;
&lt;br /&gt;
* From: https://github.com/composer/composer/issues/9393&lt;br /&gt;
* From: https://www.drupal.org/docs/develop/automated-testing&lt;br /&gt;
* probably not useful: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/creating-functional-tests-simulated-browser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require --dev --no-update symfony/filesystem:4.4.42&lt;br /&gt;
  composer require --dev drupal/core-dev:9.5.11 --with-all-dependencies&lt;br /&gt;
    composer require --dev behat/mink jcalderonzumba/mink-phantomjs-driver&lt;br /&gt;
    composer update -W&lt;br /&gt;
    composer update symfony/filesystem:4.4.42 drush/drush -W&lt;br /&gt;
    composer require --dev drupal/core-dev -W&lt;br /&gt;
    composer require --dev phpspec/prophecy-phpunit:^2&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
Not useful:&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/examples:^4.0'&lt;br /&gt;
&lt;br /&gt;
== Configure s3fs ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,&lt;br /&gt;
    &amp;quot;Statement&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement0&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:ListBucket&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:ListBucketVersions&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement1&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:PutObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectAcl&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:PutObjectAcl&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;/*&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Disable caching ==&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/development-tools/disable-caching&lt;br /&gt;
&lt;br /&gt;
* Add the settings.local.php and&lt;br /&gt;
* Modify development.services.yml:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parameters:&lt;br /&gt;
  http.response.debug_cacheability_headers: true&lt;br /&gt;
  twig.config:&lt;br /&gt;
    debug: true&lt;br /&gt;
    auto_reload: true&lt;br /&gt;
    cache: false&lt;br /&gt;
services:&lt;br /&gt;
  cache.backend.null:&lt;br /&gt;
    class: Drupal\Core\Cache\NullBackendFactory&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== cleanup template debug ==&lt;br /&gt;
&lt;br /&gt;
Use in twig:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  |preg_replace('/&amp;lt;!--.*?--&amp;gt;/s','')|striptags|replace({&amp;quot;\n&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\r&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\t&amp;quot;:&amp;quot;&amp;quot;})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ReST ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
curl --include \&lt;br /&gt;
  --request POST \&lt;br /&gt;
  --user admin:&amp;lt;&amp;gt; \&lt;br /&gt;
  --header 'Content-type: application/hal+json' \&lt;br /&gt;
  http://pi.local/node?_format=hal_json \&lt;br /&gt;
  --data-binary '{&lt;br /&gt;
    &amp;quot;_links&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;http://pi.local/rest/type/node/article&amp;quot;}&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;title&amp;quot;:[{&amp;quot;value&amp;quot;:&amp;quot;Node +++ 123 bac +++&amp;quot; }],&lt;br /&gt;
    &amp;quot;body&amp;quot;:[{&amp;quot;value&amp;quot;: &amp;quot;&amp;lt;b&amp;gt;hello, wor&amp;lt;/b&amp;gt;ld!&amp;quot;, &amp;quot;format&amp;quot;: &amp;quot;full_html&amp;quot; }],&lt;br /&gt;
    &amp;quot;type&amp;quot;:[{&amp;quot;target_id&amp;quot;:&amp;quot;article&amp;quot;}],&lt;br /&gt;
    &amp;quot;status&amp;quot;: [{&amp;quot;value&amp;quot;: 1}],&lt;br /&gt;
    &amp;quot;_embedded&amp;quot;: {&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_issue&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;56229a95-d675-43e1-99b1-f9e11b5579c5&amp;quot; }] }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_tags&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;45646a7d-1a16-42e8-b758-f6e1c8d976f7&amp;quot; }] },&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;834e34e2-05ae-498d-b876-453798872ce1&amp;quot; }] }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  }'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Default Attachments ==&lt;br /&gt;
  txt pdf doc docx html csv xlsx xlsm sh json svg&lt;br /&gt;
  cer pem pub key kdbx&lt;br /&gt;
  png jpg jpeg gif&lt;br /&gt;
  mkv sfv avi mp3 mp4 webm mov&lt;br /&gt;
  zip tar gz&lt;br /&gt;
&lt;br /&gt;
== set password ==&lt;br /&gt;
&lt;br /&gt;
 drush user:password USERNAME NEW_PASSWORD&lt;br /&gt;
&lt;br /&gt;
== change ownership ==&lt;br /&gt;
&lt;br /&gt;
of all simplenews_issue &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval &amp;quot;&lt;br /&gt;
\$nids = \Drupal::entityQuery('node')&lt;br /&gt;
  -&amp;gt;condition('type', 'simplenews_issue')&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
\$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage('node');&lt;br /&gt;
\$nodes = \$storage-&amp;gt;loadMultiple(\$nids);&lt;br /&gt;
&lt;br /&gt;
foreach (\$nodes as \$node) {&lt;br /&gt;
  \$node-&amp;gt;setOwnerId(252);&lt;br /&gt;
  \$node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
of all content with &amp;quot;generated&amp;quot; in title:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval '&lt;br /&gt;
$nids = \Drupal::entityQuery(&amp;quot;node&amp;quot;)&lt;br /&gt;
  -&amp;gt;condition(&amp;quot;title&amp;quot;, &amp;quot;%enerated%&amp;quot;, &amp;quot;LIKE&amp;quot;)&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage(&amp;quot;node&amp;quot;);&lt;br /&gt;
$nodes = $storage-&amp;gt;loadMultiple($nids);&lt;br /&gt;
&lt;br /&gt;
foreach ($nodes as $node) {&lt;br /&gt;
  $node-&amp;gt;setOwnerId(129);&lt;br /&gt;
  $node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Updated &amp;quot; . count($nodes) . &amp;quot; nodes\n&amp;quot;;&lt;br /&gt;
'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Testing =&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/running-phpunit-tests&lt;br /&gt;
&lt;br /&gt;
For me, in my drupal images and containers, drupal is installed in the following folder, which is also my workdir:&lt;br /&gt;
&lt;br /&gt;
  WORKDIR /var/www/html&lt;br /&gt;
&lt;br /&gt;
The below is optional, I call the specific phpunit executable every time:&lt;br /&gt;
&lt;br /&gt;
  export PATH=&amp;quot;$PATH:/var/www/html/vendor/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You need to change minimum stability to &amp;quot;dev&amp;quot; for the testing libraries to be loaded.&lt;br /&gt;
&lt;br /&gt;
DO NOT RUN THIS IN PRODUCTION!&lt;br /&gt;
&lt;br /&gt;
  composer require --dev phpunit/phpunit # trash&lt;br /&gt;
    composer require --dev phpunit/phpunit:^9.5 --with-all-dependencies&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
    composer require --dev drupal/core-dev --update-with-all-dependencies # trash&lt;br /&gt;
  composer require --dev behat/mink:1.8.0 --with-all-dependencies&lt;br /&gt;
  composer require --dev symfony/phpunit-bridge&lt;br /&gt;
  composer require --dev phpspec/prophecy-phpunit&lt;br /&gt;
  composer require --dev behat/mink-browserkit-driver&lt;br /&gt;
&lt;br /&gt;
Copy and configure phpunit.xml:&lt;br /&gt;
&lt;br /&gt;
  phpunit --testsuite unit --filter CurrentUserBlock # trash?&lt;br /&gt;
  cd /var/www/html&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php -v --debug&lt;br /&gt;
&lt;br /&gt;
= update =&lt;br /&gt;
== 10 to 10 ==&lt;br /&gt;
  composer require \&lt;br /&gt;
  drupal/core-recommended:10.6.7 \&lt;br /&gt;
  drupal/core-composer-scaffold:10.6.7 \&lt;br /&gt;
  drupal/core-project-message:10.6.7 \&lt;br /&gt;
  --update-with-all-dependencies&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3455</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3455"/>
				<updated>2026-04-21T23:34:01Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: /* Install &amp;amp; Configure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* A great book: https://drupalatyourfingertips.com&lt;br /&gt;
* How to clear cache: /devel/cache/clear&lt;br /&gt;
&lt;br /&gt;
= Install &amp;amp; Configure =&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:9.5.10 html&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:10.6.7 html&lt;br /&gt;
  composer update &amp;quot;drupal/core-*&amp;quot; --with-all-dependencies&lt;br /&gt;
  composer require drupal/core-recommended:10.6.7 drupal/core-composer-scaffold:10.6.7 drupal/core-project-message:10.6.7 --update-with-all-dependencies&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  drush cr&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/devel:^5.1'&lt;br /&gt;
  composer require 'drupal/s3fs:^3.3'&lt;br /&gt;
  # composer require 'wasya-co/consent_popup: 1.0.4.x-dev'&lt;br /&gt;
  composer require 'drupal/consent_popup:^1.0'&lt;br /&gt;
  composer require 'drush/drush:^11.6'&lt;br /&gt;
  composer require 'drupal/metatag:^2.0'&lt;br /&gt;
  composer require 'drupal/redirect:^1.9'&lt;br /&gt;
  composer require 'drupal/superfish:^1.6'&lt;br /&gt;
  composer require 'drupal/webform:^6.0'&lt;br /&gt;
  composer require 'drupal/captcha:^1.14'&lt;br /&gt;
  composer require 'drupal/typed_data:^1.0@alpha'&lt;br /&gt;
  composer require 'drupal/rules:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smtp:^1.2'&lt;br /&gt;
  composer require 'drupal/hal:^1.0'&lt;br /&gt;
  composer require 'drupal/restui:^1.21'&lt;br /&gt;
  composer require 'drupal/keycloak:^2.2@beta'&lt;br /&gt;
  composer require 'drupal/nodeaccess:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/email_registration:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/content_access:^2.0'&lt;br /&gt;
  composer require 'drupal/social_media:^2.0'&lt;br /&gt;
  composer require 'drupal/wordpress_migrate:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/codefilter:^2.0'&lt;br /&gt;
  composer require 'drupal/views_taxonomy_term_name_depth:^7.2'&lt;br /&gt;
  composer require 'drupal/pathauto:^1.12'&lt;br /&gt;
  composer require 'drupal/twig_tweak:^3.3'&lt;br /&gt;
  composer require 'drupal/simplenews:^4.0'&lt;br /&gt;
  composer require 'drupal/ctools:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/commerce:^2.40' ## drupal 9.5&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    apt install php-bcmath php8.1-bcmath&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^1.1'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/commerce:^3.3'  ## drupal 10&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^2.2'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/linkit:^6.0'&lt;br /&gt;
  composer require 'drupal/redirect_after_login:^3.0'&lt;br /&gt;
  composer require 'drupal/symfony_mailer:^1.4'&lt;br /&gt;
  composer require 'drupal/custom_search:^1.0@beta'&lt;br /&gt;
  composer require 'drupal/fullcalendar_view:^5.2' &lt;br /&gt;
  composer require 'drupal/date_recur:^3.3@RC'&lt;br /&gt;
  composer require 'drupal/date_recur_modular:^3.1'&lt;br /&gt;
  composer require 'drupal/colorbox:2.0.2'&lt;br /&gt;
  composer require 'drupal/tagclouds:^2.0'&lt;br /&gt;
  composer require 'drupal/filelog:^3.0'&lt;br /&gt;
  composer require 'drupal/message:^1.6'&lt;br /&gt;
  composer require 'drupal/flag:^4.0@beta'&lt;br /&gt;
  composer require 'drupal/message_subscribe:^1.4'&lt;br /&gt;
  composer require 'drupal/message_digest:^1.5'&lt;br /&gt;
  composer require 'drupal/message_ui:^1.3'&lt;br /&gt;
  composer require 'drupal/layout_builder_usage_reports:^1.0'&lt;br /&gt;
  composer require 'drupal/views_tree:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/vote_up_down:^1.0@alpha'&lt;br /&gt;
    composer require 'drupal/votingapi:^3.0@beta'&lt;br /&gt;
  composer require 'drupal/formblock:^2.0@beta'&lt;br /&gt;
  composer require 'drupal/views_pdf:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/field_permissions:^1.4'&lt;br /&gt;
  composer require 'drupal/scheduler:^2.2'&lt;br /&gt;
  composer require 'drupal/simplenews_scheduler:^4.0@alpha'&lt;br /&gt;
  composer require 'drupal/insert_view:^2.1'&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  composer require 'drupal/keycloak:^1.8'&lt;br /&gt;
  composer require 'drupal/simple_oauth:^5.2'&lt;br /&gt;
  composer require 'drupal/group:^1.6'&lt;br /&gt;
    composer require 'drupal/group_join_link:^1.0'&lt;br /&gt;
  composer require 'drupal/social_auth:^4.1'&lt;br /&gt;
    composer require 'drupal/social_auth_google:^4.0' &lt;br /&gt;
    composer require 'drupal/social_auth_facebook:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_linkedin:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_microsoft:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/twilio:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smssystem:^1.1'&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require 'drupal/smsframework:^2.3'&lt;br /&gt;
  composer require symfony/dom-crawler symfony/css-selector&lt;br /&gt;
  composer require drupal/markdown&lt;br /&gt;
  composer require drupal/markdown_easy&lt;br /&gt;
  composer require 'drupal/crm_core:3.x-dev@dev'&lt;br /&gt;
  composer require 'drupal/name:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/dynamic_entity_reference:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/default_content:^2.0@beta'&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
  composer require 'drupal/single_content_sync:^1.4' ## yep its this one&lt;br /&gt;
  # composer require drupal/views_show_more ## I don't use it?&lt;br /&gt;
  composer require 'drupal/matomo:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/paragraphs:^1.20'&lt;br /&gt;
    composer require drupal/search_api_db&lt;br /&gt;
    composer require drupal/search_api&lt;br /&gt;
    composer require 'drupal/entity_usage:^2.0@beta'&lt;br /&gt;
    composer require drupal/entity_browser&lt;br /&gt;
&lt;br /&gt;
== evaluating ==&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/seo_checklist:^5.2'&lt;br /&gt;
  composer require 'drupal/yoast_seo:^1.9'&lt;br /&gt;
  composer require 'drupal/tvi:^2.0' ## From: https://www.drupal.org/project/tvi&lt;br /&gt;
  composer require 'drupal/advanced_text_formatter:^3.0@RC'&lt;br /&gt;
  composer require 'drupal/token_filter:^2.1'&lt;br /&gt;
  composer require 'drupal/form_mode_control:^2.4'&lt;br /&gt;
  composer require 'drupal/queue_mail:^1.7'&lt;br /&gt;
  composer require 'drupal/googlelogin-googlelogin:^9.5'&lt;br /&gt;
  composer require 'drupal/dark_mode_toggle:^1.0'&lt;br /&gt;
  composer require 'drupal/imce:^3.1'&lt;br /&gt;
  composer require 'drupal/bootstrap_barrio:^5.5'&lt;br /&gt;
&lt;br /&gt;
== not gonna use ==&lt;br /&gt;
  composer require 'drupal/backup_migrate:^5.1' ## was 5.0 ## so-so, unused&lt;br /&gt;
  composer require 'drupal/migrate_tools:^6.0' ## unused&lt;br /&gt;
  # composer require 'drupal/migrate_plus:^6.0' ## didn't need it the second time&lt;br /&gt;
&lt;br /&gt;
Not gonna use ebt_core, because (1) they have way too many modules, it should have been just one, and (2) their &amp;quot;hero&amp;quot; module doesn't honor container and isn't a hero.&lt;br /&gt;
&lt;br /&gt;
  # composer require 'drupal/layout_library:^1.0@beta' ## looks poor, just use blocks&lt;br /&gt;
  # composer require 'drupal/section_library:^2.0' ## looks poor, just use blocks&lt;br /&gt;
&lt;br /&gt;
== Upgrade 9 to 10 ==&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require drupal/core-recommended:^10 drupal/core-composer-scaffold:^10 drupal/core-project-message:^10 --update-with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
  composer update --with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
== Setting up dev environment ==&lt;br /&gt;
&lt;br /&gt;
* From: https://github.com/composer/composer/issues/9393&lt;br /&gt;
* From: https://www.drupal.org/docs/develop/automated-testing&lt;br /&gt;
* probably not useful: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/creating-functional-tests-simulated-browser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require --dev --no-update symfony/filesystem:4.4.42&lt;br /&gt;
  composer require --dev drupal/core-dev:9.5.11 --with-all-dependencies&lt;br /&gt;
    composer require --dev behat/mink jcalderonzumba/mink-phantomjs-driver&lt;br /&gt;
    composer update -W&lt;br /&gt;
    composer update symfony/filesystem:4.4.42 drush/drush -W&lt;br /&gt;
    composer require --dev drupal/core-dev -W&lt;br /&gt;
    composer require --dev phpspec/prophecy-phpunit:^2&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
Not useful:&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/examples:^4.0'&lt;br /&gt;
&lt;br /&gt;
== Configure s3fs ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,&lt;br /&gt;
    &amp;quot;Statement&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement0&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:ListBucket&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:ListBucketVersions&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement1&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:PutObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectAcl&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:PutObjectAcl&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;/*&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Disable caching ==&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/development-tools/disable-caching&lt;br /&gt;
&lt;br /&gt;
* Add the settings.local.php and&lt;br /&gt;
* Modify development.services.yml:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parameters:&lt;br /&gt;
  http.response.debug_cacheability_headers: true&lt;br /&gt;
  twig.config:&lt;br /&gt;
    debug: true&lt;br /&gt;
    auto_reload: true&lt;br /&gt;
    cache: false&lt;br /&gt;
services:&lt;br /&gt;
  cache.backend.null:&lt;br /&gt;
    class: Drupal\Core\Cache\NullBackendFactory&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== cleanup template debug ==&lt;br /&gt;
&lt;br /&gt;
Use in twig:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  |preg_replace('/&amp;lt;!--.*?--&amp;gt;/s','')|striptags|replace({&amp;quot;\n&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\r&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\t&amp;quot;:&amp;quot;&amp;quot;})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ReST ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
curl --include \&lt;br /&gt;
  --request POST \&lt;br /&gt;
  --user admin:&amp;lt;&amp;gt; \&lt;br /&gt;
  --header 'Content-type: application/hal+json' \&lt;br /&gt;
  http://pi.local/node?_format=hal_json \&lt;br /&gt;
  --data-binary '{&lt;br /&gt;
    &amp;quot;_links&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;http://pi.local/rest/type/node/article&amp;quot;}&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;title&amp;quot;:[{&amp;quot;value&amp;quot;:&amp;quot;Node +++ 123 bac +++&amp;quot; }],&lt;br /&gt;
    &amp;quot;body&amp;quot;:[{&amp;quot;value&amp;quot;: &amp;quot;&amp;lt;b&amp;gt;hello, wor&amp;lt;/b&amp;gt;ld!&amp;quot;, &amp;quot;format&amp;quot;: &amp;quot;full_html&amp;quot; }],&lt;br /&gt;
    &amp;quot;type&amp;quot;:[{&amp;quot;target_id&amp;quot;:&amp;quot;article&amp;quot;}],&lt;br /&gt;
    &amp;quot;status&amp;quot;: [{&amp;quot;value&amp;quot;: 1}],&lt;br /&gt;
    &amp;quot;_embedded&amp;quot;: {&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_issue&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;56229a95-d675-43e1-99b1-f9e11b5579c5&amp;quot; }] }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_tags&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;45646a7d-1a16-42e8-b758-f6e1c8d976f7&amp;quot; }] },&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;834e34e2-05ae-498d-b876-453798872ce1&amp;quot; }] }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  }'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Default Attachments ==&lt;br /&gt;
  txt pdf doc docx html csv xlsx xlsm sh json svg&lt;br /&gt;
  cer pem pub key kdbx&lt;br /&gt;
  png jpg jpeg gif&lt;br /&gt;
  mkv sfv avi mp3 mp4 webm mov&lt;br /&gt;
  zip tar gz&lt;br /&gt;
&lt;br /&gt;
== set password ==&lt;br /&gt;
&lt;br /&gt;
 drush user:password USERNAME NEW_PASSWORD&lt;br /&gt;
&lt;br /&gt;
== change ownership ==&lt;br /&gt;
&lt;br /&gt;
of all simplenews_issue &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval &amp;quot;&lt;br /&gt;
\$nids = \Drupal::entityQuery('node')&lt;br /&gt;
  -&amp;gt;condition('type', 'simplenews_issue')&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
\$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage('node');&lt;br /&gt;
\$nodes = \$storage-&amp;gt;loadMultiple(\$nids);&lt;br /&gt;
&lt;br /&gt;
foreach (\$nodes as \$node) {&lt;br /&gt;
  \$node-&amp;gt;setOwnerId(252);&lt;br /&gt;
  \$node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
of all content with &amp;quot;generated&amp;quot; in title:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval '&lt;br /&gt;
$nids = \Drupal::entityQuery(&amp;quot;node&amp;quot;)&lt;br /&gt;
  -&amp;gt;condition(&amp;quot;title&amp;quot;, &amp;quot;%enerated%&amp;quot;, &amp;quot;LIKE&amp;quot;)&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage(&amp;quot;node&amp;quot;);&lt;br /&gt;
$nodes = $storage-&amp;gt;loadMultiple($nids);&lt;br /&gt;
&lt;br /&gt;
foreach ($nodes as $node) {&lt;br /&gt;
  $node-&amp;gt;setOwnerId(129);&lt;br /&gt;
  $node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Updated &amp;quot; . count($nodes) . &amp;quot; nodes\n&amp;quot;;&lt;br /&gt;
'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Testing =&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/running-phpunit-tests&lt;br /&gt;
&lt;br /&gt;
For me, in my drupal images and containers, drupal is installed in the following folder, which is also my workdir:&lt;br /&gt;
&lt;br /&gt;
  WORKDIR /var/www/html&lt;br /&gt;
&lt;br /&gt;
The below is optional, I call the specific phpunit executable every time:&lt;br /&gt;
&lt;br /&gt;
  export PATH=&amp;quot;$PATH:/var/www/html/vendor/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You need to change minimum stability to &amp;quot;dev&amp;quot; for the testing libraries to be loaded.&lt;br /&gt;
&lt;br /&gt;
DO NOT RUN THIS IN PRODUCTION!&lt;br /&gt;
&lt;br /&gt;
  composer require --dev phpunit/phpunit # trash&lt;br /&gt;
    composer require --dev phpunit/phpunit:^9.5 --with-all-dependencies&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
    composer require --dev drupal/core-dev --update-with-all-dependencies # trash&lt;br /&gt;
  composer require --dev behat/mink:1.8.0 --with-all-dependencies&lt;br /&gt;
  composer require --dev symfony/phpunit-bridge&lt;br /&gt;
  composer require --dev phpspec/prophecy-phpunit&lt;br /&gt;
  composer require --dev behat/mink-browserkit-driver&lt;br /&gt;
&lt;br /&gt;
Copy and configure phpunit.xml:&lt;br /&gt;
&lt;br /&gt;
  phpunit --testsuite unit --filter CurrentUserBlock # trash?&lt;br /&gt;
  cd /var/www/html&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php -v --debug&lt;br /&gt;
&lt;br /&gt;
= update =&lt;br /&gt;
== 10 to 10 ==&lt;br /&gt;
  composer require \&lt;br /&gt;
  drupal/core-recommended:10.6.7 \&lt;br /&gt;
  drupal/core-composer-scaffold:10.6.7 \&lt;br /&gt;
  drupal/core-project-message:10.6.7 \&lt;br /&gt;
  --update-with-all-dependencies&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3454</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3454"/>
				<updated>2026-04-21T23:31:00Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: /* Configure Apache */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* A great book: https://drupalatyourfingertips.com&lt;br /&gt;
* How to clear cache: /devel/cache/clear&lt;br /&gt;
&lt;br /&gt;
= Install &amp;amp; Configure =&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:9.5.10 html&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:10.6.7 html&lt;br /&gt;
  composer update &amp;quot;drupal/core-*&amp;quot; --with-all-dependencies&lt;br /&gt;
  composer require drupal/core-recommended:10.6.7 drupal/core-composer-scaffold:10.6.7 drupal/core-project-message:10.6.7 --update-with-all-dependencies&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  drush cr&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/devel:^5.1'&lt;br /&gt;
  composer require 'drupal/s3fs:^3.3'&lt;br /&gt;
  # composer require 'wasya-co/consent_popup: 1.0.4.x-dev'&lt;br /&gt;
  composer require 'drupal/consent_popup:^1.0'&lt;br /&gt;
  composer require 'drush/drush:^11.6'&lt;br /&gt;
  composer require 'drupal/metatag:^2.0'&lt;br /&gt;
  composer require 'drupal/redirect:^1.9'&lt;br /&gt;
  composer require 'drupal/superfish:^1.6'&lt;br /&gt;
  composer require 'drupal/webform:^6.0'&lt;br /&gt;
  composer require 'drupal/captcha:^1.14'&lt;br /&gt;
  composer require 'drupal/typed_data:^1.0@alpha'&lt;br /&gt;
  composer require 'drupal/rules:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smtp:^1.2'&lt;br /&gt;
  composer require 'drupal/hal:^1.0'&lt;br /&gt;
  composer require 'drupal/restui:^1.21'&lt;br /&gt;
  composer require 'drupal/keycloak:^2.2@beta'&lt;br /&gt;
  composer require 'drupal/nodeaccess:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/email_registration:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/content_access:^2.0'&lt;br /&gt;
  composer require 'drupal/social_media:^2.0'&lt;br /&gt;
  composer require 'drupal/wordpress_migrate:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/codefilter:^2.0'&lt;br /&gt;
  composer require 'drupal/views_taxonomy_term_name_depth:^7.2'&lt;br /&gt;
  composer require 'drupal/pathauto:^1.12'&lt;br /&gt;
  composer require 'drupal/twig_tweak:^3.3'&lt;br /&gt;
  composer require 'drupal/simplenews:^4.0'&lt;br /&gt;
  composer require 'drupal/ctools:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/commerce:^2.40' ## drupal 9.5&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    apt install php-bcmath php8.1-bcmath&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^1.1'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/commerce:^3.3'  ## drupal 10&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^2.2'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/linkit:^6.0'&lt;br /&gt;
  composer require 'drupal/redirect_after_login:^3.0'&lt;br /&gt;
  composer require 'drupal/symfony_mailer:^1.4'&lt;br /&gt;
  composer require 'drupal/custom_search:^1.0@beta'&lt;br /&gt;
  composer require 'drupal/fullcalendar_view:^5.2' &lt;br /&gt;
  composer require 'drupal/date_recur:^3.3@RC'&lt;br /&gt;
  composer require 'drupal/date_recur_modular:^3.1'&lt;br /&gt;
  composer require 'drupal/colorbox:2.0.2'&lt;br /&gt;
  composer require 'drupal/tagclouds:^2.0'&lt;br /&gt;
  composer require 'drupal/filelog:^3.0'&lt;br /&gt;
  composer require 'drupal/message:^1.6'&lt;br /&gt;
  composer require 'drupal/flag:^4.0@beta'&lt;br /&gt;
  composer require 'drupal/message_subscribe:^1.4'&lt;br /&gt;
  composer require 'drupal/message_digest:^1.5'&lt;br /&gt;
  composer require 'drupal/message_ui:^1.3'&lt;br /&gt;
  composer require 'drupal/layout_builder_usage_reports:^1.0'&lt;br /&gt;
  composer require 'drupal/views_tree:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/vote_up_down:^1.0@alpha'&lt;br /&gt;
    composer require 'drupal/votingapi:^3.0@beta'&lt;br /&gt;
  composer require 'drupal/formblock:^2.0@beta'&lt;br /&gt;
  composer require 'drupal/views_pdf:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/field_permissions:^1.4'&lt;br /&gt;
  composer require 'drupal/scheduler:^2.2'&lt;br /&gt;
  composer require 'drupal/simplenews_scheduler:^4.0@alpha'&lt;br /&gt;
  composer require 'drupal/insert_view:^2.1'&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  composer require 'drupal/keycloak:^1.8'&lt;br /&gt;
  composer require 'drupal/simple_oauth:^5.2'&lt;br /&gt;
  composer require 'drupal/group:^1.6'&lt;br /&gt;
    composer require 'drupal/group_join_link:^1.0'&lt;br /&gt;
  composer require 'drupal/social_auth:^4.1'&lt;br /&gt;
    composer require 'drupal/social_auth_google:^4.0' &lt;br /&gt;
    composer require 'drupal/social_auth_facebook:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_linkedin:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_microsoft:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/twilio:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smssystem:^1.1'&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require 'drupal/smsframework:^2.3'&lt;br /&gt;
  composer require symfony/dom-crawler symfony/css-selector&lt;br /&gt;
  composer require drupal/markdown&lt;br /&gt;
  composer require drupal/markdown_easy&lt;br /&gt;
  composer require 'drupal/crm_core:3.x-dev@dev'&lt;br /&gt;
  composer require 'drupal/name:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/dynamic_entity_reference:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/default_content:^2.0@beta'&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
  composer require 'drupal/single_content_sync:^1.4' ## yep its this one&lt;br /&gt;
  # composer require drupal/views_show_more ## I don't use it?&lt;br /&gt;
  composer require 'drupal/matomo:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/paragraphs:^1.20'&lt;br /&gt;
&lt;br /&gt;
== evaluating ==&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/seo_checklist:^5.2'&lt;br /&gt;
  composer require 'drupal/yoast_seo:^1.9'&lt;br /&gt;
  composer require 'drupal/tvi:^2.0' ## From: https://www.drupal.org/project/tvi&lt;br /&gt;
  composer require 'drupal/advanced_text_formatter:^3.0@RC'&lt;br /&gt;
  composer require 'drupal/token_filter:^2.1'&lt;br /&gt;
  composer require 'drupal/form_mode_control:^2.4'&lt;br /&gt;
  composer require 'drupal/queue_mail:^1.7'&lt;br /&gt;
  composer require 'drupal/googlelogin-googlelogin:^9.5'&lt;br /&gt;
  composer require 'drupal/dark_mode_toggle:^1.0'&lt;br /&gt;
  composer require 'drupal/imce:^3.1'&lt;br /&gt;
  composer require 'drupal/bootstrap_barrio:^5.5'&lt;br /&gt;
&lt;br /&gt;
== not gonna use ==&lt;br /&gt;
  composer require 'drupal/backup_migrate:^5.1' ## was 5.0 ## so-so, unused&lt;br /&gt;
  composer require 'drupal/migrate_tools:^6.0' ## unused&lt;br /&gt;
  # composer require 'drupal/migrate_plus:^6.0' ## didn't need it the second time&lt;br /&gt;
&lt;br /&gt;
Not gonna use ebt_core, because (1) they have way too many modules, it should have been just one, and (2) their &amp;quot;hero&amp;quot; module doesn't honor container and isn't a hero.&lt;br /&gt;
&lt;br /&gt;
  # composer require 'drupal/layout_library:^1.0@beta' ## looks poor, just use blocks&lt;br /&gt;
  # composer require 'drupal/section_library:^2.0' ## looks poor, just use blocks&lt;br /&gt;
&lt;br /&gt;
== Upgrade 9 to 10 ==&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require drupal/core-recommended:^10 drupal/core-composer-scaffold:^10 drupal/core-project-message:^10 --update-with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
  composer update --with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
== Setting up dev environment ==&lt;br /&gt;
&lt;br /&gt;
* From: https://github.com/composer/composer/issues/9393&lt;br /&gt;
* From: https://www.drupal.org/docs/develop/automated-testing&lt;br /&gt;
* probably not useful: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/creating-functional-tests-simulated-browser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require --dev --no-update symfony/filesystem:4.4.42&lt;br /&gt;
  composer require --dev drupal/core-dev:9.5.11 --with-all-dependencies&lt;br /&gt;
    composer require --dev behat/mink jcalderonzumba/mink-phantomjs-driver&lt;br /&gt;
    composer update -W&lt;br /&gt;
    composer update symfony/filesystem:4.4.42 drush/drush -W&lt;br /&gt;
    composer require --dev drupal/core-dev -W&lt;br /&gt;
    composer require --dev phpspec/prophecy-phpunit:^2&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
Not useful:&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/examples:^4.0'&lt;br /&gt;
&lt;br /&gt;
== Configure s3fs ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,&lt;br /&gt;
    &amp;quot;Statement&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement0&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:ListBucket&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:ListBucketVersions&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement1&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:PutObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectAcl&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:PutObjectAcl&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;/*&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Disable caching ==&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/development-tools/disable-caching&lt;br /&gt;
&lt;br /&gt;
* Add the settings.local.php and&lt;br /&gt;
* Modify development.services.yml:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parameters:&lt;br /&gt;
  http.response.debug_cacheability_headers: true&lt;br /&gt;
  twig.config:&lt;br /&gt;
    debug: true&lt;br /&gt;
    auto_reload: true&lt;br /&gt;
    cache: false&lt;br /&gt;
services:&lt;br /&gt;
  cache.backend.null:&lt;br /&gt;
    class: Drupal\Core\Cache\NullBackendFactory&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== cleanup template debug ==&lt;br /&gt;
&lt;br /&gt;
Use in twig:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  |preg_replace('/&amp;lt;!--.*?--&amp;gt;/s','')|striptags|replace({&amp;quot;\n&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\r&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\t&amp;quot;:&amp;quot;&amp;quot;})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ReST ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
curl --include \&lt;br /&gt;
  --request POST \&lt;br /&gt;
  --user admin:&amp;lt;&amp;gt; \&lt;br /&gt;
  --header 'Content-type: application/hal+json' \&lt;br /&gt;
  http://pi.local/node?_format=hal_json \&lt;br /&gt;
  --data-binary '{&lt;br /&gt;
    &amp;quot;_links&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;http://pi.local/rest/type/node/article&amp;quot;}&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;title&amp;quot;:[{&amp;quot;value&amp;quot;:&amp;quot;Node +++ 123 bac +++&amp;quot; }],&lt;br /&gt;
    &amp;quot;body&amp;quot;:[{&amp;quot;value&amp;quot;: &amp;quot;&amp;lt;b&amp;gt;hello, wor&amp;lt;/b&amp;gt;ld!&amp;quot;, &amp;quot;format&amp;quot;: &amp;quot;full_html&amp;quot; }],&lt;br /&gt;
    &amp;quot;type&amp;quot;:[{&amp;quot;target_id&amp;quot;:&amp;quot;article&amp;quot;}],&lt;br /&gt;
    &amp;quot;status&amp;quot;: [{&amp;quot;value&amp;quot;: 1}],&lt;br /&gt;
    &amp;quot;_embedded&amp;quot;: {&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_issue&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;56229a95-d675-43e1-99b1-f9e11b5579c5&amp;quot; }] }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_tags&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;45646a7d-1a16-42e8-b758-f6e1c8d976f7&amp;quot; }] },&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;834e34e2-05ae-498d-b876-453798872ce1&amp;quot; }] }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  }'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Default Attachments ==&lt;br /&gt;
  txt pdf doc docx html csv xlsx xlsm sh json svg&lt;br /&gt;
  cer pem pub key kdbx&lt;br /&gt;
  png jpg jpeg gif&lt;br /&gt;
  mkv sfv avi mp3 mp4 webm mov&lt;br /&gt;
  zip tar gz&lt;br /&gt;
&lt;br /&gt;
== set password ==&lt;br /&gt;
&lt;br /&gt;
 drush user:password USERNAME NEW_PASSWORD&lt;br /&gt;
&lt;br /&gt;
== change ownership ==&lt;br /&gt;
&lt;br /&gt;
of all simplenews_issue &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval &amp;quot;&lt;br /&gt;
\$nids = \Drupal::entityQuery('node')&lt;br /&gt;
  -&amp;gt;condition('type', 'simplenews_issue')&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
\$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage('node');&lt;br /&gt;
\$nodes = \$storage-&amp;gt;loadMultiple(\$nids);&lt;br /&gt;
&lt;br /&gt;
foreach (\$nodes as \$node) {&lt;br /&gt;
  \$node-&amp;gt;setOwnerId(252);&lt;br /&gt;
  \$node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
of all content with &amp;quot;generated&amp;quot; in title:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval '&lt;br /&gt;
$nids = \Drupal::entityQuery(&amp;quot;node&amp;quot;)&lt;br /&gt;
  -&amp;gt;condition(&amp;quot;title&amp;quot;, &amp;quot;%enerated%&amp;quot;, &amp;quot;LIKE&amp;quot;)&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage(&amp;quot;node&amp;quot;);&lt;br /&gt;
$nodes = $storage-&amp;gt;loadMultiple($nids);&lt;br /&gt;
&lt;br /&gt;
foreach ($nodes as $node) {&lt;br /&gt;
  $node-&amp;gt;setOwnerId(129);&lt;br /&gt;
  $node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Updated &amp;quot; . count($nodes) . &amp;quot; nodes\n&amp;quot;;&lt;br /&gt;
'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Testing =&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/running-phpunit-tests&lt;br /&gt;
&lt;br /&gt;
For me, in my drupal images and containers, drupal is installed in the following folder, which is also my workdir:&lt;br /&gt;
&lt;br /&gt;
  WORKDIR /var/www/html&lt;br /&gt;
&lt;br /&gt;
The below is optional, I call the specific phpunit executable every time:&lt;br /&gt;
&lt;br /&gt;
  export PATH=&amp;quot;$PATH:/var/www/html/vendor/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You need to change minimum stability to &amp;quot;dev&amp;quot; for the testing libraries to be loaded.&lt;br /&gt;
&lt;br /&gt;
DO NOT RUN THIS IN PRODUCTION!&lt;br /&gt;
&lt;br /&gt;
  composer require --dev phpunit/phpunit # trash&lt;br /&gt;
    composer require --dev phpunit/phpunit:^9.5 --with-all-dependencies&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
    composer require --dev drupal/core-dev --update-with-all-dependencies # trash&lt;br /&gt;
  composer require --dev behat/mink:1.8.0 --with-all-dependencies&lt;br /&gt;
  composer require --dev symfony/phpunit-bridge&lt;br /&gt;
  composer require --dev phpspec/prophecy-phpunit&lt;br /&gt;
  composer require --dev behat/mink-browserkit-driver&lt;br /&gt;
&lt;br /&gt;
Copy and configure phpunit.xml:&lt;br /&gt;
&lt;br /&gt;
  phpunit --testsuite unit --filter CurrentUserBlock # trash?&lt;br /&gt;
  cd /var/www/html&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php -v --debug&lt;br /&gt;
&lt;br /&gt;
= update =&lt;br /&gt;
== 10 to 10 ==&lt;br /&gt;
  composer require \&lt;br /&gt;
  drupal/core-recommended:10.6.7 \&lt;br /&gt;
  drupal/core-composer-scaffold:10.6.7 \&lt;br /&gt;
  drupal/core-project-message:10.6.7 \&lt;br /&gt;
  --update-with-all-dependencies&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3453</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3453"/>
				<updated>2026-04-21T23:30:38Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* A great book: https://drupalatyourfingertips.com&lt;br /&gt;
* How to clear cache: /devel/cache/clear&lt;br /&gt;
&lt;br /&gt;
= Install &amp;amp; Configure =&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:9.5.10 html&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:10.6.7 html&lt;br /&gt;
  composer update &amp;quot;drupal/core-*&amp;quot; --with-all-dependencies&lt;br /&gt;
  composer require drupal/core-recommended:10.6.7 drupal/core-composer-scaffold:10.6.7 drupal/core-project-message:10.6.7 --update-with-all-dependencies&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  drush cr&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/devel:^5.1'&lt;br /&gt;
  composer require 'drupal/s3fs:^3.3'&lt;br /&gt;
  # composer require 'wasya-co/consent_popup: 1.0.4.x-dev'&lt;br /&gt;
  composer require 'drupal/consent_popup:^1.0'&lt;br /&gt;
  composer require 'drush/drush:^11.6'&lt;br /&gt;
  composer require 'drupal/metatag:^2.0'&lt;br /&gt;
  composer require 'drupal/redirect:^1.9'&lt;br /&gt;
  composer require 'drupal/superfish:^1.6'&lt;br /&gt;
  composer require 'drupal/webform:^6.0'&lt;br /&gt;
  composer require 'drupal/captcha:^1.14'&lt;br /&gt;
  composer require 'drupal/typed_data:^1.0@alpha'&lt;br /&gt;
  composer require 'drupal/rules:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smtp:^1.2'&lt;br /&gt;
  composer require 'drupal/hal:^1.0'&lt;br /&gt;
  composer require 'drupal/restui:^1.21'&lt;br /&gt;
  composer require 'drupal/keycloak:^2.2@beta'&lt;br /&gt;
  composer require 'drupal/nodeaccess:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/email_registration:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/content_access:^2.0'&lt;br /&gt;
  composer require 'drupal/social_media:^2.0'&lt;br /&gt;
  composer require 'drupal/wordpress_migrate:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/codefilter:^2.0'&lt;br /&gt;
  composer require 'drupal/views_taxonomy_term_name_depth:^7.2'&lt;br /&gt;
  composer require 'drupal/pathauto:^1.12'&lt;br /&gt;
  composer require 'drupal/twig_tweak:^3.3'&lt;br /&gt;
  composer require 'drupal/simplenews:^4.0'&lt;br /&gt;
  composer require 'drupal/ctools:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/commerce:^2.40' ## drupal 9.5&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    apt install php-bcmath php8.1-bcmath&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^1.1'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/commerce:^3.3'  ## drupal 10&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^2.2'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/linkit:^6.0'&lt;br /&gt;
  composer require 'drupal/redirect_after_login:^3.0'&lt;br /&gt;
  composer require 'drupal/symfony_mailer:^1.4'&lt;br /&gt;
  composer require 'drupal/custom_search:^1.0@beta'&lt;br /&gt;
  composer require 'drupal/fullcalendar_view:^5.2' &lt;br /&gt;
  composer require 'drupal/date_recur:^3.3@RC'&lt;br /&gt;
  composer require 'drupal/date_recur_modular:^3.1'&lt;br /&gt;
  composer require 'drupal/colorbox:2.0.2'&lt;br /&gt;
  composer require 'drupal/tagclouds:^2.0'&lt;br /&gt;
  composer require 'drupal/filelog:^3.0'&lt;br /&gt;
  composer require 'drupal/message:^1.6'&lt;br /&gt;
  composer require 'drupal/flag:^4.0@beta'&lt;br /&gt;
  composer require 'drupal/message_subscribe:^1.4'&lt;br /&gt;
  composer require 'drupal/message_digest:^1.5'&lt;br /&gt;
  composer require 'drupal/message_ui:^1.3'&lt;br /&gt;
  composer require 'drupal/layout_builder_usage_reports:^1.0'&lt;br /&gt;
  composer require 'drupal/views_tree:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/vote_up_down:^1.0@alpha'&lt;br /&gt;
    composer require 'drupal/votingapi:^3.0@beta'&lt;br /&gt;
  composer require 'drupal/formblock:^2.0@beta'&lt;br /&gt;
  composer require 'drupal/views_pdf:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/field_permissions:^1.4'&lt;br /&gt;
  composer require 'drupal/scheduler:^2.2'&lt;br /&gt;
  composer require 'drupal/simplenews_scheduler:^4.0@alpha'&lt;br /&gt;
  composer require 'drupal/insert_view:^2.1'&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  composer require 'drupal/keycloak:^1.8'&lt;br /&gt;
  composer require 'drupal/simple_oauth:^5.2'&lt;br /&gt;
  composer require 'drupal/group:^1.6'&lt;br /&gt;
    composer require 'drupal/group_join_link:^1.0'&lt;br /&gt;
  composer require 'drupal/social_auth:^4.1'&lt;br /&gt;
    composer require 'drupal/social_auth_google:^4.0' &lt;br /&gt;
    composer require 'drupal/social_auth_facebook:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_linkedin:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_microsoft:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/twilio:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smssystem:^1.1'&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require 'drupal/smsframework:^2.3'&lt;br /&gt;
  composer require symfony/dom-crawler symfony/css-selector&lt;br /&gt;
  composer require drupal/markdown&lt;br /&gt;
  composer require drupal/markdown_easy&lt;br /&gt;
  composer require 'drupal/crm_core:3.x-dev@dev'&lt;br /&gt;
  composer require 'drupal/name:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/dynamic_entity_reference:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/default_content:^2.0@beta'&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
  composer require 'drupal/single_content_sync:^1.4' ## yep its this one&lt;br /&gt;
  # composer require drupal/views_show_more ## I don't use it?&lt;br /&gt;
  composer require 'drupal/matomo:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/paragraphs:^1.20'&lt;br /&gt;
&lt;br /&gt;
== evaluating ==&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/seo_checklist:^5.2'&lt;br /&gt;
  composer require 'drupal/yoast_seo:^1.9'&lt;br /&gt;
  composer require 'drupal/tvi:^2.0' ## From: https://www.drupal.org/project/tvi&lt;br /&gt;
  composer require 'drupal/advanced_text_formatter:^3.0@RC'&lt;br /&gt;
  composer require 'drupal/token_filter:^2.1'&lt;br /&gt;
  composer require 'drupal/form_mode_control:^2.4'&lt;br /&gt;
  composer require 'drupal/queue_mail:^1.7'&lt;br /&gt;
  composer require 'drupal/googlelogin-googlelogin:^9.5'&lt;br /&gt;
  composer require 'drupal/dark_mode_toggle:^1.0'&lt;br /&gt;
  composer require 'drupal/imce:^3.1'&lt;br /&gt;
  composer require 'drupal/bootstrap_barrio:^5.5'&lt;br /&gt;
&lt;br /&gt;
== not gonna use ==&lt;br /&gt;
  composer require 'drupal/backup_migrate:^5.1' ## was 5.0 ## so-so, unused&lt;br /&gt;
  composer require 'drupal/migrate_tools:^6.0' ## unused&lt;br /&gt;
  # composer require 'drupal/migrate_plus:^6.0' ## didn't need it the second time&lt;br /&gt;
&lt;br /&gt;
Not gonna use ebt_core, because (1) they have way too many modules, it should have been just one, and (2) their &amp;quot;hero&amp;quot; module doesn't honor container and isn't a hero.&lt;br /&gt;
&lt;br /&gt;
  # composer require 'drupal/layout_library:^1.0@beta' ## looks poor, just use blocks&lt;br /&gt;
  # composer require 'drupal/section_library:^2.0' ## looks poor, just use blocks&lt;br /&gt;
&lt;br /&gt;
== Upgrade 9 to 10 ==&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require drupal/core-recommended:^10 drupal/core-composer-scaffold:^10 drupal/core-project-message:^10 --update-with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
  composer update --with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
== Setting up dev environment ==&lt;br /&gt;
&lt;br /&gt;
* From: https://github.com/composer/composer/issues/9393&lt;br /&gt;
* From: https://www.drupal.org/docs/develop/automated-testing&lt;br /&gt;
* probably not useful: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/creating-functional-tests-simulated-browser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require --dev --no-update symfony/filesystem:4.4.42&lt;br /&gt;
  composer require --dev drupal/core-dev:9.5.11 --with-all-dependencies&lt;br /&gt;
    composer require --dev behat/mink jcalderonzumba/mink-phantomjs-driver&lt;br /&gt;
    composer update -W&lt;br /&gt;
    composer update symfony/filesystem:4.4.42 drush/drush -W&lt;br /&gt;
    composer require --dev drupal/core-dev -W&lt;br /&gt;
    composer require --dev phpspec/prophecy-phpunit:^2&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
Not useful:&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/examples:^4.0'&lt;br /&gt;
&lt;br /&gt;
== Configure Apache ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Directory /var/www/&amp;gt;&lt;br /&gt;
    Options Indexes FollowSymLinks MultiViews&lt;br /&gt;
    AllowOverride All&lt;br /&gt;
    Order allow,deny&lt;br /&gt;
    allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure s3fs ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,&lt;br /&gt;
    &amp;quot;Statement&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement0&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:ListBucket&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:ListBucketVersions&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement1&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:PutObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectAcl&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:PutObjectAcl&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;/*&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Disable caching ==&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/development-tools/disable-caching&lt;br /&gt;
&lt;br /&gt;
* Add the settings.local.php and&lt;br /&gt;
* Modify development.services.yml:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parameters:&lt;br /&gt;
  http.response.debug_cacheability_headers: true&lt;br /&gt;
  twig.config:&lt;br /&gt;
    debug: true&lt;br /&gt;
    auto_reload: true&lt;br /&gt;
    cache: false&lt;br /&gt;
services:&lt;br /&gt;
  cache.backend.null:&lt;br /&gt;
    class: Drupal\Core\Cache\NullBackendFactory&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== cleanup template debug ==&lt;br /&gt;
&lt;br /&gt;
Use in twig:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  |preg_replace('/&amp;lt;!--.*?--&amp;gt;/s','')|striptags|replace({&amp;quot;\n&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\r&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\t&amp;quot;:&amp;quot;&amp;quot;})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ReST ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
curl --include \&lt;br /&gt;
  --request POST \&lt;br /&gt;
  --user admin:&amp;lt;&amp;gt; \&lt;br /&gt;
  --header 'Content-type: application/hal+json' \&lt;br /&gt;
  http://pi.local/node?_format=hal_json \&lt;br /&gt;
  --data-binary '{&lt;br /&gt;
    &amp;quot;_links&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;http://pi.local/rest/type/node/article&amp;quot;}&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;title&amp;quot;:[{&amp;quot;value&amp;quot;:&amp;quot;Node +++ 123 bac +++&amp;quot; }],&lt;br /&gt;
    &amp;quot;body&amp;quot;:[{&amp;quot;value&amp;quot;: &amp;quot;&amp;lt;b&amp;gt;hello, wor&amp;lt;/b&amp;gt;ld!&amp;quot;, &amp;quot;format&amp;quot;: &amp;quot;full_html&amp;quot; }],&lt;br /&gt;
    &amp;quot;type&amp;quot;:[{&amp;quot;target_id&amp;quot;:&amp;quot;article&amp;quot;}],&lt;br /&gt;
    &amp;quot;status&amp;quot;: [{&amp;quot;value&amp;quot;: 1}],&lt;br /&gt;
    &amp;quot;_embedded&amp;quot;: {&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_issue&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;56229a95-d675-43e1-99b1-f9e11b5579c5&amp;quot; }] }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_tags&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;45646a7d-1a16-42e8-b758-f6e1c8d976f7&amp;quot; }] },&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;834e34e2-05ae-498d-b876-453798872ce1&amp;quot; }] }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  }'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Default Attachments ==&lt;br /&gt;
  txt pdf doc docx html csv xlsx xlsm sh json svg&lt;br /&gt;
  cer pem pub key kdbx&lt;br /&gt;
  png jpg jpeg gif&lt;br /&gt;
  mkv sfv avi mp3 mp4 webm mov&lt;br /&gt;
  zip tar gz&lt;br /&gt;
&lt;br /&gt;
== set password ==&lt;br /&gt;
&lt;br /&gt;
 drush user:password USERNAME NEW_PASSWORD&lt;br /&gt;
&lt;br /&gt;
== change ownership ==&lt;br /&gt;
&lt;br /&gt;
of all simplenews_issue &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval &amp;quot;&lt;br /&gt;
\$nids = \Drupal::entityQuery('node')&lt;br /&gt;
  -&amp;gt;condition('type', 'simplenews_issue')&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
\$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage('node');&lt;br /&gt;
\$nodes = \$storage-&amp;gt;loadMultiple(\$nids);&lt;br /&gt;
&lt;br /&gt;
foreach (\$nodes as \$node) {&lt;br /&gt;
  \$node-&amp;gt;setOwnerId(252);&lt;br /&gt;
  \$node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
of all content with &amp;quot;generated&amp;quot; in title:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval '&lt;br /&gt;
$nids = \Drupal::entityQuery(&amp;quot;node&amp;quot;)&lt;br /&gt;
  -&amp;gt;condition(&amp;quot;title&amp;quot;, &amp;quot;%enerated%&amp;quot;, &amp;quot;LIKE&amp;quot;)&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage(&amp;quot;node&amp;quot;);&lt;br /&gt;
$nodes = $storage-&amp;gt;loadMultiple($nids);&lt;br /&gt;
&lt;br /&gt;
foreach ($nodes as $node) {&lt;br /&gt;
  $node-&amp;gt;setOwnerId(129);&lt;br /&gt;
  $node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Updated &amp;quot; . count($nodes) . &amp;quot; nodes\n&amp;quot;;&lt;br /&gt;
'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Testing =&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/running-phpunit-tests&lt;br /&gt;
&lt;br /&gt;
For me, in my drupal images and containers, drupal is installed in the following folder, which is also my workdir:&lt;br /&gt;
&lt;br /&gt;
  WORKDIR /var/www/html&lt;br /&gt;
&lt;br /&gt;
The below is optional, I call the specific phpunit executable every time:&lt;br /&gt;
&lt;br /&gt;
  export PATH=&amp;quot;$PATH:/var/www/html/vendor/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You need to change minimum stability to &amp;quot;dev&amp;quot; for the testing libraries to be loaded.&lt;br /&gt;
&lt;br /&gt;
DO NOT RUN THIS IN PRODUCTION!&lt;br /&gt;
&lt;br /&gt;
  composer require --dev phpunit/phpunit # trash&lt;br /&gt;
    composer require --dev phpunit/phpunit:^9.5 --with-all-dependencies&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
    composer require --dev drupal/core-dev --update-with-all-dependencies # trash&lt;br /&gt;
  composer require --dev behat/mink:1.8.0 --with-all-dependencies&lt;br /&gt;
  composer require --dev symfony/phpunit-bridge&lt;br /&gt;
  composer require --dev phpspec/prophecy-phpunit&lt;br /&gt;
  composer require --dev behat/mink-browserkit-driver&lt;br /&gt;
&lt;br /&gt;
Copy and configure phpunit.xml:&lt;br /&gt;
&lt;br /&gt;
  phpunit --testsuite unit --filter CurrentUserBlock # trash?&lt;br /&gt;
  cd /var/www/html&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php -v --debug&lt;br /&gt;
&lt;br /&gt;
= update =&lt;br /&gt;
== 10 to 10 ==&lt;br /&gt;
  composer require \&lt;br /&gt;
  drupal/core-recommended:10.6.7 \&lt;br /&gt;
  drupal/core-composer-scaffold:10.6.7 \&lt;br /&gt;
  drupal/core-project-message:10.6.7 \&lt;br /&gt;
  --update-with-all-dependencies&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3452</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3452"/>
				<updated>2026-04-21T23:23:55Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: /* evaluating */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* A great book: https://drupalatyourfingertips.com&lt;br /&gt;
* How to clear cache: /devel/cache/clear&lt;br /&gt;
&lt;br /&gt;
= Install &amp;amp; Configure =&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:9.5.10 html&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:10.6.7 html&lt;br /&gt;
  composer update &amp;quot;drupal/core-*&amp;quot; --with-all-dependencies&lt;br /&gt;
  composer require drupal/core-recommended:10.6.7 drupal/core-composer-scaffold:10.6.7 drupal/core-project-message:10.6.7 --update-with-all-dependencies&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  drush cr&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/devel:^5.1'&lt;br /&gt;
  composer require 'drupal/s3fs:^3.3'&lt;br /&gt;
  # composer require 'wasya-co/consent_popup: 1.0.4.x-dev'&lt;br /&gt;
  composer require 'drupal/consent_popup:^1.0'&lt;br /&gt;
  composer require 'drush/drush:^11.6'&lt;br /&gt;
  composer require 'drupal/metatag:^2.0'&lt;br /&gt;
  composer require 'drupal/redirect:^1.9'&lt;br /&gt;
  composer require 'drupal/superfish:^1.6'&lt;br /&gt;
  composer require 'drupal/webform:^6.0'&lt;br /&gt;
  composer require 'drupal/captcha:^1.14'&lt;br /&gt;
  composer require 'drupal/typed_data:^1.0@alpha'&lt;br /&gt;
  composer require 'drupal/rules:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smtp:^1.2'&lt;br /&gt;
  composer require 'drupal/hal:^1.0'&lt;br /&gt;
  composer require 'drupal/restui:^1.21'&lt;br /&gt;
  composer require 'drupal/keycloak:^2.2@beta'&lt;br /&gt;
  composer require 'drupal/nodeaccess:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/backup_migrate:^5.1' ## was 5.0&lt;br /&gt;
  composer require 'drupal/email_registration:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/content_access:^2.0'&lt;br /&gt;
  composer require 'drupal/social_media:^2.0'&lt;br /&gt;
  composer require 'drupal/wordpress_migrate:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/migrate_tools:^6.0'&lt;br /&gt;
  composer require 'drupal/codefilter:^2.0'&lt;br /&gt;
  composer require 'drupal/views_taxonomy_term_name_depth:^7.2'&lt;br /&gt;
  composer require 'drupal/pathauto:^1.12'&lt;br /&gt;
  composer require 'drupal/twig_tweak:^3.3'&lt;br /&gt;
  composer require 'drupal/simplenews:^4.0'&lt;br /&gt;
    # composer require 'drupal/migrate_plus:^6.0' ## didn't need it the second time&lt;br /&gt;
  composer require 'drupal/ctools:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/commerce:^2.40' ## drupal 9.5&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    apt install php-bcmath php8.1-bcmath&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^1.1'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/commerce:^3.3'  ## drupal 10&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^2.2'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/linkit:^6.0'&lt;br /&gt;
  composer require 'drupal/redirect_after_login:^3.0'&lt;br /&gt;
  composer require 'drupal/symfony_mailer:^1.4'&lt;br /&gt;
  composer require 'drupal/custom_search:^1.0@beta'&lt;br /&gt;
  composer require 'drupal/fullcalendar_view:^5.2' &lt;br /&gt;
  composer require 'drupal/date_recur:^3.3@RC'&lt;br /&gt;
  composer require 'drupal/date_recur_modular:^3.1'&lt;br /&gt;
  composer require 'drupal/colorbox:2.0.2'&lt;br /&gt;
  composer require 'drupal/tagclouds:^2.0'&lt;br /&gt;
  composer require 'drupal/filelog:^3.0'&lt;br /&gt;
  composer require 'drupal/message:^1.6'&lt;br /&gt;
  composer require 'drupal/flag:^4.0@beta'&lt;br /&gt;
  composer require 'drupal/message_subscribe:^1.4'&lt;br /&gt;
  composer require 'drupal/message_digest:^1.5'&lt;br /&gt;
  composer require 'drupal/message_ui:^1.3'&lt;br /&gt;
  composer require 'drupal/layout_builder_usage_reports:^1.0'&lt;br /&gt;
  composer require 'drupal/views_tree:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/vote_up_down:^1.0@alpha'&lt;br /&gt;
    composer require 'drupal/votingapi:^3.0@beta'&lt;br /&gt;
  composer require 'drupal/formblock:^2.0@beta'&lt;br /&gt;
  composer require 'drupal/views_pdf:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/field_permissions:^1.4'&lt;br /&gt;
  composer require 'drupal/scheduler:^2.2'&lt;br /&gt;
  composer require 'drupal/simplenews_scheduler:^4.0@alpha'&lt;br /&gt;
  composer require 'drupal/insert_view:^2.1'&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  composer require 'drupal/keycloak:^1.8'&lt;br /&gt;
  composer require 'drupal/simple_oauth:^5.2'&lt;br /&gt;
  composer require 'drupal/group:^1.6'&lt;br /&gt;
    composer require 'drupal/group_join_link:^1.0'&lt;br /&gt;
  composer require 'drupal/social_auth:^4.1'&lt;br /&gt;
    composer require 'drupal/social_auth_google:^4.0' &lt;br /&gt;
    composer require 'drupal/social_auth_facebook:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_linkedin:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_microsoft:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/twilio:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smssystem:^1.1'&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require 'drupal/smsframework:^2.3'&lt;br /&gt;
  composer require symfony/dom-crawler symfony/css-selector&lt;br /&gt;
  composer require drupal/markdown&lt;br /&gt;
  composer require drupal/markdown_easy&lt;br /&gt;
  composer require 'drupal/crm_core:3.x-dev@dev'&lt;br /&gt;
  composer require 'drupal/name:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/dynamic_entity_reference:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/default_content:^2.0@beta'&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
  composer require 'drupal/single_content_sync:^1.4' ## yep its this one&lt;br /&gt;
  # composer require drupal/views_show_more ## I don't use it?&lt;br /&gt;
  composer require 'drupal/matomo:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/paragraphs:^1.20'&lt;br /&gt;
&lt;br /&gt;
== evaluating ==&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/seo_checklist:^5.2'&lt;br /&gt;
  composer require 'drupal/yoast_seo:^1.9'&lt;br /&gt;
  composer require 'drupal/tvi:^2.0' ## From: https://www.drupal.org/project/tvi&lt;br /&gt;
  composer require 'drupal/advanced_text_formatter:^3.0@RC'&lt;br /&gt;
  composer require 'drupal/token_filter:^2.1'&lt;br /&gt;
  composer require 'drupal/form_mode_control:^2.4'&lt;br /&gt;
  composer require 'drupal/queue_mail:^1.7'&lt;br /&gt;
  composer require 'drupal/googlelogin-googlelogin:^9.5'&lt;br /&gt;
  composer require 'drupal/dark_mode_toggle:^1.0'&lt;br /&gt;
  composer require 'drupal/imce:^3.1'&lt;br /&gt;
  composer require 'drupal/bootstrap_barrio:^5.5'&lt;br /&gt;
&lt;br /&gt;
Not gonna use ebt_core, because (1) they have way too many modules, it should have been just one, and (2) their &amp;quot;hero&amp;quot; module doesn't honor container and isn't a hero.&lt;br /&gt;
&lt;br /&gt;
  # composer require 'drupal/layout_library:^1.0@beta' ## looks poor, just use blocks&lt;br /&gt;
  # composer require 'drupal/section_library:^2.0' ## looks poor, just use blocks&lt;br /&gt;
&lt;br /&gt;
== Upgrade 9 to 10 ==&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require drupal/core-recommended:^10 drupal/core-composer-scaffold:^10 drupal/core-project-message:^10 --update-with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
  composer update --with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
== Setting up dev environment ==&lt;br /&gt;
&lt;br /&gt;
* From: https://github.com/composer/composer/issues/9393&lt;br /&gt;
* From: https://www.drupal.org/docs/develop/automated-testing&lt;br /&gt;
* probably not useful: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/creating-functional-tests-simulated-browser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require --dev --no-update symfony/filesystem:4.4.42&lt;br /&gt;
  composer require --dev drupal/core-dev:9.5.11 --with-all-dependencies&lt;br /&gt;
    composer require --dev behat/mink jcalderonzumba/mink-phantomjs-driver&lt;br /&gt;
    composer update -W&lt;br /&gt;
    composer update symfony/filesystem:4.4.42 drush/drush -W&lt;br /&gt;
    composer require --dev drupal/core-dev -W&lt;br /&gt;
    composer require --dev phpspec/prophecy-phpunit:^2&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
Not useful:&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/examples:^4.0'&lt;br /&gt;
&lt;br /&gt;
== Configure Apache ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Directory /var/www/&amp;gt;&lt;br /&gt;
    Options Indexes FollowSymLinks MultiViews&lt;br /&gt;
    AllowOverride All&lt;br /&gt;
    Order allow,deny&lt;br /&gt;
    allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure s3fs ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,&lt;br /&gt;
    &amp;quot;Statement&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement0&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:ListBucket&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:ListBucketVersions&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement1&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:PutObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectAcl&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:PutObjectAcl&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;/*&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Disable caching ==&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/development-tools/disable-caching&lt;br /&gt;
&lt;br /&gt;
* Add the settings.local.php and&lt;br /&gt;
* Modify development.services.yml:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parameters:&lt;br /&gt;
  http.response.debug_cacheability_headers: true&lt;br /&gt;
  twig.config:&lt;br /&gt;
    debug: true&lt;br /&gt;
    auto_reload: true&lt;br /&gt;
    cache: false&lt;br /&gt;
services:&lt;br /&gt;
  cache.backend.null:&lt;br /&gt;
    class: Drupal\Core\Cache\NullBackendFactory&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== cleanup template debug ==&lt;br /&gt;
&lt;br /&gt;
Use in twig:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  |preg_replace('/&amp;lt;!--.*?--&amp;gt;/s','')|striptags|replace({&amp;quot;\n&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\r&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\t&amp;quot;:&amp;quot;&amp;quot;})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ReST ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
curl --include \&lt;br /&gt;
  --request POST \&lt;br /&gt;
  --user admin:&amp;lt;&amp;gt; \&lt;br /&gt;
  --header 'Content-type: application/hal+json' \&lt;br /&gt;
  http://pi.local/node?_format=hal_json \&lt;br /&gt;
  --data-binary '{&lt;br /&gt;
    &amp;quot;_links&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;http://pi.local/rest/type/node/article&amp;quot;}&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;title&amp;quot;:[{&amp;quot;value&amp;quot;:&amp;quot;Node +++ 123 bac +++&amp;quot; }],&lt;br /&gt;
    &amp;quot;body&amp;quot;:[{&amp;quot;value&amp;quot;: &amp;quot;&amp;lt;b&amp;gt;hello, wor&amp;lt;/b&amp;gt;ld!&amp;quot;, &amp;quot;format&amp;quot;: &amp;quot;full_html&amp;quot; }],&lt;br /&gt;
    &amp;quot;type&amp;quot;:[{&amp;quot;target_id&amp;quot;:&amp;quot;article&amp;quot;}],&lt;br /&gt;
    &amp;quot;status&amp;quot;: [{&amp;quot;value&amp;quot;: 1}],&lt;br /&gt;
    &amp;quot;_embedded&amp;quot;: {&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_issue&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;56229a95-d675-43e1-99b1-f9e11b5579c5&amp;quot; }] }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_tags&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;45646a7d-1a16-42e8-b758-f6e1c8d976f7&amp;quot; }] },&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;834e34e2-05ae-498d-b876-453798872ce1&amp;quot; }] }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  }'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Default Attachments ==&lt;br /&gt;
  txt pdf doc docx html csv xlsx xlsm sh json svg&lt;br /&gt;
  cer pem pub key kdbx&lt;br /&gt;
  png jpg jpeg gif&lt;br /&gt;
  mkv sfv avi mp3 mp4 webm mov&lt;br /&gt;
  zip tar gz&lt;br /&gt;
&lt;br /&gt;
== set password ==&lt;br /&gt;
&lt;br /&gt;
 drush user:password USERNAME NEW_PASSWORD&lt;br /&gt;
&lt;br /&gt;
== change ownership ==&lt;br /&gt;
&lt;br /&gt;
of all simplenews_issue &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval &amp;quot;&lt;br /&gt;
\$nids = \Drupal::entityQuery('node')&lt;br /&gt;
  -&amp;gt;condition('type', 'simplenews_issue')&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
\$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage('node');&lt;br /&gt;
\$nodes = \$storage-&amp;gt;loadMultiple(\$nids);&lt;br /&gt;
&lt;br /&gt;
foreach (\$nodes as \$node) {&lt;br /&gt;
  \$node-&amp;gt;setOwnerId(252);&lt;br /&gt;
  \$node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
of all content with &amp;quot;generated&amp;quot; in title:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval '&lt;br /&gt;
$nids = \Drupal::entityQuery(&amp;quot;node&amp;quot;)&lt;br /&gt;
  -&amp;gt;condition(&amp;quot;title&amp;quot;, &amp;quot;%enerated%&amp;quot;, &amp;quot;LIKE&amp;quot;)&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage(&amp;quot;node&amp;quot;);&lt;br /&gt;
$nodes = $storage-&amp;gt;loadMultiple($nids);&lt;br /&gt;
&lt;br /&gt;
foreach ($nodes as $node) {&lt;br /&gt;
  $node-&amp;gt;setOwnerId(129);&lt;br /&gt;
  $node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Updated &amp;quot; . count($nodes) . &amp;quot; nodes\n&amp;quot;;&lt;br /&gt;
'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Testing =&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/running-phpunit-tests&lt;br /&gt;
&lt;br /&gt;
For me, in my drupal images and containers, drupal is installed in the following folder, which is also my workdir:&lt;br /&gt;
&lt;br /&gt;
  WORKDIR /var/www/html&lt;br /&gt;
&lt;br /&gt;
The below is optional, I call the specific phpunit executable every time:&lt;br /&gt;
&lt;br /&gt;
  export PATH=&amp;quot;$PATH:/var/www/html/vendor/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You need to change minimum stability to &amp;quot;dev&amp;quot; for the testing libraries to be loaded.&lt;br /&gt;
&lt;br /&gt;
DO NOT RUN THIS IN PRODUCTION!&lt;br /&gt;
&lt;br /&gt;
  composer require --dev phpunit/phpunit # trash&lt;br /&gt;
    composer require --dev phpunit/phpunit:^9.5 --with-all-dependencies&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
    composer require --dev drupal/core-dev --update-with-all-dependencies # trash&lt;br /&gt;
  composer require --dev behat/mink:1.8.0 --with-all-dependencies&lt;br /&gt;
  composer require --dev symfony/phpunit-bridge&lt;br /&gt;
  composer require --dev phpspec/prophecy-phpunit&lt;br /&gt;
  composer require --dev behat/mink-browserkit-driver&lt;br /&gt;
&lt;br /&gt;
Copy and configure phpunit.xml:&lt;br /&gt;
&lt;br /&gt;
  phpunit --testsuite unit --filter CurrentUserBlock # trash?&lt;br /&gt;
  cd /var/www/html&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php -v --debug&lt;br /&gt;
&lt;br /&gt;
= update =&lt;br /&gt;
== 10 to 10 ==&lt;br /&gt;
  composer require \&lt;br /&gt;
  drupal/core-recommended:10.6.7 \&lt;br /&gt;
  drupal/core-composer-scaffold:10.6.7 \&lt;br /&gt;
  drupal/core-project-message:10.6.7 \&lt;br /&gt;
  --update-with-all-dependencies&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3451</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3451"/>
				<updated>2026-04-21T23:00:44Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: /* Install &amp;amp; Configure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* A great book: https://drupalatyourfingertips.com&lt;br /&gt;
* How to clear cache: /devel/cache/clear&lt;br /&gt;
&lt;br /&gt;
= Install &amp;amp; Configure =&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:9.5.10 html&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:10.6.7 html&lt;br /&gt;
  composer update &amp;quot;drupal/core-*&amp;quot; --with-all-dependencies&lt;br /&gt;
  composer require drupal/core-recommended:10.6.7 drupal/core-composer-scaffold:10.6.7 drupal/core-project-message:10.6.7 --update-with-all-dependencies&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  drush cr&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/devel:^5.1'&lt;br /&gt;
  composer require 'drupal/s3fs:^3.3'&lt;br /&gt;
  # composer require 'wasya-co/consent_popup: 1.0.4.x-dev'&lt;br /&gt;
  composer require 'drupal/consent_popup:^1.0'&lt;br /&gt;
  composer require 'drush/drush:^11.6'&lt;br /&gt;
  composer require 'drupal/metatag:^2.0'&lt;br /&gt;
  composer require 'drupal/redirect:^1.9'&lt;br /&gt;
  composer require 'drupal/superfish:^1.6'&lt;br /&gt;
  composer require 'drupal/webform:^6.0'&lt;br /&gt;
  composer require 'drupal/captcha:^1.14'&lt;br /&gt;
  composer require 'drupal/typed_data:^1.0@alpha'&lt;br /&gt;
  composer require 'drupal/rules:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smtp:^1.2'&lt;br /&gt;
  composer require 'drupal/hal:^1.0'&lt;br /&gt;
  composer require 'drupal/restui:^1.21'&lt;br /&gt;
  composer require 'drupal/keycloak:^2.2@beta'&lt;br /&gt;
  composer require 'drupal/nodeaccess:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/backup_migrate:^5.1' ## was 5.0&lt;br /&gt;
  composer require 'drupal/email_registration:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/content_access:^2.0'&lt;br /&gt;
  composer require 'drupal/social_media:^2.0'&lt;br /&gt;
  composer require 'drupal/wordpress_migrate:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/migrate_tools:^6.0'&lt;br /&gt;
  composer require 'drupal/codefilter:^2.0'&lt;br /&gt;
  composer require 'drupal/views_taxonomy_term_name_depth:^7.2'&lt;br /&gt;
  composer require 'drupal/pathauto:^1.12'&lt;br /&gt;
  composer require 'drupal/twig_tweak:^3.3'&lt;br /&gt;
  composer require 'drupal/simplenews:^4.0'&lt;br /&gt;
    # composer require 'drupal/migrate_plus:^6.0' ## didn't need it the second time&lt;br /&gt;
  composer require 'drupal/ctools:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/commerce:^2.40' ## drupal 9.5&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    apt install php-bcmath php8.1-bcmath&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^1.1'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/commerce:^3.3'  ## drupal 10&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^2.2'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/linkit:^6.0'&lt;br /&gt;
  composer require 'drupal/redirect_after_login:^3.0'&lt;br /&gt;
  composer require 'drupal/symfony_mailer:^1.4'&lt;br /&gt;
  composer require 'drupal/custom_search:^1.0@beta'&lt;br /&gt;
  composer require 'drupal/fullcalendar_view:^5.2' &lt;br /&gt;
  composer require 'drupal/date_recur:^3.3@RC'&lt;br /&gt;
  composer require 'drupal/date_recur_modular:^3.1'&lt;br /&gt;
  composer require 'drupal/colorbox:2.0.2'&lt;br /&gt;
  composer require 'drupal/tagclouds:^2.0'&lt;br /&gt;
  composer require 'drupal/filelog:^3.0'&lt;br /&gt;
  composer require 'drupal/message:^1.6'&lt;br /&gt;
  composer require 'drupal/flag:^4.0@beta'&lt;br /&gt;
  composer require 'drupal/message_subscribe:^1.4'&lt;br /&gt;
  composer require 'drupal/message_digest:^1.5'&lt;br /&gt;
  composer require 'drupal/message_ui:^1.3'&lt;br /&gt;
  composer require 'drupal/layout_builder_usage_reports:^1.0'&lt;br /&gt;
  composer require 'drupal/views_tree:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/vote_up_down:^1.0@alpha'&lt;br /&gt;
    composer require 'drupal/votingapi:^3.0@beta'&lt;br /&gt;
  composer require 'drupal/formblock:^2.0@beta'&lt;br /&gt;
  composer require 'drupal/views_pdf:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/field_permissions:^1.4'&lt;br /&gt;
  composer require 'drupal/scheduler:^2.2'&lt;br /&gt;
  composer require 'drupal/simplenews_scheduler:^4.0@alpha'&lt;br /&gt;
  composer require 'drupal/insert_view:^2.1'&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  composer require 'drupal/keycloak:^1.8'&lt;br /&gt;
  composer require 'drupal/simple_oauth:^5.2'&lt;br /&gt;
  composer require 'drupal/group:^1.6'&lt;br /&gt;
    composer require 'drupal/group_join_link:^1.0'&lt;br /&gt;
  composer require 'drupal/social_auth:^4.1'&lt;br /&gt;
    composer require 'drupal/social_auth_google:^4.0' &lt;br /&gt;
    composer require 'drupal/social_auth_facebook:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_linkedin:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_microsoft:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/twilio:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smssystem:^1.1'&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require 'drupal/smsframework:^2.3'&lt;br /&gt;
  composer require symfony/dom-crawler symfony/css-selector&lt;br /&gt;
  composer require drupal/markdown&lt;br /&gt;
  composer require drupal/markdown_easy&lt;br /&gt;
  composer require 'drupal/crm_core:3.x-dev@dev'&lt;br /&gt;
  composer require 'drupal/name:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/dynamic_entity_reference:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/default_content:^2.0@beta'&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
  composer require 'drupal/single_content_sync:^1.4' ## yep its this one&lt;br /&gt;
  # composer require drupal/views_show_more ## I don't use it?&lt;br /&gt;
  composer require 'drupal/matomo:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/paragraphs:^1.20'&lt;br /&gt;
&lt;br /&gt;
=== evaluating ===&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/seo_checklist:^5.2'&lt;br /&gt;
  composer require 'drupal/yoast_seo:^1.9'&lt;br /&gt;
  composer require 'drupal/tvi:^2.0' ## From: https://www.drupal.org/project/tvi&lt;br /&gt;
  composer require 'drupal/advanced_text_formatter:^3.0@RC'&lt;br /&gt;
  composer require 'drupal/token_filter:^2.1'&lt;br /&gt;
  composer require 'drupal/form_mode_control:^2.4'&lt;br /&gt;
  composer require 'drupal/queue_mail:^1.7'&lt;br /&gt;
  composer require 'drupal/googlelogin-googlelogin:^9.5'&lt;br /&gt;
  composer require 'drupal/dark_mode_toggle:^1.0'&lt;br /&gt;
  composer require 'drupal/imce:^3.1'&lt;br /&gt;
&lt;br /&gt;
Not gonna use ebt_core, because (1) they have way too many modules, it should have been just one, and (2) their &amp;quot;hero&amp;quot; module doesn't honor container and isn't a hero.&lt;br /&gt;
&lt;br /&gt;
  # composer require 'drupal/layout_library:^1.0@beta' ## looks poor, just use blocks&lt;br /&gt;
  # composer require 'drupal/section_library:^2.0' ## looks poor, just use blocks&lt;br /&gt;
&lt;br /&gt;
== Upgrade 9 to 10 ==&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require drupal/core-recommended:^10 drupal/core-composer-scaffold:^10 drupal/core-project-message:^10 --update-with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
  composer update --with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
== Setting up dev environment ==&lt;br /&gt;
&lt;br /&gt;
* From: https://github.com/composer/composer/issues/9393&lt;br /&gt;
* From: https://www.drupal.org/docs/develop/automated-testing&lt;br /&gt;
* probably not useful: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/creating-functional-tests-simulated-browser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require --dev --no-update symfony/filesystem:4.4.42&lt;br /&gt;
  composer require --dev drupal/core-dev:9.5.11 --with-all-dependencies&lt;br /&gt;
    composer require --dev behat/mink jcalderonzumba/mink-phantomjs-driver&lt;br /&gt;
    composer update -W&lt;br /&gt;
    composer update symfony/filesystem:4.4.42 drush/drush -W&lt;br /&gt;
    composer require --dev drupal/core-dev -W&lt;br /&gt;
    composer require --dev phpspec/prophecy-phpunit:^2&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
Not useful:&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/examples:^4.0'&lt;br /&gt;
&lt;br /&gt;
== Configure Apache ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Directory /var/www/&amp;gt;&lt;br /&gt;
    Options Indexes FollowSymLinks MultiViews&lt;br /&gt;
    AllowOverride All&lt;br /&gt;
    Order allow,deny&lt;br /&gt;
    allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure s3fs ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,&lt;br /&gt;
    &amp;quot;Statement&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement0&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:ListBucket&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:ListBucketVersions&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement1&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:PutObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectAcl&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:PutObjectAcl&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;/*&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Disable caching ==&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/development-tools/disable-caching&lt;br /&gt;
&lt;br /&gt;
* Add the settings.local.php and&lt;br /&gt;
* Modify development.services.yml:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parameters:&lt;br /&gt;
  http.response.debug_cacheability_headers: true&lt;br /&gt;
  twig.config:&lt;br /&gt;
    debug: true&lt;br /&gt;
    auto_reload: true&lt;br /&gt;
    cache: false&lt;br /&gt;
services:&lt;br /&gt;
  cache.backend.null:&lt;br /&gt;
    class: Drupal\Core\Cache\NullBackendFactory&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== cleanup template debug ==&lt;br /&gt;
&lt;br /&gt;
Use in twig:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  |preg_replace('/&amp;lt;!--.*?--&amp;gt;/s','')|striptags|replace({&amp;quot;\n&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\r&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\t&amp;quot;:&amp;quot;&amp;quot;})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ReST ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
curl --include \&lt;br /&gt;
  --request POST \&lt;br /&gt;
  --user admin:&amp;lt;&amp;gt; \&lt;br /&gt;
  --header 'Content-type: application/hal+json' \&lt;br /&gt;
  http://pi.local/node?_format=hal_json \&lt;br /&gt;
  --data-binary '{&lt;br /&gt;
    &amp;quot;_links&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;http://pi.local/rest/type/node/article&amp;quot;}&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;title&amp;quot;:[{&amp;quot;value&amp;quot;:&amp;quot;Node +++ 123 bac +++&amp;quot; }],&lt;br /&gt;
    &amp;quot;body&amp;quot;:[{&amp;quot;value&amp;quot;: &amp;quot;&amp;lt;b&amp;gt;hello, wor&amp;lt;/b&amp;gt;ld!&amp;quot;, &amp;quot;format&amp;quot;: &amp;quot;full_html&amp;quot; }],&lt;br /&gt;
    &amp;quot;type&amp;quot;:[{&amp;quot;target_id&amp;quot;:&amp;quot;article&amp;quot;}],&lt;br /&gt;
    &amp;quot;status&amp;quot;: [{&amp;quot;value&amp;quot;: 1}],&lt;br /&gt;
    &amp;quot;_embedded&amp;quot;: {&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_issue&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;56229a95-d675-43e1-99b1-f9e11b5579c5&amp;quot; }] }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_tags&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;45646a7d-1a16-42e8-b758-f6e1c8d976f7&amp;quot; }] },&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;834e34e2-05ae-498d-b876-453798872ce1&amp;quot; }] }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  }'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Default Attachments ==&lt;br /&gt;
  txt pdf doc docx html csv xlsx xlsm sh json svg&lt;br /&gt;
  cer pem pub key kdbx&lt;br /&gt;
  png jpg jpeg gif&lt;br /&gt;
  mkv sfv avi mp3 mp4 webm mov&lt;br /&gt;
  zip tar gz&lt;br /&gt;
&lt;br /&gt;
== set password ==&lt;br /&gt;
&lt;br /&gt;
 drush user:password USERNAME NEW_PASSWORD&lt;br /&gt;
&lt;br /&gt;
== change ownership ==&lt;br /&gt;
&lt;br /&gt;
of all simplenews_issue &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval &amp;quot;&lt;br /&gt;
\$nids = \Drupal::entityQuery('node')&lt;br /&gt;
  -&amp;gt;condition('type', 'simplenews_issue')&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
\$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage('node');&lt;br /&gt;
\$nodes = \$storage-&amp;gt;loadMultiple(\$nids);&lt;br /&gt;
&lt;br /&gt;
foreach (\$nodes as \$node) {&lt;br /&gt;
  \$node-&amp;gt;setOwnerId(252);&lt;br /&gt;
  \$node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
of all content with &amp;quot;generated&amp;quot; in title:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval '&lt;br /&gt;
$nids = \Drupal::entityQuery(&amp;quot;node&amp;quot;)&lt;br /&gt;
  -&amp;gt;condition(&amp;quot;title&amp;quot;, &amp;quot;%enerated%&amp;quot;, &amp;quot;LIKE&amp;quot;)&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage(&amp;quot;node&amp;quot;);&lt;br /&gt;
$nodes = $storage-&amp;gt;loadMultiple($nids);&lt;br /&gt;
&lt;br /&gt;
foreach ($nodes as $node) {&lt;br /&gt;
  $node-&amp;gt;setOwnerId(129);&lt;br /&gt;
  $node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Updated &amp;quot; . count($nodes) . &amp;quot; nodes\n&amp;quot;;&lt;br /&gt;
'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Testing =&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/running-phpunit-tests&lt;br /&gt;
&lt;br /&gt;
For me, in my drupal images and containers, drupal is installed in the following folder, which is also my workdir:&lt;br /&gt;
&lt;br /&gt;
  WORKDIR /var/www/html&lt;br /&gt;
&lt;br /&gt;
The below is optional, I call the specific phpunit executable every time:&lt;br /&gt;
&lt;br /&gt;
  export PATH=&amp;quot;$PATH:/var/www/html/vendor/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You need to change minimum stability to &amp;quot;dev&amp;quot; for the testing libraries to be loaded.&lt;br /&gt;
&lt;br /&gt;
DO NOT RUN THIS IN PRODUCTION!&lt;br /&gt;
&lt;br /&gt;
  composer require --dev phpunit/phpunit # trash&lt;br /&gt;
    composer require --dev phpunit/phpunit:^9.5 --with-all-dependencies&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
    composer require --dev drupal/core-dev --update-with-all-dependencies # trash&lt;br /&gt;
  composer require --dev behat/mink:1.8.0 --with-all-dependencies&lt;br /&gt;
  composer require --dev symfony/phpunit-bridge&lt;br /&gt;
  composer require --dev phpspec/prophecy-phpunit&lt;br /&gt;
  composer require --dev behat/mink-browserkit-driver&lt;br /&gt;
&lt;br /&gt;
Copy and configure phpunit.xml:&lt;br /&gt;
&lt;br /&gt;
  phpunit --testsuite unit --filter CurrentUserBlock # trash?&lt;br /&gt;
  cd /var/www/html&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php -v --debug&lt;br /&gt;
&lt;br /&gt;
= update =&lt;br /&gt;
== 10 to 10 ==&lt;br /&gt;
  composer require \&lt;br /&gt;
  drupal/core-recommended:10.6.7 \&lt;br /&gt;
  drupal/core-composer-scaffold:10.6.7 \&lt;br /&gt;
  drupal/core-project-message:10.6.7 \&lt;br /&gt;
  --update-with-all-dependencies&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3450</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3450"/>
				<updated>2026-04-21T23:00:12Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: /* Install &amp;amp; Configure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* A great book: https://drupalatyourfingertips.com&lt;br /&gt;
* How to clear cache: /devel/cache/clear&lt;br /&gt;
&lt;br /&gt;
= Install &amp;amp; Configure =&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:9.5.10 html&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:10.6.7 html&lt;br /&gt;
  composer update &amp;quot;drupal/core-*&amp;quot; --with-all-dependencies&lt;br /&gt;
  composer require drupal/core-recommended:10.6.7 drupal/core-composer-scaffold:10.6.7 drupal/core-project-message:10.6.7 --update-with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/devel:^5.1'&lt;br /&gt;
  composer require 'drupal/s3fs:^3.3'&lt;br /&gt;
  # composer require 'wasya-co/consent_popup: 1.0.4.x-dev'&lt;br /&gt;
  composer require 'drupal/consent_popup:^1.0'&lt;br /&gt;
  composer require 'drush/drush:^11.6'&lt;br /&gt;
  composer require 'drupal/metatag:^2.0'&lt;br /&gt;
  composer require 'drupal/redirect:^1.9'&lt;br /&gt;
  composer require 'drupal/superfish:^1.6'&lt;br /&gt;
  composer require 'drupal/webform:^6.0'&lt;br /&gt;
  composer require 'drupal/captcha:^1.14'&lt;br /&gt;
  composer require 'drupal/typed_data:^1.0@alpha'&lt;br /&gt;
  composer require 'drupal/rules:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smtp:^1.2'&lt;br /&gt;
  composer require 'drupal/hal:^1.0'&lt;br /&gt;
  composer require 'drupal/restui:^1.21'&lt;br /&gt;
  composer require 'drupal/keycloak:^2.2@beta'&lt;br /&gt;
  composer require 'drupal/nodeaccess:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/backup_migrate:^5.1' ## was 5.0&lt;br /&gt;
  composer require 'drupal/email_registration:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/content_access:^2.0'&lt;br /&gt;
  composer require 'drupal/social_media:^2.0'&lt;br /&gt;
  composer require 'drupal/wordpress_migrate:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/migrate_tools:^6.0'&lt;br /&gt;
  composer require 'drupal/codefilter:^2.0'&lt;br /&gt;
  composer require 'drupal/views_taxonomy_term_name_depth:^7.2'&lt;br /&gt;
  composer require 'drupal/pathauto:^1.12'&lt;br /&gt;
  composer require 'drupal/twig_tweak:^3.3'&lt;br /&gt;
  composer require 'drupal/simplenews:^4.0'&lt;br /&gt;
    # composer require 'drupal/migrate_plus:^6.0' ## didn't need it the second time&lt;br /&gt;
  composer require 'drupal/ctools:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/commerce:^2.40' ## drupal 9.5&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    apt install php-bcmath php8.1-bcmath&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^1.1'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/commerce:^3.3'  ## drupal 10&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^2.2'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/linkit:^6.0'&lt;br /&gt;
  composer require 'drupal/redirect_after_login:^3.0'&lt;br /&gt;
  composer require 'drupal/symfony_mailer:^1.4'&lt;br /&gt;
  composer require 'drupal/custom_search:^1.0@beta'&lt;br /&gt;
  composer require 'drupal/fullcalendar_view:^5.2' &lt;br /&gt;
  composer require 'drupal/date_recur:^3.3@RC'&lt;br /&gt;
  composer require 'drupal/date_recur_modular:^3.1'&lt;br /&gt;
  composer require 'drupal/colorbox:2.0.2'&lt;br /&gt;
  composer require 'drupal/tagclouds:^2.0'&lt;br /&gt;
  composer require 'drupal/filelog:^3.0'&lt;br /&gt;
  composer require 'drupal/message:^1.6'&lt;br /&gt;
  composer require 'drupal/flag:^4.0@beta'&lt;br /&gt;
  composer require 'drupal/message_subscribe:^1.4'&lt;br /&gt;
  composer require 'drupal/message_digest:^1.5'&lt;br /&gt;
  composer require 'drupal/message_ui:^1.3'&lt;br /&gt;
  composer require 'drupal/layout_builder_usage_reports:^1.0'&lt;br /&gt;
  composer require 'drupal/views_tree:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/vote_up_down:^1.0@alpha'&lt;br /&gt;
    composer require 'drupal/votingapi:^3.0@beta'&lt;br /&gt;
  composer require 'drupal/formblock:^2.0@beta'&lt;br /&gt;
  composer require 'drupal/views_pdf:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/field_permissions:^1.4'&lt;br /&gt;
  composer require 'drupal/scheduler:^2.2'&lt;br /&gt;
  composer require 'drupal/simplenews_scheduler:^4.0@alpha'&lt;br /&gt;
  composer require 'drupal/insert_view:^2.1'&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  composer require 'drupal/keycloak:^1.8'&lt;br /&gt;
  composer require 'drupal/simple_oauth:^5.2'&lt;br /&gt;
  composer require 'drupal/group:^1.6'&lt;br /&gt;
    composer require 'drupal/group_join_link:^1.0'&lt;br /&gt;
  composer require 'drupal/social_auth:^4.1'&lt;br /&gt;
    composer require 'drupal/social_auth_google:^4.0' &lt;br /&gt;
    composer require 'drupal/social_auth_facebook:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_linkedin:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_microsoft:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/twilio:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smssystem:^1.1'&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require 'drupal/smsframework:^2.3'&lt;br /&gt;
  composer require symfony/dom-crawler symfony/css-selector&lt;br /&gt;
  composer require drupal/markdown&lt;br /&gt;
  composer require drupal/markdown_easy&lt;br /&gt;
  composer require 'drupal/crm_core:3.x-dev@dev'&lt;br /&gt;
  composer require 'drupal/name:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/dynamic_entity_reference:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/default_content:^2.0@beta'&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
  composer require 'drupal/single_content_sync:^1.4' ## yep its this one&lt;br /&gt;
  # composer require drupal/views_show_more ## I don't use it?&lt;br /&gt;
  composer require 'drupal/matomo:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/paragraphs:^1.20'&lt;br /&gt;
&lt;br /&gt;
=== evaluating ===&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/seo_checklist:^5.2'&lt;br /&gt;
  composer require 'drupal/yoast_seo:^1.9'&lt;br /&gt;
  composer require 'drupal/tvi:^2.0' ## From: https://www.drupal.org/project/tvi&lt;br /&gt;
  composer require 'drupal/advanced_text_formatter:^3.0@RC'&lt;br /&gt;
  composer require 'drupal/token_filter:^2.1'&lt;br /&gt;
  composer require 'drupal/form_mode_control:^2.4'&lt;br /&gt;
  composer require 'drupal/queue_mail:^1.7'&lt;br /&gt;
  composer require 'drupal/googlelogin-googlelogin:^9.5'&lt;br /&gt;
  composer require 'drupal/dark_mode_toggle:^1.0'&lt;br /&gt;
  composer require 'drupal/imce:^3.1'&lt;br /&gt;
&lt;br /&gt;
Not gonna use ebt_core, because (1) they have way too many modules, it should have been just one, and (2) their &amp;quot;hero&amp;quot; module doesn't honor container and isn't a hero.&lt;br /&gt;
&lt;br /&gt;
  # composer require 'drupal/layout_library:^1.0@beta' ## looks poor, just use blocks&lt;br /&gt;
  # composer require 'drupal/section_library:^2.0' ## looks poor, just use blocks&lt;br /&gt;
&lt;br /&gt;
== Upgrade 9 to 10 ==&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require drupal/core-recommended:^10 drupal/core-composer-scaffold:^10 drupal/core-project-message:^10 --update-with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
  composer update --with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
== Setting up dev environment ==&lt;br /&gt;
&lt;br /&gt;
* From: https://github.com/composer/composer/issues/9393&lt;br /&gt;
* From: https://www.drupal.org/docs/develop/automated-testing&lt;br /&gt;
* probably not useful: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/creating-functional-tests-simulated-browser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require --dev --no-update symfony/filesystem:4.4.42&lt;br /&gt;
  composer require --dev drupal/core-dev:9.5.11 --with-all-dependencies&lt;br /&gt;
    composer require --dev behat/mink jcalderonzumba/mink-phantomjs-driver&lt;br /&gt;
    composer update -W&lt;br /&gt;
    composer update symfony/filesystem:4.4.42 drush/drush -W&lt;br /&gt;
    composer require --dev drupal/core-dev -W&lt;br /&gt;
    composer require --dev phpspec/prophecy-phpunit:^2&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
Not useful:&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/examples:^4.0'&lt;br /&gt;
&lt;br /&gt;
== Configure Apache ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Directory /var/www/&amp;gt;&lt;br /&gt;
    Options Indexes FollowSymLinks MultiViews&lt;br /&gt;
    AllowOverride All&lt;br /&gt;
    Order allow,deny&lt;br /&gt;
    allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure s3fs ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,&lt;br /&gt;
    &amp;quot;Statement&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement0&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:ListBucket&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:ListBucketVersions&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement1&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:PutObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectAcl&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:PutObjectAcl&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;/*&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Disable caching ==&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/development-tools/disable-caching&lt;br /&gt;
&lt;br /&gt;
* Add the settings.local.php and&lt;br /&gt;
* Modify development.services.yml:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parameters:&lt;br /&gt;
  http.response.debug_cacheability_headers: true&lt;br /&gt;
  twig.config:&lt;br /&gt;
    debug: true&lt;br /&gt;
    auto_reload: true&lt;br /&gt;
    cache: false&lt;br /&gt;
services:&lt;br /&gt;
  cache.backend.null:&lt;br /&gt;
    class: Drupal\Core\Cache\NullBackendFactory&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== cleanup template debug ==&lt;br /&gt;
&lt;br /&gt;
Use in twig:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  |preg_replace('/&amp;lt;!--.*?--&amp;gt;/s','')|striptags|replace({&amp;quot;\n&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\r&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\t&amp;quot;:&amp;quot;&amp;quot;})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ReST ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
curl --include \&lt;br /&gt;
  --request POST \&lt;br /&gt;
  --user admin:&amp;lt;&amp;gt; \&lt;br /&gt;
  --header 'Content-type: application/hal+json' \&lt;br /&gt;
  http://pi.local/node?_format=hal_json \&lt;br /&gt;
  --data-binary '{&lt;br /&gt;
    &amp;quot;_links&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;http://pi.local/rest/type/node/article&amp;quot;}&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;title&amp;quot;:[{&amp;quot;value&amp;quot;:&amp;quot;Node +++ 123 bac +++&amp;quot; }],&lt;br /&gt;
    &amp;quot;body&amp;quot;:[{&amp;quot;value&amp;quot;: &amp;quot;&amp;lt;b&amp;gt;hello, wor&amp;lt;/b&amp;gt;ld!&amp;quot;, &amp;quot;format&amp;quot;: &amp;quot;full_html&amp;quot; }],&lt;br /&gt;
    &amp;quot;type&amp;quot;:[{&amp;quot;target_id&amp;quot;:&amp;quot;article&amp;quot;}],&lt;br /&gt;
    &amp;quot;status&amp;quot;: [{&amp;quot;value&amp;quot;: 1}],&lt;br /&gt;
    &amp;quot;_embedded&amp;quot;: {&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_issue&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;56229a95-d675-43e1-99b1-f9e11b5579c5&amp;quot; }] }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_tags&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;45646a7d-1a16-42e8-b758-f6e1c8d976f7&amp;quot; }] },&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;834e34e2-05ae-498d-b876-453798872ce1&amp;quot; }] }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  }'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Default Attachments ==&lt;br /&gt;
  txt pdf doc docx html csv xlsx xlsm sh json svg&lt;br /&gt;
  cer pem pub key kdbx&lt;br /&gt;
  png jpg jpeg gif&lt;br /&gt;
  mkv sfv avi mp3 mp4 webm mov&lt;br /&gt;
  zip tar gz&lt;br /&gt;
&lt;br /&gt;
== set password ==&lt;br /&gt;
&lt;br /&gt;
 drush user:password USERNAME NEW_PASSWORD&lt;br /&gt;
&lt;br /&gt;
== change ownership ==&lt;br /&gt;
&lt;br /&gt;
of all simplenews_issue &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval &amp;quot;&lt;br /&gt;
\$nids = \Drupal::entityQuery('node')&lt;br /&gt;
  -&amp;gt;condition('type', 'simplenews_issue')&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
\$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage('node');&lt;br /&gt;
\$nodes = \$storage-&amp;gt;loadMultiple(\$nids);&lt;br /&gt;
&lt;br /&gt;
foreach (\$nodes as \$node) {&lt;br /&gt;
  \$node-&amp;gt;setOwnerId(252);&lt;br /&gt;
  \$node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
of all content with &amp;quot;generated&amp;quot; in title:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval '&lt;br /&gt;
$nids = \Drupal::entityQuery(&amp;quot;node&amp;quot;)&lt;br /&gt;
  -&amp;gt;condition(&amp;quot;title&amp;quot;, &amp;quot;%enerated%&amp;quot;, &amp;quot;LIKE&amp;quot;)&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage(&amp;quot;node&amp;quot;);&lt;br /&gt;
$nodes = $storage-&amp;gt;loadMultiple($nids);&lt;br /&gt;
&lt;br /&gt;
foreach ($nodes as $node) {&lt;br /&gt;
  $node-&amp;gt;setOwnerId(129);&lt;br /&gt;
  $node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Updated &amp;quot; . count($nodes) . &amp;quot; nodes\n&amp;quot;;&lt;br /&gt;
'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Testing =&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/running-phpunit-tests&lt;br /&gt;
&lt;br /&gt;
For me, in my drupal images and containers, drupal is installed in the following folder, which is also my workdir:&lt;br /&gt;
&lt;br /&gt;
  WORKDIR /var/www/html&lt;br /&gt;
&lt;br /&gt;
The below is optional, I call the specific phpunit executable every time:&lt;br /&gt;
&lt;br /&gt;
  export PATH=&amp;quot;$PATH:/var/www/html/vendor/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You need to change minimum stability to &amp;quot;dev&amp;quot; for the testing libraries to be loaded.&lt;br /&gt;
&lt;br /&gt;
DO NOT RUN THIS IN PRODUCTION!&lt;br /&gt;
&lt;br /&gt;
  composer require --dev phpunit/phpunit # trash&lt;br /&gt;
    composer require --dev phpunit/phpunit:^9.5 --with-all-dependencies&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
    composer require --dev drupal/core-dev --update-with-all-dependencies # trash&lt;br /&gt;
  composer require --dev behat/mink:1.8.0 --with-all-dependencies&lt;br /&gt;
  composer require --dev symfony/phpunit-bridge&lt;br /&gt;
  composer require --dev phpspec/prophecy-phpunit&lt;br /&gt;
  composer require --dev behat/mink-browserkit-driver&lt;br /&gt;
&lt;br /&gt;
Copy and configure phpunit.xml:&lt;br /&gt;
&lt;br /&gt;
  phpunit --testsuite unit --filter CurrentUserBlock # trash?&lt;br /&gt;
  cd /var/www/html&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php -v --debug&lt;br /&gt;
&lt;br /&gt;
= update =&lt;br /&gt;
== 10 to 10 ==&lt;br /&gt;
  composer require \&lt;br /&gt;
  drupal/core-recommended:10.6.7 \&lt;br /&gt;
  drupal/core-composer-scaffold:10.6.7 \&lt;br /&gt;
  drupal/core-project-message:10.6.7 \&lt;br /&gt;
  --update-with-all-dependencies&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3449</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3449"/>
				<updated>2026-04-21T22:59:54Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: /* Install &amp;amp; Configure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* A great book: https://drupalatyourfingertips.com&lt;br /&gt;
* How to clear cache: /devel/cache/clear&lt;br /&gt;
&lt;br /&gt;
= Install &amp;amp; Configure =&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:9.5.10 html&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:10.6.7 html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/devel:^5.1'&lt;br /&gt;
  composer require 'drupal/s3fs:^3.3'&lt;br /&gt;
  # composer require 'wasya-co/consent_popup: 1.0.4.x-dev'&lt;br /&gt;
  composer require 'drupal/consent_popup:^1.0'&lt;br /&gt;
  composer require 'drush/drush:^11.6'&lt;br /&gt;
  composer require 'drupal/metatag:^2.0'&lt;br /&gt;
  composer require 'drupal/redirect:^1.9'&lt;br /&gt;
  composer require 'drupal/superfish:^1.6'&lt;br /&gt;
  composer require 'drupal/webform:^6.0'&lt;br /&gt;
  composer require 'drupal/captcha:^1.14'&lt;br /&gt;
  composer require 'drupal/typed_data:^1.0@alpha'&lt;br /&gt;
  composer require 'drupal/rules:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smtp:^1.2'&lt;br /&gt;
  composer require 'drupal/hal:^1.0'&lt;br /&gt;
  composer require 'drupal/restui:^1.21'&lt;br /&gt;
  composer require 'drupal/keycloak:^2.2@beta'&lt;br /&gt;
  composer require 'drupal/nodeaccess:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/backup_migrate:^5.1' ## was 5.0&lt;br /&gt;
  composer require 'drupal/email_registration:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/content_access:^2.0'&lt;br /&gt;
  composer require 'drupal/social_media:^2.0'&lt;br /&gt;
  composer require 'drupal/wordpress_migrate:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/migrate_tools:^6.0'&lt;br /&gt;
  composer require 'drupal/codefilter:^2.0'&lt;br /&gt;
  composer require 'drupal/views_taxonomy_term_name_depth:^7.2'&lt;br /&gt;
  composer require 'drupal/pathauto:^1.12'&lt;br /&gt;
  composer require 'drupal/twig_tweak:^3.3'&lt;br /&gt;
  composer require 'drupal/simplenews:^4.0'&lt;br /&gt;
    # composer require 'drupal/migrate_plus:^6.0' ## didn't need it the second time&lt;br /&gt;
  composer require 'drupal/ctools:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/commerce:^2.40' ## drupal 9.5&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    apt install php-bcmath php8.1-bcmath&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^1.1'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/commerce:^3.3'  ## drupal 10&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^2.2'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/linkit:^6.0'&lt;br /&gt;
  composer require 'drupal/redirect_after_login:^3.0'&lt;br /&gt;
  composer require 'drupal/symfony_mailer:^1.4'&lt;br /&gt;
  composer require 'drupal/custom_search:^1.0@beta'&lt;br /&gt;
  composer require 'drupal/fullcalendar_view:^5.2' &lt;br /&gt;
  composer require 'drupal/date_recur:^3.3@RC'&lt;br /&gt;
  composer require 'drupal/date_recur_modular:^3.1'&lt;br /&gt;
  composer require 'drupal/colorbox:2.0.2'&lt;br /&gt;
  composer require 'drupal/tagclouds:^2.0'&lt;br /&gt;
  composer require 'drupal/filelog:^3.0'&lt;br /&gt;
  composer require 'drupal/message:^1.6'&lt;br /&gt;
  composer require 'drupal/flag:^4.0@beta'&lt;br /&gt;
  composer require 'drupal/message_subscribe:^1.4'&lt;br /&gt;
  composer require 'drupal/message_digest:^1.5'&lt;br /&gt;
  composer require 'drupal/message_ui:^1.3'&lt;br /&gt;
  composer require 'drupal/layout_builder_usage_reports:^1.0'&lt;br /&gt;
  composer require 'drupal/views_tree:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/vote_up_down:^1.0@alpha'&lt;br /&gt;
    composer require 'drupal/votingapi:^3.0@beta'&lt;br /&gt;
  composer require 'drupal/formblock:^2.0@beta'&lt;br /&gt;
  composer require 'drupal/views_pdf:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/field_permissions:^1.4'&lt;br /&gt;
  composer require 'drupal/scheduler:^2.2'&lt;br /&gt;
  composer require 'drupal/simplenews_scheduler:^4.0@alpha'&lt;br /&gt;
  composer require 'drupal/insert_view:^2.1'&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  composer require 'drupal/keycloak:^1.8'&lt;br /&gt;
  composer require 'drupal/simple_oauth:^5.2'&lt;br /&gt;
  composer require 'drupal/group:^1.6'&lt;br /&gt;
    composer require 'drupal/group_join_link:^1.0'&lt;br /&gt;
  composer require 'drupal/social_auth:^4.1'&lt;br /&gt;
    composer require 'drupal/social_auth_google:^4.0' &lt;br /&gt;
    composer require 'drupal/social_auth_facebook:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_linkedin:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_microsoft:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/twilio:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smssystem:^1.1'&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require 'drupal/smsframework:^2.3'&lt;br /&gt;
  composer require symfony/dom-crawler symfony/css-selector&lt;br /&gt;
  composer require drupal/markdown&lt;br /&gt;
  composer require drupal/markdown_easy&lt;br /&gt;
  composer require 'drupal/crm_core:3.x-dev@dev'&lt;br /&gt;
  composer require 'drupal/name:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/dynamic_entity_reference:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/default_content:^2.0@beta'&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
  composer require 'drupal/single_content_sync:^1.4' ## yep its this one&lt;br /&gt;
  # composer require drupal/views_show_more ## I don't use it?&lt;br /&gt;
  composer require 'drupal/matomo:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/paragraphs:^1.20'&lt;br /&gt;
&lt;br /&gt;
=== evaluating ===&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/seo_checklist:^5.2'&lt;br /&gt;
  composer require 'drupal/yoast_seo:^1.9'&lt;br /&gt;
  composer require 'drupal/tvi:^2.0' ## From: https://www.drupal.org/project/tvi&lt;br /&gt;
  composer require 'drupal/advanced_text_formatter:^3.0@RC'&lt;br /&gt;
  composer require 'drupal/token_filter:^2.1'&lt;br /&gt;
  composer require 'drupal/form_mode_control:^2.4'&lt;br /&gt;
  composer require 'drupal/queue_mail:^1.7'&lt;br /&gt;
  composer require 'drupal/googlelogin-googlelogin:^9.5'&lt;br /&gt;
  composer require 'drupal/dark_mode_toggle:^1.0'&lt;br /&gt;
  composer require 'drupal/imce:^3.1'&lt;br /&gt;
&lt;br /&gt;
Not gonna use ebt_core, because (1) they have way too many modules, it should have been just one, and (2) their &amp;quot;hero&amp;quot; module doesn't honor container and isn't a hero.&lt;br /&gt;
&lt;br /&gt;
  # composer require 'drupal/layout_library:^1.0@beta' ## looks poor, just use blocks&lt;br /&gt;
  # composer require 'drupal/section_library:^2.0' ## looks poor, just use blocks&lt;br /&gt;
&lt;br /&gt;
== Upgrade 9 to 10 ==&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require drupal/core-recommended:^10 drupal/core-composer-scaffold:^10 drupal/core-project-message:^10 --update-with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
  composer update --with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
== Setting up dev environment ==&lt;br /&gt;
&lt;br /&gt;
* From: https://github.com/composer/composer/issues/9393&lt;br /&gt;
* From: https://www.drupal.org/docs/develop/automated-testing&lt;br /&gt;
* probably not useful: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/creating-functional-tests-simulated-browser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require --dev --no-update symfony/filesystem:4.4.42&lt;br /&gt;
  composer require --dev drupal/core-dev:9.5.11 --with-all-dependencies&lt;br /&gt;
    composer require --dev behat/mink jcalderonzumba/mink-phantomjs-driver&lt;br /&gt;
    composer update -W&lt;br /&gt;
    composer update symfony/filesystem:4.4.42 drush/drush -W&lt;br /&gt;
    composer require --dev drupal/core-dev -W&lt;br /&gt;
    composer require --dev phpspec/prophecy-phpunit:^2&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
Not useful:&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/examples:^4.0'&lt;br /&gt;
&lt;br /&gt;
== Configure Apache ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Directory /var/www/&amp;gt;&lt;br /&gt;
    Options Indexes FollowSymLinks MultiViews&lt;br /&gt;
    AllowOverride All&lt;br /&gt;
    Order allow,deny&lt;br /&gt;
    allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure s3fs ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,&lt;br /&gt;
    &amp;quot;Statement&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement0&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:ListBucket&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:ListBucketVersions&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement1&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:PutObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectAcl&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:PutObjectAcl&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;/*&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Disable caching ==&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/development-tools/disable-caching&lt;br /&gt;
&lt;br /&gt;
* Add the settings.local.php and&lt;br /&gt;
* Modify development.services.yml:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parameters:&lt;br /&gt;
  http.response.debug_cacheability_headers: true&lt;br /&gt;
  twig.config:&lt;br /&gt;
    debug: true&lt;br /&gt;
    auto_reload: true&lt;br /&gt;
    cache: false&lt;br /&gt;
services:&lt;br /&gt;
  cache.backend.null:&lt;br /&gt;
    class: Drupal\Core\Cache\NullBackendFactory&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== cleanup template debug ==&lt;br /&gt;
&lt;br /&gt;
Use in twig:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  |preg_replace('/&amp;lt;!--.*?--&amp;gt;/s','')|striptags|replace({&amp;quot;\n&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\r&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\t&amp;quot;:&amp;quot;&amp;quot;})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ReST ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
curl --include \&lt;br /&gt;
  --request POST \&lt;br /&gt;
  --user admin:&amp;lt;&amp;gt; \&lt;br /&gt;
  --header 'Content-type: application/hal+json' \&lt;br /&gt;
  http://pi.local/node?_format=hal_json \&lt;br /&gt;
  --data-binary '{&lt;br /&gt;
    &amp;quot;_links&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;http://pi.local/rest/type/node/article&amp;quot;}&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;title&amp;quot;:[{&amp;quot;value&amp;quot;:&amp;quot;Node +++ 123 bac +++&amp;quot; }],&lt;br /&gt;
    &amp;quot;body&amp;quot;:[{&amp;quot;value&amp;quot;: &amp;quot;&amp;lt;b&amp;gt;hello, wor&amp;lt;/b&amp;gt;ld!&amp;quot;, &amp;quot;format&amp;quot;: &amp;quot;full_html&amp;quot; }],&lt;br /&gt;
    &amp;quot;type&amp;quot;:[{&amp;quot;target_id&amp;quot;:&amp;quot;article&amp;quot;}],&lt;br /&gt;
    &amp;quot;status&amp;quot;: [{&amp;quot;value&amp;quot;: 1}],&lt;br /&gt;
    &amp;quot;_embedded&amp;quot;: {&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_issue&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;56229a95-d675-43e1-99b1-f9e11b5579c5&amp;quot; }] }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_tags&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;45646a7d-1a16-42e8-b758-f6e1c8d976f7&amp;quot; }] },&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;834e34e2-05ae-498d-b876-453798872ce1&amp;quot; }] }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  }'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Default Attachments ==&lt;br /&gt;
  txt pdf doc docx html csv xlsx xlsm sh json svg&lt;br /&gt;
  cer pem pub key kdbx&lt;br /&gt;
  png jpg jpeg gif&lt;br /&gt;
  mkv sfv avi mp3 mp4 webm mov&lt;br /&gt;
  zip tar gz&lt;br /&gt;
&lt;br /&gt;
== set password ==&lt;br /&gt;
&lt;br /&gt;
 drush user:password USERNAME NEW_PASSWORD&lt;br /&gt;
&lt;br /&gt;
== change ownership ==&lt;br /&gt;
&lt;br /&gt;
of all simplenews_issue &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval &amp;quot;&lt;br /&gt;
\$nids = \Drupal::entityQuery('node')&lt;br /&gt;
  -&amp;gt;condition('type', 'simplenews_issue')&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
\$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage('node');&lt;br /&gt;
\$nodes = \$storage-&amp;gt;loadMultiple(\$nids);&lt;br /&gt;
&lt;br /&gt;
foreach (\$nodes as \$node) {&lt;br /&gt;
  \$node-&amp;gt;setOwnerId(252);&lt;br /&gt;
  \$node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
of all content with &amp;quot;generated&amp;quot; in title:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval '&lt;br /&gt;
$nids = \Drupal::entityQuery(&amp;quot;node&amp;quot;)&lt;br /&gt;
  -&amp;gt;condition(&amp;quot;title&amp;quot;, &amp;quot;%enerated%&amp;quot;, &amp;quot;LIKE&amp;quot;)&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage(&amp;quot;node&amp;quot;);&lt;br /&gt;
$nodes = $storage-&amp;gt;loadMultiple($nids);&lt;br /&gt;
&lt;br /&gt;
foreach ($nodes as $node) {&lt;br /&gt;
  $node-&amp;gt;setOwnerId(129);&lt;br /&gt;
  $node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Updated &amp;quot; . count($nodes) . &amp;quot; nodes\n&amp;quot;;&lt;br /&gt;
'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Testing =&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/running-phpunit-tests&lt;br /&gt;
&lt;br /&gt;
For me, in my drupal images and containers, drupal is installed in the following folder, which is also my workdir:&lt;br /&gt;
&lt;br /&gt;
  WORKDIR /var/www/html&lt;br /&gt;
&lt;br /&gt;
The below is optional, I call the specific phpunit executable every time:&lt;br /&gt;
&lt;br /&gt;
  export PATH=&amp;quot;$PATH:/var/www/html/vendor/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You need to change minimum stability to &amp;quot;dev&amp;quot; for the testing libraries to be loaded.&lt;br /&gt;
&lt;br /&gt;
DO NOT RUN THIS IN PRODUCTION!&lt;br /&gt;
&lt;br /&gt;
  composer require --dev phpunit/phpunit # trash&lt;br /&gt;
    composer require --dev phpunit/phpunit:^9.5 --with-all-dependencies&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
    composer require --dev drupal/core-dev --update-with-all-dependencies # trash&lt;br /&gt;
  composer require --dev behat/mink:1.8.0 --with-all-dependencies&lt;br /&gt;
  composer require --dev symfony/phpunit-bridge&lt;br /&gt;
  composer require --dev phpspec/prophecy-phpunit&lt;br /&gt;
  composer require --dev behat/mink-browserkit-driver&lt;br /&gt;
&lt;br /&gt;
Copy and configure phpunit.xml:&lt;br /&gt;
&lt;br /&gt;
  phpunit --testsuite unit --filter CurrentUserBlock # trash?&lt;br /&gt;
  cd /var/www/html&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php -v --debug&lt;br /&gt;
&lt;br /&gt;
= update =&lt;br /&gt;
== 10 to 10 ==&lt;br /&gt;
  composer require \&lt;br /&gt;
  drupal/core-recommended:10.6.7 \&lt;br /&gt;
  drupal/core-composer-scaffold:10.6.7 \&lt;br /&gt;
  drupal/core-project-message:10.6.7 \&lt;br /&gt;
  --update-with-all-dependencies&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3448</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3448"/>
				<updated>2026-04-21T22:47:18Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: /* evaluating */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* A great book: https://drupalatyourfingertips.com&lt;br /&gt;
* How to clear cache: /devel/cache/clear&lt;br /&gt;
&lt;br /&gt;
= Install &amp;amp; Configure =&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:9.5.10 html&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/devel:^5.1'&lt;br /&gt;
  composer require 'drupal/s3fs:^3.3'&lt;br /&gt;
  # composer require 'wasya-co/consent_popup: 1.0.4.x-dev'&lt;br /&gt;
  composer require 'drupal/consent_popup:^1.0'&lt;br /&gt;
  composer require 'drush/drush:^11.6'&lt;br /&gt;
  composer require 'drupal/metatag:^2.0'&lt;br /&gt;
  composer require 'drupal/redirect:^1.9'&lt;br /&gt;
  composer require 'drupal/superfish:^1.6'&lt;br /&gt;
  composer require 'drupal/webform:^6.0'&lt;br /&gt;
  composer require 'drupal/captcha:^1.14'&lt;br /&gt;
  composer require 'drupal/typed_data:^1.0@alpha'&lt;br /&gt;
  composer require 'drupal/rules:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smtp:^1.2'&lt;br /&gt;
  composer require 'drupal/hal:^1.0'&lt;br /&gt;
  composer require 'drupal/restui:^1.21'&lt;br /&gt;
  composer require 'drupal/keycloak:^2.2@beta'&lt;br /&gt;
  composer require 'drupal/nodeaccess:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/backup_migrate:^5.1' ## was 5.0&lt;br /&gt;
  composer require 'drupal/email_registration:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/content_access:^2.0'&lt;br /&gt;
  composer require 'drupal/social_media:^2.0'&lt;br /&gt;
  composer require 'drupal/wordpress_migrate:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/migrate_tools:^6.0'&lt;br /&gt;
  composer require 'drupal/codefilter:^2.0'&lt;br /&gt;
  composer require 'drupal/views_taxonomy_term_name_depth:^7.2'&lt;br /&gt;
  composer require 'drupal/pathauto:^1.12'&lt;br /&gt;
  composer require 'drupal/twig_tweak:^3.3'&lt;br /&gt;
  composer require 'drupal/simplenews:^4.0'&lt;br /&gt;
    # composer require 'drupal/migrate_plus:^6.0' ## didn't need it the second time&lt;br /&gt;
  composer require 'drupal/ctools:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/commerce:^2.40' ## drupal 9.5&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    apt install php-bcmath php8.1-bcmath&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^1.1'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/commerce:^3.3'  ## drupal 10&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^2.2'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/linkit:^6.0'&lt;br /&gt;
  composer require 'drupal/redirect_after_login:^3.0'&lt;br /&gt;
  composer require 'drupal/symfony_mailer:^1.4'&lt;br /&gt;
  composer require 'drupal/custom_search:^1.0@beta'&lt;br /&gt;
  composer require 'drupal/fullcalendar_view:^5.2' &lt;br /&gt;
  composer require 'drupal/date_recur:^3.3@RC'&lt;br /&gt;
  composer require 'drupal/date_recur_modular:^3.1'&lt;br /&gt;
  composer require 'drupal/colorbox:2.0.2'&lt;br /&gt;
  composer require 'drupal/tagclouds:^2.0'&lt;br /&gt;
  composer require 'drupal/filelog:^3.0'&lt;br /&gt;
  composer require 'drupal/message:^1.6'&lt;br /&gt;
  composer require 'drupal/flag:^4.0@beta'&lt;br /&gt;
  composer require 'drupal/message_subscribe:^1.4'&lt;br /&gt;
  composer require 'drupal/message_digest:^1.5'&lt;br /&gt;
  composer require 'drupal/message_ui:^1.3'&lt;br /&gt;
  composer require 'drupal/layout_builder_usage_reports:^1.0'&lt;br /&gt;
  composer require 'drupal/views_tree:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/vote_up_down:^1.0@alpha'&lt;br /&gt;
    composer require 'drupal/votingapi:^3.0@beta'&lt;br /&gt;
  composer require 'drupal/formblock:^2.0@beta'&lt;br /&gt;
  composer require 'drupal/views_pdf:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/field_permissions:^1.4'&lt;br /&gt;
  composer require 'drupal/scheduler:^2.2'&lt;br /&gt;
  composer require 'drupal/simplenews_scheduler:^4.0@alpha'&lt;br /&gt;
  composer require 'drupal/insert_view:^2.1'&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  composer require 'drupal/keycloak:^1.8'&lt;br /&gt;
  composer require 'drupal/simple_oauth:^5.2'&lt;br /&gt;
  composer require 'drupal/group:^1.6'&lt;br /&gt;
    composer require 'drupal/group_join_link:^1.0'&lt;br /&gt;
  composer require 'drupal/social_auth:^4.1'&lt;br /&gt;
    composer require 'drupal/social_auth_google:^4.0' &lt;br /&gt;
    composer require 'drupal/social_auth_facebook:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_linkedin:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_microsoft:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/twilio:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smssystem:^1.1'&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require 'drupal/smsframework:^2.3'&lt;br /&gt;
  composer require symfony/dom-crawler symfony/css-selector&lt;br /&gt;
  composer require drupal/markdown&lt;br /&gt;
  composer require drupal/markdown_easy&lt;br /&gt;
  composer require 'drupal/crm_core:3.x-dev@dev'&lt;br /&gt;
  composer require 'drupal/name:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/dynamic_entity_reference:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/default_content:^2.0@beta'&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
  composer require 'drupal/single_content_sync:^1.4' ## yep its this one&lt;br /&gt;
  # composer require drupal/views_show_more ## I don't use it?&lt;br /&gt;
  composer require 'drupal/matomo:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/paragraphs:^1.20'&lt;br /&gt;
&lt;br /&gt;
=== evaluating ===&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/seo_checklist:^5.2'&lt;br /&gt;
  composer require 'drupal/yoast_seo:^1.9'&lt;br /&gt;
  composer require 'drupal/tvi:^2.0' ## From: https://www.drupal.org/project/tvi&lt;br /&gt;
  composer require 'drupal/advanced_text_formatter:^3.0@RC'&lt;br /&gt;
  composer require 'drupal/token_filter:^2.1'&lt;br /&gt;
  composer require 'drupal/form_mode_control:^2.4'&lt;br /&gt;
  composer require 'drupal/queue_mail:^1.7'&lt;br /&gt;
  composer require 'drupal/googlelogin-googlelogin:^9.5'&lt;br /&gt;
  composer require 'drupal/dark_mode_toggle:^1.0'&lt;br /&gt;
  composer require 'drupal/imce:^3.1'&lt;br /&gt;
&lt;br /&gt;
Not gonna use ebt_core, because (1) they have way too many modules, it should have been just one, and (2) their &amp;quot;hero&amp;quot; module doesn't honor container and isn't a hero.&lt;br /&gt;
&lt;br /&gt;
  # composer require 'drupal/layout_library:^1.0@beta' ## looks poor, just use blocks&lt;br /&gt;
  # composer require 'drupal/section_library:^2.0' ## looks poor, just use blocks&lt;br /&gt;
&lt;br /&gt;
== Upgrade 9 to 10 ==&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require drupal/core-recommended:^10 drupal/core-composer-scaffold:^10 drupal/core-project-message:^10 --update-with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
  composer update --with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
== Setting up dev environment ==&lt;br /&gt;
&lt;br /&gt;
* From: https://github.com/composer/composer/issues/9393&lt;br /&gt;
* From: https://www.drupal.org/docs/develop/automated-testing&lt;br /&gt;
* probably not useful: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/creating-functional-tests-simulated-browser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require --dev --no-update symfony/filesystem:4.4.42&lt;br /&gt;
  composer require --dev drupal/core-dev:9.5.11 --with-all-dependencies&lt;br /&gt;
    composer require --dev behat/mink jcalderonzumba/mink-phantomjs-driver&lt;br /&gt;
    composer update -W&lt;br /&gt;
    composer update symfony/filesystem:4.4.42 drush/drush -W&lt;br /&gt;
    composer require --dev drupal/core-dev -W&lt;br /&gt;
    composer require --dev phpspec/prophecy-phpunit:^2&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
Not useful:&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/examples:^4.0'&lt;br /&gt;
&lt;br /&gt;
== Configure Apache ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Directory /var/www/&amp;gt;&lt;br /&gt;
    Options Indexes FollowSymLinks MultiViews&lt;br /&gt;
    AllowOverride All&lt;br /&gt;
    Order allow,deny&lt;br /&gt;
    allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure s3fs ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,&lt;br /&gt;
    &amp;quot;Statement&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement0&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:ListBucket&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:ListBucketVersions&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement1&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:PutObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectAcl&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:PutObjectAcl&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;/*&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Disable caching ==&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/development-tools/disable-caching&lt;br /&gt;
&lt;br /&gt;
* Add the settings.local.php and&lt;br /&gt;
* Modify development.services.yml:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parameters:&lt;br /&gt;
  http.response.debug_cacheability_headers: true&lt;br /&gt;
  twig.config:&lt;br /&gt;
    debug: true&lt;br /&gt;
    auto_reload: true&lt;br /&gt;
    cache: false&lt;br /&gt;
services:&lt;br /&gt;
  cache.backend.null:&lt;br /&gt;
    class: Drupal\Core\Cache\NullBackendFactory&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== cleanup template debug ==&lt;br /&gt;
&lt;br /&gt;
Use in twig:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  |preg_replace('/&amp;lt;!--.*?--&amp;gt;/s','')|striptags|replace({&amp;quot;\n&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\r&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\t&amp;quot;:&amp;quot;&amp;quot;})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ReST ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
curl --include \&lt;br /&gt;
  --request POST \&lt;br /&gt;
  --user admin:&amp;lt;&amp;gt; \&lt;br /&gt;
  --header 'Content-type: application/hal+json' \&lt;br /&gt;
  http://pi.local/node?_format=hal_json \&lt;br /&gt;
  --data-binary '{&lt;br /&gt;
    &amp;quot;_links&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;http://pi.local/rest/type/node/article&amp;quot;}&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;title&amp;quot;:[{&amp;quot;value&amp;quot;:&amp;quot;Node +++ 123 bac +++&amp;quot; }],&lt;br /&gt;
    &amp;quot;body&amp;quot;:[{&amp;quot;value&amp;quot;: &amp;quot;&amp;lt;b&amp;gt;hello, wor&amp;lt;/b&amp;gt;ld!&amp;quot;, &amp;quot;format&amp;quot;: &amp;quot;full_html&amp;quot; }],&lt;br /&gt;
    &amp;quot;type&amp;quot;:[{&amp;quot;target_id&amp;quot;:&amp;quot;article&amp;quot;}],&lt;br /&gt;
    &amp;quot;status&amp;quot;: [{&amp;quot;value&amp;quot;: 1}],&lt;br /&gt;
    &amp;quot;_embedded&amp;quot;: {&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_issue&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;56229a95-d675-43e1-99b1-f9e11b5579c5&amp;quot; }] }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_tags&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;45646a7d-1a16-42e8-b758-f6e1c8d976f7&amp;quot; }] },&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;834e34e2-05ae-498d-b876-453798872ce1&amp;quot; }] }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  }'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Default Attachments ==&lt;br /&gt;
  txt pdf doc docx html csv xlsx xlsm sh json svg&lt;br /&gt;
  cer pem pub key kdbx&lt;br /&gt;
  png jpg jpeg gif&lt;br /&gt;
  mkv sfv avi mp3 mp4 webm mov&lt;br /&gt;
  zip tar gz&lt;br /&gt;
&lt;br /&gt;
== set password ==&lt;br /&gt;
&lt;br /&gt;
 drush user:password USERNAME NEW_PASSWORD&lt;br /&gt;
&lt;br /&gt;
== change ownership ==&lt;br /&gt;
&lt;br /&gt;
of all simplenews_issue &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval &amp;quot;&lt;br /&gt;
\$nids = \Drupal::entityQuery('node')&lt;br /&gt;
  -&amp;gt;condition('type', 'simplenews_issue')&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
\$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage('node');&lt;br /&gt;
\$nodes = \$storage-&amp;gt;loadMultiple(\$nids);&lt;br /&gt;
&lt;br /&gt;
foreach (\$nodes as \$node) {&lt;br /&gt;
  \$node-&amp;gt;setOwnerId(252);&lt;br /&gt;
  \$node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
of all content with &amp;quot;generated&amp;quot; in title:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval '&lt;br /&gt;
$nids = \Drupal::entityQuery(&amp;quot;node&amp;quot;)&lt;br /&gt;
  -&amp;gt;condition(&amp;quot;title&amp;quot;, &amp;quot;%enerated%&amp;quot;, &amp;quot;LIKE&amp;quot;)&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage(&amp;quot;node&amp;quot;);&lt;br /&gt;
$nodes = $storage-&amp;gt;loadMultiple($nids);&lt;br /&gt;
&lt;br /&gt;
foreach ($nodes as $node) {&lt;br /&gt;
  $node-&amp;gt;setOwnerId(129);&lt;br /&gt;
  $node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Updated &amp;quot; . count($nodes) . &amp;quot; nodes\n&amp;quot;;&lt;br /&gt;
'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Testing =&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/running-phpunit-tests&lt;br /&gt;
&lt;br /&gt;
For me, in my drupal images and containers, drupal is installed in the following folder, which is also my workdir:&lt;br /&gt;
&lt;br /&gt;
  WORKDIR /var/www/html&lt;br /&gt;
&lt;br /&gt;
The below is optional, I call the specific phpunit executable every time:&lt;br /&gt;
&lt;br /&gt;
  export PATH=&amp;quot;$PATH:/var/www/html/vendor/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You need to change minimum stability to &amp;quot;dev&amp;quot; for the testing libraries to be loaded.&lt;br /&gt;
&lt;br /&gt;
DO NOT RUN THIS IN PRODUCTION!&lt;br /&gt;
&lt;br /&gt;
  composer require --dev phpunit/phpunit # trash&lt;br /&gt;
    composer require --dev phpunit/phpunit:^9.5 --with-all-dependencies&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
    composer require --dev drupal/core-dev --update-with-all-dependencies # trash&lt;br /&gt;
  composer require --dev behat/mink:1.8.0 --with-all-dependencies&lt;br /&gt;
  composer require --dev symfony/phpunit-bridge&lt;br /&gt;
  composer require --dev phpspec/prophecy-phpunit&lt;br /&gt;
  composer require --dev behat/mink-browserkit-driver&lt;br /&gt;
&lt;br /&gt;
Copy and configure phpunit.xml:&lt;br /&gt;
&lt;br /&gt;
  phpunit --testsuite unit --filter CurrentUserBlock # trash?&lt;br /&gt;
  cd /var/www/html&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php -v --debug&lt;br /&gt;
&lt;br /&gt;
= update =&lt;br /&gt;
== 10 to 10 ==&lt;br /&gt;
  composer require \&lt;br /&gt;
  drupal/core-recommended:10.6.7 \&lt;br /&gt;
  drupal/core-composer-scaffold:10.6.7 \&lt;br /&gt;
  drupal/core-project-message:10.6.7 \&lt;br /&gt;
  --update-with-all-dependencies&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3447</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3447"/>
				<updated>2026-04-21T21:33:45Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* A great book: https://drupalatyourfingertips.com&lt;br /&gt;
* How to clear cache: /devel/cache/clear&lt;br /&gt;
&lt;br /&gt;
= Install &amp;amp; Configure =&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:9.5.10 html&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/devel:^5.1'&lt;br /&gt;
  composer require 'drupal/s3fs:^3.3'&lt;br /&gt;
  # composer require 'wasya-co/consent_popup: 1.0.4.x-dev'&lt;br /&gt;
  composer require 'drupal/consent_popup:^1.0'&lt;br /&gt;
  composer require 'drush/drush:^11.6'&lt;br /&gt;
  composer require 'drupal/metatag:^2.0'&lt;br /&gt;
  composer require 'drupal/redirect:^1.9'&lt;br /&gt;
  composer require 'drupal/superfish:^1.6'&lt;br /&gt;
  composer require 'drupal/webform:^6.0'&lt;br /&gt;
  composer require 'drupal/captcha:^1.14'&lt;br /&gt;
  composer require 'drupal/typed_data:^1.0@alpha'&lt;br /&gt;
  composer require 'drupal/rules:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smtp:^1.2'&lt;br /&gt;
  composer require 'drupal/hal:^1.0'&lt;br /&gt;
  composer require 'drupal/restui:^1.21'&lt;br /&gt;
  composer require 'drupal/keycloak:^2.2@beta'&lt;br /&gt;
  composer require 'drupal/nodeaccess:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/backup_migrate:^5.1' ## was 5.0&lt;br /&gt;
  composer require 'drupal/email_registration:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/content_access:^2.0'&lt;br /&gt;
  composer require 'drupal/social_media:^2.0'&lt;br /&gt;
  composer require 'drupal/wordpress_migrate:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/migrate_tools:^6.0'&lt;br /&gt;
  composer require 'drupal/codefilter:^2.0'&lt;br /&gt;
  composer require 'drupal/views_taxonomy_term_name_depth:^7.2'&lt;br /&gt;
  composer require 'drupal/pathauto:^1.12'&lt;br /&gt;
  composer require 'drupal/twig_tweak:^3.3'&lt;br /&gt;
  composer require 'drupal/simplenews:^4.0'&lt;br /&gt;
    # composer require 'drupal/migrate_plus:^6.0' ## didn't need it the second time&lt;br /&gt;
  composer require 'drupal/ctools:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/commerce:^2.40' ## drupal 9.5&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    apt install php-bcmath php8.1-bcmath&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^1.1'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/commerce:^3.3'  ## drupal 10&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^2.2'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/linkit:^6.0'&lt;br /&gt;
  composer require 'drupal/redirect_after_login:^3.0'&lt;br /&gt;
  composer require 'drupal/symfony_mailer:^1.4'&lt;br /&gt;
  composer require 'drupal/custom_search:^1.0@beta'&lt;br /&gt;
  composer require 'drupal/fullcalendar_view:^5.2' &lt;br /&gt;
  composer require 'drupal/date_recur:^3.3@RC'&lt;br /&gt;
  composer require 'drupal/date_recur_modular:^3.1'&lt;br /&gt;
  composer require 'drupal/colorbox:2.0.2'&lt;br /&gt;
  composer require 'drupal/tagclouds:^2.0'&lt;br /&gt;
  composer require 'drupal/filelog:^3.0'&lt;br /&gt;
  composer require 'drupal/message:^1.6'&lt;br /&gt;
  composer require 'drupal/flag:^4.0@beta'&lt;br /&gt;
  composer require 'drupal/message_subscribe:^1.4'&lt;br /&gt;
  composer require 'drupal/message_digest:^1.5'&lt;br /&gt;
  composer require 'drupal/message_ui:^1.3'&lt;br /&gt;
  composer require 'drupal/layout_builder_usage_reports:^1.0'&lt;br /&gt;
  composer require 'drupal/views_tree:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/vote_up_down:^1.0@alpha'&lt;br /&gt;
    composer require 'drupal/votingapi:^3.0@beta'&lt;br /&gt;
  composer require 'drupal/formblock:^2.0@beta'&lt;br /&gt;
  composer require 'drupal/views_pdf:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/field_permissions:^1.4'&lt;br /&gt;
  composer require 'drupal/scheduler:^2.2'&lt;br /&gt;
  composer require 'drupal/simplenews_scheduler:^4.0@alpha'&lt;br /&gt;
  composer require 'drupal/insert_view:^2.1'&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  composer require 'drupal/keycloak:^1.8'&lt;br /&gt;
  composer require 'drupal/simple_oauth:^5.2'&lt;br /&gt;
  composer require 'drupal/group:^1.6'&lt;br /&gt;
    composer require 'drupal/group_join_link:^1.0'&lt;br /&gt;
  composer require 'drupal/social_auth:^4.1'&lt;br /&gt;
    composer require 'drupal/social_auth_google:^4.0' &lt;br /&gt;
    composer require 'drupal/social_auth_facebook:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_linkedin:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_microsoft:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/twilio:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smssystem:^1.1'&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require 'drupal/smsframework:^2.3'&lt;br /&gt;
  composer require symfony/dom-crawler symfony/css-selector&lt;br /&gt;
  composer require drupal/markdown&lt;br /&gt;
  composer require drupal/markdown_easy&lt;br /&gt;
  composer require 'drupal/crm_core:3.x-dev@dev'&lt;br /&gt;
  composer require 'drupal/name:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/dynamic_entity_reference:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/default_content:^2.0@beta'&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
  composer require 'drupal/single_content_sync:^1.4' ## yep its this one&lt;br /&gt;
  # composer require drupal/views_show_more ## I don't use it?&lt;br /&gt;
  composer require 'drupal/matomo:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/paragraphs:^1.20'&lt;br /&gt;
&lt;br /&gt;
=== evaluating ===&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/seo_checklist:^5.2'&lt;br /&gt;
  composer require 'drupal/yoast_seo:^1.9'&lt;br /&gt;
  composer require 'drupal/tvi:^2.0' ## From: https://www.drupal.org/project/tvi&lt;br /&gt;
  composer require 'drupal/advanced_text_formatter:^3.0@RC'&lt;br /&gt;
  composer require 'drupal/token_filter:^2.1'&lt;br /&gt;
  composer require 'drupal/form_mode_control:^2.4'&lt;br /&gt;
  composer require 'drupal/queue_mail:^1.7'&lt;br /&gt;
  composer require 'drupal/googlelogin-googlelogin:^9.5'&lt;br /&gt;
  composer require 'drupal/dark_mode_toggle:^1.0'&lt;br /&gt;
&lt;br /&gt;
Not gonna use ebt_core, because (1) they have way too many modules, it should have been just one, and (2) their &amp;quot;hero&amp;quot; module doesn't honor container and isn't a hero.&lt;br /&gt;
&lt;br /&gt;
  # composer require 'drupal/layout_library:^1.0@beta' ## looks poor, just use blocks&lt;br /&gt;
  # composer require 'drupal/section_library:^2.0' ## looks poor, just use blocks&lt;br /&gt;
&lt;br /&gt;
== Upgrade 9 to 10 ==&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require drupal/core-recommended:^10 drupal/core-composer-scaffold:^10 drupal/core-project-message:^10 --update-with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
  composer update --with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
== Setting up dev environment ==&lt;br /&gt;
&lt;br /&gt;
* From: https://github.com/composer/composer/issues/9393&lt;br /&gt;
* From: https://www.drupal.org/docs/develop/automated-testing&lt;br /&gt;
* probably not useful: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/creating-functional-tests-simulated-browser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require --dev --no-update symfony/filesystem:4.4.42&lt;br /&gt;
  composer require --dev drupal/core-dev:9.5.11 --with-all-dependencies&lt;br /&gt;
    composer require --dev behat/mink jcalderonzumba/mink-phantomjs-driver&lt;br /&gt;
    composer update -W&lt;br /&gt;
    composer update symfony/filesystem:4.4.42 drush/drush -W&lt;br /&gt;
    composer require --dev drupal/core-dev -W&lt;br /&gt;
    composer require --dev phpspec/prophecy-phpunit:^2&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
Not useful:&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/examples:^4.0'&lt;br /&gt;
&lt;br /&gt;
== Configure Apache ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Directory /var/www/&amp;gt;&lt;br /&gt;
    Options Indexes FollowSymLinks MultiViews&lt;br /&gt;
    AllowOverride All&lt;br /&gt;
    Order allow,deny&lt;br /&gt;
    allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure s3fs ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,&lt;br /&gt;
    &amp;quot;Statement&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement0&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:ListBucket&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:ListBucketVersions&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement1&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:PutObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectAcl&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:PutObjectAcl&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;/*&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Disable caching ==&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/development-tools/disable-caching&lt;br /&gt;
&lt;br /&gt;
* Add the settings.local.php and&lt;br /&gt;
* Modify development.services.yml:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parameters:&lt;br /&gt;
  http.response.debug_cacheability_headers: true&lt;br /&gt;
  twig.config:&lt;br /&gt;
    debug: true&lt;br /&gt;
    auto_reload: true&lt;br /&gt;
    cache: false&lt;br /&gt;
services:&lt;br /&gt;
  cache.backend.null:&lt;br /&gt;
    class: Drupal\Core\Cache\NullBackendFactory&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== cleanup template debug ==&lt;br /&gt;
&lt;br /&gt;
Use in twig:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  |preg_replace('/&amp;lt;!--.*?--&amp;gt;/s','')|striptags|replace({&amp;quot;\n&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\r&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\t&amp;quot;:&amp;quot;&amp;quot;})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ReST ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
curl --include \&lt;br /&gt;
  --request POST \&lt;br /&gt;
  --user admin:&amp;lt;&amp;gt; \&lt;br /&gt;
  --header 'Content-type: application/hal+json' \&lt;br /&gt;
  http://pi.local/node?_format=hal_json \&lt;br /&gt;
  --data-binary '{&lt;br /&gt;
    &amp;quot;_links&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;http://pi.local/rest/type/node/article&amp;quot;}&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;title&amp;quot;:[{&amp;quot;value&amp;quot;:&amp;quot;Node +++ 123 bac +++&amp;quot; }],&lt;br /&gt;
    &amp;quot;body&amp;quot;:[{&amp;quot;value&amp;quot;: &amp;quot;&amp;lt;b&amp;gt;hello, wor&amp;lt;/b&amp;gt;ld!&amp;quot;, &amp;quot;format&amp;quot;: &amp;quot;full_html&amp;quot; }],&lt;br /&gt;
    &amp;quot;type&amp;quot;:[{&amp;quot;target_id&amp;quot;:&amp;quot;article&amp;quot;}],&lt;br /&gt;
    &amp;quot;status&amp;quot;: [{&amp;quot;value&amp;quot;: 1}],&lt;br /&gt;
    &amp;quot;_embedded&amp;quot;: {&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_issue&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;56229a95-d675-43e1-99b1-f9e11b5579c5&amp;quot; }] }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_tags&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;45646a7d-1a16-42e8-b758-f6e1c8d976f7&amp;quot; }] },&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;834e34e2-05ae-498d-b876-453798872ce1&amp;quot; }] }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  }'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Default Attachments ==&lt;br /&gt;
  txt pdf doc docx html csv xlsx xlsm sh json svg&lt;br /&gt;
  cer pem pub key kdbx&lt;br /&gt;
  png jpg jpeg gif&lt;br /&gt;
  mkv sfv avi mp3 mp4 webm mov&lt;br /&gt;
  zip tar gz&lt;br /&gt;
&lt;br /&gt;
== set password ==&lt;br /&gt;
&lt;br /&gt;
 drush user:password USERNAME NEW_PASSWORD&lt;br /&gt;
&lt;br /&gt;
== change ownership ==&lt;br /&gt;
&lt;br /&gt;
of all simplenews_issue &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval &amp;quot;&lt;br /&gt;
\$nids = \Drupal::entityQuery('node')&lt;br /&gt;
  -&amp;gt;condition('type', 'simplenews_issue')&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
\$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage('node');&lt;br /&gt;
\$nodes = \$storage-&amp;gt;loadMultiple(\$nids);&lt;br /&gt;
&lt;br /&gt;
foreach (\$nodes as \$node) {&lt;br /&gt;
  \$node-&amp;gt;setOwnerId(252);&lt;br /&gt;
  \$node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
of all content with &amp;quot;generated&amp;quot; in title:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval '&lt;br /&gt;
$nids = \Drupal::entityQuery(&amp;quot;node&amp;quot;)&lt;br /&gt;
  -&amp;gt;condition(&amp;quot;title&amp;quot;, &amp;quot;%enerated%&amp;quot;, &amp;quot;LIKE&amp;quot;)&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage(&amp;quot;node&amp;quot;);&lt;br /&gt;
$nodes = $storage-&amp;gt;loadMultiple($nids);&lt;br /&gt;
&lt;br /&gt;
foreach ($nodes as $node) {&lt;br /&gt;
  $node-&amp;gt;setOwnerId(129);&lt;br /&gt;
  $node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Updated &amp;quot; . count($nodes) . &amp;quot; nodes\n&amp;quot;;&lt;br /&gt;
'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Testing =&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/running-phpunit-tests&lt;br /&gt;
&lt;br /&gt;
For me, in my drupal images and containers, drupal is installed in the following folder, which is also my workdir:&lt;br /&gt;
&lt;br /&gt;
  WORKDIR /var/www/html&lt;br /&gt;
&lt;br /&gt;
The below is optional, I call the specific phpunit executable every time:&lt;br /&gt;
&lt;br /&gt;
  export PATH=&amp;quot;$PATH:/var/www/html/vendor/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You need to change minimum stability to &amp;quot;dev&amp;quot; for the testing libraries to be loaded.&lt;br /&gt;
&lt;br /&gt;
DO NOT RUN THIS IN PRODUCTION!&lt;br /&gt;
&lt;br /&gt;
  composer require --dev phpunit/phpunit # trash&lt;br /&gt;
    composer require --dev phpunit/phpunit:^9.5 --with-all-dependencies&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
    composer require --dev drupal/core-dev --update-with-all-dependencies # trash&lt;br /&gt;
  composer require --dev behat/mink:1.8.0 --with-all-dependencies&lt;br /&gt;
  composer require --dev symfony/phpunit-bridge&lt;br /&gt;
  composer require --dev phpspec/prophecy-phpunit&lt;br /&gt;
  composer require --dev behat/mink-browserkit-driver&lt;br /&gt;
&lt;br /&gt;
Copy and configure phpunit.xml:&lt;br /&gt;
&lt;br /&gt;
  phpunit --testsuite unit --filter CurrentUserBlock # trash?&lt;br /&gt;
  cd /var/www/html&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php -v --debug&lt;br /&gt;
&lt;br /&gt;
= update =&lt;br /&gt;
== 10 to 10 ==&lt;br /&gt;
  composer require \&lt;br /&gt;
  drupal/core-recommended:10.6.7 \&lt;br /&gt;
  drupal/core-composer-scaffold:10.6.7 \&lt;br /&gt;
  drupal/core-project-message:10.6.7 \&lt;br /&gt;
  --update-with-all-dependencies&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3446</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3446"/>
				<updated>2026-04-20T22:50:32Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* A great book: https://drupalatyourfingertips.com&lt;br /&gt;
* How to clear cache: /devel/cache/clear&lt;br /&gt;
&lt;br /&gt;
= Install &amp;amp; Configure =&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:9.5.10 html&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/devel:^5.1'&lt;br /&gt;
  composer require 'drupal/s3fs:^3.3'&lt;br /&gt;
  # composer require 'wasya-co/consent_popup: 1.0.4.x-dev'&lt;br /&gt;
  composer require 'drupal/consent_popup:^1.0'&lt;br /&gt;
  composer require 'drush/drush:^11.6'&lt;br /&gt;
  composer require 'drupal/metatag:^2.0'&lt;br /&gt;
  composer require 'drupal/redirect:^1.9'&lt;br /&gt;
  composer require 'drupal/superfish:^1.6'&lt;br /&gt;
  composer require 'drupal/webform:^6.0'&lt;br /&gt;
  composer require 'drupal/captcha:^1.14'&lt;br /&gt;
  composer require 'drupal/typed_data:^1.0@alpha'&lt;br /&gt;
  composer require 'drupal/rules:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smtp:^1.2'&lt;br /&gt;
  composer require 'drupal/hal:^1.0'&lt;br /&gt;
  composer require 'drupal/restui:^1.21'&lt;br /&gt;
  composer require 'drupal/keycloak:^2.2@beta'&lt;br /&gt;
  composer require 'drupal/nodeaccess:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/backup_migrate:^5.1' ## was 5.0&lt;br /&gt;
  composer require 'drupal/email_registration:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/content_access:^2.0'&lt;br /&gt;
  composer require 'drupal/social_media:^2.0'&lt;br /&gt;
  composer require 'drupal/wordpress_migrate:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/migrate_tools:^6.0'&lt;br /&gt;
  composer require 'drupal/codefilter:^2.0'&lt;br /&gt;
  composer require 'drupal/views_taxonomy_term_name_depth:^7.2'&lt;br /&gt;
  composer require 'drupal/pathauto:^1.12'&lt;br /&gt;
  composer require 'drupal/twig_tweak:^3.3'&lt;br /&gt;
  composer require 'drupal/simplenews:^4.0'&lt;br /&gt;
    # composer require 'drupal/migrate_plus:^6.0' ## didn't need it the second time&lt;br /&gt;
  composer require 'drupal/ctools:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/commerce:^2.40' ## drupal 9.5&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    apt install php-bcmath php8.1-bcmath&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^1.1'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/commerce:^3.3'  ## drupal 10&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^2.2'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/linkit:^6.0'&lt;br /&gt;
  composer require 'drupal/redirect_after_login:^3.0'&lt;br /&gt;
  composer require 'drupal/symfony_mailer:^1.4'&lt;br /&gt;
  composer require 'drupal/custom_search:^1.0@beta'&lt;br /&gt;
  composer require 'drupal/fullcalendar_view:^5.2' &lt;br /&gt;
  composer require 'drupal/date_recur:^3.3@RC'&lt;br /&gt;
  composer require 'drupal/date_recur_modular:^3.1'&lt;br /&gt;
  composer require 'drupal/colorbox:2.0.2'&lt;br /&gt;
  composer require 'drupal/tagclouds:^2.0'&lt;br /&gt;
  composer require 'drupal/filelog:^3.0'&lt;br /&gt;
  composer require 'drupal/message:^1.6'&lt;br /&gt;
  composer require 'drupal/flag:^4.0@beta'&lt;br /&gt;
  composer require 'drupal/message_subscribe:^1.4'&lt;br /&gt;
  composer require 'drupal/message_digest:^1.5'&lt;br /&gt;
  composer require 'drupal/message_ui:^1.3'&lt;br /&gt;
  composer require 'drupal/layout_builder_usage_reports:^1.0'&lt;br /&gt;
  composer require 'drupal/views_tree:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/vote_up_down:^1.0@alpha'&lt;br /&gt;
    composer require 'drupal/votingapi:^3.0@beta'&lt;br /&gt;
  composer require 'drupal/formblock:^2.0@beta'&lt;br /&gt;
  composer require 'drupal/views_pdf:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/field_permissions:^1.4'&lt;br /&gt;
  composer require 'drupal/scheduler:^2.2'&lt;br /&gt;
  composer require 'drupal/simplenews_scheduler:^4.0@alpha'&lt;br /&gt;
  composer require 'drupal/insert_view:^2.1'&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  composer require 'drupal/keycloak:^1.8'&lt;br /&gt;
  composer require 'drupal/simple_oauth:^5.2'&lt;br /&gt;
  composer require 'drupal/group:^1.6'&lt;br /&gt;
    composer require 'drupal/group_join_link:^1.0'&lt;br /&gt;
  composer require 'drupal/social_auth:^4.1'&lt;br /&gt;
    composer require 'drupal/social_auth_google:^4.0' &lt;br /&gt;
    composer require 'drupal/social_auth_facebook:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_linkedin:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_microsoft:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/twilio:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smssystem:^1.1'&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require 'drupal/smsframework:^2.3'&lt;br /&gt;
  composer require symfony/dom-crawler symfony/css-selector&lt;br /&gt;
  composer require drupal/markdown&lt;br /&gt;
  composer require drupal/markdown_easy&lt;br /&gt;
  composer require 'drupal/crm_core:3.x-dev@dev'&lt;br /&gt;
  composer require 'drupal/name:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/dynamic_entity_reference:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/default_content:^2.0@beta'&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
  composer require 'drupal/single_content_sync:^1.4' ## yep its this one&lt;br /&gt;
  # composer require drupal/views_show_more ## I don't use it?&lt;br /&gt;
  composer require 'drupal/matomo:^2.0@alpha'&lt;br /&gt;
&lt;br /&gt;
=== evaluating ===&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/seo_checklist:^5.2'&lt;br /&gt;
  composer require 'drupal/yoast_seo:^1.9'&lt;br /&gt;
  composer require 'drupal/tvi:^2.0' ## From: https://www.drupal.org/project/tvi&lt;br /&gt;
  composer require 'drupal/advanced_text_formatter:^3.0@RC'&lt;br /&gt;
  composer require 'drupal/token_filter:^2.1'&lt;br /&gt;
  composer require 'drupal/form_mode_control:^2.4'&lt;br /&gt;
  composer require 'drupal/queue_mail:^1.7'&lt;br /&gt;
  composer require 'drupal/googlelogin-googlelogin:^9.5'&lt;br /&gt;
  composer require 'drupal/dark_mode_toggle:^1.0'&lt;br /&gt;
&lt;br /&gt;
Not gonna use ebt_core, because (1) they have way too many modules, it should have been just one, and (2) their &amp;quot;hero&amp;quot; module doesn't honor container and isn't a hero.&lt;br /&gt;
&lt;br /&gt;
  # composer require 'drupal/layout_library:^1.0@beta' ## looks poor, just use blocks&lt;br /&gt;
  # composer require 'drupal/section_library:^2.0' ## looks poor, just use blocks&lt;br /&gt;
&lt;br /&gt;
== Upgrade 9 to 10 ==&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require drupal/core-recommended:^10 drupal/core-composer-scaffold:^10 drupal/core-project-message:^10 --update-with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
  composer update --with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
== Setting up dev environment ==&lt;br /&gt;
&lt;br /&gt;
* From: https://github.com/composer/composer/issues/9393&lt;br /&gt;
* From: https://www.drupal.org/docs/develop/automated-testing&lt;br /&gt;
* probably not useful: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/creating-functional-tests-simulated-browser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require --dev --no-update symfony/filesystem:4.4.42&lt;br /&gt;
  composer require --dev drupal/core-dev:9.5.11 --with-all-dependencies&lt;br /&gt;
    composer require --dev behat/mink jcalderonzumba/mink-phantomjs-driver&lt;br /&gt;
    composer update -W&lt;br /&gt;
    composer update symfony/filesystem:4.4.42 drush/drush -W&lt;br /&gt;
    composer require --dev drupal/core-dev -W&lt;br /&gt;
    composer require --dev phpspec/prophecy-phpunit:^2&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
Not useful:&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/examples:^4.0'&lt;br /&gt;
&lt;br /&gt;
== Configure Apache ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Directory /var/www/&amp;gt;&lt;br /&gt;
    Options Indexes FollowSymLinks MultiViews&lt;br /&gt;
    AllowOverride All&lt;br /&gt;
    Order allow,deny&lt;br /&gt;
    allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure s3fs ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,&lt;br /&gt;
    &amp;quot;Statement&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement0&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:ListBucket&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:ListBucketVersions&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement1&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:PutObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectAcl&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:PutObjectAcl&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;/*&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Disable caching ==&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/development-tools/disable-caching&lt;br /&gt;
&lt;br /&gt;
* Add the settings.local.php and&lt;br /&gt;
* Modify development.services.yml:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parameters:&lt;br /&gt;
  http.response.debug_cacheability_headers: true&lt;br /&gt;
  twig.config:&lt;br /&gt;
    debug: true&lt;br /&gt;
    auto_reload: true&lt;br /&gt;
    cache: false&lt;br /&gt;
services:&lt;br /&gt;
  cache.backend.null:&lt;br /&gt;
    class: Drupal\Core\Cache\NullBackendFactory&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== cleanup template debug ==&lt;br /&gt;
&lt;br /&gt;
Use in twig:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  |preg_replace('/&amp;lt;!--.*?--&amp;gt;/s','')|striptags|replace({&amp;quot;\n&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\r&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\t&amp;quot;:&amp;quot;&amp;quot;})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ReST ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
curl --include \&lt;br /&gt;
  --request POST \&lt;br /&gt;
  --user admin:&amp;lt;&amp;gt; \&lt;br /&gt;
  --header 'Content-type: application/hal+json' \&lt;br /&gt;
  http://pi.local/node?_format=hal_json \&lt;br /&gt;
  --data-binary '{&lt;br /&gt;
    &amp;quot;_links&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;http://pi.local/rest/type/node/article&amp;quot;}&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;title&amp;quot;:[{&amp;quot;value&amp;quot;:&amp;quot;Node +++ 123 bac +++&amp;quot; }],&lt;br /&gt;
    &amp;quot;body&amp;quot;:[{&amp;quot;value&amp;quot;: &amp;quot;&amp;lt;b&amp;gt;hello, wor&amp;lt;/b&amp;gt;ld!&amp;quot;, &amp;quot;format&amp;quot;: &amp;quot;full_html&amp;quot; }],&lt;br /&gt;
    &amp;quot;type&amp;quot;:[{&amp;quot;target_id&amp;quot;:&amp;quot;article&amp;quot;}],&lt;br /&gt;
    &amp;quot;status&amp;quot;: [{&amp;quot;value&amp;quot;: 1}],&lt;br /&gt;
    &amp;quot;_embedded&amp;quot;: {&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_issue&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;56229a95-d675-43e1-99b1-f9e11b5579c5&amp;quot; }] }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_tags&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;45646a7d-1a16-42e8-b758-f6e1c8d976f7&amp;quot; }] },&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;834e34e2-05ae-498d-b876-453798872ce1&amp;quot; }] }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  }'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Default Attachments ==&lt;br /&gt;
  txt pdf doc docx html csv xlsx xlsm sh json svg&lt;br /&gt;
  cer pem pub key kdbx&lt;br /&gt;
  png jpg jpeg gif&lt;br /&gt;
  mkv sfv avi mp3 mp4 webm mov&lt;br /&gt;
  zip tar gz&lt;br /&gt;
&lt;br /&gt;
== set password ==&lt;br /&gt;
&lt;br /&gt;
 drush user:password USERNAME NEW_PASSWORD&lt;br /&gt;
&lt;br /&gt;
== change ownership ==&lt;br /&gt;
&lt;br /&gt;
of all simplenews_issue &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval &amp;quot;&lt;br /&gt;
\$nids = \Drupal::entityQuery('node')&lt;br /&gt;
  -&amp;gt;condition('type', 'simplenews_issue')&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
\$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage('node');&lt;br /&gt;
\$nodes = \$storage-&amp;gt;loadMultiple(\$nids);&lt;br /&gt;
&lt;br /&gt;
foreach (\$nodes as \$node) {&lt;br /&gt;
  \$node-&amp;gt;setOwnerId(252);&lt;br /&gt;
  \$node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
of all content with &amp;quot;generated&amp;quot; in title:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval '&lt;br /&gt;
$nids = \Drupal::entityQuery(&amp;quot;node&amp;quot;)&lt;br /&gt;
  -&amp;gt;condition(&amp;quot;title&amp;quot;, &amp;quot;%enerated%&amp;quot;, &amp;quot;LIKE&amp;quot;)&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage(&amp;quot;node&amp;quot;);&lt;br /&gt;
$nodes = $storage-&amp;gt;loadMultiple($nids);&lt;br /&gt;
&lt;br /&gt;
foreach ($nodes as $node) {&lt;br /&gt;
  $node-&amp;gt;setOwnerId(129);&lt;br /&gt;
  $node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Updated &amp;quot; . count($nodes) . &amp;quot; nodes\n&amp;quot;;&lt;br /&gt;
'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Testing =&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/running-phpunit-tests&lt;br /&gt;
&lt;br /&gt;
For me, in my drupal images and containers, drupal is installed in the following folder, which is also my workdir:&lt;br /&gt;
&lt;br /&gt;
  WORKDIR /var/www/html&lt;br /&gt;
&lt;br /&gt;
The below is optional, I call the specific phpunit executable every time:&lt;br /&gt;
&lt;br /&gt;
  export PATH=&amp;quot;$PATH:/var/www/html/vendor/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You need to change minimum stability to &amp;quot;dev&amp;quot; for the testing libraries to be loaded.&lt;br /&gt;
&lt;br /&gt;
DO NOT RUN THIS IN PRODUCTION!&lt;br /&gt;
&lt;br /&gt;
  composer require --dev phpunit/phpunit # trash&lt;br /&gt;
    composer require --dev phpunit/phpunit:^9.5 --with-all-dependencies&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
    composer require --dev drupal/core-dev --update-with-all-dependencies # trash&lt;br /&gt;
  composer require --dev behat/mink:1.8.0 --with-all-dependencies&lt;br /&gt;
  composer require --dev symfony/phpunit-bridge&lt;br /&gt;
  composer require --dev phpspec/prophecy-phpunit&lt;br /&gt;
  composer require --dev behat/mink-browserkit-driver&lt;br /&gt;
&lt;br /&gt;
Copy and configure phpunit.xml:&lt;br /&gt;
&lt;br /&gt;
  phpunit --testsuite unit --filter CurrentUserBlock # trash?&lt;br /&gt;
  cd /var/www/html&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php -v --debug&lt;br /&gt;
&lt;br /&gt;
= update =&lt;br /&gt;
== 10 to 10 ==&lt;br /&gt;
  composer require \&lt;br /&gt;
  drupal/core-recommended:10.6.7 \&lt;br /&gt;
  drupal/core-composer-scaffold:10.6.7 \&lt;br /&gt;
  drupal/core-project-message:10.6.7 \&lt;br /&gt;
  --update-with-all-dependencies&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3445</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3445"/>
				<updated>2026-04-20T21:35:11Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* A great book: https://drupalatyourfingertips.com&lt;br /&gt;
* How to clear cache: /devel/cache/clear&lt;br /&gt;
&lt;br /&gt;
= Install &amp;amp; Configure =&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:9.5.10 html&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/devel:^5.1'&lt;br /&gt;
  composer require 'drupal/s3fs:^3.3'&lt;br /&gt;
  # composer require 'wasya-co/consent_popup: 1.0.4.x-dev'&lt;br /&gt;
  composer require 'drupal/consent_popup:^1.0'&lt;br /&gt;
  composer require 'drush/drush:^11.6'&lt;br /&gt;
  composer require 'drupal/metatag:^2.0'&lt;br /&gt;
  composer require 'drupal/redirect:^1.9'&lt;br /&gt;
  composer require 'drupal/superfish:^1.6'&lt;br /&gt;
  composer require 'drupal/webform:^6.0'&lt;br /&gt;
  composer require 'drupal/captcha:^1.14'&lt;br /&gt;
  composer require 'drupal/typed_data:^1.0@alpha'&lt;br /&gt;
  composer require 'drupal/rules:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smtp:^1.2'&lt;br /&gt;
  composer require 'drupal/hal:^1.0'&lt;br /&gt;
  composer require 'drupal/restui:^1.21'&lt;br /&gt;
  composer require 'drupal/keycloak:^2.2@beta'&lt;br /&gt;
  composer require 'drupal/nodeaccess:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/backup_migrate:^5.1' ## was 5.0&lt;br /&gt;
  composer require 'drupal/email_registration:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/content_access:^2.0'&lt;br /&gt;
  composer require 'drupal/social_media:^2.0'&lt;br /&gt;
  composer require 'drupal/wordpress_migrate:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/migrate_tools:^6.0'&lt;br /&gt;
  composer require 'drupal/codefilter:^2.0'&lt;br /&gt;
  composer require 'drupal/views_taxonomy_term_name_depth:^7.2'&lt;br /&gt;
  composer require 'drupal/pathauto:^1.12'&lt;br /&gt;
  composer require 'drupal/twig_tweak:^3.3'&lt;br /&gt;
  composer require 'drupal/simplenews:^4.0'&lt;br /&gt;
    # composer require 'drupal/migrate_plus:^6.0' ## didn't need it the second time&lt;br /&gt;
  composer require 'drupal/ctools:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/commerce:^2.40' ## drupal 9.5&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    apt install php-bcmath php8.1-bcmath&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^1.1'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/commerce:^3.3'  ## drupal 10&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^2.2'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/linkit:^6.0'&lt;br /&gt;
  composer require 'drupal/redirect_after_login:^3.0'&lt;br /&gt;
  composer require 'drupal/symfony_mailer:^1.4'&lt;br /&gt;
  composer require 'drupal/custom_search:^1.0@beta'&lt;br /&gt;
  composer require 'drupal/fullcalendar_view:^5.2' &lt;br /&gt;
  composer require 'drupal/date_recur:^3.3@RC'&lt;br /&gt;
  composer require 'drupal/date_recur_modular:^3.1'&lt;br /&gt;
  composer require 'drupal/colorbox:2.0.2'&lt;br /&gt;
  composer require 'drupal/tagclouds:^2.0'&lt;br /&gt;
  composer require 'drupal/filelog:^3.0'&lt;br /&gt;
  composer require 'drupal/message:^1.6'&lt;br /&gt;
  composer require 'drupal/flag:^4.0@beta'&lt;br /&gt;
  composer require 'drupal/message_subscribe:^1.4'&lt;br /&gt;
  composer require 'drupal/message_digest:^1.5'&lt;br /&gt;
  composer require 'drupal/message_ui:^1.3'&lt;br /&gt;
  composer require 'drupal/layout_builder_usage_reports:^1.0'&lt;br /&gt;
  composer require 'drupal/views_tree:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/vote_up_down:^1.0@alpha'&lt;br /&gt;
  composer require 'drupal/formblock:^2.0@beta'&lt;br /&gt;
  composer require 'drupal/views_pdf:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/field_permissions:^1.4'&lt;br /&gt;
  composer require 'drupal/scheduler:^2.2'&lt;br /&gt;
  composer require 'drupal/simplenews_scheduler:^4.0@alpha'&lt;br /&gt;
  composer require 'drupal/insert_view:^2.1'&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  composer require 'drupal/keycloak:^1.8'&lt;br /&gt;
  composer require 'drupal/simple_oauth:^5.2'&lt;br /&gt;
  composer require 'drupal/group:^1.6'&lt;br /&gt;
    composer require 'drupal/group_join_link:^1.0'&lt;br /&gt;
  composer require 'drupal/social_auth:^4.1'&lt;br /&gt;
    composer require 'drupal/social_auth_google:^4.0' &lt;br /&gt;
    composer require 'drupal/social_auth_facebook:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_linkedin:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_microsoft:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/twilio:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smssystem:^1.1'&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require 'drupal/smsframework:^2.3'&lt;br /&gt;
  composer require symfony/dom-crawler symfony/css-selector&lt;br /&gt;
  composer require drupal/markdown&lt;br /&gt;
  composer require drupal/markdown_easy&lt;br /&gt;
  composer require 'drupal/crm_core:3.x-dev@dev'&lt;br /&gt;
  composer require 'drupal/name:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/dynamic_entity_reference:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/default_content:^2.0@beta'&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
  composer require 'drupal/single_content_sync:^1.4' ## yep its this one&lt;br /&gt;
  # composer require drupal/views_show_more ## I don't use it?&lt;br /&gt;
  composer require 'drupal/matomo:^2.0@alpha'&lt;br /&gt;
&lt;br /&gt;
=== evaluating ===&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/seo_checklist:^5.2'&lt;br /&gt;
  composer require 'drupal/yoast_seo:^1.9'&lt;br /&gt;
  composer require 'drupal/tvi:^2.0' ## From: https://www.drupal.org/project/tvi&lt;br /&gt;
  composer require 'drupal/advanced_text_formatter:^3.0@RC'&lt;br /&gt;
  composer require 'drupal/token_filter:^2.1'&lt;br /&gt;
  composer require 'drupal/form_mode_control:^2.4'&lt;br /&gt;
  composer require 'drupal/queue_mail:^1.7'&lt;br /&gt;
  composer require 'drupal/googlelogin-googlelogin:^9.5'&lt;br /&gt;
  composer require 'drupal/dark_mode_toggle:^1.0'&lt;br /&gt;
&lt;br /&gt;
Not gonna use ebt_core, because (1) they have way too many modules, it should have been just one, and (2) their &amp;quot;hero&amp;quot; module doesn't honor container and isn't a hero.&lt;br /&gt;
&lt;br /&gt;
  # composer require 'drupal/layout_library:^1.0@beta' ## looks poor, just use blocks&lt;br /&gt;
  # composer require 'drupal/section_library:^2.0' ## looks poor, just use blocks&lt;br /&gt;
&lt;br /&gt;
== Upgrade 9 to 10 ==&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require drupal/core-recommended:^10 drupal/core-composer-scaffold:^10 drupal/core-project-message:^10 --update-with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
  composer update --with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
== Setting up dev environment ==&lt;br /&gt;
&lt;br /&gt;
* From: https://github.com/composer/composer/issues/9393&lt;br /&gt;
* From: https://www.drupal.org/docs/develop/automated-testing&lt;br /&gt;
* probably not useful: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/creating-functional-tests-simulated-browser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require --dev --no-update symfony/filesystem:4.4.42&lt;br /&gt;
  composer require --dev drupal/core-dev:9.5.11 --with-all-dependencies&lt;br /&gt;
    composer require --dev behat/mink jcalderonzumba/mink-phantomjs-driver&lt;br /&gt;
    composer update -W&lt;br /&gt;
    composer update symfony/filesystem:4.4.42 drush/drush -W&lt;br /&gt;
    composer require --dev drupal/core-dev -W&lt;br /&gt;
    composer require --dev phpspec/prophecy-phpunit:^2&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
Not useful:&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/examples:^4.0'&lt;br /&gt;
&lt;br /&gt;
== Configure Apache ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Directory /var/www/&amp;gt;&lt;br /&gt;
    Options Indexes FollowSymLinks MultiViews&lt;br /&gt;
    AllowOverride All&lt;br /&gt;
    Order allow,deny&lt;br /&gt;
    allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure s3fs ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,&lt;br /&gt;
    &amp;quot;Statement&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement0&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:ListBucket&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:ListBucketVersions&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement1&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:PutObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectAcl&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:PutObjectAcl&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;/*&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Disable caching ==&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/development-tools/disable-caching&lt;br /&gt;
&lt;br /&gt;
* Add the settings.local.php and&lt;br /&gt;
* Modify development.services.yml:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parameters:&lt;br /&gt;
  http.response.debug_cacheability_headers: true&lt;br /&gt;
  twig.config:&lt;br /&gt;
    debug: true&lt;br /&gt;
    auto_reload: true&lt;br /&gt;
    cache: false&lt;br /&gt;
services:&lt;br /&gt;
  cache.backend.null:&lt;br /&gt;
    class: Drupal\Core\Cache\NullBackendFactory&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== cleanup template debug ==&lt;br /&gt;
&lt;br /&gt;
Use in twig:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  |preg_replace('/&amp;lt;!--.*?--&amp;gt;/s','')|striptags|replace({&amp;quot;\n&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\r&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\t&amp;quot;:&amp;quot;&amp;quot;})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ReST ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
curl --include \&lt;br /&gt;
  --request POST \&lt;br /&gt;
  --user admin:&amp;lt;&amp;gt; \&lt;br /&gt;
  --header 'Content-type: application/hal+json' \&lt;br /&gt;
  http://pi.local/node?_format=hal_json \&lt;br /&gt;
  --data-binary '{&lt;br /&gt;
    &amp;quot;_links&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;http://pi.local/rest/type/node/article&amp;quot;}&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;title&amp;quot;:[{&amp;quot;value&amp;quot;:&amp;quot;Node +++ 123 bac +++&amp;quot; }],&lt;br /&gt;
    &amp;quot;body&amp;quot;:[{&amp;quot;value&amp;quot;: &amp;quot;&amp;lt;b&amp;gt;hello, wor&amp;lt;/b&amp;gt;ld!&amp;quot;, &amp;quot;format&amp;quot;: &amp;quot;full_html&amp;quot; }],&lt;br /&gt;
    &amp;quot;type&amp;quot;:[{&amp;quot;target_id&amp;quot;:&amp;quot;article&amp;quot;}],&lt;br /&gt;
    &amp;quot;status&amp;quot;: [{&amp;quot;value&amp;quot;: 1}],&lt;br /&gt;
    &amp;quot;_embedded&amp;quot;: {&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_issue&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;56229a95-d675-43e1-99b1-f9e11b5579c5&amp;quot; }] }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_tags&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;45646a7d-1a16-42e8-b758-f6e1c8d976f7&amp;quot; }] },&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;834e34e2-05ae-498d-b876-453798872ce1&amp;quot; }] }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  }'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Default Attachments ==&lt;br /&gt;
  txt pdf doc docx html csv xlsx xlsm sh json svg&lt;br /&gt;
  cer pem pub key kdbx&lt;br /&gt;
  png jpg jpeg gif&lt;br /&gt;
  mkv sfv avi mp3 mp4 webm mov&lt;br /&gt;
  zip tar gz&lt;br /&gt;
&lt;br /&gt;
== set password ==&lt;br /&gt;
&lt;br /&gt;
 drush user:password USERNAME NEW_PASSWORD&lt;br /&gt;
&lt;br /&gt;
== change ownership ==&lt;br /&gt;
&lt;br /&gt;
of all simplenews_issue &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval &amp;quot;&lt;br /&gt;
\$nids = \Drupal::entityQuery('node')&lt;br /&gt;
  -&amp;gt;condition('type', 'simplenews_issue')&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
\$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage('node');&lt;br /&gt;
\$nodes = \$storage-&amp;gt;loadMultiple(\$nids);&lt;br /&gt;
&lt;br /&gt;
foreach (\$nodes as \$node) {&lt;br /&gt;
  \$node-&amp;gt;setOwnerId(252);&lt;br /&gt;
  \$node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
of all content with &amp;quot;generated&amp;quot; in title:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval '&lt;br /&gt;
$nids = \Drupal::entityQuery(&amp;quot;node&amp;quot;)&lt;br /&gt;
  -&amp;gt;condition(&amp;quot;title&amp;quot;, &amp;quot;%enerated%&amp;quot;, &amp;quot;LIKE&amp;quot;)&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage(&amp;quot;node&amp;quot;);&lt;br /&gt;
$nodes = $storage-&amp;gt;loadMultiple($nids);&lt;br /&gt;
&lt;br /&gt;
foreach ($nodes as $node) {&lt;br /&gt;
  $node-&amp;gt;setOwnerId(129);&lt;br /&gt;
  $node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Updated &amp;quot; . count($nodes) . &amp;quot; nodes\n&amp;quot;;&lt;br /&gt;
'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Testing =&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/running-phpunit-tests&lt;br /&gt;
&lt;br /&gt;
For me, in my drupal images and containers, drupal is installed in the following folder, which is also my workdir:&lt;br /&gt;
&lt;br /&gt;
  WORKDIR /var/www/html&lt;br /&gt;
&lt;br /&gt;
The below is optional, I call the specific phpunit executable every time:&lt;br /&gt;
&lt;br /&gt;
  export PATH=&amp;quot;$PATH:/var/www/html/vendor/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You need to change minimum stability to &amp;quot;dev&amp;quot; for the testing libraries to be loaded.&lt;br /&gt;
&lt;br /&gt;
DO NOT RUN THIS IN PRODUCTION!&lt;br /&gt;
&lt;br /&gt;
  composer require --dev phpunit/phpunit # trash&lt;br /&gt;
    composer require --dev phpunit/phpunit:^9.5 --with-all-dependencies&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
    composer require --dev drupal/core-dev --update-with-all-dependencies # trash&lt;br /&gt;
  composer require --dev behat/mink:1.8.0 --with-all-dependencies&lt;br /&gt;
  composer require --dev symfony/phpunit-bridge&lt;br /&gt;
  composer require --dev phpspec/prophecy-phpunit&lt;br /&gt;
  composer require --dev behat/mink-browserkit-driver&lt;br /&gt;
&lt;br /&gt;
Copy and configure phpunit.xml:&lt;br /&gt;
&lt;br /&gt;
  phpunit --testsuite unit --filter CurrentUserBlock # trash?&lt;br /&gt;
  cd /var/www/html&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php -v --debug&lt;br /&gt;
&lt;br /&gt;
= update =&lt;br /&gt;
== 10 to 10 ==&lt;br /&gt;
  composer require \&lt;br /&gt;
  drupal/core-recommended:10.6.7 \&lt;br /&gt;
  drupal/core-composer-scaffold:10.6.7 \&lt;br /&gt;
  drupal/core-project-message:10.6.7 \&lt;br /&gt;
  --update-with-all-dependencies&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3444</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3444"/>
				<updated>2026-04-20T20:44:55Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: /* set password */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* A great book: https://drupalatyourfingertips.com&lt;br /&gt;
* How to clear cache: /devel/cache/clear&lt;br /&gt;
&lt;br /&gt;
= Install &amp;amp; Configure =&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:9.5.10 html&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/devel:^5.1'&lt;br /&gt;
  composer require 'drupal/s3fs:^3.3'&lt;br /&gt;
  # composer require 'wasya-co/consent_popup: 1.0.4.x-dev'&lt;br /&gt;
  composer require 'drupal/consent_popup:^1.0'&lt;br /&gt;
  composer require 'drush/drush:^11.6'&lt;br /&gt;
  composer require 'drupal/metatag:^2.0'&lt;br /&gt;
  composer require 'drupal/redirect:^1.9'&lt;br /&gt;
  composer require 'drupal/superfish:^1.6'&lt;br /&gt;
  composer require 'drupal/webform:^6.0'&lt;br /&gt;
  composer require 'drupal/captcha:^1.14'&lt;br /&gt;
  composer require 'drupal/typed_data:^1.0@alpha'&lt;br /&gt;
  composer require 'drupal/rules:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smtp:^1.2'&lt;br /&gt;
  composer require 'drupal/hal:^1.0'&lt;br /&gt;
  composer require 'drupal/restui:^1.21'&lt;br /&gt;
  composer require 'drupal/keycloak:^2.2@beta'&lt;br /&gt;
  composer require 'drupal/nodeaccess:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/backup_migrate:^5.1' ## was 5.0&lt;br /&gt;
  composer require 'drupal/email_registration:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/content_access:^2.0'&lt;br /&gt;
  composer require 'drupal/social_media:^2.0'&lt;br /&gt;
  composer require 'drupal/wordpress_migrate:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/migrate_tools:^6.0'&lt;br /&gt;
  composer require 'drupal/codefilter:^2.0'&lt;br /&gt;
  composer require 'drupal/views_taxonomy_term_name_depth:^7.2'&lt;br /&gt;
  composer require 'drupal/pathauto:^1.12'&lt;br /&gt;
  composer require 'drupal/twig_tweak:^3.3'&lt;br /&gt;
  composer require 'drupal/simplenews:^4.0'&lt;br /&gt;
    # composer require 'drupal/migrate_plus:^6.0' ## didn't need it the second time&lt;br /&gt;
  composer require 'drupal/ctools:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/commerce:^2.40' ## drupal 9.5&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    apt install php-bcmath php8.1-bcmath&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^1.1'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/commerce:^3.3'  ## drupal 10&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^2.2'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/linkit:^6.0'&lt;br /&gt;
  composer require 'drupal/redirect_after_login:^3.0'&lt;br /&gt;
  composer require 'drupal/symfony_mailer:^1.4'&lt;br /&gt;
  composer require 'drupal/custom_search:^1.0@beta'&lt;br /&gt;
  composer require 'drupal/fullcalendar_view:^5.2' &lt;br /&gt;
  composer require 'drupal/date_recur:^3.3@RC'&lt;br /&gt;
  composer require 'drupal/date_recur_modular:^3.1'&lt;br /&gt;
  composer require 'drupal/colorbox:2.0.2'&lt;br /&gt;
  composer require 'drupal/tagclouds:^2.0'&lt;br /&gt;
  composer require 'drupal/filelog:^3.0'&lt;br /&gt;
  composer require 'drupal/message:^1.6'&lt;br /&gt;
  composer require 'drupal/flag:^4.0@beta'&lt;br /&gt;
  composer require 'drupal/message_subscribe:^1.4'&lt;br /&gt;
  composer require 'drupal/message_digest:^1.5'&lt;br /&gt;
  composer require 'drupal/message_ui:^1.3'&lt;br /&gt;
  composer require 'drupal/layout_builder_usage_reports:^1.0'&lt;br /&gt;
  composer require 'drupal/views_tree:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/vote_up_down:^1.0@alpha'&lt;br /&gt;
  composer require 'drupal/formblock:^2.0@beta'&lt;br /&gt;
  composer require 'drupal/views_pdf:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/field_permissions:^1.4'&lt;br /&gt;
  composer require 'drupal/scheduler:^2.2'&lt;br /&gt;
  composer require 'drupal/simplenews_scheduler:^4.0@alpha'&lt;br /&gt;
  composer require 'drupal/insert_view:^2.1'&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  composer require 'drupal/keycloak:^1.8'&lt;br /&gt;
  composer require 'drupal/simple_oauth:^5.2'&lt;br /&gt;
  composer require 'drupal/group:^1.6'&lt;br /&gt;
    composer require 'drupal/group_join_link:^1.0'&lt;br /&gt;
  composer require 'drupal/social_auth:^4.1'&lt;br /&gt;
    composer require 'drupal/social_auth_google:^4.0' &lt;br /&gt;
    composer require 'drupal/social_auth_facebook:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_linkedin:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_microsoft:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/twilio:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smssystem:^1.1'&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require 'drupal/smsframework:^2.3'&lt;br /&gt;
  composer require symfony/dom-crawler symfony/css-selector&lt;br /&gt;
  composer require drupal/markdown&lt;br /&gt;
  composer require drupal/markdown_easy&lt;br /&gt;
  composer require 'drupal/crm_core:3.x-dev@dev'&lt;br /&gt;
  composer require 'drupal/name:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/dynamic_entity_reference:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/default_content:^2.0@beta'&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
  composer require 'drupal/single_content_sync:^1.4' ## yep its this one&lt;br /&gt;
  # composer require drupal/views_show_more ## I don't use it?&lt;br /&gt;
  composer require 'drupal/matomo:^2.0@alpha'&lt;br /&gt;
&lt;br /&gt;
=== evaluating ===&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/seo_checklist:^5.2'&lt;br /&gt;
  composer require 'drupal/yoast_seo:^1.9'&lt;br /&gt;
  composer require 'drupal/tvi:^2.0' ## From: https://www.drupal.org/project/tvi&lt;br /&gt;
  composer require 'drupal/advanced_text_formatter:^3.0@RC'&lt;br /&gt;
  composer require 'drupal/token_filter:^2.1'&lt;br /&gt;
  composer require 'drupal/form_mode_control:^2.4'&lt;br /&gt;
  composer require 'drupal/queue_mail:^1.7'&lt;br /&gt;
  composer require 'drupal/googlelogin-googlelogin:^9.5'&lt;br /&gt;
  composer require 'drupal/dark_mode_toggle:^1.0'&lt;br /&gt;
&lt;br /&gt;
Not gonna use ebt_core, because (1) they have way too many modules, it should have been just one, and (2) their &amp;quot;hero&amp;quot; module doesn't honor container and isn't a hero.&lt;br /&gt;
&lt;br /&gt;
  # composer require 'drupal/layout_library:^1.0@beta' ## looks poor, just use blocks&lt;br /&gt;
  # composer require 'drupal/section_library:^2.0' ## looks poor, just use blocks&lt;br /&gt;
&lt;br /&gt;
== Upgrade 9 to 10 ==&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require drupal/core-recommended:^10 drupal/core-composer-scaffold:^10 drupal/core-project-message:^10 --update-with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
  composer update --with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
== Setting up dev environment ==&lt;br /&gt;
&lt;br /&gt;
* From: https://github.com/composer/composer/issues/9393&lt;br /&gt;
* From: https://www.drupal.org/docs/develop/automated-testing&lt;br /&gt;
* probably not useful: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/creating-functional-tests-simulated-browser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require --dev --no-update symfony/filesystem:4.4.42&lt;br /&gt;
  composer require --dev drupal/core-dev:9.5.11 --with-all-dependencies&lt;br /&gt;
    composer require --dev behat/mink jcalderonzumba/mink-phantomjs-driver&lt;br /&gt;
    composer update -W&lt;br /&gt;
    composer update symfony/filesystem:4.4.42 drush/drush -W&lt;br /&gt;
    composer require --dev drupal/core-dev -W&lt;br /&gt;
    composer require --dev phpspec/prophecy-phpunit:^2&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
Not useful:&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/examples:^4.0'&lt;br /&gt;
&lt;br /&gt;
== Configure Apache ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Directory /var/www/&amp;gt;&lt;br /&gt;
    Options Indexes FollowSymLinks MultiViews&lt;br /&gt;
    AllowOverride All&lt;br /&gt;
    Order allow,deny&lt;br /&gt;
    allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure s3fs ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,&lt;br /&gt;
    &amp;quot;Statement&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement0&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:ListBucket&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:ListBucketVersions&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement1&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:PutObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectAcl&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:PutObjectAcl&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;/*&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Disable caching ==&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/development-tools/disable-caching&lt;br /&gt;
&lt;br /&gt;
* Add the settings.local.php and&lt;br /&gt;
* Modify development.services.yml:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parameters:&lt;br /&gt;
  http.response.debug_cacheability_headers: true&lt;br /&gt;
  twig.config:&lt;br /&gt;
    debug: true&lt;br /&gt;
    auto_reload: true&lt;br /&gt;
    cache: false&lt;br /&gt;
services:&lt;br /&gt;
  cache.backend.null:&lt;br /&gt;
    class: Drupal\Core\Cache\NullBackendFactory&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== cleanup template debug ==&lt;br /&gt;
&lt;br /&gt;
Use in twig:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  |preg_replace('/&amp;lt;!--.*?--&amp;gt;/s','')|striptags|replace({&amp;quot;\n&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\r&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\t&amp;quot;:&amp;quot;&amp;quot;})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ReST ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
curl --include \&lt;br /&gt;
  --request POST \&lt;br /&gt;
  --user admin:&amp;lt;&amp;gt; \&lt;br /&gt;
  --header 'Content-type: application/hal+json' \&lt;br /&gt;
  http://pi.local/node?_format=hal_json \&lt;br /&gt;
  --data-binary '{&lt;br /&gt;
    &amp;quot;_links&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;http://pi.local/rest/type/node/article&amp;quot;}&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;title&amp;quot;:[{&amp;quot;value&amp;quot;:&amp;quot;Node +++ 123 bac +++&amp;quot; }],&lt;br /&gt;
    &amp;quot;body&amp;quot;:[{&amp;quot;value&amp;quot;: &amp;quot;&amp;lt;b&amp;gt;hello, wor&amp;lt;/b&amp;gt;ld!&amp;quot;, &amp;quot;format&amp;quot;: &amp;quot;full_html&amp;quot; }],&lt;br /&gt;
    &amp;quot;type&amp;quot;:[{&amp;quot;target_id&amp;quot;:&amp;quot;article&amp;quot;}],&lt;br /&gt;
    &amp;quot;status&amp;quot;: [{&amp;quot;value&amp;quot;: 1}],&lt;br /&gt;
    &amp;quot;_embedded&amp;quot;: {&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_issue&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;56229a95-d675-43e1-99b1-f9e11b5579c5&amp;quot; }] }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_tags&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;45646a7d-1a16-42e8-b758-f6e1c8d976f7&amp;quot; }] },&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;834e34e2-05ae-498d-b876-453798872ce1&amp;quot; }] }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  }'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Default Attachments ==&lt;br /&gt;
  txt pdf doc docx html csv xlsx xlsm sh json svg&lt;br /&gt;
  cer pem pub key kdbx&lt;br /&gt;
  png jpg jpeg gif&lt;br /&gt;
  mkv sfv avi mp3 mp4 webm mov&lt;br /&gt;
  zip tar gz&lt;br /&gt;
&lt;br /&gt;
== set password ==&lt;br /&gt;
&lt;br /&gt;
 drush user:password USERNAME NEW_PASSWORD&lt;br /&gt;
&lt;br /&gt;
== change ownership ==&lt;br /&gt;
&lt;br /&gt;
of all simplenews_issue &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval &amp;quot;&lt;br /&gt;
\$nids = \Drupal::entityQuery('node')&lt;br /&gt;
  -&amp;gt;condition('type', 'simplenews_issue')&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
\$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage('node');&lt;br /&gt;
\$nodes = \$storage-&amp;gt;loadMultiple(\$nids);&lt;br /&gt;
&lt;br /&gt;
foreach (\$nodes as \$node) {&lt;br /&gt;
  \$node-&amp;gt;setOwnerId(252);&lt;br /&gt;
  \$node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
of all content with &amp;quot;generated&amp;quot; in title:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval '&lt;br /&gt;
$nids = \Drupal::entityQuery(&amp;quot;node&amp;quot;)&lt;br /&gt;
  -&amp;gt;condition(&amp;quot;title&amp;quot;, &amp;quot;%enerated%&amp;quot;, &amp;quot;LIKE&amp;quot;)&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage(&amp;quot;node&amp;quot;);&lt;br /&gt;
$nodes = $storage-&amp;gt;loadMultiple($nids);&lt;br /&gt;
&lt;br /&gt;
foreach ($nodes as $node) {&lt;br /&gt;
  $node-&amp;gt;setOwnerId(129);&lt;br /&gt;
  $node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Updated &amp;quot; . count($nodes) . &amp;quot; nodes\n&amp;quot;;&lt;br /&gt;
'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Testing =&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/running-phpunit-tests&lt;br /&gt;
&lt;br /&gt;
For me, in my drupal images and containers, drupal is installed in the following folder, which is also my workdir:&lt;br /&gt;
&lt;br /&gt;
  WORKDIR /var/www/html&lt;br /&gt;
&lt;br /&gt;
The below is optional, I call the specific phpunit executable every time:&lt;br /&gt;
&lt;br /&gt;
  export PATH=&amp;quot;$PATH:/var/www/html/vendor/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You need to change minimum stability to &amp;quot;dev&amp;quot; for the testing libraries to be loaded.&lt;br /&gt;
&lt;br /&gt;
DO NOT RUN THIS IN PRODUCTION!&lt;br /&gt;
&lt;br /&gt;
  composer require --dev phpunit/phpunit # trash&lt;br /&gt;
    composer require --dev phpunit/phpunit:^9.5 --with-all-dependencies&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
    composer require --dev drupal/core-dev --update-with-all-dependencies # trash&lt;br /&gt;
  composer require --dev behat/mink:1.8.0 --with-all-dependencies&lt;br /&gt;
  composer require --dev symfony/phpunit-bridge&lt;br /&gt;
  composer require --dev phpspec/prophecy-phpunit&lt;br /&gt;
  composer require --dev behat/mink-browserkit-driver&lt;br /&gt;
&lt;br /&gt;
Copy and configure phpunit.xml:&lt;br /&gt;
&lt;br /&gt;
  phpunit --testsuite unit --filter CurrentUserBlock # trash?&lt;br /&gt;
  cd /var/www/html&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php -v --debug&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3443</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3443"/>
				<updated>2026-04-20T20:44:48Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* A great book: https://drupalatyourfingertips.com&lt;br /&gt;
* How to clear cache: /devel/cache/clear&lt;br /&gt;
&lt;br /&gt;
= Install &amp;amp; Configure =&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:9.5.10 html&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/devel:^5.1'&lt;br /&gt;
  composer require 'drupal/s3fs:^3.3'&lt;br /&gt;
  # composer require 'wasya-co/consent_popup: 1.0.4.x-dev'&lt;br /&gt;
  composer require 'drupal/consent_popup:^1.0'&lt;br /&gt;
  composer require 'drush/drush:^11.6'&lt;br /&gt;
  composer require 'drupal/metatag:^2.0'&lt;br /&gt;
  composer require 'drupal/redirect:^1.9'&lt;br /&gt;
  composer require 'drupal/superfish:^1.6'&lt;br /&gt;
  composer require 'drupal/webform:^6.0'&lt;br /&gt;
  composer require 'drupal/captcha:^1.14'&lt;br /&gt;
  composer require 'drupal/typed_data:^1.0@alpha'&lt;br /&gt;
  composer require 'drupal/rules:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smtp:^1.2'&lt;br /&gt;
  composer require 'drupal/hal:^1.0'&lt;br /&gt;
  composer require 'drupal/restui:^1.21'&lt;br /&gt;
  composer require 'drupal/keycloak:^2.2@beta'&lt;br /&gt;
  composer require 'drupal/nodeaccess:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/backup_migrate:^5.1' ## was 5.0&lt;br /&gt;
  composer require 'drupal/email_registration:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/content_access:^2.0'&lt;br /&gt;
  composer require 'drupal/social_media:^2.0'&lt;br /&gt;
  composer require 'drupal/wordpress_migrate:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/migrate_tools:^6.0'&lt;br /&gt;
  composer require 'drupal/codefilter:^2.0'&lt;br /&gt;
  composer require 'drupal/views_taxonomy_term_name_depth:^7.2'&lt;br /&gt;
  composer require 'drupal/pathauto:^1.12'&lt;br /&gt;
  composer require 'drupal/twig_tweak:^3.3'&lt;br /&gt;
  composer require 'drupal/simplenews:^4.0'&lt;br /&gt;
    # composer require 'drupal/migrate_plus:^6.0' ## didn't need it the second time&lt;br /&gt;
  composer require 'drupal/ctools:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/commerce:^2.40' ## drupal 9.5&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    apt install php-bcmath php8.1-bcmath&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^1.1'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/commerce:^3.3'  ## drupal 10&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^2.2'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/linkit:^6.0'&lt;br /&gt;
  composer require 'drupal/redirect_after_login:^3.0'&lt;br /&gt;
  composer require 'drupal/symfony_mailer:^1.4'&lt;br /&gt;
  composer require 'drupal/custom_search:^1.0@beta'&lt;br /&gt;
  composer require 'drupal/fullcalendar_view:^5.2' &lt;br /&gt;
  composer require 'drupal/date_recur:^3.3@RC'&lt;br /&gt;
  composer require 'drupal/date_recur_modular:^3.1'&lt;br /&gt;
  composer require 'drupal/colorbox:2.0.2'&lt;br /&gt;
  composer require 'drupal/tagclouds:^2.0'&lt;br /&gt;
  composer require 'drupal/filelog:^3.0'&lt;br /&gt;
  composer require 'drupal/message:^1.6'&lt;br /&gt;
  composer require 'drupal/flag:^4.0@beta'&lt;br /&gt;
  composer require 'drupal/message_subscribe:^1.4'&lt;br /&gt;
  composer require 'drupal/message_digest:^1.5'&lt;br /&gt;
  composer require 'drupal/message_ui:^1.3'&lt;br /&gt;
  composer require 'drupal/layout_builder_usage_reports:^1.0'&lt;br /&gt;
  composer require 'drupal/views_tree:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/vote_up_down:^1.0@alpha'&lt;br /&gt;
  composer require 'drupal/formblock:^2.0@beta'&lt;br /&gt;
  composer require 'drupal/views_pdf:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/field_permissions:^1.4'&lt;br /&gt;
  composer require 'drupal/scheduler:^2.2'&lt;br /&gt;
  composer require 'drupal/simplenews_scheduler:^4.0@alpha'&lt;br /&gt;
  composer require 'drupal/insert_view:^2.1'&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  composer require 'drupal/keycloak:^1.8'&lt;br /&gt;
  composer require 'drupal/simple_oauth:^5.2'&lt;br /&gt;
  composer require 'drupal/group:^1.6'&lt;br /&gt;
    composer require 'drupal/group_join_link:^1.0'&lt;br /&gt;
  composer require 'drupal/social_auth:^4.1'&lt;br /&gt;
    composer require 'drupal/social_auth_google:^4.0' &lt;br /&gt;
    composer require 'drupal/social_auth_facebook:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_linkedin:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_microsoft:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/twilio:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smssystem:^1.1'&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require 'drupal/smsframework:^2.3'&lt;br /&gt;
  composer require symfony/dom-crawler symfony/css-selector&lt;br /&gt;
  composer require drupal/markdown&lt;br /&gt;
  composer require drupal/markdown_easy&lt;br /&gt;
  composer require 'drupal/crm_core:3.x-dev@dev'&lt;br /&gt;
  composer require 'drupal/name:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/dynamic_entity_reference:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/default_content:^2.0@beta'&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
  composer require 'drupal/single_content_sync:^1.4' ## yep its this one&lt;br /&gt;
  # composer require drupal/views_show_more ## I don't use it?&lt;br /&gt;
  composer require 'drupal/matomo:^2.0@alpha'&lt;br /&gt;
&lt;br /&gt;
=== evaluating ===&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/seo_checklist:^5.2'&lt;br /&gt;
  composer require 'drupal/yoast_seo:^1.9'&lt;br /&gt;
  composer require 'drupal/tvi:^2.0' ## From: https://www.drupal.org/project/tvi&lt;br /&gt;
  composer require 'drupal/advanced_text_formatter:^3.0@RC'&lt;br /&gt;
  composer require 'drupal/token_filter:^2.1'&lt;br /&gt;
  composer require 'drupal/form_mode_control:^2.4'&lt;br /&gt;
  composer require 'drupal/queue_mail:^1.7'&lt;br /&gt;
  composer require 'drupal/googlelogin-googlelogin:^9.5'&lt;br /&gt;
  composer require 'drupal/dark_mode_toggle:^1.0'&lt;br /&gt;
&lt;br /&gt;
Not gonna use ebt_core, because (1) they have way too many modules, it should have been just one, and (2) their &amp;quot;hero&amp;quot; module doesn't honor container and isn't a hero.&lt;br /&gt;
&lt;br /&gt;
  # composer require 'drupal/layout_library:^1.0@beta' ## looks poor, just use blocks&lt;br /&gt;
  # composer require 'drupal/section_library:^2.0' ## looks poor, just use blocks&lt;br /&gt;
&lt;br /&gt;
== Upgrade 9 to 10 ==&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require drupal/core-recommended:^10 drupal/core-composer-scaffold:^10 drupal/core-project-message:^10 --update-with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
  composer update --with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
== Setting up dev environment ==&lt;br /&gt;
&lt;br /&gt;
* From: https://github.com/composer/composer/issues/9393&lt;br /&gt;
* From: https://www.drupal.org/docs/develop/automated-testing&lt;br /&gt;
* probably not useful: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/creating-functional-tests-simulated-browser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require --dev --no-update symfony/filesystem:4.4.42&lt;br /&gt;
  composer require --dev drupal/core-dev:9.5.11 --with-all-dependencies&lt;br /&gt;
    composer require --dev behat/mink jcalderonzumba/mink-phantomjs-driver&lt;br /&gt;
    composer update -W&lt;br /&gt;
    composer update symfony/filesystem:4.4.42 drush/drush -W&lt;br /&gt;
    composer require --dev drupal/core-dev -W&lt;br /&gt;
    composer require --dev phpspec/prophecy-phpunit:^2&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
Not useful:&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/examples:^4.0'&lt;br /&gt;
&lt;br /&gt;
== Configure Apache ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Directory /var/www/&amp;gt;&lt;br /&gt;
    Options Indexes FollowSymLinks MultiViews&lt;br /&gt;
    AllowOverride All&lt;br /&gt;
    Order allow,deny&lt;br /&gt;
    allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure s3fs ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,&lt;br /&gt;
    &amp;quot;Statement&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement0&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:ListBucket&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:ListBucketVersions&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement1&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:PutObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectAcl&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:PutObjectAcl&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;/*&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Disable caching ==&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/development-tools/disable-caching&lt;br /&gt;
&lt;br /&gt;
* Add the settings.local.php and&lt;br /&gt;
* Modify development.services.yml:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parameters:&lt;br /&gt;
  http.response.debug_cacheability_headers: true&lt;br /&gt;
  twig.config:&lt;br /&gt;
    debug: true&lt;br /&gt;
    auto_reload: true&lt;br /&gt;
    cache: false&lt;br /&gt;
services:&lt;br /&gt;
  cache.backend.null:&lt;br /&gt;
    class: Drupal\Core\Cache\NullBackendFactory&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== cleanup template debug ==&lt;br /&gt;
&lt;br /&gt;
Use in twig:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  |preg_replace('/&amp;lt;!--.*?--&amp;gt;/s','')|striptags|replace({&amp;quot;\n&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\r&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\t&amp;quot;:&amp;quot;&amp;quot;})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ReST ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
curl --include \&lt;br /&gt;
  --request POST \&lt;br /&gt;
  --user admin:&amp;lt;&amp;gt; \&lt;br /&gt;
  --header 'Content-type: application/hal+json' \&lt;br /&gt;
  http://pi.local/node?_format=hal_json \&lt;br /&gt;
  --data-binary '{&lt;br /&gt;
    &amp;quot;_links&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;http://pi.local/rest/type/node/article&amp;quot;}&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;title&amp;quot;:[{&amp;quot;value&amp;quot;:&amp;quot;Node +++ 123 bac +++&amp;quot; }],&lt;br /&gt;
    &amp;quot;body&amp;quot;:[{&amp;quot;value&amp;quot;: &amp;quot;&amp;lt;b&amp;gt;hello, wor&amp;lt;/b&amp;gt;ld!&amp;quot;, &amp;quot;format&amp;quot;: &amp;quot;full_html&amp;quot; }],&lt;br /&gt;
    &amp;quot;type&amp;quot;:[{&amp;quot;target_id&amp;quot;:&amp;quot;article&amp;quot;}],&lt;br /&gt;
    &amp;quot;status&amp;quot;: [{&amp;quot;value&amp;quot;: 1}],&lt;br /&gt;
    &amp;quot;_embedded&amp;quot;: {&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_issue&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;56229a95-d675-43e1-99b1-f9e11b5579c5&amp;quot; }] }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_tags&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;45646a7d-1a16-42e8-b758-f6e1c8d976f7&amp;quot; }] },&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;834e34e2-05ae-498d-b876-453798872ce1&amp;quot; }] }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  }'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Default Attachments ==&lt;br /&gt;
  txt pdf doc docx html csv xlsx xlsm sh json svg&lt;br /&gt;
  cer pem pub key kdbx&lt;br /&gt;
  png jpg jpeg gif&lt;br /&gt;
  mkv sfv avi mp3 mp4 webm mov&lt;br /&gt;
  zip tar gz&lt;br /&gt;
&lt;br /&gt;
== set password ==&lt;br /&gt;
&lt;br /&gt;
drush user:password USERNAME NEW_PASSWORD&lt;br /&gt;
&lt;br /&gt;
== change ownership ==&lt;br /&gt;
&lt;br /&gt;
of all simplenews_issue &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval &amp;quot;&lt;br /&gt;
\$nids = \Drupal::entityQuery('node')&lt;br /&gt;
  -&amp;gt;condition('type', 'simplenews_issue')&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
\$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage('node');&lt;br /&gt;
\$nodes = \$storage-&amp;gt;loadMultiple(\$nids);&lt;br /&gt;
&lt;br /&gt;
foreach (\$nodes as \$node) {&lt;br /&gt;
  \$node-&amp;gt;setOwnerId(252);&lt;br /&gt;
  \$node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
of all content with &amp;quot;generated&amp;quot; in title:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval '&lt;br /&gt;
$nids = \Drupal::entityQuery(&amp;quot;node&amp;quot;)&lt;br /&gt;
  -&amp;gt;condition(&amp;quot;title&amp;quot;, &amp;quot;%enerated%&amp;quot;, &amp;quot;LIKE&amp;quot;)&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage(&amp;quot;node&amp;quot;);&lt;br /&gt;
$nodes = $storage-&amp;gt;loadMultiple($nids);&lt;br /&gt;
&lt;br /&gt;
foreach ($nodes as $node) {&lt;br /&gt;
  $node-&amp;gt;setOwnerId(129);&lt;br /&gt;
  $node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Updated &amp;quot; . count($nodes) . &amp;quot; nodes\n&amp;quot;;&lt;br /&gt;
'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Testing =&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/running-phpunit-tests&lt;br /&gt;
&lt;br /&gt;
For me, in my drupal images and containers, drupal is installed in the following folder, which is also my workdir:&lt;br /&gt;
&lt;br /&gt;
  WORKDIR /var/www/html&lt;br /&gt;
&lt;br /&gt;
The below is optional, I call the specific phpunit executable every time:&lt;br /&gt;
&lt;br /&gt;
  export PATH=&amp;quot;$PATH:/var/www/html/vendor/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You need to change minimum stability to &amp;quot;dev&amp;quot; for the testing libraries to be loaded.&lt;br /&gt;
&lt;br /&gt;
DO NOT RUN THIS IN PRODUCTION!&lt;br /&gt;
&lt;br /&gt;
  composer require --dev phpunit/phpunit # trash&lt;br /&gt;
    composer require --dev phpunit/phpunit:^9.5 --with-all-dependencies&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
    composer require --dev drupal/core-dev --update-with-all-dependencies # trash&lt;br /&gt;
  composer require --dev behat/mink:1.8.0 --with-all-dependencies&lt;br /&gt;
  composer require --dev symfony/phpunit-bridge&lt;br /&gt;
  composer require --dev phpspec/prophecy-phpunit&lt;br /&gt;
  composer require --dev behat/mink-browserkit-driver&lt;br /&gt;
&lt;br /&gt;
Copy and configure phpunit.xml:&lt;br /&gt;
&lt;br /&gt;
  phpunit --testsuite unit --filter CurrentUserBlock # trash?&lt;br /&gt;
  cd /var/www/html&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php -v --debug&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3442</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3442"/>
				<updated>2026-04-20T20:27:13Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* A great book: https://drupalatyourfingertips.com&lt;br /&gt;
* How to clear cache: /devel/cache/clear&lt;br /&gt;
&lt;br /&gt;
= Install &amp;amp; Configure =&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:9.5.10 html&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/devel:^5.1'&lt;br /&gt;
  composer require 'drupal/s3fs:^3.3'&lt;br /&gt;
  # composer require 'wasya-co/consent_popup: 1.0.4.x-dev'&lt;br /&gt;
  composer require 'drupal/consent_popup:^1.0'&lt;br /&gt;
  composer require 'drush/drush:^11.6'&lt;br /&gt;
  composer require 'drupal/metatag:^2.0'&lt;br /&gt;
  composer require 'drupal/redirect:^1.9'&lt;br /&gt;
  composer require 'drupal/superfish:^1.6'&lt;br /&gt;
  composer require 'drupal/webform:^6.0'&lt;br /&gt;
  composer require 'drupal/captcha:^1.14'&lt;br /&gt;
  composer require 'drupal/typed_data:^1.0@alpha'&lt;br /&gt;
  composer require 'drupal/rules:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smtp:^1.2'&lt;br /&gt;
  composer require 'drupal/hal:^1.0'&lt;br /&gt;
  composer require 'drupal/restui:^1.21'&lt;br /&gt;
  composer require 'drupal/keycloak:^2.2@beta'&lt;br /&gt;
  composer require 'drupal/nodeaccess:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/backup_migrate:^5.1' ## was 5.0&lt;br /&gt;
  composer require 'drupal/email_registration:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/content_access:^2.0'&lt;br /&gt;
  composer require 'drupal/social_media:^2.0'&lt;br /&gt;
  composer require 'drupal/wordpress_migrate:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/migrate_tools:^6.0'&lt;br /&gt;
  composer require 'drupal/codefilter:^2.0'&lt;br /&gt;
  composer require 'drupal/views_taxonomy_term_name_depth:^7.2'&lt;br /&gt;
  composer require 'drupal/pathauto:^1.12'&lt;br /&gt;
  composer require 'drupal/twig_tweak:^3.3'&lt;br /&gt;
  composer require 'drupal/simplenews:^4.0'&lt;br /&gt;
    # composer require 'drupal/migrate_plus:^6.0' ## didn't need it the second time&lt;br /&gt;
  composer require 'drupal/ctools:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/commerce:^2.40' ## drupal 9.5&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    apt install php-bcmath php8.1-bcmath&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^1.1'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/commerce:^3.3'  ## drupal 10&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^2.2'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/linkit:^6.0'&lt;br /&gt;
  composer require 'drupal/redirect_after_login:^3.0'&lt;br /&gt;
  composer require 'drupal/symfony_mailer:^1.4'&lt;br /&gt;
  composer require 'drupal/custom_search:^1.0@beta'&lt;br /&gt;
  composer require 'drupal/fullcalendar_view:^5.2' &lt;br /&gt;
  composer require 'drupal/date_recur:^3.3@RC'&lt;br /&gt;
  composer require 'drupal/date_recur_modular:^3.1'&lt;br /&gt;
  composer require 'drupal/colorbox:2.0.2'&lt;br /&gt;
  composer require 'drupal/tagclouds:^2.0'&lt;br /&gt;
  composer require 'drupal/filelog:^3.0'&lt;br /&gt;
  composer require 'drupal/message:^1.6'&lt;br /&gt;
  composer require 'drupal/flag:^4.0@beta'&lt;br /&gt;
  composer require 'drupal/message_subscribe:^1.4'&lt;br /&gt;
  composer require 'drupal/message_digest:^1.5'&lt;br /&gt;
  composer require 'drupal/message_ui:^1.3'&lt;br /&gt;
  composer require 'drupal/layout_builder_usage_reports:^1.0'&lt;br /&gt;
  composer require 'drupal/views_tree:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/vote_up_down:^1.0@alpha'&lt;br /&gt;
  composer require 'drupal/formblock:^2.0@beta'&lt;br /&gt;
  composer require 'drupal/views_pdf:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/field_permissions:^1.4'&lt;br /&gt;
  composer require 'drupal/scheduler:^2.2'&lt;br /&gt;
  composer require 'drupal/simplenews_scheduler:^4.0@alpha'&lt;br /&gt;
  composer require 'drupal/insert_view:^2.1'&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  composer require 'drupal/keycloak:^1.8'&lt;br /&gt;
  composer require 'drupal/simple_oauth:^5.2'&lt;br /&gt;
  composer require 'drupal/group:^1.6'&lt;br /&gt;
    composer require 'drupal/group_join_link:^1.0'&lt;br /&gt;
  composer require 'drupal/social_auth:^4.1'&lt;br /&gt;
    composer require 'drupal/social_auth_google:^4.0' &lt;br /&gt;
    composer require 'drupal/social_auth_facebook:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_linkedin:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_microsoft:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/twilio:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smssystem:^1.1'&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require 'drupal/smsframework:^2.3'&lt;br /&gt;
  composer require symfony/dom-crawler symfony/css-selector&lt;br /&gt;
  composer require drupal/markdown&lt;br /&gt;
  composer require drupal/markdown_easy&lt;br /&gt;
  composer require 'drupal/crm_core:3.x-dev@dev'&lt;br /&gt;
  composer require 'drupal/name:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/dynamic_entity_reference:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/default_content:^2.0@beta'&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
  composer require 'drupal/single_content_sync:^1.4' ## yep its this one&lt;br /&gt;
  # composer require drupal/views_show_more ## I don't use it?&lt;br /&gt;
  composer require 'drupal/matomo:^2.0@alpha'&lt;br /&gt;
&lt;br /&gt;
=== evaluating ===&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/seo_checklist:^5.2'&lt;br /&gt;
  composer require 'drupal/yoast_seo:^1.9'&lt;br /&gt;
  composer require 'drupal/tvi:^2.0' ## From: https://www.drupal.org/project/tvi&lt;br /&gt;
  composer require 'drupal/advanced_text_formatter:^3.0@RC'&lt;br /&gt;
  composer require 'drupal/token_filter:^2.1'&lt;br /&gt;
  composer require 'drupal/form_mode_control:^2.4'&lt;br /&gt;
  composer require 'drupal/queue_mail:^1.7'&lt;br /&gt;
  composer require 'drupal/googlelogin-googlelogin:^9.5'&lt;br /&gt;
  composer require 'drupal/dark_mode_toggle:^1.0'&lt;br /&gt;
&lt;br /&gt;
Not gonna use ebt_core, because (1) they have way too many modules, it should have been just one, and (2) their &amp;quot;hero&amp;quot; module doesn't honor container and isn't a hero.&lt;br /&gt;
&lt;br /&gt;
  # composer require 'drupal/layout_library:^1.0@beta' ## looks poor, just use blocks&lt;br /&gt;
  # composer require 'drupal/section_library:^2.0' ## looks poor, just use blocks&lt;br /&gt;
&lt;br /&gt;
== Upgrade 9 to 10 ==&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require drupal/core-recommended:^10 drupal/core-composer-scaffold:^10 drupal/core-project-message:^10 --update-with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
  composer update --with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
== Setting up dev environment ==&lt;br /&gt;
&lt;br /&gt;
* From: https://github.com/composer/composer/issues/9393&lt;br /&gt;
* From: https://www.drupal.org/docs/develop/automated-testing&lt;br /&gt;
* probably not useful: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/creating-functional-tests-simulated-browser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require --dev --no-update symfony/filesystem:4.4.42&lt;br /&gt;
  composer require --dev drupal/core-dev:9.5.11 --with-all-dependencies&lt;br /&gt;
    composer require --dev behat/mink jcalderonzumba/mink-phantomjs-driver&lt;br /&gt;
    composer update -W&lt;br /&gt;
    composer update symfony/filesystem:4.4.42 drush/drush -W&lt;br /&gt;
    composer require --dev drupal/core-dev -W&lt;br /&gt;
    composer require --dev phpspec/prophecy-phpunit:^2&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
Not useful:&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/examples:^4.0'&lt;br /&gt;
&lt;br /&gt;
== Configure Apache ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Directory /var/www/&amp;gt;&lt;br /&gt;
    Options Indexes FollowSymLinks MultiViews&lt;br /&gt;
    AllowOverride All&lt;br /&gt;
    Order allow,deny&lt;br /&gt;
    allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure s3fs ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,&lt;br /&gt;
    &amp;quot;Statement&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement0&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:ListBucket&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:ListBucketVersions&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement1&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:PutObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectAcl&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:PutObjectAcl&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;/*&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Disable caching ==&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/development-tools/disable-caching&lt;br /&gt;
&lt;br /&gt;
* Add the settings.local.php and&lt;br /&gt;
* Modify development.services.yml:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parameters:&lt;br /&gt;
  http.response.debug_cacheability_headers: true&lt;br /&gt;
  twig.config:&lt;br /&gt;
    debug: true&lt;br /&gt;
    auto_reload: true&lt;br /&gt;
    cache: false&lt;br /&gt;
services:&lt;br /&gt;
  cache.backend.null:&lt;br /&gt;
    class: Drupal\Core\Cache\NullBackendFactory&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== cleanup template debug ==&lt;br /&gt;
&lt;br /&gt;
Use in twig:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  |preg_replace('/&amp;lt;!--.*?--&amp;gt;/s','')|striptags|replace({&amp;quot;\n&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\r&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\t&amp;quot;:&amp;quot;&amp;quot;})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ReST ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
curl --include \&lt;br /&gt;
  --request POST \&lt;br /&gt;
  --user admin:&amp;lt;&amp;gt; \&lt;br /&gt;
  --header 'Content-type: application/hal+json' \&lt;br /&gt;
  http://pi.local/node?_format=hal_json \&lt;br /&gt;
  --data-binary '{&lt;br /&gt;
    &amp;quot;_links&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;http://pi.local/rest/type/node/article&amp;quot;}&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;title&amp;quot;:[{&amp;quot;value&amp;quot;:&amp;quot;Node +++ 123 bac +++&amp;quot; }],&lt;br /&gt;
    &amp;quot;body&amp;quot;:[{&amp;quot;value&amp;quot;: &amp;quot;&amp;lt;b&amp;gt;hello, wor&amp;lt;/b&amp;gt;ld!&amp;quot;, &amp;quot;format&amp;quot;: &amp;quot;full_html&amp;quot; }],&lt;br /&gt;
    &amp;quot;type&amp;quot;:[{&amp;quot;target_id&amp;quot;:&amp;quot;article&amp;quot;}],&lt;br /&gt;
    &amp;quot;status&amp;quot;: [{&amp;quot;value&amp;quot;: 1}],&lt;br /&gt;
    &amp;quot;_embedded&amp;quot;: {&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_issue&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;56229a95-d675-43e1-99b1-f9e11b5579c5&amp;quot; }] }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_tags&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;45646a7d-1a16-42e8-b758-f6e1c8d976f7&amp;quot; }] },&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;834e34e2-05ae-498d-b876-453798872ce1&amp;quot; }] }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  }'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Default Attachments ==&lt;br /&gt;
  txt pdf doc docx html csv xlsx xlsm sh json svg&lt;br /&gt;
  cer pem pub key kdbx&lt;br /&gt;
  png jpg jpeg gif&lt;br /&gt;
  mkv sfv avi mp3 mp4 webm mov&lt;br /&gt;
  zip tar gz&lt;br /&gt;
&lt;br /&gt;
== change ownership ==&lt;br /&gt;
&lt;br /&gt;
of all simplenews_issue &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval &amp;quot;&lt;br /&gt;
\$nids = \Drupal::entityQuery('node')&lt;br /&gt;
  -&amp;gt;condition('type', 'simplenews_issue')&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
\$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage('node');&lt;br /&gt;
\$nodes = \$storage-&amp;gt;loadMultiple(\$nids);&lt;br /&gt;
&lt;br /&gt;
foreach (\$nodes as \$node) {&lt;br /&gt;
  \$node-&amp;gt;setOwnerId(252);&lt;br /&gt;
  \$node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
of all content with &amp;quot;generated&amp;quot; in title:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval '&lt;br /&gt;
$nids = \Drupal::entityQuery(&amp;quot;node&amp;quot;)&lt;br /&gt;
  -&amp;gt;condition(&amp;quot;title&amp;quot;, &amp;quot;%enerated%&amp;quot;, &amp;quot;LIKE&amp;quot;)&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage(&amp;quot;node&amp;quot;);&lt;br /&gt;
$nodes = $storage-&amp;gt;loadMultiple($nids);&lt;br /&gt;
&lt;br /&gt;
foreach ($nodes as $node) {&lt;br /&gt;
  $node-&amp;gt;setOwnerId(129);&lt;br /&gt;
  $node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Updated &amp;quot; . count($nodes) . &amp;quot; nodes\n&amp;quot;;&lt;br /&gt;
'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Testing =&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/running-phpunit-tests&lt;br /&gt;
&lt;br /&gt;
For me, in my drupal images and containers, drupal is installed in the following folder, which is also my workdir:&lt;br /&gt;
&lt;br /&gt;
  WORKDIR /var/www/html&lt;br /&gt;
&lt;br /&gt;
The below is optional, I call the specific phpunit executable every time:&lt;br /&gt;
&lt;br /&gt;
  export PATH=&amp;quot;$PATH:/var/www/html/vendor/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You need to change minimum stability to &amp;quot;dev&amp;quot; for the testing libraries to be loaded.&lt;br /&gt;
&lt;br /&gt;
DO NOT RUN THIS IN PRODUCTION!&lt;br /&gt;
&lt;br /&gt;
  composer require --dev phpunit/phpunit # trash&lt;br /&gt;
    composer require --dev phpunit/phpunit:^9.5 --with-all-dependencies&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
    composer require --dev drupal/core-dev --update-with-all-dependencies # trash&lt;br /&gt;
  composer require --dev behat/mink:1.8.0 --with-all-dependencies&lt;br /&gt;
  composer require --dev symfony/phpunit-bridge&lt;br /&gt;
  composer require --dev phpspec/prophecy-phpunit&lt;br /&gt;
  composer require --dev behat/mink-browserkit-driver&lt;br /&gt;
&lt;br /&gt;
Copy and configure phpunit.xml:&lt;br /&gt;
&lt;br /&gt;
  phpunit --testsuite unit --filter CurrentUserBlock # trash?&lt;br /&gt;
  cd /var/www/html&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php -v --debug&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Cool&amp;diff=3441</id>
		<title>Cool</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Cool&amp;diff=3441"/>
				<updated>2026-04-19T13:07:25Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: /* 2022 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cool websites (latest first) ==&lt;br /&gt;
&lt;br /&gt;
=== 2026q1 ===&lt;br /&gt;
* https://www.micro1.ai/&lt;br /&gt;
* https://getmysocial.com/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* https://www.paycom.com/&lt;br /&gt;
* https://www.qed42.com/services/drupal&lt;br /&gt;
&lt;br /&gt;
* https://www.fulcrumapp.com/industries/environmental/&lt;br /&gt;
* https://www.dotsquares.com/&lt;br /&gt;
* https://moneyhub.com/&lt;br /&gt;
* https://skillenai.com/external-post/how-to-build-an-agentic-email-workflow/&lt;br /&gt;
&lt;br /&gt;
=== 2025q4 ===&lt;br /&gt;
* https://vitaminak.design/en&lt;br /&gt;
&lt;br /&gt;
=== 2024Q3 ===&lt;br /&gt;
&lt;br /&gt;
* SEO&lt;br /&gt;
** https://www.targetedwebtraffic.com/&lt;br /&gt;
** https://serpclix.com/&lt;br /&gt;
&lt;br /&gt;
* Design&lt;br /&gt;
** https://truesocialmarketing.com/our-portfolio/&lt;br /&gt;
** https://pitturagroup.com/&lt;br /&gt;
** https://www.devsinc.com/&lt;br /&gt;
** https://wearesocial.com/us/&lt;br /&gt;
&lt;br /&gt;
* Hosting&lt;br /&gt;
** https://www.turnkeylinux.org/&lt;br /&gt;
** https://www.acquia.com/&lt;br /&gt;
&lt;br /&gt;
* Misc services, nice designs&lt;br /&gt;
** https://macarthursociety.org/&lt;br /&gt;
&lt;br /&gt;
* spam recruiters&lt;br /&gt;
** https://inficarehealth.com/&lt;br /&gt;
&lt;br /&gt;
* products&lt;br /&gt;
** https://www.notion.so/product/docs&lt;br /&gt;
** https://quillbot.com/&lt;br /&gt;
** https://www.copy.ai/prices&lt;br /&gt;
&lt;br /&gt;
=== 2024Q1 ===&lt;br /&gt;
&lt;br /&gt;
* https://www.tylertech.com/&lt;br /&gt;
* https://www.liatrio.com/&lt;br /&gt;
* https://cypress.io&lt;br /&gt;
&lt;br /&gt;
=== 2023Q4 ===&lt;br /&gt;
* https://apexfintechsolutions.com/resources/#custody-clearing&lt;br /&gt;
* https://www.springsapartments.com/apartments/tx/austin/springs-at-lakeline&lt;br /&gt;
&lt;br /&gt;
=== 2023Q3 ===&lt;br /&gt;
* https://trustedquote.com/disability-insurance&lt;br /&gt;
* https://stripe.com/billing&lt;br /&gt;
* https://www.assemblyai.com/&lt;br /&gt;
* https://www.eidos.ai/&lt;br /&gt;
* https://www.vardot.com/en-us/services/digital-strategy&lt;br /&gt;
* https://osome.com/sg/&lt;br /&gt;
* https://bitbag.io/&lt;br /&gt;
* https://arends-inc.com/&lt;br /&gt;
&lt;br /&gt;
=== 2023Q2 ===&lt;br /&gt;
examples&lt;br /&gt;
* https://www.sdssinc.com/&lt;br /&gt;
&lt;br /&gt;
other&lt;br /&gt;
* recruiter example: https://www.trigent.com/&lt;br /&gt;
* https://www.foley.com/en/offices/austin&lt;br /&gt;
* https://callummurraycomposer.com/&lt;br /&gt;
* https://www.austinresidentialsolutions.online/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2023Q1 ===&lt;br /&gt;
* https://www.intrafinetworkdeposits.com/&lt;br /&gt;
* https://codebasics.io/&lt;br /&gt;
* https://devforth.io/&lt;br /&gt;
* https://www.michaeljcasey.com/&lt;br /&gt;
&lt;br /&gt;
=== 2022-11 ===&lt;br /&gt;
* https://www.netlify.com/&lt;br /&gt;
* https://kore.ai/platform/virtual-assistant/&lt;br /&gt;
* https://chain.link/&lt;br /&gt;
* https://www.blackknightinc.com/&lt;br /&gt;
* https://www.fancyhands.com/&lt;br /&gt;
* https://www.prialto.com/&lt;br /&gt;
* https://rewind.com/products/backups/github/&lt;br /&gt;
* https://gitcoin.co/hackathon/reserve-launch/onboard&lt;br /&gt;
* https://angel.co/ - a clean narrative&lt;br /&gt;
&lt;br /&gt;
=== 2022 ===&lt;br /&gt;
* https://katalon.com/ - I have a lot to learn!&lt;br /&gt;
* excellent blog format: https://www.git-tower.com/blog/developing-for-the-desktop-vscode/&lt;br /&gt;
* https://www.circle.com/en/euro-coin&lt;br /&gt;
* https://www.drsgme.org/&lt;br /&gt;
* https://brooksource.com - its okay, the page feels &amp;quot;full&amp;quot;&lt;br /&gt;
* https://www.pinata.cloud/&lt;br /&gt;
* https://discord.com/&lt;br /&gt;
* https://dribbble.com/DmiT&lt;br /&gt;
* https://mailtrap.io/&lt;br /&gt;
* https://www.thebalance.com/&lt;br /&gt;
* https://badgirlsbible.com/&lt;br /&gt;
* https://www.balena.io/etcher/&lt;br /&gt;
* https://railsware.com/&lt;br /&gt;
* https://sentry.io/welcome/&lt;br /&gt;
* https://www.confluent.io/&lt;br /&gt;
* https://www.wecraftapps.com/&lt;br /&gt;
* https://saeloun.com&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [[ To read ]]&lt;br /&gt;
* [[ Tools ]]&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3440</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3440"/>
				<updated>2026-04-18T19:01:23Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: /* Install &amp;amp; Configure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* A great book: https://drupalatyourfingertips.com&lt;br /&gt;
* How to clear cache: /devel/cache/clear&lt;br /&gt;
&lt;br /&gt;
= Install &amp;amp; Configure =&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:9.5.10 html&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/devel:^5.1'&lt;br /&gt;
  composer require 'drupal/s3fs:^3.3'&lt;br /&gt;
  # composer require 'wasya-co/consent_popup: 1.0.4.x-dev'&lt;br /&gt;
  composer require 'drupal/consent_popup:^1.0'&lt;br /&gt;
  composer require 'drush/drush:^11.6'&lt;br /&gt;
  composer require 'drupal/metatag:^2.0'&lt;br /&gt;
  composer require 'drupal/redirect:^1.9'&lt;br /&gt;
  composer require 'drupal/superfish:^1.6'&lt;br /&gt;
  composer require 'drupal/webform:^6.0'&lt;br /&gt;
  composer require 'drupal/captcha:^1.14'&lt;br /&gt;
  composer require 'drupal/typed_data:^1.0@alpha'&lt;br /&gt;
  composer require 'drupal/rules:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smtp:^1.2'&lt;br /&gt;
  composer require 'drupal/hal:^1.0'&lt;br /&gt;
  composer require 'drupal/restui:^1.21'&lt;br /&gt;
  composer require 'drupal/keycloak:^2.2@beta'&lt;br /&gt;
  composer require 'drupal/nodeaccess:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/backup_migrate:^5.1' ## was 5.0&lt;br /&gt;
  composer require 'drupal/email_registration:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/content_access:^2.0'&lt;br /&gt;
  composer require 'drupal/social_media:^2.0'&lt;br /&gt;
  composer require 'drupal/wordpress_migrate:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/migrate_tools:^6.0'&lt;br /&gt;
  composer require 'drupal/codefilter:^2.0'&lt;br /&gt;
  composer require 'drupal/views_taxonomy_term_name_depth:^7.2'&lt;br /&gt;
  composer require 'drupal/pathauto:^1.12'&lt;br /&gt;
  composer require 'drupal/twig_tweak:^3.3'&lt;br /&gt;
  composer require 'drupal/simplenews:^4.0'&lt;br /&gt;
    # composer require 'drupal/migrate_plus:^6.0' ## didn't need it the second time&lt;br /&gt;
  composer require 'drupal/ctools:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/commerce:^2.40' ## drupal 9.5&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    apt install php-bcmath php8.1-bcmath&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^1.1'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/commerce:^3.3'  ## drupal 10&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^2.2'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/linkit:^6.0'&lt;br /&gt;
  composer require 'drupal/redirect_after_login:^3.0'&lt;br /&gt;
  composer require 'drupal/symfony_mailer:^1.4'&lt;br /&gt;
  composer require 'drupal/custom_search:^1.0@beta'&lt;br /&gt;
  composer require 'drupal/fullcalendar_view:^5.2' &lt;br /&gt;
  composer require 'drupal/date_recur:^3.3@RC'&lt;br /&gt;
  composer require 'drupal/date_recur_modular:^3.1'&lt;br /&gt;
  composer require 'drupal/colorbox:2.0.2'&lt;br /&gt;
  composer require 'drupal/tagclouds:^2.0'&lt;br /&gt;
  composer require 'drupal/filelog:^3.0'&lt;br /&gt;
  composer require 'drupal/message:^1.6'&lt;br /&gt;
  composer require 'drupal/flag:^4.0@beta'&lt;br /&gt;
  composer require 'drupal/message_subscribe:^1.4'&lt;br /&gt;
  composer require 'drupal/message_digest:^1.5'&lt;br /&gt;
  composer require 'drupal/message_ui:^1.3'&lt;br /&gt;
  composer require 'drupal/layout_builder_usage_reports:^1.0'&lt;br /&gt;
  composer require 'drupal/views_tree:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/vote_up_down:^1.0@alpha'&lt;br /&gt;
  composer require 'drupal/formblock:^2.0@beta'&lt;br /&gt;
  composer require 'drupal/views_pdf:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/field_permissions:^1.4'&lt;br /&gt;
  composer require 'drupal/scheduler:^2.2'&lt;br /&gt;
  composer require 'drupal/simplenews_scheduler:^4.0@alpha'&lt;br /&gt;
  composer require 'drupal/insert_view:^2.1'&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  composer require 'drupal/keycloak:^1.8'&lt;br /&gt;
  composer require 'drupal/simple_oauth:^5.2'&lt;br /&gt;
  composer require 'drupal/group:^1.6'&lt;br /&gt;
    composer require 'drupal/group_join_link:^1.0'&lt;br /&gt;
  composer require 'drupal/social_auth:^4.1'&lt;br /&gt;
    composer require 'drupal/social_auth_google:^4.0' &lt;br /&gt;
    composer require 'drupal/social_auth_facebook:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_linkedin:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_microsoft:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/twilio:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smssystem:^1.1'&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require 'drupal/smsframework:^2.3'&lt;br /&gt;
  composer require symfony/dom-crawler symfony/css-selector&lt;br /&gt;
  composer require drupal/markdown&lt;br /&gt;
  composer require drupal/markdown_easy&lt;br /&gt;
  composer require 'drupal/crm_core:3.x-dev@dev'&lt;br /&gt;
  composer require 'drupal/name:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/dynamic_entity_reference:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/default_content:^2.0@beta'&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
  composer require 'drupal/single_content_sync:^1.4' ## yep its this one&lt;br /&gt;
  # composer require drupal/views_show_more ## I don't use it?&lt;br /&gt;
  composer require 'drupal/matomo:^2.0@alpha'&lt;br /&gt;
&lt;br /&gt;
=== evaluating ===&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/seo_checklist:^5.2'&lt;br /&gt;
  composer require 'drupal/yoast_seo:^1.9'&lt;br /&gt;
  composer require 'drupal/tvi:^2.0' ## From: https://www.drupal.org/project/tvi&lt;br /&gt;
  composer require 'drupal/advanced_text_formatter:^3.0@RC'&lt;br /&gt;
  composer require 'drupal/token_filter:^2.1'&lt;br /&gt;
  composer require 'drupal/form_mode_control:^2.4'&lt;br /&gt;
  composer require 'drupal/queue_mail:^1.7'&lt;br /&gt;
  composer require 'drupal/googlelogin-googlelogin:^9.5'&lt;br /&gt;
  composer require 'drupal/dark_mode_toggle:^1.0'&lt;br /&gt;
&lt;br /&gt;
Not gonna use ebt_core, because (1) they have way too many modules, it should have been just one, and (2) their &amp;quot;hero&amp;quot; module doesn't honor container and isn't a hero.&lt;br /&gt;
&lt;br /&gt;
  # composer require 'drupal/layout_library:^1.0@beta' ## looks poor, just use blocks&lt;br /&gt;
  # composer require 'drupal/section_library:^2.0' ## looks poor, just use blocks&lt;br /&gt;
&lt;br /&gt;
== Upgrade 9 to 10 ==&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require drupal/core-recommended:^10 drupal/core-composer-scaffold:^10 drupal/core-project-message:^10 --update-with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
  composer update --with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
== Setting up dev environment ==&lt;br /&gt;
&lt;br /&gt;
* From: https://github.com/composer/composer/issues/9393&lt;br /&gt;
* From: https://www.drupal.org/docs/develop/automated-testing&lt;br /&gt;
* probably not useful: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/creating-functional-tests-simulated-browser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require --dev --no-update symfony/filesystem:4.4.42&lt;br /&gt;
  composer require --dev drupal/core-dev:9.5.11 --with-all-dependencies&lt;br /&gt;
    composer require --dev behat/mink jcalderonzumba/mink-phantomjs-driver&lt;br /&gt;
    composer update -W&lt;br /&gt;
    composer update symfony/filesystem:4.4.42 drush/drush -W&lt;br /&gt;
    composer require --dev drupal/core-dev -W&lt;br /&gt;
    composer require --dev phpspec/prophecy-phpunit:^2&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
Not useful:&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/examples:^4.0'&lt;br /&gt;
&lt;br /&gt;
== Configure Apache ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Directory /var/www/&amp;gt;&lt;br /&gt;
    Options Indexes FollowSymLinks MultiViews&lt;br /&gt;
    AllowOverride All&lt;br /&gt;
    Order allow,deny&lt;br /&gt;
    allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure s3fs ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,&lt;br /&gt;
    &amp;quot;Statement&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement0&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:ListBucket&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:ListBucketVersions&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement1&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:PutObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectAcl&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:PutObjectAcl&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;/*&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Disable caching ==&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/development-tools/disable-caching&lt;br /&gt;
&lt;br /&gt;
* Add the settings.local.php and&lt;br /&gt;
* Modify development.services.yml:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parameters:&lt;br /&gt;
  http.response.debug_cacheability_headers: true&lt;br /&gt;
  twig.config:&lt;br /&gt;
    debug: true&lt;br /&gt;
    auto_reload: true&lt;br /&gt;
    cache: false&lt;br /&gt;
services:&lt;br /&gt;
  cache.backend.null:&lt;br /&gt;
    class: Drupal\Core\Cache\NullBackendFactory&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== cleanup template debug ==&lt;br /&gt;
&lt;br /&gt;
Use in twig:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  |preg_replace('/&amp;lt;!--.*?--&amp;gt;/s','')|striptags|replace({&amp;quot;\n&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\r&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\t&amp;quot;:&amp;quot;&amp;quot;})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ReST ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
curl --include \&lt;br /&gt;
  --request POST \&lt;br /&gt;
  --user admin:&amp;lt;&amp;gt; \&lt;br /&gt;
  --header 'Content-type: application/hal+json' \&lt;br /&gt;
  http://pi.local/node?_format=hal_json \&lt;br /&gt;
  --data-binary '{&lt;br /&gt;
    &amp;quot;_links&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;http://pi.local/rest/type/node/article&amp;quot;}&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;title&amp;quot;:[{&amp;quot;value&amp;quot;:&amp;quot;Node +++ 123 bac +++&amp;quot; }],&lt;br /&gt;
    &amp;quot;body&amp;quot;:[{&amp;quot;value&amp;quot;: &amp;quot;&amp;lt;b&amp;gt;hello, wor&amp;lt;/b&amp;gt;ld!&amp;quot;, &amp;quot;format&amp;quot;: &amp;quot;full_html&amp;quot; }],&lt;br /&gt;
    &amp;quot;type&amp;quot;:[{&amp;quot;target_id&amp;quot;:&amp;quot;article&amp;quot;}],&lt;br /&gt;
    &amp;quot;status&amp;quot;: [{&amp;quot;value&amp;quot;: 1}],&lt;br /&gt;
    &amp;quot;_embedded&amp;quot;: {&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_issue&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;56229a95-d675-43e1-99b1-f9e11b5579c5&amp;quot; }] }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_tags&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;45646a7d-1a16-42e8-b758-f6e1c8d976f7&amp;quot; }] },&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;834e34e2-05ae-498d-b876-453798872ce1&amp;quot; }] }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  }'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Default Attachments ==&lt;br /&gt;
  txt pdf doc docx html csv xlsx xlsm sh json svg&lt;br /&gt;
  cer pem pub key kdbx&lt;br /&gt;
  png jpg jpeg gif&lt;br /&gt;
  mkv sfv avi mp3 mp4 webm mov&lt;br /&gt;
  zip tar gz&lt;br /&gt;
&lt;br /&gt;
== change ownership ==&lt;br /&gt;
&lt;br /&gt;
of all simplenews_issue &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval &amp;quot;&lt;br /&gt;
\$nids = \Drupal::entityQuery('node')&lt;br /&gt;
  -&amp;gt;condition('type', 'simplenews_issue')&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
\$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage('node');&lt;br /&gt;
\$nodes = \$storage-&amp;gt;loadMultiple(\$nids);&lt;br /&gt;
&lt;br /&gt;
foreach (\$nodes as \$node) {&lt;br /&gt;
  \$node-&amp;gt;setOwnerId(252);&lt;br /&gt;
  \$node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
of all content with &amp;quot;generated&amp;quot; in title:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval '&lt;br /&gt;
$nids = \Drupal::entityQuery(&amp;quot;node&amp;quot;)&lt;br /&gt;
  -&amp;gt;condition(&amp;quot;title&amp;quot;, &amp;quot;%enerated%&amp;quot;, &amp;quot;LIKE&amp;quot;)&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage(&amp;quot;node&amp;quot;);&lt;br /&gt;
$nodes = $storage-&amp;gt;loadMultiple($nids);&lt;br /&gt;
&lt;br /&gt;
foreach ($nodes as $node) {&lt;br /&gt;
  $node-&amp;gt;setOwnerId(129);&lt;br /&gt;
  $node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Updated &amp;quot; . count($nodes) . &amp;quot; nodes\n&amp;quot;;&lt;br /&gt;
'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Testing =&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/running-phpunit-tests&lt;br /&gt;
&lt;br /&gt;
For me, in my drupal images and containers, drupal is installed in the following folder, which is also my workdir:&lt;br /&gt;
&lt;br /&gt;
  WORKDIR /var/www/html&lt;br /&gt;
&lt;br /&gt;
The below is optional, I call the specific phpunit executable every time:&lt;br /&gt;
&lt;br /&gt;
  export PATH=&amp;quot;$PATH:/var/www/html/vendor/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You need to change minimum stability to &amp;quot;dev&amp;quot; for the testing libraries to be loaded.&lt;br /&gt;
&lt;br /&gt;
DO NOT RUN THIS IN PRODUCTION!&lt;br /&gt;
&lt;br /&gt;
  composer require --dev phpunit/phpunit # trash&lt;br /&gt;
    composer require --dev phpunit/phpunit:^9.5 --with-all-dependencies&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
    composer require --dev drupal/core-dev --update-with-all-dependencies # trash&lt;br /&gt;
  composer require --dev behat/mink:1.8.0 --with-all-dependencies&lt;br /&gt;
  composer require --dev symfony/phpunit-bridge&lt;br /&gt;
  composer require --dev phpspec/prophecy-phpunit&lt;br /&gt;
  composer require --dev behat/mink-browserkit-driver&lt;br /&gt;
&lt;br /&gt;
Copy and configure phpunit.xml:&lt;br /&gt;
&lt;br /&gt;
  phpunit --testsuite unit --filter CurrentUserBlock # trash?&lt;br /&gt;
  cd /var/www/html&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php -v --debug&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3439</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3439"/>
				<updated>2026-04-18T18:59:21Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: /* Install &amp;amp; Configure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* A great book: https://drupalatyourfingertips.com&lt;br /&gt;
* How to clear cache: /devel/cache/clear&lt;br /&gt;
&lt;br /&gt;
= Install &amp;amp; Configure =&lt;br /&gt;
&lt;br /&gt;
  composer create-project drupal/recommended-project:9.5.10 html&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/devel:^5.1'&lt;br /&gt;
  composer require 'drupal/s3fs:^3.3'&lt;br /&gt;
  # composer require 'wasya-co/consent_popup: 1.0.4.x-dev'&lt;br /&gt;
  composer require 'drupal/consent_popup:^1.0'&lt;br /&gt;
  composer require 'drush/drush:^11.6'&lt;br /&gt;
  composer require 'drupal/metatag:^2.0'&lt;br /&gt;
  composer require 'drupal/redirect:^1.9'&lt;br /&gt;
  composer require 'drupal/superfish:^1.6'&lt;br /&gt;
  composer require 'drupal/webform:^6.0'&lt;br /&gt;
  composer require 'drupal/captcha:^1.14'&lt;br /&gt;
  composer require 'drupal/typed_data:^1.0@alpha'&lt;br /&gt;
  composer require 'drupal/rules:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smtp:^1.2'&lt;br /&gt;
  composer require 'drupal/hal:^1.0'&lt;br /&gt;
  composer require 'drupal/restui:^1.21'&lt;br /&gt;
  composer require 'drupal/keycloak:^2.2@beta'&lt;br /&gt;
  composer require 'drupal/nodeaccess:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/backup_migrate:^5.1' ## was 5.0&lt;br /&gt;
  composer require 'drupal/email_registration:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/content_access:^2.0'&lt;br /&gt;
  composer require 'drupal/social_media:^2.0'&lt;br /&gt;
  composer require 'drupal/wordpress_migrate:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/migrate_tools:^6.0'&lt;br /&gt;
  composer require 'drupal/codefilter:^2.0'&lt;br /&gt;
  composer require 'drupal/views_taxonomy_term_name_depth:^7.2'&lt;br /&gt;
  composer require 'drupal/pathauto:^1.12'&lt;br /&gt;
  composer require 'drupal/twig_tweak:^3.3'&lt;br /&gt;
  composer require 'drupal/simplenews:^4.0'&lt;br /&gt;
    # composer require 'drupal/migrate_plus:^6.0' ## didn't need it the second time&lt;br /&gt;
  composer require 'drupal/ctools:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/commerce:^2.40' ## drupal 9.5&lt;br /&gt;
  composer require 'drupal/commerce:^3.3'  ## drupal 10&lt;br /&gt;
    composer require drupal/inline_entity_form @RC --no-update&lt;br /&gt;
    apt install php-bcmath php8.1-bcmath&lt;br /&gt;
    composer require 'drupal/commerce_stripe:^1.1'&lt;br /&gt;
    composer require 'drupal/commerce_recurring:^1.0@RC'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/linkit:^6.0'&lt;br /&gt;
  composer require 'drupal/redirect_after_login:^3.0'&lt;br /&gt;
  composer require 'drupal/symfony_mailer:^1.4'&lt;br /&gt;
  composer require 'drupal/custom_search:^1.0@beta'&lt;br /&gt;
  composer require 'drupal/fullcalendar_view:^5.2' &lt;br /&gt;
  composer require 'drupal/date_recur:^3.3@RC'&lt;br /&gt;
  composer require 'drupal/date_recur_modular:^3.1'&lt;br /&gt;
  composer require 'drupal/colorbox:2.0.2'&lt;br /&gt;
  composer require 'drupal/tagclouds:^2.0'&lt;br /&gt;
  composer require 'drupal/filelog:^3.0'&lt;br /&gt;
  composer require 'drupal/message:^1.6'&lt;br /&gt;
  composer require 'drupal/flag:^4.0@beta'&lt;br /&gt;
  composer require 'drupal/message_subscribe:^1.4'&lt;br /&gt;
  composer require 'drupal/message_digest:^1.5'&lt;br /&gt;
  composer require 'drupal/message_ui:^1.3'&lt;br /&gt;
  composer require 'drupal/layout_builder_usage_reports:^1.0'&lt;br /&gt;
  composer require 'drupal/views_tree:^2.0@RC'&lt;br /&gt;
  composer require 'drupal/vote_up_down:^1.0@alpha'&lt;br /&gt;
  composer require 'drupal/formblock:^2.0@beta'&lt;br /&gt;
  composer require 'drupal/views_pdf:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/field_permissions:^1.4'&lt;br /&gt;
  composer require 'drupal/scheduler:^2.2'&lt;br /&gt;
  composer require 'drupal/simplenews_scheduler:^4.0@alpha'&lt;br /&gt;
  composer require 'drupal/insert_view:^2.1'&lt;br /&gt;
  composer require drush/drush&lt;br /&gt;
  composer require 'drupal/keycloak:^1.8'&lt;br /&gt;
  composer require 'drupal/simple_oauth:^5.2'&lt;br /&gt;
  composer require 'drupal/group:^1.6'&lt;br /&gt;
    composer require 'drupal/group_join_link:^1.0'&lt;br /&gt;
  composer require 'drupal/social_auth:^4.1'&lt;br /&gt;
    composer require 'drupal/social_auth_google:^4.0' &lt;br /&gt;
    composer require 'drupal/social_auth_facebook:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_linkedin:^4.0'&lt;br /&gt;
    composer require 'drupal/social_auth_microsoft:^4.0'&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/twilio:^3.0@alpha'&lt;br /&gt;
  composer require 'drupal/smssystem:^1.1'&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require 'drupal/smsframework:^2.3'&lt;br /&gt;
  composer require symfony/dom-crawler symfony/css-selector&lt;br /&gt;
  composer require drupal/markdown&lt;br /&gt;
  composer require drupal/markdown_easy&lt;br /&gt;
  composer require 'drupal/crm_core:3.x-dev@dev'&lt;br /&gt;
  composer require 'drupal/name:^1.0@RC'&lt;br /&gt;
  composer require 'drupal/dynamic_entity_reference:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/default_content:^2.0@beta'&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
  composer require 'drupal/single_content_sync:^1.4' ## yep its this one&lt;br /&gt;
  # composer require drupal/views_show_more ## I don't use it?&lt;br /&gt;
  composer require 'drupal/matomo:^2.0@alpha'&lt;br /&gt;
&lt;br /&gt;
=== evaluating ===&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/seo_checklist:^5.2'&lt;br /&gt;
  composer require 'drupal/yoast_seo:^1.9'&lt;br /&gt;
  composer require 'drupal/tvi:^2.0' ## From: https://www.drupal.org/project/tvi&lt;br /&gt;
  composer require 'drupal/advanced_text_formatter:^3.0@RC'&lt;br /&gt;
  composer require 'drupal/token_filter:^2.1'&lt;br /&gt;
  composer require 'drupal/form_mode_control:^2.4'&lt;br /&gt;
  composer require 'drupal/queue_mail:^1.7'&lt;br /&gt;
  composer require 'drupal/googlelogin-googlelogin:^9.5'&lt;br /&gt;
  composer require 'drupal/dark_mode_toggle:^1.0'&lt;br /&gt;
&lt;br /&gt;
Not gonna use ebt_core, because (1) they have way too many modules, it should have been just one, and (2) their &amp;quot;hero&amp;quot; module doesn't honor container and isn't a hero.&lt;br /&gt;
&lt;br /&gt;
  # composer require 'drupal/layout_library:^1.0@beta' ## looks poor, just use blocks&lt;br /&gt;
  # composer require 'drupal/section_library:^2.0' ## looks poor, just use blocks&lt;br /&gt;
&lt;br /&gt;
== Upgrade 9 to 10 ==&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/upgrade_status:^4.3'&lt;br /&gt;
  composer require drupal/core-recommended:^10 drupal/core-composer-scaffold:^10 drupal/core-project-message:^10 --update-with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
  composer update --with-all-dependencies&lt;br /&gt;
&lt;br /&gt;
== Setting up dev environment ==&lt;br /&gt;
&lt;br /&gt;
* From: https://github.com/composer/composer/issues/9393&lt;br /&gt;
* From: https://www.drupal.org/docs/develop/automated-testing&lt;br /&gt;
* probably not useful: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/creating-functional-tests-simulated-browser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  composer require --dev --no-update symfony/filesystem:4.4.42&lt;br /&gt;
  composer require --dev drupal/core-dev:9.5.11 --with-all-dependencies&lt;br /&gt;
    composer require --dev behat/mink jcalderonzumba/mink-phantomjs-driver&lt;br /&gt;
    composer update -W&lt;br /&gt;
    composer update symfony/filesystem:4.4.42 drush/drush -W&lt;br /&gt;
    composer require --dev drupal/core-dev -W&lt;br /&gt;
    composer require --dev phpspec/prophecy-phpunit:^2&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
Not useful:&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/examples:^4.0'&lt;br /&gt;
&lt;br /&gt;
== Configure Apache ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Directory /var/www/&amp;gt;&lt;br /&gt;
    Options Indexes FollowSymLinks MultiViews&lt;br /&gt;
    AllowOverride All&lt;br /&gt;
    Order allow,deny&lt;br /&gt;
    allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure s3fs ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,&lt;br /&gt;
    &amp;quot;Statement&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement0&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:ListBucket&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:ListBucketVersions&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Sid&amp;quot;: &amp;quot;Statement1&amp;quot;,&lt;br /&gt;
            &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,&lt;br /&gt;
            &amp;quot;Action&amp;quot;: [&lt;br /&gt;
                &amp;quot;s3:PutObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:DeleteObject&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectVersion&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:GetObjectAcl&amp;quot;,&lt;br /&gt;
                &amp;quot;s3:PutObjectAcl&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;Resource&amp;quot;: [&lt;br /&gt;
                &amp;quot;arn:aws:s3:::&amp;lt;ze bucket&amp;gt;/*&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Disable caching ==&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/development-tools/disable-caching&lt;br /&gt;
&lt;br /&gt;
* Add the settings.local.php and&lt;br /&gt;
* Modify development.services.yml:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parameters:&lt;br /&gt;
  http.response.debug_cacheability_headers: true&lt;br /&gt;
  twig.config:&lt;br /&gt;
    debug: true&lt;br /&gt;
    auto_reload: true&lt;br /&gt;
    cache: false&lt;br /&gt;
services:&lt;br /&gt;
  cache.backend.null:&lt;br /&gt;
    class: Drupal\Core\Cache\NullBackendFactory&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== cleanup template debug ==&lt;br /&gt;
&lt;br /&gt;
Use in twig:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  |preg_replace('/&amp;lt;!--.*?--&amp;gt;/s','')|striptags|replace({&amp;quot;\n&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\r&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;\t&amp;quot;:&amp;quot;&amp;quot;})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ReST ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
curl --include \&lt;br /&gt;
  --request POST \&lt;br /&gt;
  --user admin:&amp;lt;&amp;gt; \&lt;br /&gt;
  --header 'Content-type: application/hal+json' \&lt;br /&gt;
  http://pi.local/node?_format=hal_json \&lt;br /&gt;
  --data-binary '{&lt;br /&gt;
    &amp;quot;_links&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;http://pi.local/rest/type/node/article&amp;quot;}&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;title&amp;quot;:[{&amp;quot;value&amp;quot;:&amp;quot;Node +++ 123 bac +++&amp;quot; }],&lt;br /&gt;
    &amp;quot;body&amp;quot;:[{&amp;quot;value&amp;quot;: &amp;quot;&amp;lt;b&amp;gt;hello, wor&amp;lt;/b&amp;gt;ld!&amp;quot;, &amp;quot;format&amp;quot;: &amp;quot;full_html&amp;quot; }],&lt;br /&gt;
    &amp;quot;type&amp;quot;:[{&amp;quot;target_id&amp;quot;:&amp;quot;article&amp;quot;}],&lt;br /&gt;
    &amp;quot;status&amp;quot;: [{&amp;quot;value&amp;quot;: 1}],&lt;br /&gt;
    &amp;quot;_embedded&amp;quot;: {&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_issue&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;56229a95-d675-43e1-99b1-f9e11b5579c5&amp;quot; }] }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;http://pi.local/rest/relation/node/article/field_tags&amp;quot;: [&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;45646a7d-1a16-42e8-b758-f6e1c8d976f7&amp;quot; }] },&lt;br /&gt;
        { &amp;quot;uuid&amp;quot;: [{ &amp;quot;value&amp;quot;: &amp;quot;834e34e2-05ae-498d-b876-453798872ce1&amp;quot; }] }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  }'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Default Attachments ==&lt;br /&gt;
  txt pdf doc docx html csv xlsx xlsm sh json svg&lt;br /&gt;
  cer pem pub key kdbx&lt;br /&gt;
  png jpg jpeg gif&lt;br /&gt;
  mkv sfv avi mp3 mp4 webm mov&lt;br /&gt;
  zip tar gz&lt;br /&gt;
&lt;br /&gt;
== change ownership ==&lt;br /&gt;
&lt;br /&gt;
of all simplenews_issue &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval &amp;quot;&lt;br /&gt;
\$nids = \Drupal::entityQuery('node')&lt;br /&gt;
  -&amp;gt;condition('type', 'simplenews_issue')&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
\$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage('node');&lt;br /&gt;
\$nodes = \$storage-&amp;gt;loadMultiple(\$nids);&lt;br /&gt;
&lt;br /&gt;
foreach (\$nodes as \$node) {&lt;br /&gt;
  \$node-&amp;gt;setOwnerId(252);&lt;br /&gt;
  \$node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
of all content with &amp;quot;generated&amp;quot; in title:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush php:eval '&lt;br /&gt;
$nids = \Drupal::entityQuery(&amp;quot;node&amp;quot;)&lt;br /&gt;
  -&amp;gt;condition(&amp;quot;title&amp;quot;, &amp;quot;%enerated%&amp;quot;, &amp;quot;LIKE&amp;quot;)&lt;br /&gt;
  -&amp;gt;accessCheck(FALSE)&lt;br /&gt;
  -&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
$storage = \Drupal::entityTypeManager()-&amp;gt;getStorage(&amp;quot;node&amp;quot;);&lt;br /&gt;
$nodes = $storage-&amp;gt;loadMultiple($nids);&lt;br /&gt;
&lt;br /&gt;
foreach ($nodes as $node) {&lt;br /&gt;
  $node-&amp;gt;setOwnerId(129);&lt;br /&gt;
  $node-&amp;gt;save();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Updated &amp;quot; . count($nodes) . &amp;quot; nodes\n&amp;quot;;&lt;br /&gt;
'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Testing =&lt;br /&gt;
&lt;br /&gt;
From: https://www.drupal.org/docs/develop/automated-testing/phpunit-in-drupal/running-phpunit-tests&lt;br /&gt;
&lt;br /&gt;
For me, in my drupal images and containers, drupal is installed in the following folder, which is also my workdir:&lt;br /&gt;
&lt;br /&gt;
  WORKDIR /var/www/html&lt;br /&gt;
&lt;br /&gt;
The below is optional, I call the specific phpunit executable every time:&lt;br /&gt;
&lt;br /&gt;
  export PATH=&amp;quot;$PATH:/var/www/html/vendor/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You need to change minimum stability to &amp;quot;dev&amp;quot; for the testing libraries to be loaded.&lt;br /&gt;
&lt;br /&gt;
DO NOT RUN THIS IN PRODUCTION!&lt;br /&gt;
&lt;br /&gt;
  composer require --dev phpunit/phpunit # trash&lt;br /&gt;
    composer require --dev phpunit/phpunit:^9.5 --with-all-dependencies&lt;br /&gt;
  composer require --dev drupal/core-dev&lt;br /&gt;
    composer require --dev drupal/core-dev --update-with-all-dependencies # trash&lt;br /&gt;
  composer require --dev behat/mink:1.8.0 --with-all-dependencies&lt;br /&gt;
  composer require --dev symfony/phpunit-bridge&lt;br /&gt;
  composer require --dev phpspec/prophecy-phpunit&lt;br /&gt;
  composer require --dev behat/mink-browserkit-driver&lt;br /&gt;
&lt;br /&gt;
Copy and configure phpunit.xml:&lt;br /&gt;
&lt;br /&gt;
  phpunit --testsuite unit --filter CurrentUserBlock # trash?&lt;br /&gt;
  cd /var/www/html&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php&lt;br /&gt;
  ../vendor/bin/phpunit  -c ../phpunit.xml modules/ish_drupal_module/tests/src/Functional/CurrentUserBlockTest.php -v --debug&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	</feed>