<!-- 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-05-09T13:41:14Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.26.0</generator>

	<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>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3438</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3438"/>
				<updated>2026-04-18T18:41:47Z</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;
&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/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=3437</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3437"/>
				<updated>2026-04-18T15:49:27Z</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;
  composer require 'drupal/commerce:^2.40'&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/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;
&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=Git_cheatsheet&amp;diff=3436</id>
		<title>Git cheatsheet</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Git_cheatsheet&amp;diff=3436"/>
				<updated>2026-04-18T03:06:45Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Git cheatsheet - nifty git usage example.&lt;br /&gt;
&lt;br /&gt;
=== push to two remotes at once ===&lt;br /&gt;
  git remote set-url       --push origin git@github.com:&amp;lt;username&amp;gt;/&amp;lt;reponame&amp;gt;.git&lt;br /&gt;
  git remote set-url --add --push origin git@git:/home/git/repos/&lt;br /&gt;
=== rebuild cache ===&lt;br /&gt;
  rm -f .git/index&lt;br /&gt;
  git reset&lt;br /&gt;
&lt;br /&gt;
=== Clear staged files ===&lt;br /&gt;
  git clean -df&lt;br /&gt;
  # remove untracked files&lt;br /&gt;
  git clean -n&lt;br /&gt;
&lt;br /&gt;
=== clear stale remotes ===&lt;br /&gt;
  git remote prune origin&lt;br /&gt;
&lt;br /&gt;
=== download a specific tag ===&lt;br /&gt;
  git checkout tags/&amp;lt;tag_name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== which commit does a blob belong to? ===&lt;br /&gt;
&lt;br /&gt;
which.sh:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
obj_name=&amp;quot;$1&amp;quot;&lt;br /&gt;
shift&lt;br /&gt;
git log &amp;quot;$@&amp;quot; --pretty=format:'%T %h %s' \&lt;br /&gt;
| while read tree commit subject ; do&lt;br /&gt;
    if git ls-tree -r $tree | grep -q &amp;quot;$obj_name&amp;quot; ; then&lt;br /&gt;
        echo $commit &amp;quot;$subject&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 which.sh &amp;lt;blob&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== show history for a file ===&lt;br /&gt;
 git log --follow -p -- file&lt;br /&gt;
&lt;br /&gt;
=== show one commit ===&lt;br /&gt;
 git diff &amp;lt;commit&amp;gt;~ &amp;lt;commit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== check branch ===&lt;br /&gt;
 git branch | grep -e &amp;quot;^*&amp;quot; | cut -d' ' -f 2&lt;br /&gt;
&lt;br /&gt;
=== see most recent branch ===&lt;br /&gt;
 git branch -a --sort=-committerdate&lt;br /&gt;
 git branch -a --sort=committerdate&lt;br /&gt;
&lt;br /&gt;
=== What's the latest commit in the branch? ===&lt;br /&gt;
 git log -n 1 &amp;lt;branchname&amp;gt; --format=format:%ci&lt;br /&gt;
&lt;br /&gt;
=== list conflicting files ===&lt;br /&gt;
 git diff --name-only --diff-filter=U&lt;br /&gt;
&lt;br /&gt;
=== set globalgitignore ===&lt;br /&gt;
 git config --global core.excludesfile '~/.gitignore'&lt;br /&gt;
&lt;br /&gt;
=== Allow empty commit ===&lt;br /&gt;
 git commit --allow-empty -m 'trigger build'&lt;br /&gt;
&lt;br /&gt;
=== revert ===&lt;br /&gt;
&lt;br /&gt;
How do you do reverts, by the way? Do you create a reverse patch from a hash, and commit it on top to develop ?&lt;br /&gt;
&lt;br /&gt;
I’m very careful, so I create a new branch and revert on that, then merge the branch in.&lt;br /&gt;
 1. checkout and pull develop&lt;br /&gt;
 2. cut new branch&lt;br /&gt;
 3. git revert &amp;lt;commit hash&amp;gt; &lt;br /&gt;
 4. push to origin and open PR&lt;br /&gt;
&lt;br /&gt;
Exactly the same process as cherry-picks, just with revert instead of cherry-pick&lt;br /&gt;
&lt;br /&gt;
=== create an empty branch ===&lt;br /&gt;
From: https://stackoverflow.com/questions/34100048/create-empty-branch-on-github&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git switch --orphan &amp;lt;new branch&amp;gt;&lt;br /&gt;
git commit --allow-empty -m &amp;quot;Initial commit on orphan branch&amp;quot;&lt;br /&gt;
git push -u origin &amp;lt;new branch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3435</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3435"/>
				<updated>2026-04-13T19:16:53Z</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;
  composer require 'drupal/commerce:^2.40'&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/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;
&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;
&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=3434</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3434"/>
				<updated>2026-04-12T18:17:20Z</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/metatag:^2.0'&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;
  composer require 'drupal/commerce:^2.40'&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/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;
&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;
&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=3433</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3433"/>
				<updated>2026-04-12T18:10:23Z</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/metatag:^2.0'&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;
  composer require 'drupal/commerce:^2.40'&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/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;
&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'&lt;br /&gt;
  composer require 'drupal/section_library:^2.0'&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;
&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=3432</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3432"/>
				<updated>2026-04-12T18:09:15Z</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/metatag:^2.0'&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;
  composer require 'drupal/commerce:^2.40'&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/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;
&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'&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;
&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=3431</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3431"/>
				<updated>2026-04-12T18:03:53Z</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/metatag:^2.0'&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;
  composer require 'drupal/commerce:^2.40'&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/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;
&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;
&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;
&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=3430</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3430"/>
				<updated>2026-04-12T16:54: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/metatag:^2.0'&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;
  composer require 'drupal/commerce:^2.40'&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/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;
=== ebt ===&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/ebt_core:^1.4'&lt;br /&gt;
    composer require 'drupal/ebt_hero:^1.4'&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;
&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;
&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=3429</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3429"/>
				<updated>2026-04-12T16:54: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/metatag:^2.0'&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;
  composer require 'drupal/commerce:^2.40'&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/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;
=== ebt ===&lt;br /&gt;
&lt;br /&gt;
  composer require 'drupal/ebt_core:^1.4'&lt;br /&gt;
    composer require 'drupal/ebt_hero:^1.4'&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;
&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;
&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=3428</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3428"/>
				<updated>2026-04-12T16:48: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;
&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/metatag:^2.0'&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;
  composer require 'drupal/commerce:^2.40'&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/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;
  composer require 'drupal/ebt_core:^1.4'&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;
&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;
&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=3427</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Drupal&amp;diff=3427"/>
				<updated>2026-04-12T16:47:53Z</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/metatag:^2.0'&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;
  composer require 'drupal/commerce:^2.40'&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/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&lt;br /&gt;
  composer require 'drupal/matomo:^2.0@alpha'&lt;br /&gt;
  composer require 'drupal/ebt_core:^1.4'&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;
&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;
&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=Html&amp;diff=3426</id>
		<title>Html</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Html&amp;diff=3426"/>
				<updated>2026-04-12T14:34:57Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
 certbot run -d $DOMAIN --nginx -n --expand&lt;br /&gt;
&lt;br /&gt;
Color picker: https://www.w3schools.com/colors/colors_picker.asp&lt;br /&gt;
&lt;br /&gt;
Unlimited music downloads: https://www.bensound.com/pricing&lt;br /&gt;
&lt;br /&gt;
Google cloud billing (make sure it's at zero): https://console.cloud.google.com/billing/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;text-center&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;video width=&amp;quot;640&amp;quot; height=&amp;quot;480&amp;quot; controls=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;source src=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    Your browser does not support the video tag.&lt;br /&gt;
  &amp;lt;/video&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;text-center&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;video width=&amp;quot;640&amp;quot; height=&amp;quot;360&amp;quot; controls=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;source src=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    Your browser does not support the video tag.&lt;br /&gt;
  &amp;lt;/video&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;text-center&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;video width=&amp;quot;300&amp;quot; height=&amp;quot;225&amp;quot; controls=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;source src=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    Your browser does not support the video tag.&lt;br /&gt;
  &amp;lt;/video&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;text-center&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;video width=&amp;quot;480&amp;quot; height=&amp;quot;640&amp;quot; controls=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;source src=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    Your browser does not support the video tag.&lt;br /&gt;
  &amp;lt;/video&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	<entry>
		<id>https://wiki.wasya.co/index.php?title=Books_to_Read&amp;diff=3425</id>
		<title>Books to Read</title>
		<link rel="alternate" type="text/html" href="https://wiki.wasya.co/index.php?title=Books_to_Read&amp;diff=3425"/>
				<updated>2026-04-12T14:33:40Z</updated>
		
		<summary type="html">&lt;p&gt;Piousbox: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* https://www.theguardian.com/us-news/2021/jan/29/trump-russia-asset-claims-former-kgb-spy-new-book?CMP=Share_iOSApp_Other&lt;br /&gt;
* https://www.cracked.com/article_19021_5-amazing-things-invented-by-donald-duck-seriously.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= e-reading club =&lt;br /&gt;
&lt;br /&gt;
* https://www.e-reading.club/chapter.php/78448/3/ivan-solonevich-velikaya-falshivka-fevralya.html&lt;br /&gt;
* https://e-reading.club/book.php?book=1032806 - masons in russia&lt;br /&gt;
&lt;br /&gt;
= Investing =&lt;br /&gt;
* https://www.amazon.com/Quantitative-Equity-Portfolio-Management-Construction/dp/0071459391&lt;br /&gt;
* https://www.amazon.com/Man-All-Markets-Street-Dealer/dp/1400067960&lt;br /&gt;
* https://www.amazon.com/Options-Futures-Other-Derivatives-9th/dp/0133456315&lt;br /&gt;
* https://www.amazon.com/Financial-Engineering-Stochastic-Modelling-Probability/dp/0387004513/&lt;br /&gt;
* https://www.amazon.com/Man-Who-Solved-Market-Revolution/dp/073521798X&lt;/div&gt;</summary>
		<author><name>Piousbox</name></author>	</entry>

	</feed>