Tarek EZZAT
Tarek EZZAT

Reputation: 353

Drupal 8 custom theme, twig and template

I want to display all authenticaed users in a custom template with a custom twig file.

All works fine, except that the twig file is not recognized or loaded.

My module name is "ThemeLoader"

Here are my files

In directory
\modules\custom\ThemeLoader

file: ThemeLoader.info.yml

+++++++++++++++++++++++++++++

name: ThemeLoader
description: This module is for switching the theme dynamicaly
package: d8_training
type: module
core: 8.x

+++++++++++++++++++++++++++++

file: ThemeLoader.services.yml

+++++++++++++++++++++++++++++

services:
  theme.negotiator.ThemeLoader:
    class: Drupal\ThemeLoader\Theme\ThemeLoaderNegociator
    tags:
      - { name: theme_negotiator, priority: 0 }
                                                                                                                                        

+++++++++++++++++++++++++++++

In directory
\modules\custom\ThemeLoader\src\Theme

File: ThemeLoaderNegociator.php

+++++++++++++++++++++++++++++

<?php


    namespace Drupal\ThemeLoader\Theme;

    use Drupal\Core\Routing\RouteMatchInterface;
    //use \Drupal\Core\Theme;
    class ThemeLoaderNegociator implements \Drupal\Core\Theme\ThemeNegotiatorInterface
    //class ThemeLoaderNegociator implements ThemeNegotiatorInterface
    {

        /**
         * @inheritDoc
         */
        public function applies(RouteMatchInterface $route_match)
        {
            // TODO: Implement applies() method.
            // Use this theme on a certain route.
          return $route_match->getRouteName() == 'mymodule2.mypage2';
        }

        /**
         * @inheritDoc
         */
        public function determineActiveTheme(RouteMatchInterface $route_match)
        {
            // TODO: Implement determineActiveTheme() method.
          return 'mytheme';//The theme name
        }
    }

+++++++++++++++++++++++++++++

In directory \themes\mytheme

File: mytheme.info.yml

+++++++++++++++++++++++++++++

name: mytheme
description: My custom theme
type: theme
core: 8.x
base theme: false
regions:
  header: 'Header'
  primary_menu: 'Primary menu'
  page_top: 'Page top'
  page_bottom: 'Page bottom'
  breadcrumb: 'Breadcrumb'
  content: 'Content'
libraries:
   - mytheme/global-styling

+++++++++++++++++++++++++++++

File: mytheme.libraries.yml

+++++++++++++++++++++++++++++

global-styling:
  version: VERSION
  css:
    theme:
      css/style.css: {}
  js:
    js/scripts.js: {}

+++++++++++++++++++++++++++++

File: css\style.css

+++++++++++++++++++++++++++++

body {
    background: #99ffbb;
}

+++++++++++++++++++++++++++++

File: js\scripts.js

+++++++++++++++++++++++++++++

(function($){    
    alert('hello world - jQuery version ' + $.fn.jquery);})
(jQuery);

+++++++++++++++++++++++++++++

in directory \themes\mytheme\templates

File: page.html.twig

+++++++++++++++++++++++++++++

{#
/**
 * @file
 * Theme override to display a single page.
 *
 * The doctype, html, head and body tags are not in this template. Instead they
 * can be found in the html.html.twig template in this directory.
 *
 * Available variables:
 *
 * General utility variables:
 * - base_path: The base URL path of the Drupal installation. Will usually be
 *   "/" unless you have installed Drupal in a sub-directory.
 * - is_front: A flag indicating if the current page is the front page.
 * - logged_in: A flag indicating if the user is registered and signed in.
 * - is_admin: A flag indicating if the user has permission to access
 *   administration pages.
 *
 * Site identity:
 * - front_page: The URL of the front page. Use this instead of base_path when
 *   linking to the front page. This includes the language domain or prefix.
 *
 * Page content (in order of occurrence in the default page.html.twig):
 * - node: Fully loaded node, if there is an automatically-loaded node
 *   associated with the page and the node ID is the second argument in the
 *   page's path (e.g. node/12345 and node/12345/revisions, but not
 *   comment/reply/12345).
 *
 * Regions:
 * - page.header: Items for the header region.
 * - page.primary_menu: Items for the primary menu region.
 * - page.secondary_menu: Items for the secondary menu region.
 * - page.highlighted: Items for the highlighted content region.
 * - page.help: Dynamic help text, mostly for admin pages.
 * - page.content: The main content of the current page.
 * - page.sidebar_first: Items for the first sidebar.
 * - page.sidebar_second: Items for the second sidebar.
 * - page.footer: Items for the footer region.
 * - page.breadcrumb: Items for the breadcrumb region.
 *
 * @see template_preprocess_page()
 * @see html.html.twig
 */
#}
<div class="layout-container">

  <header role="banner">
    {{ page.header }}
  </header>

  {{ page.primary_menu }}
  {{ page.secondary_menu }}

  {{ page.breadcrumb }}

  {{ page.highlighted }}

  {{ page.help }}

  <main role="main">
    <a id="main-content" tabindex="-1"></a>{# link is in html.html.twig #}

    <div class="layout-content">
      {{ page.content }}
    </div>{# /.layout-content #}

    {% if page.sidebar_first %}
      <aside class="layout-sidebar-first" role="complementary">
        {{ page.sidebar_first }}
      </aside>
    {% endif %}

    {% if page.sidebar_second %}
      <aside class="layout-sidebar-second" role="complementary">
        {{ page.sidebar_second }}
      </aside>
    {% endif %}

  </main>

  {% if page.footer %}
    <footer role="contentinfo">
      {{ page.footer }}
    </footer>
  {% endif %}

</div>{# /.layout-container #}

+++++++++++++++++++++++++++++

The file page.html.twig is not loàaded I also renamed it to mytheme.html.twig with no success I even removed all files in the directory themes\mytheme\templates, I got no error message.

The javascript works, aned the css also.

What did I miss or do wrong ?

Upvotes: 0

Views: 2604

Answers (1)

gcerni
gcerni

Reputation: 132

I'm not sure here what kind of issue you may have. I have created all the files to try debugging this and everything worked fine to me.

enter image description here

I would suggest you to do the following to debug in future, on your settings.php file add the following:

$settings['container_yamls'][] = DRUPAL_ROOT . '/sites/default/services.yml';

Then on your services.yml file, you could duplicate and rename the default.services.yml file, change the following:

debug: true
auto_reload: true
cache: false

Once you do all of the above, if you have drush installed clear cache by doing:

drush cr

You will start seeing helpful extracts on your devtools, which will aide you during your development.

Upvotes: 1

Related Questions