@ -0,0 +1,8 @@ | |||||
DOCKSAL_STACK=default | |||||
DOCROOT=docroot | |||||
XDEBUG_ENABLED=1 | |||||
DATABASE_NAME=default | |||||
DATABASE_USERNAME=user | |||||
DATABASE_PASSWORD=user | |||||
DATABASE_HOST=db | |||||
SITE_ENV=local |
@ -0,0 +1,72 @@ | |||||
# Basic LAMP stack | |||||
version: "2.1" | |||||
services: | |||||
# Web | |||||
web: | |||||
hostname: web | |||||
image: docksal/web:2.1-apache2.4 | |||||
volumes: | |||||
- project_root:/var/www:ro,nocopy # Project root volume | |||||
labels: | |||||
- io.docksal.virtual-host=${VIRTUAL_HOST},*.${VIRTUAL_HOST} | |||||
- io.docksal.project-root=${PROJECT_ROOT} | |||||
environment: | |||||
- APACHE_DOCUMENTROOT=/var/www/${DOCROOT:-docroot} | |||||
- APACHE_BASIC_AUTH_USER | |||||
- APACHE_BASIC_AUTH_PASS | |||||
depends_on: | |||||
- cli | |||||
dns: | |||||
- ${DOCKSAL_DNS1} | |||||
- ${DOCKSAL_DNS2} | |||||
# DB | |||||
db: | |||||
hostname: db | |||||
image: docksal/db:1.1-mysql-5.6 | |||||
ports: | |||||
- "${MYSQL_PORT_MAPPING:-3306}" | |||||
volumes: | |||||
- project_root:/var/www:ro,nocopy # Project root volume | |||||
- ${PROJECT_ROOT}/db:/docker-entrypoint-initdb.d:ro | |||||
environment: | |||||
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD:-root} | |||||
- MYSQL_USER=${MYSQL_USER:-user} | |||||
- MYSQL_PASSWORD=${MYSQL_PASSWORD:-user} | |||||
- MYSQL_DATABASE=${MYSQL_DATABASE:-default} | |||||
dns: | |||||
- ${DOCKSAL_DNS1} | |||||
- ${DOCKSAL_DNS2} | |||||
# CLI - Used for all console commands and tools. | |||||
cli: | |||||
hostname: cli | |||||
image: docksal/cli:2.4-php7.2 | |||||
volumes: | |||||
- project_root:/var/www:rw,nocopy # Project root volume | |||||
- docksal_ssh_agent:/.ssh-agent:ro # Shared ssh-agent socket | |||||
environment: | |||||
- HOST_UID | |||||
- HOST_GID | |||||
- DOCROOT | |||||
- XDEBUG_ENABLED=${XDEBUG_ENABLED:-0} | |||||
- XDEBUG_CONFIG=remote_connect_back=0 remote_host=${DOCKSAL_HOST_IP} # Point xdebug to the host IP | |||||
- DATABASE_NAME | |||||
- DATABASE_USERNAME | |||||
- DATABASE_PASSWORD | |||||
- DATABASE_HOST | |||||
- DRUPAL_TRUSTED_HOSTS=${VIRTUAL_HOST} | |||||
- SITE_ENV | |||||
dns: | |||||
- ${DOCKSAL_DNS1} | |||||
- ${DOCKSAL_DNS2} | |||||
# | |||||
# solr: | |||||
# extends: | |||||
# file: ${HOME}/.docksal/stacks/services.yml | |||||
# service: solr | |||||
# image: docksal/solr:7.5 | |||||
# environment: | |||||
# SOLR_DEFAULT_CONFIG_SET: search_api_solr_8.x-2.1 |
@ -0,0 +1,17 @@ | |||||
# Drupal editor configuration normalization | |||||
# @see http://editorconfig.org/ | |||||
# This is the top-most .editorconfig file; do not search in parent directories. | |||||
root = true | |||||
# All files. | |||||
[*] | |||||
end_of_line = LF | |||||
indent_style = space | |||||
indent_size = 2 | |||||
charset = utf-8 | |||||
trim_trailing_whitespace = true | |||||
insert_final_newline = true | |||||
[composer.{json,lock}] | |||||
indent_size = 4 |
@ -0,0 +1,61 @@ | |||||
# Drupal git normalization | |||||
# @see https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html | |||||
# @see https://www.drupal.org/node/1542048 | |||||
# Normally these settings would be done with macro attributes for improved | |||||
# readability and easier maintenance. However macros can only be defined at the | |||||
# repository root directory. Drupal avoids making any assumptions about where it | |||||
# is installed. | |||||
# Define text file attributes. | |||||
# - Treat them as text. | |||||
# - Ensure no CRLF line-endings, neither on checkout nor on checkin. | |||||
# - Detect whitespace errors. | |||||
# - Exposed by default in `git diff --color` on the CLI. | |||||
# - Validate with `git diff --check`. | |||||
# - Deny applying with `git apply --whitespace=error-all`. | |||||
# - Fix automatically with `git apply --whitespace=fix`. | |||||
*.config text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||||
*.css text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||||
*.dist text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||||
*.engine text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php | |||||
*.html text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=html | |||||
*.inc text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php | |||||
*.install text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php | |||||
*.js text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||||
*.json text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||||
*.lock text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||||
*.map text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||||
*.md text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||||
*.module text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php | |||||
*.php text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php | |||||
*.po text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||||
*.profile text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php | |||||
*.script text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||||
*.sh text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php | |||||
*.sql text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||||
*.svg text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||||
*.theme text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php | |||||
*.twig text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||||
*.txt text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||||
*.xml text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||||
*.yml text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||||
# Define binary file attributes. | |||||
# - Do not treat them as text. | |||||
# - Include binary diff in patches instead of "binary files differ." | |||||
*.eot -text diff | |||||
*.exe -text diff | |||||
*.gif -text diff | |||||
*.gz -text diff | |||||
*.ico -text diff | |||||
*.jpeg -text diff | |||||
*.jpg -text diff | |||||
*.otf -text diff | |||||
*.phar -text diff | |||||
*.png -text diff | |||||
*.svgz -text diff | |||||
*.ttf -text diff | |||||
*.woff -text diff | |||||
*.woff2 -text diff |
@ -0,0 +1,22 @@ | |||||
# Ignore directories generated by Composer | |||||
/drush/contrib/ | |||||
/vendor/ | |||||
/docroot/core/ | |||||
/docroot/modules/contrib/ | |||||
/docroot/themes/contrib/ | |||||
/docroot/profiles/contrib/ | |||||
/docroot/libraries/ | |||||
# Ignore sensitive information | |||||
docroot/sites/*/settings.php | |||||
docroot/sites/*/settings.local.php | |||||
# Ignore Drupal's file directory | |||||
/docroot/sites/*/files/ | |||||
# Ignore SimpleTest multi-site environment. | |||||
docroot/sites/simpletest | |||||
# Ignore files generated by PhpStorm | |||||
/.idea/ | |||||
.tags |
@ -0,0 +1,57 @@ | |||||
variables: | |||||
IMAGE_TAG_RELEASE: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME | |||||
stages: | |||||
- lint | |||||
- deploy | |||||
lint: | |||||
stage: lint | |||||
image: donniewest/drupal-node-container:latest | |||||
only: | |||||
- dev | |||||
script: | |||||
- cd docroot/themes/custom/THEMENAME && npm install && npm run lint | |||||
build-dev: | |||||
image: docker:latest | |||||
services: | |||||
- docker:18-dind | |||||
stage: deploy | |||||
only: | |||||
- master | |||||
script: | |||||
- docker run -v $PWD:/var/www/html donniewest/drupal-node-container:latest /bin/bash -c "composer install && cd ./docroot/themes/custom/THEMENAME/ && npm install && npm run build && npm run compile" | |||||
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY | |||||
- docker build -t $IMAGE_TAG_RELEASE ./ | |||||
- docker push $IMAGE_TAG_RELEASE | |||||
build-staging: | |||||
image: docker:latest | |||||
services: | |||||
- docker:18-dind | |||||
stage: deploy | |||||
only: | |||||
- /^RC-[\.\d]*/ | |||||
except: | |||||
- branches | |||||
script: | |||||
- docker run -v $PWD:/var/www/html donniewest/drupal-node-container:latest /bin/bash -c "composer install && cd ./docroot/themes/custom/THEMENAME/ && npm install && npm run build && npm run compile" | |||||
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY | |||||
- docker build -t $CI_REGISTRY_IMAGE:staging ./ | |||||
- docker push $CI_REGISTRY_IMAGE:staging | |||||
build-production: | |||||
image: docker:latest | |||||
services: | |||||
- docker:18-dind | |||||
stage: deploy | |||||
only: | |||||
- /^RELEASE-[\.\d]*/ | |||||
except: | |||||
- branches | |||||
script: | |||||
- docker run -v $PWD:/var/www/html donniewest/drupal-node-container:latest /bin/bash -c "composer install && cd ./docroot/themes/custom/THEMENAME/ && npm install && npm run build && npm run compile" | |||||
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY | |||||
- docker build -t $CI_REGISTRY_IMAGE:production ./ | |||||
- docker push $CI_REGISTRY_IMAGE:production |
@ -0,0 +1,40 @@ | |||||
language: php | |||||
dist: trusty | |||||
sudo: false | |||||
php: | |||||
- 5.6 | |||||
- 7.0 | |||||
- 7.1 | |||||
env: | |||||
global: | |||||
- SIMPLETEST_DB=sqlite://tmp/site.sqlite | |||||
- SIMPLETEST_BASE_URL="http://127.0.0.1:8080" | |||||
matrix: | |||||
- RELEASE=stable COMPOSER_CHANNEL=stable | |||||
- RELEASE=dev COMPOSER_CHANNEL=stable | |||||
- RELEASE=stable COMPOSER_CHANNEL=snapshot | |||||
before_install: | |||||
- echo 'sendmail_path = /bin/true' >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini | |||||
- phpenv config-rm xdebug.ini | |||||
- composer --verbose self-update --$COMPOSER_CHANNEL | |||||
- composer --version | |||||
install: | |||||
- composer --verbose install | |||||
script: | |||||
- if [[ $RELEASE = dev ]]; then composer --verbose remove --no-update drupal/console; fi; | |||||
- if [[ $RELEASE = dev ]]; then composer --verbose require --no-update drupal/core:8.4.x-dev drush/drush:9.0.x-dev; fi; | |||||
- if [[ $RELEASE = dev ]]; then composer --verbose update; fi; | |||||
- cd $TRAVIS_BUILD_DIR/web | |||||
- ./../vendor/bin/drush site-install --verbose --yes --db-url=sqlite://tmp/site.sqlite | |||||
- ./../vendor/bin/drush runserver $SIMPLETEST_BASE_URL & | |||||
- until curl -s $SIMPLETEST_BASE_URL; do true; done > /dev/null | |||||
# Skip core/tests/Drupal/Tests/ComposerIntegrationTest.php because web/ has no composer.json | |||||
# Ignore PageCache group temporarily, @see https://www.drupal.org/node/2770673 | |||||
- ./../vendor/bin/phpunit -c core --testsuite unit --exclude-group Composer,DependencyInjection,PageCache | |||||
- ./../vendor/bin/drush | |||||
- if [[ $RELEASE = stable ]]; then ./../vendor/bin/drupal; fi; |
@ -0,0 +1,38 @@ | |||||
FROM drupal:8.6 | |||||
# Set the Drush version. | |||||
ENV DRUSH_VERSION 8.1.18 | |||||
# Install Drush 8 with the phar file. | |||||
RUN curl -fsSL -o /usr/local/bin/drush "https://github.com/drush-ops/drush/releases/download/$DRUSH_VERSION/drush.phar" && \ | |||||
chmod +x /usr/local/bin/drush | |||||
RUN apt-get update && apt-get install -y libxml2-dev imagemagick mysql-client ssmtp --no-install-recommends | |||||
RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli | |||||
ADD https://drupalconsole.com/installer /usr/local/bin/drupal | |||||
RUN chmod +x /usr/local/bin/drupal | |||||
RUN { \ | |||||
echo 'memory_limit = 196M'; \ | |||||
echo 'display_errors = Off'; \ | |||||
echo 'post_max_size = 512M'; \ | |||||
echo 'file_uploads = On'; \ | |||||
echo 'upload_max_filesize = 512M'; \ | |||||
echo 'max_file_uploads = 20'; \ | |||||
} > /usr/local/etc/php/conf.d/codekoalas-settings.ini | |||||
RUN echo 'sendmail_path = "/usr/sbin/ssmtp -t -i"' > /usr/local/etc/php/conf.d/mail.ini | |||||
RUN sed -i 's/\/var\/www\/html/\/var\/www\/html\/docroot/g' /etc/apache2/sites-available/000-default.conf | |||||
RUN rm -rf /var/www/html/* | |||||
COPY ./ /var/www/html | |||||
RUN chmod a+x ./run.sh | |||||
ENTRYPOINT ["/bin/sh", "-c"] | |||||
CMD ["./run.sh"] |
@ -0,0 +1,339 @@ | |||||
GNU GENERAL PUBLIC LICENSE | |||||
Version 2, June 1991 | |||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc., <http://fsf.org/> | |||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||||
Everyone is permitted to copy and distribute verbatim copies | |||||
of this license document, but changing it is not allowed. | |||||
Preamble | |||||
The licenses for most software are designed to take away your | |||||
freedom to share and change it. By contrast, the GNU General Public | |||||
License is intended to guarantee your freedom to share and change free | |||||
software--to make sure the software is free for all its users. This | |||||
General Public License applies to most of the Free Software | |||||
Foundation's software and to any other program whose authors commit to | |||||
using it. (Some other Free Software Foundation software is covered by | |||||
the GNU Lesser General Public License instead.) You can apply it to | |||||
your programs, too. | |||||
When we speak of free software, we are referring to freedom, not | |||||
price. Our General Public Licenses are designed to make sure that you | |||||
have the freedom to distribute copies of free software (and charge for | |||||
this service if you wish), that you receive source code or can get it | |||||
if you want it, that you can change the software or use pieces of it | |||||
in new free programs; and that you know you can do these things. | |||||
To protect your rights, we need to make restrictions that forbid | |||||
anyone to deny you these rights or to ask you to surrender the rights. | |||||
These restrictions translate to certain responsibilities for you if you | |||||
distribute copies of the software, or if you modify it. | |||||
For example, if you distribute copies of such a program, whether | |||||
gratis or for a fee, you must give the recipients all the rights that | |||||
you have. You must make sure that they, too, receive or can get the | |||||
source code. And you must show them these terms so they know their | |||||
rights. | |||||
We protect your rights with two steps: (1) copyright the software, and | |||||
(2) offer you this license which gives you legal permission to copy, | |||||
distribute and/or modify the software. | |||||
Also, for each author's protection and ours, we want to make certain | |||||
that everyone understands that there is no warranty for this free | |||||
software. If the software is modified by someone else and passed on, we | |||||
want its recipients to know that what they have is not the original, so | |||||
that any problems introduced by others will not reflect on the original | |||||
authors' reputations. | |||||
Finally, any free program is threatened constantly by software | |||||
patents. We wish to avoid the danger that redistributors of a free | |||||
program will individually obtain patent licenses, in effect making the | |||||
program proprietary. To prevent this, we have made it clear that any | |||||
patent must be licensed for everyone's free use or not licensed at all. | |||||
The precise terms and conditions for copying, distribution and | |||||
modification follow. | |||||
GNU GENERAL PUBLIC LICENSE | |||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | |||||
0. This License applies to any program or other work which contains | |||||
a notice placed by the copyright holder saying it may be distributed | |||||
under the terms of this General Public License. The "Program", below, | |||||
refers to any such program or work, and a "work based on the Program" | |||||
means either the Program or any derivative work under copyright law: | |||||
that is to say, a work containing the Program or a portion of it, | |||||
either verbatim or with modifications and/or translated into another | |||||
language. (Hereinafter, translation is included without limitation in | |||||
the term "modification".) Each licensee is addressed as "you". | |||||
Activities other than copying, distribution and modification are not | |||||
covered by this License; they are outside its scope. The act of | |||||
running the Program is not restricted, and the output from the Program | |||||
is covered only if its contents constitute a work based on the | |||||
Program (independent of having been made by running the Program). | |||||
Whether that is true depends on what the Program does. | |||||
1. You may copy and distribute verbatim copies of the Program's | |||||
source code as you receive it, in any medium, provided that you | |||||
conspicuously and appropriately publish on each copy an appropriate | |||||
copyright notice and disclaimer of warranty; keep intact all the | |||||
notices that refer to this License and to the absence of any warranty; | |||||
and give any other recipients of the Program a copy of this License | |||||
along with the Program. | |||||
You may charge a fee for the physical act of transferring a copy, and | |||||
you may at your option offer warranty protection in exchange for a fee. | |||||
2. You may modify your copy or copies of the Program or any portion | |||||
of it, thus forming a work based on the Program, and copy and | |||||
distribute such modifications or work under the terms of Section 1 | |||||
above, provided that you also meet all of these conditions: | |||||
a) You must cause the modified files to carry prominent notices | |||||
stating that you changed the files and the date of any change. | |||||
b) You must cause any work that you distribute or publish, that in | |||||
whole or in part contains or is derived from the Program or any | |||||
part thereof, to be licensed as a whole at no charge to all third | |||||
parties under the terms of this License. | |||||
c) If the modified program normally reads commands interactively | |||||
when run, you must cause it, when started running for such | |||||
interactive use in the most ordinary way, to print or display an | |||||
announcement including an appropriate copyright notice and a | |||||
notice that there is no warranty (or else, saying that you provide | |||||
a warranty) and that users may redistribute the program under | |||||
these conditions, and telling the user how to view a copy of this | |||||
License. (Exception: if the Program itself is interactive but | |||||
does not normally print such an announcement, your work based on | |||||
the Program is not required to print an announcement.) | |||||
These requirements apply to the modified work as a whole. If | |||||
identifiable sections of that work are not derived from the Program, | |||||
and can be reasonably considered independent and separate works in | |||||
themselves, then this License, and its terms, do not apply to those | |||||
sections when you distribute them as separate works. But when you | |||||
distribute the same sections as part of a whole which is a work based | |||||
on the Program, the distribution of the whole must be on the terms of | |||||
this License, whose permissions for other licensees extend to the | |||||
entire whole, and thus to each and every part regardless of who wrote it. | |||||
Thus, it is not the intent of this section to claim rights or contest | |||||
your rights to work written entirely by you; rather, the intent is to | |||||
exercise the right to control the distribution of derivative or | |||||
collective works based on the Program. | |||||
In addition, mere aggregation of another work not based on the Program | |||||
with the Program (or with a work based on the Program) on a volume of | |||||
a storage or distribution medium does not bring the other work under | |||||
the scope of this License. | |||||
3. You may copy and distribute the Program (or a work based on it, | |||||
under Section 2) in object code or executable form under the terms of | |||||
Sections 1 and 2 above provided that you also do one of the following: | |||||
a) Accompany it with the complete corresponding machine-readable | |||||
source code, which must be distributed under the terms of Sections | |||||
1 and 2 above on a medium customarily used for software interchange; or, | |||||
b) Accompany it with a written offer, valid for at least three | |||||
years, to give any third party, for a charge no more than your | |||||
cost of physically performing source distribution, a complete | |||||
machine-readable copy of the corresponding source code, to be | |||||
distributed under the terms of Sections 1 and 2 above on a medium | |||||
customarily used for software interchange; or, | |||||
c) Accompany it with the information you received as to the offer | |||||
to distribute corresponding source code. (This alternative is | |||||
allowed only for noncommercial distribution and only if you | |||||
received the program in object code or executable form with such | |||||
an offer, in accord with Subsection b above.) | |||||
The source code for a work means the preferred form of the work for | |||||
making modifications to it. For an executable work, complete source | |||||
code means all the source code for all modules it contains, plus any | |||||
associated interface definition files, plus the scripts used to | |||||
control compilation and installation of the executable. However, as a | |||||
special exception, the source code distributed need not include | |||||
anything that is normally distributed (in either source or binary | |||||
form) with the major components (compiler, kernel, and so on) of the | |||||
operating system on which the executable runs, unless that component | |||||
itself accompanies the executable. | |||||
If distribution of executable or object code is made by offering | |||||
access to copy from a designated place, then offering equivalent | |||||
access to copy the source code from the same place counts as | |||||
distribution of the source code, even though third parties are not | |||||
compelled to copy the source along with the object code. | |||||
4. You may not copy, modify, sublicense, or distribute the Program | |||||
except as expressly provided under this License. Any attempt | |||||
otherwise to copy, modify, sublicense or distribute the Program is | |||||
void, and will automatically terminate your rights under this License. | |||||
However, parties who have received copies, or rights, from you under | |||||
this License will not have their licenses terminated so long as such | |||||
parties remain in full compliance. | |||||
5. You are not required to accept this License, since you have not | |||||
signed it. However, nothing else grants you permission to modify or | |||||
distribute the Program or its derivative works. These actions are | |||||
prohibited by law if you do not accept this License. Therefore, by | |||||
modifying or distributing the Program (or any work based on the | |||||
Program), you indicate your acceptance of this License to do so, and | |||||
all its terms and conditions for copying, distributing or modifying | |||||
the Program or works based on it. | |||||
6. Each time you redistribute the Program (or any work based on the | |||||
Program), the recipient automatically receives a license from the | |||||
original licensor to copy, distribute or modify the Program subject to | |||||
these terms and conditions. You may not impose any further | |||||
restrictions on the recipients' exercise of the rights granted herein. | |||||
You are not responsible for enforcing compliance by third parties to | |||||
this License. | |||||
7. If, as a consequence of a court judgment or allegation of patent | |||||
infringement or for any other reason (not limited to patent issues), | |||||
conditions are imposed on you (whether by court order, agreement or | |||||
otherwise) that contradict the conditions of this License, they do not | |||||
excuse you from the conditions of this License. If you cannot | |||||
distribute so as to satisfy simultaneously your obligations under this | |||||
License and any other pertinent obligations, then as a consequence you | |||||
may not distribute the Program at all. For example, if a patent | |||||
license would not permit royalty-free redistribution of the Program by | |||||
all those who receive copies directly or indirectly through you, then | |||||
the only way you could satisfy both it and this License would be to | |||||
refrain entirely from distribution of the Program. | |||||
If any portion of this section is held invalid or unenforceable under | |||||
any particular circumstance, the balance of the section is intended to | |||||
apply and the section as a whole is intended to apply in other | |||||
circumstances. | |||||
It is not the purpose of this section to induce you to infringe any | |||||
patents or other property right claims or to contest validity of any | |||||
such claims; this section has the sole purpose of protecting the | |||||
integrity of the free software distribution system, which is | |||||
implemented by public license practices. Many people have made | |||||
generous contributions to the wide range of software distributed | |||||
through that system in reliance on consistent application of that | |||||
system; it is up to the author/donor to decide if he or she is willing | |||||
to distribute software through any other system and a licensee cannot | |||||
impose that choice. | |||||
This section is intended to make thoroughly clear what is believed to | |||||
be a consequence of the rest of this License. | |||||
8. If the distribution and/or use of the Program is restricted in | |||||
certain countries either by patents or by copyrighted interfaces, the | |||||
original copyright holder who places the Program under this License | |||||
may add an explicit geographical distribution limitation excluding | |||||
those countries, so that distribution is permitted only in or among | |||||
countries not thus excluded. In such case, this License incorporates | |||||
the limitation as if written in the body of this License. | |||||
9. The Free Software Foundation may publish revised and/or new versions | |||||
of the General Public License from time to time. Such new versions will | |||||
be similar in spirit to the present version, but may differ in detail to | |||||
address new problems or concerns. | |||||
Each version is given a distinguishing version number. If the Program | |||||
specifies a version number of this License which applies to it and "any | |||||
later version", you have the option of following the terms and conditions | |||||
either of that version or of any later version published by the Free | |||||
Software Foundation. If the Program does not specify a version number of | |||||
this License, you may choose any version ever published by the Free Software | |||||
Foundation. | |||||
10. If you wish to incorporate parts of the Program into other free | |||||
programs whose distribution conditions are different, write to the author | |||||
to ask for permission. For software which is copyrighted by the Free | |||||
Software Foundation, write to the Free Software Foundation; we sometimes | |||||
make exceptions for this. Our decision will be guided by the two goals | |||||
of preserving the free status of all derivatives of our free software and | |||||
of promoting the sharing and reuse of software generally. | |||||
NO WARRANTY | |||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY | |||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN | |||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES | |||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED | |||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS | |||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE | |||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, | |||||
REPAIR OR CORRECTION. | |||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | |||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR | |||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, | |||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING | |||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED | |||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY | |||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER | |||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE | |||||
POSSIBILITY OF SUCH DAMAGES. | |||||
END OF TERMS AND CONDITIONS | |||||
How to Apply These Terms to Your New Programs | |||||
If you develop a new program, and you want it to be of the greatest | |||||
possible use to the public, the best way to achieve this is to make it | |||||
free software which everyone can redistribute and change under these terms. | |||||
To do so, attach the following notices to the program. It is safest | |||||
to attach them to the start of each source file to most effectively | |||||
convey the exclusion of warranty; and each file should have at least | |||||
the "copyright" line and a pointer to where the full notice is found. | |||||
{description} | |||||
Copyright (C) {year} {fullname} | |||||
This program is free software; you can redistribute it and/or modify | |||||
it under the terms of the GNU General Public License as published by | |||||
the Free Software Foundation; either version 2 of the License, or | |||||
(at your option) any later version. | |||||
This program is distributed in the hope that it will be useful, | |||||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
GNU General Public License for more details. | |||||
You should have received a copy of the GNU General Public License along | |||||
with this program; if not, write to the Free Software Foundation, Inc., | |||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |||||
Also add information on how to contact you by electronic and paper mail. | |||||
If the program is interactive, make it output a short notice like this | |||||
when it starts in an interactive mode: | |||||
Gnomovision version 69, Copyright (C) year name of author | |||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. | |||||
This is free software, and you are welcome to redistribute it | |||||
under certain conditions; type `show c' for details. | |||||
The hypothetical commands `show w' and `show c' should show the appropriate | |||||
parts of the General Public License. Of course, the commands you use may | |||||
be called something other than `show w' and `show c'; they could even be | |||||
mouse-clicks or menu items--whatever suits your program. | |||||
You should also get your employer (if you work as a programmer) or your | |||||
school, if any, to sign a "copyright disclaimer" for the program, if | |||||
necessary. Here is a sample; alter the names: | |||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program | |||||
`Gnomovision' (which makes passes at compilers) written by James Hacker. | |||||
{signature of Ty Coon}, 1 April 1989 | |||||
Ty Coon, President of Vice | |||||
This General Public License does not permit incorporating your program into | |||||
proprietary programs. If your program is a subroutine library, you may | |||||
consider it more useful to permit linking proprietary applications with the | |||||
library. If this is what you want to do, use the GNU Lesser General | |||||
Public License instead of this License. |
@ -0,0 +1,13 @@ | |||||
# Composer template for Drupal projects | |||||
Code Koalas Edition | |||||
## How to use | |||||
1. `composer create-project codekoalas/koality-drupal:8.x-dev some-dir --stability dev --no-interaction` | |||||
2. `fin up` | |||||
3. `cp sample.settings.php docroot/sites/default/settings.php` | |||||
4. Go to your new local site. | |||||
# Previous Readme | |||||
Since this is a fork the previous README can be viewed back on the main project: | |||||
https://github.com/drupal-composer/drupal-project | |||||
@ -0,0 +1,113 @@ | |||||
{ | |||||
"name": "codekoalas/koality-drupal", | |||||
"description": "Project template for Drupal 8 projects with composer: with some pre-installed things needed on every site", | |||||
"type": "project", | |||||
"license": "GPL-2.0+", | |||||
"authors": [ | |||||
{ | |||||
"name": "", | |||||
"role": "" | |||||
} | |||||
], | |||||
"repositories": [ | |||||
{ | |||||
"type": "composer", | |||||
"url": "https://packages.drupal.org/8" | |||||
} | |||||
], | |||||
"require": { | |||||
"php": ">=5.6", | |||||
"composer/installers": "^1.2", | |||||
"cweagans/composer-patches": "^1.6.5", | |||||
"drupal-composer/drupal-scaffold": "^2.5", | |||||
"drupal/admin_toolbar": "~1.0", | |||||
"drupal/advagg": "^3.5", | |||||
"drupal/backup_migrate": "^4.0", | |||||
"drupal/blazy": "~1.0", | |||||
"drupal/block_blacklist": "^1.0", | |||||
"drupal/claro": "^1.0", | |||||
"drupal/components": "^1.1", | |||||
"drupal/config_export_ignore": "^1.0@RC", | |||||
"drupal/config_ignore": "^2.1", | |||||
"drupal/config_split": "^1.3", | |||||
"drupal/config_update": "^1.5", | |||||
"drupal/console": "^1.0.2", | |||||
"drupal/core": "~8.0", | |||||
"drupal/ctools": "~3.0", | |||||
"drupal/devel": "^1.2", | |||||
"drush/drush": "^9.0.0", | |||||
"drupal/field_group": "^1.0", | |||||
"drupal/focal_point": "^1.0", | |||||
"drupal/imageapi_optimize": "^2.0@alpha", | |||||
"drupal/inline_entity_form": "^1.0@RC", | |||||
"drupal/layout_builder_restrictions": "^2.2", | |||||
"drupal/layout_builder_st": "^1.0@alpha", | |||||
"drupal/linkit": "~4.0", | |||||
"drupal/masquerade": "^2.0@beta", | |||||
"drupal/menu_link_attributes": "^1.0", | |||||
"drupal/metatag": "^1.9", | |||||
"drupal/module_filter": "~3.0", | |||||
"drupal/paragraphs": "^1.2", | |||||
"drupal/pathauto": "~1.0", | |||||
"drupal/prlp": "^1.2", | |||||
"drupal/token": "~1.0", | |||||
"drupal/twig_tweak": "^2.0", | |||||
"drupal/ui_patterns": "^1.1", | |||||
"drupal/webform": "^5.3", | |||||
"vlucas/phpdotenv": "^2.4", | |||||
"webflo/drupal-finder": "^1.0.0", | |||||
"webmozart/path-util": "^2.3", | |||||
"zaporylie/composer-drupal-optimizations": "^1.0" | |||||
}, | |||||
"require-dev": { | |||||
"webflo/drupal-core-require-dev": "^8.7.0" | |||||
}, | |||||
"conflict": { | |||||
"drupal/drupal": "*" | |||||
}, | |||||
"minimum-stability": "dev", | |||||
"prefer-stable": true, | |||||
"config": { | |||||
"sort-packages": true | |||||
}, | |||||
"autoload": { | |||||
"classmap": [ | |||||
"scripts/composer/ScriptHandler.php" | |||||
], | |||||
"files": ["load.environment.php"] | |||||
}, | |||||
"scripts": { | |||||
"pre-install-cmd": [ | |||||
"DrupalProject\\composer\\ScriptHandler::checkComposerVersion" | |||||
], | |||||
"pre-update-cmd": [ | |||||
"DrupalProject\\composer\\ScriptHandler::checkComposerVersion" | |||||
], | |||||
"post-install-cmd": [ | |||||
"DrupalProject\\composer\\ScriptHandler::createRequiredFiles" | |||||
], | |||||
"post-update-cmd": [ | |||||
"DrupalProject\\composer\\ScriptHandler::createRequiredFiles" | |||||
] | |||||
}, | |||||
"extra": { | |||||
"composer-exit-on-patch-failure": true, | |||||
"patchLevel": { | |||||
"drupal/core": "-p2" | |||||
}, | |||||
"installer-paths": { | |||||
"docroot/core": ["type:drupal-core"], | |||||
"docroot/libraries/{$name}": ["type:drupal-library"], | |||||
"docroot/modules/contrib/{$name}": ["type:drupal-module"], | |||||
"docroot/profiles/contrib/{$name}": ["type:drupal-profile"], | |||||
"docroot/themes/contrib/{$name}": ["type:drupal-theme"], | |||||
"drush/contrib/{$name}": ["type:drupal-drush"] | |||||
}, | |||||
"drupal-scaffold": { | |||||
"initial": { | |||||
".editorconfig": "../.editorconfig", | |||||
".gitattributes": "../.gitattributes" | |||||
} | |||||
} | |||||
} | |||||
} |
@ -0,0 +1,24 @@ | |||||
# Deny all requests from Apache 2.4+. | |||||
<IfModule mod_authz_core.c> | |||||
Require all denied | |||||
</IfModule> | |||||
# Deny all requests from Apache 2.0-2.2. | |||||
<IfModule !mod_authz_core.c> | |||||
Deny from all | |||||
</IfModule> | |||||
# Turn off all options we don't need. | |||||
Options -Indexes -ExecCGI -Includes -MultiViews | |||||
# Set the catch-all handler to prevent scripts from being executed. | |||||
SetHandler Drupal_Security_Do_Not_Remove_See_SA_2006_006 | |||||
<Files *> | |||||
# Override the handler again if we're run later in the evaluation list. | |||||
SetHandler Drupal_Security_Do_Not_Remove_See_SA_2013_003 | |||||
</Files> | |||||
# If we know how to do it safely, disable the PHP engine entirely. | |||||
<IfModule mod_php5.c> | |||||
php_flag engine off | |||||
</IfModule> |
@ -0,0 +1,3 @@ | |||||
ignored_config_entities: { } | |||||
_core: | |||||
default_config_hash: UVH1aJ4b44UM-VdPVN7hNNuuVqfReJxwfVeDQH1Hvsk |
@ -0,0 +1,13 @@ | |||||
langcode: en | |||||
status: true | |||||
dependencies: { } | |||||
id: default | |||||
label: Default | |||||
folder: ../config/default/default | |||||
module: { } | |||||
theme: { } | |||||
blacklist: { } | |||||
graylist: { } | |||||
graylist_dependents: true | |||||
graylist_skip_equal: true | |||||
weight: 0 |
@ -0,0 +1,13 @@ | |||||
langcode: en | |||||
status: true | |||||
dependencies: { } | |||||
id: local | |||||
label: Local | |||||
folder: ../config/default/local | |||||
module: { } | |||||
theme: { } | |||||
blacklist: { } | |||||
graylist: { } | |||||
graylist_dependents: true | |||||
graylist_skip_equal: true | |||||
weight: 1 |
@ -0,0 +1,13 @@ | |||||
langcode: en | |||||
status: true | |||||
dependencies: { } | |||||
id: production | |||||
label: Production | |||||
folder: ../config/default/production | |||||
module: { } | |||||
theme: { } | |||||
blacklist: { } | |||||
graylist: { } | |||||
graylist_dependents: true | |||||
graylist_skip_equal: true | |||||
weight: 2 |
@ -0,0 +1,40 @@ | |||||
--errors=box-model, | |||||
display-property-grouping, | |||||
duplicate-background-images, | |||||
duplicate-properties, | |||||
empty-rules, | |||||
ids, | |||||
import, | |||||
important, | |||||
known-properties, | |||||
outline-none, | |||||
overqualified-elements, | |||||
qualified-headings, | |||||
shorthand, | |||||
star-property-hack, | |||||
text-indent, | |||||
underscore-property-hack, | |||||
unique-headings, | |||||
unqualified-attributes, | |||||
vendor-prefix, | |||||
zero-units | |||||
--ignore=adjoining-classes, | |||||
box-sizing, | |||||
bulletproof-font-face, | |||||
compatible-vendor-prefixes, | |||||
errors, | |||||
fallback-colors, | |||||
floats, | |||||
font-faces, | |||||
font-sizes, | |||||
gradients, | |||||
import-ie-limit, | |||||
order-alphabetical, | |||||
regex-selectors, | |||||
rules-count, | |||||
selector-max, | |||||
selector-max-approaching, | |||||
selector-newline, | |||||
universal-selector | |||||
--exclude-list=core/assets, | |||||
vendor |
@ -0,0 +1,17 @@ | |||||
# Drupal editor configuration normalization | |||||
# @see http://editorconfig.org/ | |||||
# This is the top-most .editorconfig file; do not search in parent directories. | |||||
root = true | |||||
# All files. | |||||
[*] | |||||
end_of_line = LF | |||||
indent_style = space | |||||
indent_size = 2 | |||||
charset = utf-8 | |||||
trim_trailing_whitespace = true | |||||
insert_final_newline = true | |||||
[composer.{json,lock}] | |||||
indent_size = 4 |
@ -0,0 +1,8 @@ | |||||
core/**/* | |||||
vendor/**/* | |||||
sites/**/files/**/* | |||||
libraries/**/* | |||||
sites/**/libraries/**/* | |||||
profiles/**/libraries/**/* | |||||
**/js_test_files/**/* | |||||
**/node_modules/**/* |
@ -0,0 +1,3 @@ | |||||
{ | |||||
"extends": "./core/.eslintrc.json" | |||||
} |
@ -0,0 +1,61 @@ | |||||
# Drupal git normalization | |||||
# @see https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html | |||||
# @see https://www.drupal.org/node/1542048 | |||||
# Normally these settings would be done with macro attributes for improved | |||||
# readability and easier maintenance. However macros can only be defined at the | |||||
# repository root directory. Drupal avoids making any assumptions about where it | |||||
# is installed. | |||||
# Define text file attributes. | |||||
# - Treat them as text. | |||||
# - Ensure no CRLF line-endings, neither on checkout nor on checkin. | |||||
# - Detect whitespace errors. | |||||
# - Exposed by default in `git diff --color` on the CLI. | |||||
# - Validate with `git diff --check`. | |||||
# - Deny applying with `git apply --whitespace=error-all`. | |||||
# - Fix automatically with `git apply --whitespace=fix`. | |||||
*.config text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||||
*.css text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||||
*.dist text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||||
*.engine text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php | |||||
*.html text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=html | |||||
*.inc text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php | |||||
*.install text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php | |||||
*.js text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||||
*.json text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||||
*.lock text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||||
*.map text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||||
*.md text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||||
*.module text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php | |||||
*.php text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php | |||||
*.po text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||||
*.profile text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php | |||||
*.script text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||||
*.sh text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php | |||||
*.sql text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||||
*.svg text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||||
*.theme text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php | |||||
*.twig text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||||
*.txt text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||||
*.xml text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||||
*.yml text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 | |||||
# Define binary file attributes. | |||||
# - Do not treat them as text. | |||||
# - Include binary diff in patches instead of "binary files differ." | |||||
*.eot -text diff | |||||
*.exe -text diff | |||||
*.gif -text diff | |||||
*.gz -text diff | |||||
*.ico -text diff | |||||
*.jpeg -text diff | |||||
*.jpg -text diff | |||||
*.otf -text diff | |||||
*.phar -text diff | |||||
*.png -text diff | |||||
*.svgz -text diff | |||||
*.ttf -text diff | |||||
*.woff -text diff | |||||
*.woff2 -text diff |
@ -0,0 +1,65 @@ | |||||
<?php | |||||
/** | |||||
* @file | |||||
* Router script for the built-in PHP web server. | |||||
* | |||||
* The built-in web server should only be used for development and testing as it | |||||
* has a number of limitations that makes running Drupal on it highly insecure | |||||
* and somewhat limited. | |||||
* | |||||
* Note that: | |||||
* - The server is single-threaded, any requests made during the execution of | |||||
* the main request will hang until the main request has been completed. | |||||
* - The web server does not enforce any of the settings in .htaccess in | |||||
* particular a remote user will be able to download files that normally would | |||||
* be protected from direct access such as .module files. | |||||
* | |||||
* The router script is needed to work around a bug in PHP, see | |||||
* https://bugs.php.net/bug.php?id=61286. | |||||
* | |||||
* Usage: | |||||
* php -S localhost:8888 .ht.router.php | |||||
* | |||||
* @see http://php.net/manual/en/features.commandline.webserver.php | |||||
*/ | |||||
$url = parse_url($_SERVER['REQUEST_URI']); | |||||
if (file_exists(__DIR__ . $url['path'])) { | |||||
// Serve the requested resource as-is. | |||||
return FALSE; | |||||
} | |||||
// Work around the PHP bug. | |||||
$path = $url['path']; | |||||
$script = 'index.php'; | |||||
if (strpos($path, '.php') !== FALSE) { | |||||
// Work backwards through the path to check if a script exists. Otherwise | |||||
// fallback to index.php. | |||||
do { | |||||
$path = dirname($path); | |||||
if (preg_match('/\.php$/', $path) && is_file(__DIR__ . $path)) { | |||||
// Discovered that the path contains an existing PHP file. Use that as the | |||||
// script to include. | |||||
$script = ltrim($path, '/'); | |||||
break; | |||||
} | |||||
} while ($path !== '/' && $path !== '.'); | |||||
} | |||||
// Update $_SERVER variables to point to the correct index-file. | |||||
$index_file_absolute = $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . $script; | |||||
$index_file_relative = DIRECTORY_SEPARATOR . $script; | |||||
// SCRIPT_FILENAME will point to the router script itself, it should point to | |||||
// the full path of index.php. | |||||
$_SERVER['SCRIPT_FILENAME'] = $index_file_absolute; | |||||
// SCRIPT_NAME and PHP_SELF will either point to index.php or contain the full | |||||
// virtual path being requested depending on the URL being requested. They | |||||
// should always point to index.php relative to document root. | |||||
$_SERVER['SCRIPT_NAME'] = $index_file_relative; | |||||
$_SERVER['PHP_SELF'] = $index_file_relative; | |||||
// Require the script and let core take over. | |||||
require $_SERVER['SCRIPT_FILENAME']; |
@ -0,0 +1,189 @@ | |||||
# | |||||
# Apache/PHP/Drupal settings: | |||||
# | |||||
# Protect files and directories from prying eyes. | |||||
<FilesMatch "\.(engine|inc|install|make|module|profile|po|sh|.*sql|theme|twig|tpl(\.php)?|xtmpl|yml)(~|\.sw[op]|\.bak|\.orig|\.save)?$|^(\.(?!well-known).*|Entries.*|Repository|Root|Tag|Template|composer\.(json|lock))$|^#.*#$|\.php(~|\.sw[op]|\.bak|\.orig|\.save)$"> | |||||
<IfModule mod_authz_core.c> | |||||
Require all denied | |||||
</IfModule> | |||||
<IfModule !mod_authz_core.c> | |||||
Order allow,deny | |||||
</IfModule> | |||||
</FilesMatch> | |||||
# Don't show directory listings for URLs which map to a directory. | |||||
Options -Indexes | |||||
# Set the default handler. | |||||
DirectoryIndex index.php index.html index.htm | |||||
# Add correct encoding for SVGZ. | |||||
AddType image/svg+xml svg svgz | |||||
AddEncoding gzip svgz | |||||
# Most of the following PHP settings cannot be changed at runtime. See | |||||
# sites/default/default.settings.php and | |||||
# Drupal\Core\DrupalKernel::bootEnvironment() for settings that can be | |||||
# changed at runtime. | |||||
# PHP 5, Apache 1 and 2. | |||||
<IfModule mod_php5.c> | |||||
php_value assert.active 0 | |||||
php_flag session.auto_start off | |||||
php_value mbstring.http_input pass | |||||
php_value mbstring.http_output pass | |||||
php_flag mbstring.encoding_translation off | |||||
# PHP 5.6 has deprecated $HTTP_RAW_POST_DATA and produces warnings if this is | |||||
# not set. | |||||
php_value always_populate_raw_post_data -1 | |||||
</IfModule> | |||||
# Requires mod_expires to be enabled. | |||||
<IfModule mod_expires.c> | |||||
# Enable expirations. | |||||
ExpiresActive On | |||||
# Cache all files for 2 weeks after access (A). | |||||
ExpiresDefault A1209600 | |||||
<FilesMatch \.php$> | |||||
# Do not allow PHP scripts to be cached unless they explicitly send cache | |||||
# headers themselves. Otherwise all scripts would have to overwrite the | |||||
# headers set by mod_expires if they want another caching behavior. This may | |||||
# fail if an error occurs early in the bootstrap process, and it may cause | |||||
# problems if a non-Drupal PHP file is installed in a subdirectory. | |||||
ExpiresActive Off | |||||
</FilesMatch> | |||||
</IfModule> | |||||
# Set a fallback resource if mod_rewrite is not enabled. This allows Drupal to | |||||
# work without clean URLs. This requires Apache version >= 2.2.16. If Drupal is | |||||
# not accessed by the top level URL (i.e.: http://example.com/drupal/ instead of | |||||
# http://example.com/), the path to index.php will need to be adjusted. | |||||
<IfModule !mod_rewrite.c> | |||||
FallbackResource /index.php | |||||
</IfModule> | |||||
# Various rewrite rules. | |||||
<IfModule mod_rewrite.c> | |||||
RewriteEngine on | |||||
# Set "protossl" to "s" if we were accessed via https://. This is used later | |||||
# if you enable "www." stripping or enforcement, in order to ensure that | |||||
# you don't bounce between http and https. | |||||
RewriteRule ^ - [E=protossl] | |||||
RewriteCond %{HTTPS} on | |||||
RewriteRule ^ - [E=protossl:s] | |||||
# Make sure Authorization HTTP header is available to PHP | |||||
# even when running as CGI or FastCGI. | |||||
RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] | |||||
# Block access to "hidden" directories whose names begin with a period. This | |||||
# includes directories used by version control systems such as Subversion or | |||||
# Git to store control files. Files whose names begin with a period, as well | |||||
# as the control files used by CVS, are protected by the FilesMatch directive | |||||
# above. | |||||
# | |||||
# NOTE: This only works when mod_rewrite is loaded. Without mod_rewrite, it is | |||||
# not possible to block access to entire directories from .htaccess because | |||||
# <DirectoryMatch> is not allowed here. | |||||
# | |||||
# If you do not have mod_rewrite installed, you should remove these | |||||
# directories from your webroot or otherwise protect them from being | |||||
# downloaded. | |||||
RewriteRule "/\.|^\.(?!well-known/)" - [F] | |||||
# If your site can be accessed both with and without the 'www.' prefix, you | |||||
# can use one of the following settings to redirect users to your preferred | |||||
# URL, either WITH or WITHOUT the 'www.' prefix. Choose ONLY one option: | |||||
# | |||||
# To redirect all users to access the site WITH the 'www.' prefix, | |||||
# (http://example.com/foo will be redirected to http://www.example.com/foo) | |||||
# uncomment the following: | |||||
# RewriteCond %{HTTP_HOST} . | |||||
# RewriteCond %{HTTP_HOST} !^www\. [NC] | |||||
# RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] | |||||
# | |||||
# To redirect all users to access the site WITHOUT the 'www.' prefix, | |||||
# (http://www.example.com/foo will be redirected to http://example.com/foo) | |||||
# uncomment the following: | |||||
# RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] | |||||
# RewriteRule ^ http%{ENV:protossl}://%1%{REQUEST_URI} [L,R=301] | |||||
# Modify the RewriteBase if you are using Drupal in a subdirectory or in a | |||||
# VirtualDocumentRoot and the rewrite rules are not working properly. | |||||
# For example if your site is at http://example.com/drupal uncomment and | |||||
# modify the following line: | |||||
# RewriteBase /drupal | |||||
# | |||||
# If your site is running in a VirtualDocumentRoot at http://example.com/, | |||||
# uncomment the following line: | |||||
# RewriteBase / | |||||
# Redirect common PHP files to their new locations. | |||||
RewriteCond %{REQUEST_URI} ^(.*)?/(install.php) [OR] | |||||
RewriteCond %{REQUEST_URI} ^(.*)?/(rebuild.php) | |||||
RewriteCond %{REQUEST_URI} !core | |||||
RewriteRule ^ %1/core/%2 [L,QSA,R=301] | |||||
# Rewrite install.php during installation to see if mod_rewrite is working | |||||
RewriteRule ^core/install.php core/install.php?rewrite=ok [QSA,L] | |||||
# Pass all requests not referring directly to files in the filesystem to | |||||
# index.php. | |||||
RewriteCond %{REQUEST_FILENAME} !-f | |||||
RewriteCond %{REQUEST_FILENAME} !-d | |||||
RewriteCond %{REQUEST_URI} !=/favicon.ico | |||||
RewriteRule ^ index.php [L] | |||||
# For security reasons, deny access to other PHP files on public sites. | |||||
# Note: The following URI conditions are not anchored at the start (^), | |||||
# because Drupal may be located in a subdirectory. To further improve | |||||
# security, you can replace '!/' with '!^/'. | |||||
# Allow access to PHP files in /core (like authorize.php or install.php): | |||||
RewriteCond %{REQUEST_URI} !/core/[^/]*\.php$ | |||||
# Allow access to test-specific PHP files: | |||||
RewriteCond %{REQUEST_URI} !/core/modules/system/tests/https?.php | |||||
# Allow access to Statistics module's custom front controller. | |||||
# Copy and adapt this rule to directly execute PHP files in contributed or | |||||
# custom modules or to run another PHP application in the same directory. | |||||
RewriteCond %{REQUEST_URI} !/core/modules/statistics/statistics.php$ | |||||
# Deny access to any other PHP files that do not match the rules above. | |||||
# Specifically, disallow autoload.php from being served directly. | |||||
RewriteRule "^(.+/.*|autoload)\.php($|/)" - [F] | |||||
# Rules to correctly serve gzip compressed CSS and JS files. | |||||
# Requires both mod_rewrite and mod_headers to be enabled. | |||||
<IfModule mod_headers.c> | |||||
# Serve gzip compressed CSS files if they exist and the client accepts gzip. | |||||
RewriteCond %{HTTP:Accept-encoding} gzip | |||||
RewriteCond %{REQUEST_FILENAME}\.gz -s | |||||
RewriteRule ^(.*)\.css $1\.css\.gz [QSA] | |||||
# Serve gzip compressed JS files if they exist and the client accepts gzip. | |||||
RewriteCond %{HTTP:Accept-encoding} gzip | |||||
RewriteCond %{REQUEST_FILENAME}\.gz -s | |||||
RewriteRule ^(.*)\.js $1\.js\.gz [QSA] | |||||
# Serve correct content types, and prevent mod_deflate double gzip. | |||||
RewriteRule \.css\.gz$ - [T=text/css,E=no-gzip:1] | |||||
RewriteRule \.js\.gz$ - [T=text/javascript,E=no-gzip:1] | |||||
<FilesMatch "(\.js\.gz|\.css\.gz)$"> | |||||
# Serve correct encoding type. | |||||
Header set Content-Encoding gzip | |||||
# Force proxies to cache gzipped & non-gzipped css/js files separately. | |||||
Header append Vary Accept-Encoding | |||||
</FilesMatch> | |||||
</IfModule> | |||||
</IfModule> | |||||
# Various header fixes. | |||||
<IfModule mod_headers.c> | |||||
# Disable content sniffing, since it's an attack vector. | |||||
Header always set X-Content-Type-Options nosniff | |||||
# Disable Proxy header, since it's an attack vector. | |||||
RequestHeader unset Proxy | |||||
</IfModule> |
@ -0,0 +1,17 @@ | |||||
<?php | |||||
/** | |||||
* @file | |||||
* Includes the autoloader created by Composer. | |||||
* | |||||
* This file was generated by drupal-composer/drupal-scaffold. | |||||
* https://github.com/drupal-composer/drupal-scaffold | |||||
* | |||||
* @see composer.json | |||||
* @see index.php | |||||
* @see core/install.php | |||||
* @see core/rebuild.php | |||||
* @see core/modules/statistics/statistics.php | |||||
*/ | |||||
return require __DIR__ . '/../vendor/autoload.php'; |
@ -0,0 +1,22 @@ | |||||
<?php | |||||
/** | |||||
* @file | |||||
* The PHP page that serves all page requests on a Drupal installation. | |||||
* | |||||
* All Drupal code is released under the GNU General Public License. | |||||
* See COPYRIGHT.txt and LICENSE.txt files in the "core" directory. | |||||
*/ | |||||
use Drupal\Core\DrupalKernel; | |||||
use Symfony\Component\HttpFoundation\Request; | |||||
$autoloader = require_once 'autoload.php'; | |||||
$kernel = new DrupalKernel('prod', $autoloader); | |||||
$request = Request::createFromGlobals(); | |||||
$response = $kernel->handle($request); | |||||
$response->send(); | |||||
$kernel->terminate($request, $response); |
@ -0,0 +1,11 @@ | |||||
services: | |||||
koality_theme.koality_theme_generate: | |||||
class: Drupal\koality_theme\Command\GenerateThemeCommand | |||||
arguments: ['@console.extension_manager', '@koality_theme.koality_theme_generate_generator', '@console.validator', '@app.root', '@theme_handler', '@console.site', '@console.string_converter'] | |||||
tags: | |||||
- { name: drupal.command } | |||||
koality_theme.koality_theme_generate_generator: | |||||
class: Drupal\koality_theme\Generator\KoalityThemeGenerator | |||||
arguments: ['@console.extension_manager'] | |||||
tags: | |||||
- { name: drupal.generator } |
@ -0,0 +1,5 @@ | |||||
description: 'Drupal Console generated command.' | |||||
options: {} | |||||
arguments: {} | |||||
messages: | |||||
success: 'I am a new generated command.' |
@ -0,0 +1,7 @@ | |||||
name: 'Koality Theme' | |||||
type: module | |||||
description: 'Generate your own Koality Theme' | |||||
core: 8.x | |||||
package: 'Custom' | |||||
dependencies: | |||||
- components |
@ -0,0 +1,24 @@ | |||||
<?php | |||||
/** | |||||
* @file | |||||
* Contains koality_theme.module. | |||||
*/ | |||||
use Drupal\Core\Routing\RouteMatchInterface; | |||||
/** | |||||
* Implements hook_help(). | |||||
*/ | |||||
function koality_theme_help($route_name, RouteMatchInterface $route_match) { | |||||
switch ($route_name) { | |||||
// Main module help for the koality_theme module. | |||||
case 'help.page.koality_theme': | |||||
$output = ''; | |||||
$output .= '<h3>' . t('About') . '</h3>'; | |||||
$output .= '<p>' . t('Generate your own Koality Theme') . '</p>'; | |||||
return $output; | |||||
default: | |||||
} | |||||
} |
@ -0,0 +1,417 @@ | |||||
<?php | |||||
namespace Drupal\koality_theme\Command; | |||||
use Drupal\Console\Command\Shared\ArrayInputTrait; | |||||
use Symfony\Component\Console\Input\InputInterface; | |||||
use Symfony\Component\Console\Input\InputOption; | |||||
use Symfony\Component\Console\Output\OutputInterface; | |||||
use Drupal\Console\Command\Shared\ThemeRegionTrait; | |||||
use Drupal\Console\Command\Shared\ThemeBreakpointTrait; | |||||
use Drupal\Console\Command\Shared\ConfirmationTrait; | |||||
use Drupal\Console\Core\Command\Command; | |||||
use Drupal\Console\Extension\Manager; | |||||
use Drupal\Console\Utils\Site; | |||||
use Drupal\Console\Core\Utils\StringConverter; | |||||
use Drupal\Console\Utils\Validator; | |||||
use Drupal\Core\Extension\ThemeHandler; | |||||
use Webmozart\PathUtil\Path; | |||||
use Drupal\koality_theme\Generator\KoalityThemeGenerator; | |||||
/** | |||||
* Class GenerateThemeCommand. | |||||
* | |||||
* Drupal\Console\Annotations\DrupalCommand ( | |||||
* extension="koality_theme", | |||||
* extensionType="module" | |||||
* ) | |||||
*/ | |||||
class GenerateThemeCommand extends Command { | |||||
use ConfirmationTrait; | |||||
use ThemeRegionTrait; | |||||
use ThemeBreakpointTrait; | |||||
use ArrayInputTrait; | |||||
/** | |||||
* @var Manager | |||||
*/ | |||||
protected $extensionManager; | |||||
/** | |||||
* @var KoalityThemeGenerator | |||||
*/ | |||||
protected $generator; | |||||
/** | |||||
* @var Validator | |||||
*/ | |||||
protected $validator; | |||||
/** | |||||
* @var string | |||||
*/ | |||||
protected $appRoot; | |||||
/** | |||||
* @var ThemeHandler | |||||
*/ | |||||
protected $themeHandler; | |||||
/** | |||||
* @var Site | |||||
*/ | |||||
protected $site; | |||||
/** | |||||
* @var StringConverter | |||||
*/ | |||||
protected $stringConverter; | |||||
/** | |||||
* ThemeCommand constructor. | |||||
* | |||||
* @param Manager $extensionManager | |||||
* @param KoalityThemeGenerator $generator | |||||
* @param Validator $validator | |||||
* @param $appRoot | |||||
* @param ThemeHandler $themeHandler | |||||
* @param Site $site | |||||
* @param StringConverter $stringConverter | |||||
*/ | |||||
public function __construct( | |||||
Manager $extensionManager, | |||||
KoalityThemeGenerator $generator, | |||||
Validator $validator, | |||||
$appRoot, | |||||
ThemeHandler $themeHandler, | |||||
Site $site, | |||||
StringConverter $stringConverter | |||||
) { | |||||
$this->extensionManager = $extensionManager; | |||||
$this->generator = $generator; | |||||
$this->validator = $validator; | |||||
$this->appRoot = $appRoot; | |||||
$this->themeHandler = $themeHandler; | |||||
$this->site = $site; | |||||
$this->stringConverter = $stringConverter; | |||||
parent::__construct(); | |||||
} | |||||
/** | |||||
* {@inheritdoc} | |||||
*/ | |||||
protected function configure() { | |||||
$this | |||||
->setName('koality_theme:generate') | |||||
->setDescription($this->trans('commands.generate.theme.description')) | |||||
->setHelp($this->trans('commands.generate.theme.help')) | |||||
->addOption( | |||||
'theme', | |||||
NULL, | |||||
InputOption::VALUE_REQUIRED, | |||||
$this->trans('commands.generate.theme.options.theme') | |||||
) | |||||
->addOption( | |||||
'machine-name', | |||||
NULL, | |||||
InputOption::VALUE_REQUIRED, | |||||
$this->trans('commands.generate.theme.options.machine-name') | |||||
) | |||||
->addOption( | |||||
'theme-path', | |||||
NULL, | |||||
InputOption::VALUE_REQUIRED, | |||||
$this->trans('commands.generate.theme.options.theme-path') | |||||
) | |||||
->addOption( | |||||
'description', | |||||
NULL, | |||||
InputOption::VALUE_OPTIONAL, | |||||
$this->trans('commands.generate.theme.options.description') | |||||
) | |||||
->addOption('core', NULL, InputOption::VALUE_OPTIONAL, $this->trans('commands.generate.theme.options.core')) | |||||
->addOption( | |||||
'package', | |||||
NULL, | |||||
InputOption::VALUE_OPTIONAL, | |||||
$this->trans('commands.generate.theme.options.package') | |||||
) | |||||
->addOption( | |||||
'global-library', | |||||
NULL, | |||||
InputOption::VALUE_OPTIONAL, | |||||
$this->trans('commands.generate.theme.options.global-library') | |||||
) | |||||
->addOption( | |||||
'libraries', | |||||
NULL, | |||||
InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, | |||||
$this->trans('commands.generate.theme.options.libraries') | |||||
) | |||||
->addOption( | |||||
'base-theme', | |||||
NULL, | |||||
InputOption::VALUE_OPTIONAL, | |||||
$this->trans('commands.generate.theme.options.base-theme') | |||||
) | |||||
->addOption( | |||||
'base-theme-regions', | |||||
NULL, | |||||
InputOption::VALUE_NONE, | |||||
$this->trans('commands.generate.theme.options.base-theme-regions') | |||||
) | |||||
->addOption( | |||||
'regions', | |||||
NULL, | |||||
InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, | |||||
$this->trans('commands.generate.theme.options.regions') | |||||
) | |||||
->addOption( | |||||
'breakpoints', | |||||
NULL, | |||||
InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, | |||||
$this->trans('commands.generate.theme.options.breakpoints') | |||||
) | |||||
->setAliases(['gt']); | |||||
} | |||||
/** | |||||
* {@inheritdoc} | |||||
*/ | |||||
protected function execute(InputInterface $input, OutputInterface $output) { | |||||
// @see use Drupal\Console\Command\Shared\ConfirmationTrait::confirmOperation | |||||
if (!$this->confirmOperation()) { | |||||
return 1; | |||||
} | |||||
$theme = $this->validator->validateModuleName($input->getOption('theme')); | |||||
// Get the profile path and define a profile path if it is null | |||||
// Check that it is an absolute path or otherwise create an absolute path using appRoot | |||||
$theme_path = $input->getOption('theme-path'); | |||||
if (is_null($theme_path)) { | |||||
$uri = $this->site->getMultisiteName($input); | |||||
$defaultThemePath = 'themes/custom'; | |||||
$theme_path = $this->site->multisiteMode($uri) ? 'sites/' . $this->site->getMultisiteDir($uri) . '/' . $defaultThemePath : $defaultThemePath; | |||||
} | |||||
$theme_path = Path::isAbsolute($theme_path) ? $theme_path : Path::makeAbsolute($theme_path, $this->appRoot); | |||||
$theme_path = $this->validator->validateModulePath($theme_path, TRUE); | |||||
$machine_name = $input->getOption('machine-name') ? | |||||
$this->validator->validateMachineName($input->getOption('machine-name')) | |||||
: $this->stringConverter->createMachineName($theme); | |||||
$description = $input->getOption('description'); | |||||
$core = $input->getOption('core'); | |||||
$package = $input->getOption('package'); | |||||
$base_theme = $input->getOption('base-theme'); | |||||
$base_theme_regions = $input->getOption('base-theme-regions'); | |||||
$global_library = $input->getOption('global-library'); | |||||
$libraries = $input->getOption('libraries'); | |||||
$regions = $input->getOption('regions'); | |||||
$breakpoints = $input->getOption('breakpoints'); | |||||
$noInteraction = $input->getOption('no-interaction'); | |||||
// Parse nested data. | |||||
if ($noInteraction) { | |||||
$libraries = $this->explodeInlineArray($libraries); | |||||
$regions = $this->explodeInlineArray($regions); | |||||
$breakpoints = $this->explodeInlineArray($breakpoints); | |||||
} | |||||
$base_theme_path = $this->extensionManager->getTheme($base_theme); | |||||
$this->generator->generate([ | |||||
'theme' => $theme, | |||||
'machine_name' => $machine_name, | |||||
'dir' => $theme_path, | |||||
'core' => $core, | |||||
'description' => $description, | |||||
'package' => $package, | |||||
'base_theme' => $base_theme, | |||||
'base_theme_path' => is_null($base_theme_path) ? FALSE : $base_theme_path->getRealPath(), | |||||
'base_theme_regions' => $base_theme_regions, | |||||
'global_library' => $global_library, | |||||
'libraries' => $libraries, | |||||
'regions' => $regions, | |||||
'breakpoints' => $breakpoints, | |||||
]); | |||||
return 0; | |||||
} | |||||
/** | |||||
* {@inheritdoc} | |||||
*/ | |||||
protected function interact(InputInterface $input, OutputInterface $output) { | |||||
try { | |||||
$theme = $input->getOption('theme') ? $this->validator->validateModuleName($input->getOption('theme')) : NULL; | |||||
} catch (\Exception $error) { | |||||
$this->getIo()->error($error->getMessage()); | |||||
return 1; | |||||
} | |||||
if (!$theme) { | |||||
$theme = $this->getIo()->ask( | |||||
$this->trans('commands.generate.theme.questions.theme'), | |||||
'', | |||||
function ($theme) { | |||||
return $this->validator->validateModuleName($theme); | |||||
} | |||||
); | |||||
$input->setOption('theme', $theme); | |||||
} | |||||
try { | |||||
$machine_name = $input->getOption('machine-name') ? $this->validator->validateModuleName($input->getOption('machine-name')) : NULL; | |||||
} catch (\Exception $error) { | |||||
$this->getIo()->error($error->getMessage()); | |||||
return 1; | |||||
} | |||||
if (!$machine_name) { | |||||
$machine_name = $this->getIo()->ask( | |||||
$this->trans('commands.generate.theme.questions.machine-name'), | |||||
$this->stringConverter->createMachineName($theme), | |||||
function ($machine_name) { | |||||
return $this->validator->validateMachineName($machine_name); | |||||
} | |||||
); | |||||
$input->setOption('machine-name', $machine_name); | |||||
} | |||||
$theme_path = $input->getOption('theme-path'); | |||||
if (!$theme_path) { | |||||
$uri = $this->site->getMultisiteName($input); | |||||
$defaultThemePath = 'themes/custom'; | |||||
$theme_path = $this->getIo()->ask( | |||||
$this->trans('commands.generate.theme.questions.theme-path'), | |||||
$this->site->multisiteMode($uri) ? 'sites/' . $this->site->getMultisiteDir($uri) . '/' . $defaultThemePath : $defaultThemePath, | |||||
function ($theme_path) use ($machine_name) { | |||||
$fullPath = Path::isAbsolute($theme_path) ? $theme_path : Path::makeAbsolute($theme_path, $this->appRoot); | |||||
$fullPath = $fullPath . '/' . $machine_name; | |||||
if (file_exists($fullPath)) { | |||||
throw new \InvalidArgumentException( | |||||
sprintf( | |||||
$this->trans('commands.generate.theme.errors.directory-exists'), | |||||
$fullPath | |||||
) | |||||
); | |||||
} | |||||
else { | |||||
return $theme_path; | |||||
} | |||||
} | |||||
); | |||||
$input->setOption('theme-path', $theme_path); | |||||
} | |||||
$description = $input->getOption('description'); | |||||
if (!$description) { | |||||
$description = $this->getIo()->ask( | |||||
$this->trans('commands.generate.theme.questions.description'), | |||||
$this->trans('commands.generate.theme.suggestions.my-awesome-theme') | |||||
); | |||||
$input->setOption('description', $description); | |||||
} | |||||
$package = $input->getOption('package'); | |||||
if (!$package) { | |||||
$package = $this->getIo()->ask( | |||||
$this->trans('commands.generate.theme.questions.package'), | |||||
$this->trans('commands.generate.theme.suggestions.other') | |||||
); | |||||
$input->setOption('package', $package); | |||||
} | |||||
$core = $input->getOption('core'); | |||||
if (!$core) { | |||||
$core = $this->getIo()->ask( | |||||
$this->trans('commands.generate.theme.questions.core'), | |||||
'8.x' | |||||
); | |||||
$input->setOption('core', $core); | |||||
} | |||||
$base_theme = $input->getOption('base-theme'); | |||||
if (!$base_theme) { | |||||
$themes = $this->themeHandler->rebuildThemeData(); | |||||
$themes['false'] = ''; | |||||
uasort($themes, 'system_sort_modules_by_info_name'); | |||||
$base_theme = $this->getIo()->choiceNoList( | |||||
$this->trans('commands.generate.theme.options.base-theme'), | |||||
array_keys($themes) | |||||
); | |||||
$input->setOption('base-theme', $base_theme); | |||||
} | |||||
$global_library = $input->getOption('global-library'); | |||||
if (!$global_library) { | |||||
$global_library = $this->getIo()->ask( | |||||
$this->trans('commands.generate.theme.questions.global-library'), | |||||
'global-styling' | |||||
); | |||||
$input->setOption('global-library', $global_library); | |||||
} | |||||
// --libraries option. | |||||
$libraries = $input->getOption('libraries'); | |||||
if (!$libraries) { | |||||
if ($this->getIo()->confirm( | |||||
$this->trans('commands.generate.theme.questions.library-add'), | |||||
TRUE | |||||
) | |||||
) { | |||||
// @see \Drupal\Console\Command\Shared\ThemeRegionTrait::libraryQuestion | |||||
$libraries = $this->libraryQuestion(); | |||||
} | |||||
} | |||||
else { | |||||
$libraries = $this->explodeInlineArray($libraries); | |||||
} | |||||
$input->setOption('libraries', $libraries); | |||||
// --regions option. | |||||
$regions = $input->getOption('regions'); | |||||
if (!$regions) { | |||||
if ($this->getIo()->confirm( | |||||
$this->trans('commands.generate.theme.questions.regions'), | |||||
TRUE | |||||
) | |||||
) { | |||||
// @see \Drupal\Console\Command\Shared\ThemeRegionTrait::regionQuestion | |||||
$regions = $this->regionQuestion(); | |||||
} | |||||
} | |||||
else { | |||||
$regions = $this->explodeInlineArray($regions); | |||||
} | |||||
$input->setOption('regions', $regions); | |||||
// --breakpoints option. | |||||
$breakpoints = $input->getOption('breakpoints'); | |||||
if (!$breakpoints) { | |||||
if ($this->getIo()->confirm( | |||||
$this->trans('commands.generate.theme.questions.breakpoints'), | |||||
TRUE | |||||
) | |||||
) { | |||||
// @see \Drupal\Console\Command\Shared\ThemeRegionTrait::regionQuestion | |||||
$breakpoints = $this->breakpointQuestion(); | |||||
} | |||||
} | |||||
else { | |||||
$breakpoints = $this->explodeInlineArray($breakpoints); | |||||
} | |||||
$input->setOption('breakpoints', $breakpoints); | |||||
} | |||||
} |
@ -0,0 +1,108 @@ | |||||
<?php | |||||
namespace Drupal\koality_theme\Generator; | |||||
use Drupal\Console\Core\Generator\Generator; | |||||
use Drupal\Console\Extension\Manager; | |||||
use Drupal\Console\Generator\AuthenticationProviderGenerator; | |||||
use Drupal\Component\Serialization\Yaml; | |||||
/** | |||||
* Class KoalityThemeGenerator. | |||||
* | |||||
* @package Drupal\Console\Generator | |||||
*/ | |||||
class KoalityThemeGenerator extends Generator { | |||||
/** | |||||
* @var Manager | |||||
*/ | |||||
protected $extensionManager; | |||||
/** | |||||
* AuthenticationProviderGenerator constructor. | |||||
* | |||||
* @param Manager $extensionManager | |||||
*/ | |||||
public function __construct( | |||||
Manager $extensionManager | |||||
) { | |||||
$this->extensionManager = $extensionManager; | |||||
} | |||||
/** | |||||
* {@inheritdoc} | |||||
*/ | |||||
public function generate(array $parameters) { | |||||
$dir = $parameters['dir']; | |||||
$breakpoints = $parameters['breakpoints']; | |||||
$libraries = $parameters['libraries']; | |||||
$machine_name = $parameters['machine_name']; | |||||
$parameters['type'] = 'theme'; | |||||
$dir = ($dir == '/' ? '' : $dir) . '/' . $machine_name; | |||||
if (file_exists($dir)) { | |||||
if (!is_dir($dir)) { | |||||
throw new \RuntimeException( | |||||
sprintf( | |||||
'Unable to generate the bundle as the target directory "%s" exists but is a file.', | |||||
realpath($dir) | |||||
) | |||||
); | |||||
} | |||||
$files = scandir($dir); | |||||
if ($files != ['.', '..']) { | |||||
throw new \RuntimeException( | |||||
sprintf( | |||||
'Unable to generate the bundle as the target directory "%s" is not empty.', | |||||
realpath($dir) | |||||
) | |||||
); | |||||
} | |||||
if (!is_writable($dir)) { | |||||
throw new \RuntimeException( | |||||
sprintf( | |||||
'Unable to generate the bundle as the target directory "%s" is not writable.', | |||||
realpath($dir) | |||||
) | |||||
); | |||||
} | |||||
} | |||||
if ($parameters['base_theme_regions'] && $parameters['base_theme']) { | |||||
$defaultRegions = Yaml::decode(file_get_contents($parameters['base_theme_path'])); | |||||
$parameters['base_theme_regions'] = $defaultRegions['regions']; | |||||
$parameters['base_theme_regions_hidden'] = $defaultRegions['regions_hidden']; | |||||
} | |||||
$themePath = $dir . '/' . $machine_name; | |||||
$this->renderFile( | |||||
'theme/info.yml.twig', | |||||
$themePath . '.info.yml', | |||||
$parameters | |||||
); | |||||
$this->renderFile( | |||||
'theme/theme.twig', | |||||
$themePath . '.theme', | |||||
$parameters | |||||
); | |||||
$this->renderFile( | |||||
'theme/libraries.yml.twig', | |||||
$themePath . '.libraries.yml', | |||||
$parameters | |||||
); | |||||
if ($breakpoints) { | |||||
$this->renderFile( | |||||
'theme/breakpoints.yml.twig', | |||||
$themePath . '.breakpoints.yml', | |||||
$parameters | |||||
); | |||||
} | |||||
} | |||||
} |
@ -0,0 +1,8 @@ | |||||
{% for breakpoint in breakpoints %} | |||||
{{ machine_name }}.{{ breakpoint.breakpoint_name }}: | |||||
label: {{ breakpoint.breakpoint_label }} | |||||
mediaQuery: '{{ breakpoint.breakpoint_media_query }}' | |||||
weight: '{{ breakpoint.breakpoint_weight }}' | |||||
multipliers: | |||||
- '{{ breakpoint.breakpoint_multipliers }}' | |||||
{% endfor %} |
@ -0,0 +1,43 @@ | |||||
name: {{ theme }} | |||||
type: {{ type }} | |||||
description: '{{ description }}' | |||||
package: {{ package }} | |||||
core: {{ core }} | |||||
libraries: | |||||
- {{ machine_name }}/{{ global_library }} | |||||
{% if libraries %} | |||||
{% for library in libraries %} | |||||
- {{ machine_name }}/{{ library.library_name }} | |||||
{% endfor %} | |||||
{% endif %} | |||||
base theme: {{ base_theme }} | |||||
{% if base_theme == 'classy' %} | |||||
#Using Classy as a base theme https://www.drupal.org/theme-guide/8/classy | |||||
{% endif %} | |||||
{% if regions or base_theme_regions is iterable %} | |||||
regions: | |||||
{% if base_theme_regions is iterable %} | |||||
{% for key, default_regions in base_theme_regions %} | |||||
{{ key }}: {{ default_regions }} | |||||
{% endfor %} | |||||
{% endif %} | |||||
{% for region in regions %} | |||||
{{ region.region_machine_name }}: {{ region.region_name }} | |||||
{% endfor %} | |||||
{% endif %} | |||||
{% if base_theme_regions_hidden is defined and base_theme_regions_hidden is not null %} | |||||
regions_hidden: | |||||
{% for default_regions_hidden in base_theme_regions_hidden %} | |||||
- {{ default_regions_hidden }} | |||||
{% endfor %} | |||||
{% endif %} | |||||
#does this show up | |||||
component-libraries: | |||||
{{ machine_name }}: | |||||
paths: | |||||
- src/components | |||||
- src/layout | |||||
- src/templates |
@ -0,0 +1,16 @@ | |||||
{{ global_library }}: | |||||
version: 1.0 | |||||
css: | |||||
base: | |||||
dist/css/{{ global_library }}.css : {} | |||||
js: | |||||
#js/your_js.js : {} | |||||
{% for library in libraries %} | |||||
{{ library.library_name }}: | |||||
version: {{ library.library_version }} | |||||
css: | |||||
component: | |||||
dist/css/{{ library.library_name }}.css : {} | |||||
js: | |||||
#js/your_js.js : {} | |||||
{% endfor %} |
@ -0,0 +1,145 @@ | |||||
<?php | |||||
/** | |||||
* @file | |||||
* Functions to support theming in the {{ machine_name }} theme. | |||||
*/ | |||||
/** | |||||
* Implements hook_preprocess_HOOK() for html.html.twig. | |||||
*/ | |||||
function {{ machine_name }}_preprocess_html(array &$variables) { | |||||
/* Add class to html tag */ | |||||
//$variables['html_attributes']->addClass('no-js'); | |||||
// Don't display the site name twice on the front page (and potentially others) | |||||
/*if (isset($variables['head_title_array']['title']) && isset($variables['head_title_array']['name']) && ($variables['head_title_array']['title'] == $variables['head_title_array']['name'])) { | |||||
$variables['head_title'] = $variables['head_title_array']['name']; | |||||
}*/ | |||||
} | |||||
/** | |||||
* Implements hook_page_attachments_alter(). | |||||
*/ | |||||
function {{ machine_name }}_page_attachments_alter(array &$page) { | |||||
// Tell IE to use latest rendering engine (not to use compatibility mode). | |||||
/*$ie_edge = [ | |||||
'#type' => 'html_tag', | |||||
'#tag' => 'meta', | |||||
'#attributes' => [ | |||||
'http-equiv' => 'X-UA-Compatible', | |||||
'content' => 'IE=edge', | |||||
], | |||||
]; | |||||
$page['#attached']['html_head'][] = [$ie_edge, 'ie_edge'];*/ | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_page() for page.html.twig. | |||||
*/ | |||||
function {{ machine_name }}_preprocess_page(array &$variables) { | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_page_alter(). | |||||
*/ | |||||
function {{ machine_name }}_theme_suggestions_page_alter(array &$suggestions, array $variables) { | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_node_alter(). | |||||
*/ | |||||
function {{ machine_name }}_theme_suggestions_node_alter(array &$suggestions, array $variables) { | |||||
/*$node = $variables['elements']['#node']; | |||||
if ($variables['elements']['#view_mode'] == "full") { | |||||
}*/ | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_HOOK() for Block document templates. | |||||
*/ | |||||
function {{ machine_name }}_preprocess_block(array &$variables) { | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_field_alter(). | |||||
*/ | |||||
function {{ machine_name }}_theme_suggestions_field_alter(array &$suggestions, array $variables) { | |||||
/*$element = $variables['element']; | |||||
$suggestions[] = 'field__' . $element['#view_mode']; | |||||
$suggestions[] = 'field__' . $element['#view_mode'] . '__' . $element['#field_name'];*/ | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_field_alter(). | |||||
*/ | |||||
function {{ machine_name }}_theme_suggestions_fieldset_alter(array &$suggestions, array $variables) { | |||||
/*$element = $variables['element']; | |||||
if (isset($element['#attributes']['class']) && in_array('form-composite', $element['#attributes']['class'])) { | |||||
$suggestions[] = 'fieldset__form_composite'; | |||||
}*/ | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_node(). | |||||
*/ | |||||
function {{ machine_name }}_preprocess_node(array &$variables) { | |||||
// Default to turning off byline/submitted. | |||||
//$variables['display_submitted'] = FALSE; | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_views_view_alter(). | |||||
*/ | |||||
function {{ machine_name }}_theme_suggestions_views_view_alter(array &$suggestions, array $variables) { | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_form(). | |||||
*/ | |||||
function {{ machine_name }}_preprocess_form(array &$variables) { | |||||
//$variables['attributes']['novalidate'] = 'novalidate'; | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_select(). | |||||
*/ | |||||
function {{ machine_name }}_preprocess_select(array &$variables) { | |||||
//$variables['attributes']['class'][] = 'select-chosen'; | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_field(). | |||||
*/ | |||||
function {{ machine_name }}_preprocess_field(array &$variables, $hook) { | |||||
/*switch ($variables['element']['#field_name']) { | |||||
}*/ | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_details(). | |||||
*/ | |||||
function {{ machine_name }}_preprocess_details(array &$variables) { | |||||
/*$variables['attributes']['class'][] = 'details'; | |||||
$variables['summary_attributes']['class'] = 'summary';*/ | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_details_alter(). | |||||
*/ | |||||
function {{ machine_name }}_theme_suggestions_details_alter(array &$suggestions, array $variables) { | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_menu_local_task(). | |||||
*/ | |||||
function {{ machine_name }}_preprocess_menu_local_task(array &$variables) { | |||||
//$variables['element']['#link']['url']->setOption('attributes', ['class'=>'rounded']); | |||||
} |
@ -0,0 +1,46 @@ | |||||
<?php | |||||
namespace Drupal\Tests\koality_theme\Functional; | |||||
use Drupal\Core\Url; | |||||
use Drupal\Tests\BrowserTestBase; | |||||
/** | |||||
* Simple test to ensure that main page loads with module enabled. | |||||
* | |||||
* @group koality_theme | |||||
*/ | |||||
class LoadTest extends BrowserTestBase { | |||||
/** | |||||
* Modules to enable. | |||||
* | |||||
* @var array | |||||
*/ | |||||
public static $modules = ['koality_theme']; | |||||
/** | |||||
* A user with permission to administer site configuration. | |||||
* | |||||
* @var \Drupal\user\UserInterface | |||||
*/ | |||||
protected $user; | |||||
/** | |||||
* {@inheritdoc} | |||||
*/ | |||||
protected function setUp() { | |||||
parent::setUp(); | |||||
$this->user = $this->drupalCreateUser(['administer site configuration']); | |||||
$this->drupalLogin($this->user); | |||||
} | |||||
/** | |||||
* Tests that the home page loads with a 200 response. | |||||
*/ | |||||
public function testLoad() { | |||||
$this->drupalGet(Url::fromRoute('<front>')); | |||||
$this->assertSession()->statusCodeEquals(200); | |||||
} | |||||
} |
@ -0,0 +1,61 @@ | |||||
# | |||||
# robots.txt | |||||
# | |||||
# This file is to prevent the crawling and indexing of certain parts | |||||
# of your site by web crawlers and spiders run by sites like Yahoo! | |||||
# and Google. By telling these "robots" where not to go on your site, | |||||
# you save bandwidth and server resources. | |||||
# | |||||
# This file will be ignored unless it is at the root of your host: | |||||
# Used: http://example.com/robots.txt | |||||
# Ignored: http://example.com/site/robots.txt | |||||
# | |||||
# For more information about the robots.txt standard, see: | |||||
# http://www.robotstxt.org/robotstxt.html | |||||
User-agent: * | |||||
# CSS, JS, Images | |||||
Allow: /core/*.css$ | |||||
Allow: /core/*.css? | |||||
Allow: /core/*.js$ | |||||
Allow: /core/*.js? | |||||
Allow: /core/*.gif | |||||
Allow: /core/*.jpg | |||||
Allow: /core/*.jpeg | |||||
Allow: /core/*.png | |||||
Allow: /core/*.svg | |||||
Allow: /profiles/*.css$ | |||||
Allow: /profiles/*.css? | |||||
Allow: /profiles/*.js$ | |||||
Allow: /profiles/*.js? | |||||
Allow: /profiles/*.gif | |||||
Allow: /profiles/*.jpg | |||||
Allow: /profiles/*.jpeg | |||||
Allow: /profiles/*.png | |||||
Allow: /profiles/*.svg | |||||
# Directories | |||||
Disallow: /core/ | |||||
Disallow: /profiles/ | |||||
# Files | |||||
Disallow: /README.txt | |||||
Disallow: /web.config | |||||
# Paths (clean URLs) | |||||
Disallow: /admin/ | |||||
Disallow: /comment/reply/ | |||||
Disallow: /filter/tips | |||||
Disallow: /node/add/ | |||||
Disallow: /search/ | |||||
Disallow: /user/register/ | |||||
Disallow: /user/password/ | |||||
Disallow: /user/login/ | |||||
Disallow: /user/logout/ | |||||
# Paths (no clean URLs) | |||||
Disallow: /index.php/admin/ | |||||
Disallow: /index.php/comment/reply/ | |||||
Disallow: /index.php/filter/tips | |||||
Disallow: /index.php/node/add/ | |||||
Disallow: /index.php/search/ | |||||
Disallow: /index.php/user/password/ | |||||
Disallow: /index.php/user/register/ | |||||
Disallow: /index.php/user/login/ | |||||
Disallow: /index.php/user/logout/ |
@ -0,0 +1,174 @@ | |||||
parameters: | |||||
session.storage.options: | |||||
# Default ini options for sessions. | |||||
# | |||||
# Some distributions of Linux (most notably Debian) ship their PHP | |||||
# installations with garbage collection (gc) disabled. Since Drupal depends | |||||
# on PHP's garbage collection for clearing sessions, ensure that garbage | |||||
# collection occurs by using the most common settings. | |||||
# @default 1 | |||||
gc_probability: 1 | |||||
# @default 100 | |||||
gc_divisor: 100 | |||||
# | |||||
# Set session lifetime (in seconds), i.e. the time from the user's last | |||||
# visit to the active session may be deleted by the session garbage | |||||
# collector. When a session is deleted, authenticated users are logged out, | |||||
# and the contents of the user's $_SESSION variable is discarded. | |||||
# @default 200000 | |||||
gc_maxlifetime: 200000 | |||||
# | |||||
# Set session cookie lifetime (in seconds), i.e. the time from the session | |||||
# is created to the cookie expires, i.e. when the browser is expected to | |||||
# discard the cookie. The value 0 means "until the browser is closed". | |||||
# @default 2000000 | |||||
cookie_lifetime: 2000000 | |||||
# | |||||
# Drupal automatically generates a unique session cookie name based on the | |||||
# full domain name used to access the site. This mechanism is sufficient | |||||
# for most use-cases, including multi-site deployments. However, if it is | |||||
# desired that a session can be reused across different subdomains, the | |||||
# cookie domain needs to be set to the shared base domain. Doing so assures | |||||
# that users remain logged in as they cross between various subdomains. | |||||
# To maximize compatibility and normalize the behavior across user agents, | |||||
# the cookie domain should start with a dot. | |||||
# | |||||
# @default none | |||||
# cookie_domain: '.example.com' | |||||
# | |||||
twig.config: | |||||
# Twig debugging: | |||||
# | |||||
# When debugging is enabled: | |||||
# - The markup of each Twig template is surrounded by HTML comments that | |||||
# contain theming information, such as template file name suggestions. | |||||
# - Note that this debugging markup will cause automated tests that directly | |||||
# check rendered HTML to fail. When running automated tests, 'debug' | |||||
# should be set to FALSE. | |||||
# - The dump() function can be used in Twig templates to output information | |||||
# about template variables. | |||||
# - Twig templates are automatically recompiled whenever the source code | |||||
# changes (see auto_reload below). | |||||
# | |||||
# For more information about debugging Twig templates, see | |||||
# https://www.drupal.org/node/1906392. | |||||
# | |||||
# Not recommended in production environments | |||||
# @default false | |||||
debug: false | |||||
# Twig auto-reload: | |||||
# | |||||
# Automatically recompile Twig templates whenever the source code changes. | |||||
# If you don't provide a value for auto_reload, it will be determined | |||||
# based on the value of debug. | |||||
# | |||||
# Not recommended in production environments | |||||
# @default null | |||||
auto_reload: null | |||||
# Twig cache: | |||||
# | |||||
# By default, Twig templates will be compiled and stored in the filesystem | |||||
# to increase performance. Disabling the Twig cache will recompile the | |||||
# templates from source each time they are used. In most cases the | |||||
# auto_reload setting above should be enabled rather than disabling the | |||||
# Twig cache. | |||||
# | |||||
# Not recommended in production environments | |||||
# @default true | |||||
cache: true | |||||
renderer.config: | |||||
# Renderer required cache contexts: | |||||
# | |||||
# The Renderer will automatically associate these cache contexts with every | |||||
# render array, hence varying every render array by these cache contexts. | |||||
# | |||||
# @default ['languages:language_interface', 'theme', 'user.permissions'] | |||||
required_cache_contexts: ['languages:language_interface', 'theme', 'user.permissions'] | |||||
# Renderer automatic placeholdering conditions: | |||||
# | |||||
# Drupal allows portions of the page to be automatically deferred when | |||||
# rendering to improve cache performance. That is especially helpful for | |||||
# cache contexts that vary widely, such as the active user. On some sites | |||||
# those may be different, however, such as sites with only a handful of | |||||
# users. If you know what the high-cardinality cache contexts are for your | |||||
# site, specify those here. If you're not sure, the defaults are fairly safe | |||||
# in general. | |||||
# | |||||
# For more information about rendering optimizations see | |||||
# https://www.drupal.org/developing/api/8/render/arrays/cacheability#optimizing | |||||
auto_placeholder_conditions: | |||||
# Max-age at or below which caching is not considered worthwhile. | |||||
# | |||||
# Disable by setting to -1. | |||||
# | |||||
# @default 0 | |||||
max-age: 0 | |||||
# Cache contexts with a high cardinality. | |||||
# | |||||
# Disable by setting to []. | |||||
# | |||||
# @default ['session', 'user'] | |||||
contexts: ['session', 'user'] | |||||
# Tags with a high invalidation frequency. | |||||
# | |||||
# Disable by setting to []. | |||||
# | |||||
# @default [] | |||||
tags: [] | |||||
# Cacheability debugging: | |||||
# | |||||
# Responses with cacheability metadata (CacheableResponseInterface instances) | |||||
# get X-Drupal-Cache-Tags and X-Drupal-Cache-Contexts headers. | |||||
# | |||||
# For more information about debugging cacheable responses, see | |||||
# https://www.drupal.org/developing/api/8/response/cacheable-response-interface | |||||
# | |||||
# Not recommended in production environments | |||||
# @default false | |||||
http.response.debug_cacheability_headers: false | |||||
factory.keyvalue: | |||||
{} | |||||
# Default key/value storage service to use. | |||||
# @default keyvalue.database | |||||
# default: keyvalue.database | |||||
# Collection-specific overrides. | |||||
# state: keyvalue.database | |||||
factory.keyvalue.expirable: | |||||
{} | |||||
# Default key/value expirable storage service to use. | |||||
# @default keyvalue.database.expirable | |||||
# default: keyvalue.database.expirable | |||||
# Allowed protocols for URL generation. | |||||
filter_protocols: | |||||
- http | |||||
- https | |||||
- ftp | |||||
- news | |||||
- nntp | |||||
- tel | |||||
- telnet | |||||
- mailto | |||||
- irc | |||||
- ssh | |||||
- sftp | |||||
- webcal | |||||
- rtsp | |||||
# Configure Cross-Site HTTP requests (CORS). | |||||
# Read https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS | |||||
# for more information about the topic in general. | |||||
# Note: By default the configuration is disabled. | |||||
cors.config: | |||||
enabled: false | |||||
# Specify allowed headers, like 'x-allowed-header'. | |||||
allowedHeaders: [] | |||||
# Specify allowed request methods, specify ['*'] to allow all possible ones. | |||||
allowedMethods: [] | |||||
# Configure requests allowed from specific origins. | |||||
allowedOrigins: ['*'] | |||||
# Sets the Access-Control-Expose-Headers header. | |||||
exposedHeaders: false | |||||
# Sets the Access-Control-Max-Age header. | |||||
maxAge: false | |||||
# Sets the Access-Control-Allow-Credentials header. | |||||
supportsCredentials: false |
@ -0,0 +1,779 @@ | |||||
<?php | |||||
// @codingStandardsIgnoreFile | |||||
/** | |||||
* @file | |||||
* Drupal site-specific configuration file. | |||||
* | |||||
* IMPORTANT NOTE: | |||||
* This file may have been set to read-only by the Drupal installation program. | |||||
* If you make changes to this file, be sure to protect it again after making | |||||
* your modifications. Failure to remove write permissions to this file is a | |||||
* security risk. | |||||
* | |||||
* In order to use the selection rules below the multisite aliasing file named | |||||
* sites/sites.php must be present. Its optional settings will be loaded, and | |||||
* the aliases in the array $sites will override the default directory rules | |||||
* below. See sites/example.sites.php for more information about aliases. | |||||
* | |||||
* The configuration directory will be discovered by stripping the website's | |||||
* hostname from left to right and pathname from right to left. The first | |||||
* configuration file found will be used and any others will be ignored. If no | |||||
* other configuration file is found then the default configuration file at | |||||
* 'sites/default' will be used. | |||||
* | |||||
* For example, for a fictitious site installed at | |||||
* https://www.drupal.org:8080/mysite/test/, the 'settings.php' file is searched | |||||
* for in the following directories: | |||||
* | |||||
* - sites/8080.www.drupal.org.mysite.test | |||||
* - sites/www.drupal.org.mysite.test | |||||
* - sites/drupal.org.mysite.test | |||||
* - sites/org.mysite.test | |||||
* | |||||
* - sites/8080.www.drupal.org.mysite | |||||
* - sites/www.drupal.org.mysite | |||||
* - sites/drupal.org.mysite | |||||
* - sites/org.mysite | |||||
* | |||||
* - sites/8080.www.drupal.org | |||||
* - sites/www.drupal.org | |||||
* - sites/drupal.org | |||||
* - sites/org | |||||
* | |||||
* - sites/default | |||||
* | |||||
* Note that if you are installing on a non-standard port number, prefix the | |||||
* hostname with that number. For example, | |||||
* https://www.drupal.org:8080/mysite/test/ could be loaded from | |||||
* sites/8080.www.drupal.org.mysite.test/. | |||||
* | |||||
* @see example.sites.php | |||||
* @see \Drupal\Core\DrupalKernel::getSitePath() | |||||
* | |||||
* In addition to customizing application settings through variables in | |||||
* settings.php, you can create a services.yml file in the same directory to | |||||
* register custom, site-specific service definitions and/or swap out default | |||||
* implementations with custom ones. | |||||
*/ | |||||
/** | |||||
* Database settings: | |||||
* | |||||
* The $databases array specifies the database connection or | |||||
* connections that Drupal may use. Drupal is able to connect | |||||
* to multiple databases, including multiple types of databases, | |||||
* during the same request. | |||||
* | |||||
* One example of the simplest connection array is shown below. To use the | |||||
* sample settings, copy and uncomment the code below between the @code and | |||||
* @endcode lines and paste it after the $databases declaration. You will need | |||||
* to replace the database username and password and possibly the host and port | |||||
* with the appropriate credentials for your database system. | |||||
* | |||||
* The next section describes how to customize the $databases array for more | |||||
* specific needs. | |||||
* | |||||
* @code | |||||
* $databases['default']['default'] = [ | |||||
* 'database' => 'databasename', | |||||
* 'username' => 'sqlusername', | |||||
* 'password' => 'sqlpassword', | |||||
* 'host' => 'localhost', | |||||
* 'port' => '3306', | |||||
* 'driver' => 'mysql', | |||||
* 'prefix' => '', | |||||
* 'collation' => 'utf8mb4_general_ci', | |||||
* ]; | |||||
* @endcode | |||||
*/ | |||||
$databases = []; | |||||
/** | |||||
* Customizing database settings. | |||||
* | |||||
* Many of the values of the $databases array can be customized for your | |||||
* particular database system. Refer to the sample in the section above as a | |||||
* starting point. | |||||
* | |||||
* The "driver" property indicates what Drupal database driver the | |||||
* connection should use. This is usually the same as the name of the | |||||
* database type, such as mysql or sqlite, but not always. The other | |||||
* properties will vary depending on the driver. For SQLite, you must | |||||
* specify a database file name in a directory that is writable by the | |||||
* webserver. For most other drivers, you must specify a | |||||
* username, password, host, and database name. | |||||
* | |||||
* Transaction support is enabled by default for all drivers that support it, | |||||
* including MySQL. To explicitly disable it, set the 'transactions' key to | |||||
* FALSE. | |||||
* Note that some configurations of MySQL, such as the MyISAM engine, don't | |||||
* support it and will proceed silently even if enabled. If you experience | |||||
* transaction related crashes with such configuration, set the 'transactions' | |||||
* key to FALSE. | |||||
* | |||||
* For each database, you may optionally specify multiple "target" databases. | |||||
* A target database allows Drupal to try to send certain queries to a | |||||
* different database if it can but fall back to the default connection if not. | |||||
* That is useful for primary/replica replication, as Drupal may try to connect | |||||
* to a replica server when appropriate and if one is not available will simply | |||||
* fall back to the single primary server (The terms primary/replica are | |||||
* traditionally referred to as master/slave in database server documentation). | |||||
* | |||||
* The general format for the $databases array is as follows: | |||||
* @code | |||||
* $databases['default']['default'] = $info_array; | |||||
* $databases['default']['replica'][] = $info_array; | |||||
* $databases['default']['replica'][] = $info_array; | |||||
* $databases['extra']['default'] = $info_array; | |||||
* @endcode | |||||
* | |||||
* In the above example, $info_array is an array of settings described above. | |||||
* The first line sets a "default" database that has one primary database | |||||
* (the second level default). The second and third lines create an array | |||||
* of potential replica databases. Drupal will select one at random for a given | |||||
* request as needed. The fourth line creates a new database with a name of | |||||
* "extra". | |||||
* | |||||
* You can optionally set prefixes for some or all database table names | |||||
* by using the 'prefix' setting. If a prefix is specified, the table | |||||
* name will be prepended with its value. Be sure to use valid database | |||||
* characters only, usually alphanumeric and underscore. If no prefixes | |||||
* are desired, leave it as an empty string ''. | |||||
* | |||||
* To have all database names prefixed, set 'prefix' as a string: | |||||
* @code | |||||
* 'prefix' => 'main_', | |||||
* @endcode | |||||
* | |||||
* Per-table prefixes are deprecated as of Drupal 8.2, and will be removed in | |||||
* Drupal 9.0. After that, only a single prefix for all tables will be | |||||
* supported. | |||||
* | |||||
* To provide prefixes for specific tables, set 'prefix' as an array. | |||||
* The array's keys are the table names and the values are the prefixes. | |||||
* The 'default' element is mandatory and holds the prefix for any tables | |||||
* not specified elsewhere in the array. Example: | |||||
* @code | |||||
* 'prefix' => [ | |||||
* 'default' => 'main_', | |||||
* 'users' => 'shared_', | |||||
* 'sessions' => 'shared_', | |||||
* 'role' => 'shared_', | |||||
* 'authmap' => 'shared_', | |||||
* ], | |||||
* @endcode | |||||
* You can also use a reference to a schema/database as a prefix. This may be | |||||
* useful if your Drupal installation exists in a schema that is not the default | |||||
* or you want to access several databases from the same code base at the same | |||||
* time. | |||||
* Example: | |||||
* @code | |||||
* 'prefix' => [ | |||||
* 'default' => 'main.', | |||||
* 'users' => 'shared.', | |||||
* 'sessions' => 'shared.', | |||||
* 'role' => 'shared.', | |||||
* 'authmap' => 'shared.', | |||||
* ]; | |||||
* @endcode | |||||
* NOTE: MySQL and SQLite's definition of a schema is a database. | |||||
* | |||||
* Advanced users can add or override initial commands to execute when | |||||
* connecting to the database server, as well as PDO connection settings. For | |||||
* example, to enable MySQL SELECT queries to exceed the max_join_size system | |||||
* variable, and to reduce the database connection timeout to 5 seconds: | |||||
* @code | |||||
* $databases['default']['default'] = [ | |||||
* 'init_commands' => [ | |||||
* 'big_selects' => 'SET SQL_BIG_SELECTS=1', | |||||
* ], | |||||
* 'pdo' => [ | |||||
* PDO::ATTR_TIMEOUT => 5, | |||||
* ], | |||||
* ]; | |||||
* @endcode | |||||
* | |||||
* WARNING: The above defaults are designed for database portability. Changing | |||||
* them may cause unexpected behavior, including potential data loss. See | |||||
* https://www.drupal.org/developing/api/database/configuration for more | |||||
* information on these defaults and the potential issues. | |||||
* | |||||
* More details can be found in the constructor methods for each driver: | |||||
* - \Drupal\Core\Database\Driver\mysql\Connection::__construct() | |||||
* - \Drupal\Core\Database\Driver\pgsql\Connection::__construct() | |||||
* - \Drupal\Core\Database\Driver\sqlite\Connection::__construct() | |||||
* | |||||
* Sample Database configuration format for PostgreSQL (pgsql): | |||||
* @code | |||||
* $databases['default']['default'] = [ | |||||
* 'driver' => 'pgsql', | |||||
* 'database' => 'databasename', | |||||
* 'username' => 'sqlusername', | |||||
* 'password' => 'sqlpassword', | |||||
* 'host' => 'localhost', | |||||
* 'prefix' => '', | |||||
* ]; | |||||
* @endcode | |||||
* | |||||
* Sample Database configuration format for SQLite (sqlite): | |||||
* @code | |||||
* $databases['default']['default'] = [ | |||||
* 'driver' => 'sqlite', | |||||
* 'database' => '/path/to/databasefilename', | |||||
* ]; | |||||
* @endcode | |||||
*/ | |||||
/** | |||||
* Location of the site configuration files. | |||||
* | |||||
* The $config_directories array specifies the location of file system | |||||
* directories used for configuration data. On install, the "sync" directory is | |||||
* created. This is used for configuration imports. The "active" directory is | |||||
* not created by default since the default storage for active configuration is | |||||
* the database rather than the file system. (This can be changed. See "Active | |||||
* configuration settings" below). | |||||
* | |||||
* The default location for the "sync" directory is inside a randomly-named | |||||
* directory in the public files path. The setting below allows you to override | |||||
* the "sync" location. | |||||
* | |||||
* If you use files for the "active" configuration, you can tell the | |||||
* Configuration system where this directory is located by adding an entry with | |||||
* array key CONFIG_ACTIVE_DIRECTORY. | |||||
* | |||||
* Example: | |||||
* @code | |||||
* $config_directories = [ | |||||
* CONFIG_SYNC_DIRECTORY => '/directory/outside/webroot', | |||||
* ]; | |||||
* @endcode | |||||
*/ | |||||
$config_directories = []; | |||||
/** | |||||
* Settings: | |||||
* | |||||
* $settings contains environment-specific configuration, such as the files | |||||
* directory and reverse proxy address, and temporary configuration, such as | |||||
* security overrides. | |||||
* | |||||
* @see \Drupal\Core\Site\Settings::get() | |||||
*/ | |||||
/** | |||||
* Salt for one-time login links, cancel links, form tokens, etc. | |||||
* | |||||
* This variable will be set to a random value by the installer. All one-time | |||||
* login links will be invalidated if the value is changed. Note that if your | |||||
* site is deployed on a cluster of web servers, you must ensure that this | |||||
* variable has the same value on each server. | |||||
* | |||||
* For enhanced security, you may set this variable to the contents of a file | |||||
* outside your document root; you should also ensure that this file is not | |||||
* stored with backups of your database. | |||||
* | |||||
* Example: | |||||
* @code | |||||
* $settings['hash_salt'] = file_get_contents('/home/example/salt.txt'); | |||||
* @endcode | |||||
*/ | |||||
$settings['hash_salt'] = ''; | |||||
/** | |||||
* Deployment identifier. | |||||
* | |||||
* Drupal's dependency injection container will be automatically invalidated and | |||||
* rebuilt when the Drupal core version changes. When updating contributed or | |||||
* custom code that changes the container, changing this identifier will also | |||||
* allow the container to be invalidated as soon as code is deployed. | |||||
*/ | |||||
# $settings['deployment_identifier'] = \Drupal::VERSION; | |||||
/** | |||||
* Access control for update.php script. | |||||
* | |||||
* If you are updating your Drupal installation using the update.php script but | |||||
* are not logged in using either an account with the "Administer software | |||||
* updates" permission or the site maintenance account (the account that was | |||||
* created during installation), you will need to modify the access check | |||||
* statement below. Change the FALSE to a TRUE to disable the access check. | |||||
* After finishing the upgrade, be sure to open this file again and change the | |||||
* TRUE back to a FALSE! | |||||
*/ | |||||
$settings['update_free_access'] = FALSE; | |||||
/** | |||||
* External access proxy settings: | |||||
* | |||||
* If your site must access the Internet via a web proxy then you can enter the | |||||
* proxy settings here. Set the full URL of the proxy, including the port, in | |||||
* variables: | |||||
* - $settings['http_client_config']['proxy']['http']: The proxy URL for HTTP | |||||
* requests. | |||||
* - $settings['http_client_config']['proxy']['https']: The proxy URL for HTTPS | |||||
* requests. | |||||
* You can pass in the user name and password for basic authentication in the | |||||
* URLs in these settings. | |||||
* | |||||
* You can also define an array of host names that can be accessed directly, | |||||
* bypassing the proxy, in $settings['http_client_config']['proxy']['no']. | |||||
*/ | |||||
# $settings['http_client_config']['proxy']['http'] = 'http://proxy_user:proxy_pass@example.com:8080'; | |||||
# $settings['http_client_config']['proxy']['https'] = 'http://proxy_user:proxy_pass@example.com:8080'; | |||||
# $settings['http_client_config']['proxy']['no'] = ['127.0.0.1', 'localhost']; | |||||
/** | |||||
* Reverse Proxy Configuration: | |||||
* | |||||
* Reverse proxy servers are often used to enhance the performance | |||||
* of heavily visited sites and may also provide other site caching, | |||||
* security, or encryption benefits. In an environment where Drupal | |||||
* is behind a reverse proxy, the real IP address of the client should | |||||
* be determined such that the correct client IP address is available | |||||
* to Drupal's logging, statistics, and access management systems. In | |||||
* the most simple scenario, the proxy server will add an | |||||
* X-Forwarded-For header to the request that contains the client IP | |||||
* address. However, HTTP headers are vulnerable to spoofing, where a | |||||
* malicious client could bypass restrictions by setting the | |||||
* X-Forwarded-For header directly. Therefore, Drupal's proxy | |||||
* configuration requires the IP addresses of all remote proxies to be | |||||
* specified in $settings['reverse_proxy_addresses'] to work correctly. | |||||
* | |||||
* Enable this setting to get Drupal to determine the client IP from the | |||||
* X-Forwarded-For header. If you are unsure about this setting, do not have a | |||||
* reverse proxy, or Drupal operates in a shared hosting environment, this | |||||
* setting should remain commented out. | |||||
* | |||||
* In order for this setting to be used you must specify every possible | |||||
* reverse proxy IP address in $settings['reverse_proxy_addresses']. | |||||
* If a complete list of reverse proxies is not available in your | |||||
* environment (for example, if you use a CDN) you may set the | |||||
* $_SERVER['REMOTE_ADDR'] variable directly in settings.php. | |||||
* Be aware, however, that it is likely that this would allow IP | |||||
* address spoofing unless more advanced precautions are taken. | |||||
*/ | |||||
# $settings['reverse_proxy'] = TRUE; | |||||
/** | |||||
* Specify every reverse proxy IP address in your environment. | |||||
* This setting is required if $settings['reverse_proxy'] is TRUE. | |||||
*/ | |||||
# $settings['reverse_proxy_addresses'] = ['a.b.c.d', ...]; | |||||
/** | |||||
* Reverse proxy trusted headers. | |||||
* | |||||
* Sets which headers to trust from your reverse proxy. | |||||
* | |||||
* Common values are: | |||||
* - \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_ALL | |||||
* - \Symfony\Component\HttpFoundation\Request::HEADER_FORWARDED | |||||
* | |||||
* Note the default value of | |||||
* @code | |||||
* \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_ALL | \Symfony\Component\HttpFoundation\Request::HEADER_FORWARDED | |||||
* @endcode | |||||
* is not secure by default. The value should be set to only the specific | |||||
* headers the reverse proxy uses. For example: | |||||
* @code | |||||
* \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_ALL | |||||
* @endcode | |||||
* This would trust the following headers: | |||||
* - X_FORWARDED_FOR | |||||
* - X_FORWARDED_HOST | |||||
* - X_FORWARDED_PROTO | |||||
* - X_FORWARDED_PORT | |||||
* | |||||
* @see \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_ALL | |||||
* @see \Symfony\Component\HttpFoundation\Request::HEADER_FORWARDED | |||||
* @see \Symfony\Component\HttpFoundation\Request::setTrustedProxies | |||||
*/ | |||||
# $settings['reverse_proxy_trusted_headers'] = \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_ALL | \Symfony\Component\HttpFoundation\Request::HEADER_FORWARDED; | |||||
/** | |||||
* Page caching: | |||||
* | |||||
* By default, Drupal sends a "Vary: Cookie" HTTP header for anonymous page | |||||
* views. This tells a HTTP proxy that it may return a page from its local | |||||
* cache without contacting the web server, if the user sends the same Cookie | |||||
* header as the user who originally requested the cached page. Without "Vary: | |||||
* Cookie", authenticated users would also be served the anonymous page from | |||||
* the cache. If the site has mostly anonymous users except a few known | |||||
* editors/administrators, the Vary header can be omitted. This allows for | |||||
* better caching in HTTP proxies (including reverse proxies), i.e. even if | |||||
* clients send different cookies, they still get content served from the cache. | |||||
* However, authenticated users should access the site directly (i.e. not use an | |||||
* HTTP proxy, and bypass the reverse proxy if one is used) in order to avoid | |||||
* getting cached pages from the proxy. | |||||
*/ | |||||
# $settings['omit_vary_cookie'] = TRUE; | |||||
/** | |||||
* Cache TTL for client error (4xx) responses. | |||||
* | |||||
* Items cached per-URL tend to result in a large number of cache items, and | |||||
* this can be problematic on 404 pages which by their nature are unbounded. A | |||||
* fixed TTL can be set for these items, defaulting to one hour, so that cache | |||||
* backends which do not support LRU can purge older entries. To disable caching | |||||
* of client error responses set the value to 0. Currently applies only to | |||||
* page_cache module. | |||||
*/ | |||||
# $settings['cache_ttl_4xx'] = 3600; | |||||
/** | |||||
* Expiration of cached forms. | |||||
* | |||||
* Drupal's Form API stores details of forms in a cache and these entries are | |||||
* kept for at least 6 hours by default. Expired entries are cleared by cron. | |||||
* | |||||
* @see \Drupal\Core\Form\FormCache::setCache() | |||||
*/ | |||||
# $settings['form_cache_expiration'] = 21600; | |||||
/** | |||||
* Class Loader. | |||||
* | |||||
* If the APC extension is detected, the Symfony APC class loader is used for | |||||
* performance reasons. Detection can be prevented by setting | |||||
* class_loader_auto_detect to false, as in the example below. | |||||
*/ | |||||
# $settings['class_loader_auto_detect'] = FALSE; | |||||
/* | |||||
* If the APC extension is not detected, either because APC is missing or | |||||
* because auto-detection has been disabled, auto-loading falls back to | |||||
* Composer's ClassLoader, which is good for development as it does not break | |||||
* when code is moved in the file system. You can also decorate the base class | |||||
* loader with another cached solution than the Symfony APC class loader, as | |||||
* all production sites should have a cached class loader of some sort enabled. | |||||
* | |||||
* To do so, you may decorate and replace the local $class_loader variable. For | |||||
* example, to use Symfony's APC class loader without automatic detection, | |||||
* uncomment the code below. | |||||
*/ | |||||
/* | |||||
if ($settings['hash_salt']) { | |||||
$prefix = 'drupal.' . hash('sha256', 'drupal.' . $settings['hash_salt']); | |||||
$apc_loader = new \Symfony\Component\ClassLoader\ApcClassLoader($prefix, $class_loader); | |||||
unset($prefix); | |||||
$class_loader->unregister(); | |||||
$apc_loader->register(); | |||||
$class_loader = $apc_loader; | |||||
} | |||||
*/ | |||||
/** | |||||
* Authorized file system operations: | |||||
* | |||||
* The Update Manager module included with Drupal provides a mechanism for | |||||
* site administrators to securely install missing updates for the site | |||||
* directly through the web user interface. On securely-configured servers, | |||||
* the Update manager will require the administrator to provide SSH or FTP | |||||
* credentials before allowing the installation to proceed; this allows the | |||||
* site to update the new files as the user who owns all the Drupal files, | |||||
* instead of as the user the webserver is running as. On servers where the | |||||
* webserver user is itself the owner of the Drupal files, the administrator | |||||
* will not be prompted for SSH or FTP credentials (note that these server | |||||
* setups are common on shared hosting, but are inherently insecure). | |||||
* | |||||
* Some sites might wish to disable the above functionality, and only update | |||||
* the code directly via SSH or FTP themselves. This setting completely | |||||
* disables all functionality related to these authorized file operations. | |||||
* | |||||
* @see https://www.drupal.org/node/244924 | |||||
* | |||||
* Remove the leading hash signs to disable. | |||||
*/ | |||||
# $settings['allow_authorize_operations'] = FALSE; | |||||
/** | |||||
* Default mode for directories and files written by Drupal. | |||||
* | |||||
* Value should be in PHP Octal Notation, with leading zero. | |||||
*/ | |||||
# $settings['file_chmod_directory'] = 0775; | |||||
# $settings['file_chmod_file'] = 0664; | |||||
/** | |||||
* Public file base URL: | |||||
* | |||||
* An alternative base URL to be used for serving public files. This must | |||||
* include any leading directory path. | |||||
* | |||||
* A different value from the domain used by Drupal to be used for accessing | |||||
* public files. This can be used for a simple CDN integration, or to improve | |||||
* security by serving user-uploaded files from a different domain or subdomain | |||||
* pointing to the same server. Do not include a trailing slash. | |||||
*/ | |||||
# $settings['file_public_base_url'] = 'http://downloads.example.com/files'; | |||||
/** | |||||
* Public file path: | |||||
* | |||||
* A local file system path where public files will be stored. This directory | |||||
* must exist and be writable by Drupal. This directory must be relative to | |||||
* the Drupal installation directory and be accessible over the web. | |||||
*/ | |||||
# $settings['file_public_path'] = 'sites/default/files'; | |||||
/** | |||||
* Private file path: | |||||
* | |||||
* A local file system path where private files will be stored. This directory | |||||
* must be absolute, outside of the Drupal installation directory and not | |||||
* accessible over the web. | |||||
* | |||||
* Note: Caches need to be cleared when this value is changed to make the | |||||
* private:// stream wrapper available to the system. | |||||
* | |||||
* See https://www.drupal.org/documentation/modules/file for more information | |||||
* about securing private files. | |||||
*/ | |||||
# $settings['file_private_path'] = ''; | |||||
/** | |||||
* Session write interval: | |||||
* | |||||
* Set the minimum interval between each session write to database. | |||||
* For performance reasons it defaults to 180. | |||||
*/ | |||||
# $settings['session_write_interval'] = 180; | |||||
/** | |||||
* String overrides: | |||||
* | |||||
* To override specific strings on your site with or without enabling the Locale | |||||
* module, add an entry to this list. This functionality allows you to change | |||||
* a small number of your site's default English language interface strings. | |||||
* | |||||
* Remove the leading hash signs to enable. | |||||
* | |||||
* The "en" part of the variable name, is dynamic and can be any langcode of | |||||
* any added language. (eg locale_custom_strings_de for german). | |||||
*/ | |||||
# $settings['locale_custom_strings_en'][''] = [ | |||||
# 'forum' => 'Discussion board', | |||||
# '@count min' => '@count minutes', | |||||
# ]; | |||||
/** | |||||
* A custom theme for the offline page: | |||||
* | |||||
* This applies when the site is explicitly set to maintenance mode through the | |||||
* administration page or when the database is inactive due to an error. | |||||
* The template file should also be copied into the theme. It is located inside | |||||
* 'core/modules/system/templates/maintenance-page.html.twig'. | |||||
* | |||||
* Note: This setting does not apply to installation and update pages. | |||||
*/ | |||||
# $settings['maintenance_theme'] = 'bartik'; | |||||
/** | |||||
* PHP settings: | |||||
* | |||||
* To see what PHP settings are possible, including whether they can be set at | |||||
* runtime (by using ini_set()), read the PHP documentation: | |||||
* http://php.net/manual/ini.list.php | |||||
* See \Drupal\Core\DrupalKernel::bootEnvironment() for required runtime | |||||
* settings and the .htaccess file for non-runtime settings. | |||||
* Settings defined there should not be duplicated here so as to avoid conflict | |||||
* issues. | |||||
*/ | |||||
/** | |||||
* If you encounter a situation where users post a large amount of text, and | |||||
* the result is stripped out upon viewing but can still be edited, Drupal's | |||||
* output filter may not have sufficient memory to process it. If you | |||||
* experience this issue, you may wish to uncomment the following two lines | |||||
* and increase the limits of these variables. For more information, see | |||||
* http://php.net/manual/pcre.configuration.php. | |||||
*/ | |||||
# ini_set('pcre.backtrack_limit', 200000); | |||||
# ini_set('pcre.recursion_limit', 200000); | |||||
/** | |||||
* Active configuration settings. | |||||
* | |||||
* By default, the active configuration is stored in the database in the | |||||
* {config} table. To use a different storage mechanism for the active | |||||
* configuration, do the following prior to installing: | |||||
* - Create an "active" directory and declare its path in $config_directories | |||||
* as explained under the 'Location of the site configuration files' section | |||||
* above in this file. To enhance security, you can declare a path that is | |||||
* outside your document root. | |||||
* - Override the 'bootstrap_config_storage' setting here. It must be set to a | |||||
* callable that returns an object that implements | |||||
* \Drupal\Core\Config\StorageInterface. | |||||
* - Override the service definition 'config.storage.active'. Put this | |||||
* override in a services.yml file in the same directory as settings.php | |||||
* (definitions in this file will override service definition defaults). | |||||
*/ | |||||
# $settings['bootstrap_config_storage'] = ['Drupal\Core\Config\BootstrapConfigStorageFactory', 'getFileStorage']; | |||||
/** | |||||
* Configuration overrides. | |||||
* | |||||
* To globally override specific configuration values for this site, | |||||
* set them here. You usually don't need to use this feature. This is | |||||
* useful in a configuration file for a vhost or directory, rather than | |||||
* the default settings.php. | |||||
* | |||||
* Note that any values you provide in these variable overrides will not be | |||||
* viewable from the Drupal administration interface. The administration | |||||
* interface displays the values stored in configuration so that you can stage | |||||
* changes to other environments that don't have the overrides. | |||||
* | |||||
* There are particular configuration values that are risky to override. For | |||||
* example, overriding the list of installed modules in 'core.extension' is not | |||||
* supported as module install or uninstall has not occurred. Other examples | |||||
* include field storage configuration, because it has effects on database | |||||
* structure, and 'core.menu.static_menu_link_overrides' since this is cached in | |||||
* a way that is not config override aware. Also, note that changing | |||||
* configuration values in settings.php will not fire any of the configuration | |||||
* change events. | |||||
*/ | |||||
# $config['system.file']['path']['temporary'] = '/tmp'; | |||||
# $config['system.site']['name'] = 'My Drupal site'; | |||||
# $config['system.theme']['default'] = 'stark'; | |||||
# $config['user.settings']['anonymous'] = 'Visitor'; | |||||
/** | |||||
* Fast 404 pages: | |||||
* | |||||
* Drupal can generate fully themed 404 pages. However, some of these responses | |||||
* are for images or other resource files that are not displayed to the user. | |||||
* This can waste bandwidth, and also generate server load. | |||||
* | |||||
* The options below return a simple, fast 404 page for URLs matching a | |||||
* specific pattern: | |||||
* - $config['system.performance']['fast_404']['exclude_paths']: A regular | |||||
* expression to match paths to exclude, such as images generated by image | |||||
* styles, or dynamically-resized images. The default pattern provided below | |||||
* also excludes the private file system. If you need to add more paths, you | |||||
* can add '|path' to the expression. | |||||
* - $config['system.performance']['fast_404']['paths']: A regular expression to | |||||
* match paths that should return a simple 404 page, rather than the fully | |||||
* themed 404 page. If you don't have any aliases ending in htm or html you | |||||
* can add '|s?html?' to the expression. | |||||
* - $config['system.performance']['fast_404']['html']: The html to return for | |||||
* simple 404 pages. | |||||
* | |||||
* Remove the leading hash signs if you would like to alter this functionality. | |||||
*/ | |||||
# $config['system.performance']['fast_404']['exclude_paths'] = '/\/(?:styles)|(?:system\/files)\//'; | |||||
# $config['system.performance']['fast_404']['paths'] = '/\.(?:txt|png|gif|jpe?g|css|js|ico|swf|flv|cgi|bat|pl|dll|exe|asp)$/i'; | |||||
# $config['system.performance']['fast_404']['html'] = '<!DOCTYPE html><html><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL "@path" was not found on this server.</p></body></html>'; | |||||
/** | |||||
* Load services definition file. | |||||
*/ | |||||
$settings['container_yamls'][] = $app_root . '/' . $site_path . '/services.yml'; | |||||
/** | |||||
* Override the default service container class. | |||||
* | |||||
* This is useful for example to trace the service container for performance | |||||
* tracking purposes, for testing a service container with an error condition or | |||||
* to test a service container that throws an exception. | |||||
*/ | |||||
# $settings['container_base_class'] = '\Drupal\Core\DependencyInjection\Container'; | |||||
/** | |||||
* Override the default yaml parser class. | |||||
* | |||||
* Provide a fully qualified class name here if you would like to provide an | |||||
* alternate implementation YAML parser. The class must implement the | |||||
* \Drupal\Component\Serialization\SerializationInterface interface. | |||||
*/ | |||||
# $settings['yaml_parser_class'] = NULL; | |||||
/** | |||||
* Trusted host configuration. | |||||
* | |||||
* Drupal core can use the Symfony trusted host mechanism to prevent HTTP Host | |||||
* header spoofing. | |||||
* | |||||
* To enable the trusted host mechanism, you enable your allowable hosts | |||||
* in $settings['trusted_host_patterns']. This should be an array of regular | |||||
* expression patterns, without delimiters, representing the hosts you would | |||||
* like to allow. | |||||
* | |||||
* For example: | |||||
* @code | |||||
* $settings['trusted_host_patterns'] = [ | |||||
* '^www\.example\.com$', | |||||
* ]; | |||||
* @endcode | |||||
* will allow the site to only run from www.example.com. | |||||
* | |||||
* If you are running multisite, or if you are running your site from | |||||
* different domain names (eg, you don't redirect http://www.example.com to | |||||
* http://example.com), you should specify all of the host patterns that are | |||||
* allowed by your site. | |||||
* | |||||
* For example: | |||||
* @code | |||||
* $settings['trusted_host_patterns'] = [ | |||||
* '^example\.com$', | |||||
* '^.+\.example\.com$', | |||||
* '^example\.org$', | |||||
* '^.+\.example\.org$', | |||||
* ]; | |||||
* @endcode | |||||
* will allow the site to run off of all variants of example.com and | |||||
* example.org, with all subdomains included. | |||||
*/ | |||||
/** | |||||
* The default list of directories that will be ignored by Drupal's file API. | |||||
* | |||||
* By default ignore node_modules and bower_components folders to avoid issues | |||||
* with common frontend tools and recursive scanning of directories looking for | |||||
* extensions. | |||||
* | |||||
* @see file_scan_directory() | |||||
* @see \Drupal\Core\Extension\ExtensionDiscovery::scanDirectory() | |||||
*/ | |||||
$settings['file_scan_ignore_directories'] = [ | |||||
'node_modules', | |||||
'bower_components', | |||||
]; | |||||
/** | |||||
* The default number of entities to update in a batch process. | |||||
* | |||||
* This is used by update and post-update functions that need to go through and | |||||
* change all the entities on a site, so it is useful to increase this number | |||||
* if your hosting configuration (i.e. RAM allocation, CPU speed) allows for a | |||||
* larger number of entities to be processed in a single batch run. | |||||
*/ | |||||
$settings['entity_update_batch_size'] = 50; | |||||
/** | |||||
* Entity update backup. | |||||
* | |||||
* This is used to inform the entity storage handler that the backup tables as | |||||
* well as the original entity type and field storage definitions should be | |||||
* retained after a successful entity update process. | |||||
*/ | |||||
$settings['entity_update_backup'] = TRUE; | |||||
/** | |||||
* Load local development override configuration, if available. | |||||
* | |||||
* Use settings.local.php to override variables on secondary (staging, | |||||
* development, etc) installations of this site. Typically used to disable | |||||
* caching, JavaScript/CSS compression, re-routing of outgoing emails, and | |||||
* other things that should not happen on development and testing sites. | |||||
* | |||||
* Keep this code block at the end of this file to take full effect. | |||||
*/ | |||||
# | |||||
# if (file_exists($app_root . '/' . $site_path . '/settings.local.php')) { | |||||
# include $app_root . '/' . $site_path . '/settings.local.php'; | |||||
# } |
@ -0,0 +1,9 @@ | |||||
# Local development services. | |||||
# | |||||
# To activate this feature, follow the instructions at the top of the | |||||
# 'example.settings.local.php' file, which sits next to this file. | |||||
parameters: | |||||
http.response.debug_cacheability_headers: true | |||||
services: | |||||
cache.backend.null: | |||||
class: Drupal\Core\Cache\NullBackendFactory |
@ -0,0 +1,131 @@ | |||||
<?php | |||||
// @codingStandardsIgnoreFile | |||||
/** | |||||
* @file | |||||
* Local development override configuration feature. | |||||
* | |||||
* To activate this feature, copy and rename it such that its path plus | |||||
* filename is 'sites/default/settings.local.php'. Then, go to the bottom of | |||||
* 'sites/default/settings.php' and uncomment the commented lines that mention | |||||
* 'settings.local.php'. | |||||
* | |||||
* If you are using a site name in the path, such as 'sites/example.com', copy | |||||
* this file to 'sites/example.com/settings.local.php', and uncomment the lines | |||||
* at the bottom of 'sites/example.com/settings.php'. | |||||
*/ | |||||
/** | |||||
* Assertions. | |||||
* | |||||
* The Drupal project primarily uses runtime assertions to enforce the | |||||
* expectations of the API by failing when incorrect calls are made by code | |||||
* under development. | |||||
* | |||||
* @see http://php.net/assert | |||||
* @see https://www.drupal.org/node/2492225 | |||||
* | |||||
* If you are using PHP 7.0 it is strongly recommended that you set | |||||
* zend.assertions=1 in the PHP.ini file (It cannot be changed from .htaccess | |||||
* or runtime) on development machines and to 0 in production. | |||||
* | |||||
* @see https://wiki.php.net/rfc/expectations | |||||
*/ | |||||
assert_options(ASSERT_ACTIVE, TRUE); | |||||
\Drupal\Component\Assertion\Handle::register(); | |||||
/** | |||||
* Enable local development services. | |||||
*/ | |||||
$settings['container_yamls'][] = DRUPAL_ROOT . '/sites/development.services.yml'; | |||||
/** | |||||
* Show all error messages, with backtrace information. | |||||
* | |||||
* In case the error level could not be fetched from the database, as for | |||||
* example the database connection failed, we rely only on this value. | |||||
*/ | |||||
$config['system.logging']['error_level'] = 'verbose'; | |||||
/** | |||||
* Disable CSS and JS aggregation. | |||||
*/ | |||||
$config['system.performance']['css']['preprocess'] = FALSE; | |||||
$config['system.performance']['js']['preprocess'] = FALSE; | |||||
/** | |||||
* Disable the render cache. | |||||
* | |||||
* Note: you should test with the render cache enabled, to ensure the correct | |||||
* cacheability metadata is present. However, in the early stages of | |||||
* development, you may want to disable it. | |||||
* | |||||
* This setting disables the render cache by using the Null cache back-end | |||||
* defined by the development.services.yml file above. | |||||
* | |||||
* Only use this setting once the site has been installed. | |||||
*/ | |||||
# $settings['cache']['bins']['render'] = 'cache.backend.null'; | |||||
/** | |||||
* Disable caching for migrations. | |||||
* | |||||
* Uncomment the code below to only store migrations in memory and not in the | |||||
* database. This makes it easier to develop custom migrations. | |||||
*/ | |||||
# $settings['cache']['bins']['discovery_migration'] = 'cache.backend.memory'; | |||||
/** | |||||
* Disable Internal Page Cache. | |||||
* | |||||
* Note: you should test with Internal Page Cache enabled, to ensure the correct | |||||
* cacheability metadata is present. However, in the early stages of | |||||
* development, you may want to disable it. | |||||
* | |||||
* This setting disables the page cache by using the Null cache back-end | |||||
* defined by the development.services.yml file above. | |||||
* | |||||
* Only use this setting once the site has been installed. | |||||
*/ | |||||
# $settings['cache']['bins']['page'] = 'cache.backend.null'; | |||||
/** | |||||
* Disable Dynamic Page Cache. | |||||
* | |||||
* Note: you should test with Dynamic Page Cache enabled, to ensure the correct | |||||
* cacheability metadata is present (and hence the expected behavior). However, | |||||
* in the early stages of development, you may want to disable it. | |||||
*/ | |||||
# $settings['cache']['bins']['dynamic_page_cache'] = 'cache.backend.null'; | |||||
/** | |||||
* Allow test modules and themes to be installed. | |||||
* | |||||
* Drupal ignores test modules and themes by default for performance reasons. | |||||
* During development it can be useful to install test extensions for debugging | |||||
* purposes. | |||||
*/ | |||||
# $settings['extension_discovery_scan_tests'] = TRUE; | |||||
/** | |||||
* Enable access to rebuild.php. | |||||
* | |||||
* This setting can be enabled to allow Drupal's php and database cached | |||||
* storage to be cleared via the rebuild.php page. Access to this page can also | |||||
* be gained by generating a query string from rebuild_token_calculator.sh and | |||||
* using these parameters in a request to rebuild.php. | |||||
*/ | |||||
$settings['rebuild_access'] = TRUE; | |||||
/** | |||||
* Skip file system permissions hardening. | |||||
* | |||||
* The system module will periodically check the permissions of your site's | |||||
* site directory to ensure that it is not writable by the website user. For | |||||
* sites that are managed with a version control system, this can cause problems | |||||
* when files in that directory such as settings.php are updated, because the | |||||
* user pulling in the changes won't have permissions to modify files in the | |||||
* directory. | |||||
*/ | |||||
$settings['skip_permissions_hardening'] = TRUE; |
@ -0,0 +1,57 @@ | |||||
<?php | |||||
// @codingStandardsIgnoreFile | |||||
/** | |||||
* @file | |||||
* Configuration file for multi-site support and directory aliasing feature. | |||||
* | |||||
* This file is required for multi-site support and also allows you to define a | |||||
* set of aliases that map hostnames, ports, and pathnames to configuration | |||||
* directories in the sites directory. These aliases are loaded prior to | |||||
* scanning for directories, and they are exempt from the normal discovery | |||||
* rules. See default.settings.php to view how Drupal discovers the | |||||
* configuration directory when no alias is found. | |||||
* | |||||
* Aliases are useful on development servers, where the domain name may not be | |||||
* the same as the domain of the live server. Since Drupal stores file paths in | |||||
* the database (files, system table, etc.) this will ensure the paths are | |||||
* correct when the site is deployed to a live server. | |||||
* | |||||
* To activate this feature, copy and rename it such that its path plus | |||||
* filename is 'sites/sites.php'. | |||||
* | |||||
* Aliases are defined in an associative array named $sites. The array is | |||||
* written in the format: '<port>.<domain>.<path>' => 'directory'. As an | |||||
* example, to map https://www.drupal.org:8080/mysite/test to the configuration | |||||
* directory sites/example.com, the array should be defined as: | |||||
* @code | |||||
* $sites = [ | |||||
* '8080.www.drupal.org.mysite.test' => 'example.com', | |||||
* ]; | |||||
* @endcode | |||||
* The URL, https://www.drupal.org:8080/mysite/test/, could be a symbolic link | |||||
* or an Apache Alias directive that points to the Drupal root containing | |||||
* index.php. An alias could also be created for a subdomain. See the | |||||
* @link https://www.drupal.org/documentation/install online Drupal installation guide @endlink | |||||
* for more information on setting up domains, subdomains, and subdirectories. | |||||
* | |||||
* The following examples look for a site configuration in sites/example.com: | |||||
* @code | |||||
* URL: http://dev.drupal.org | |||||
* $sites['dev.drupal.org'] = 'example.com'; | |||||
* | |||||
* URL: http://localhost/example | |||||
* $sites['localhost.example'] = 'example.com'; | |||||
* | |||||
* URL: http://localhost:8080/example | |||||
* $sites['8080.localhost.example'] = 'example.com'; | |||||
* | |||||
* URL: https://www.drupal.org:8080/mysite/test/ | |||||
* $sites['8080.www.drupal.org.mysite.test'] = 'example.com'; | |||||
* @endcode | |||||
* | |||||
* @see default.settings.php | |||||
* @see \Drupal\Core\DrupalKernel::getSitePath() | |||||
* @see https://www.drupal.org/documentation/install/multi-site | |||||
*/ |
@ -0,0 +1,13 @@ | |||||
name: My Cool Test Theme | |||||
type: theme | |||||
description: 'Its a theme' | |||||
package: Other | |||||
core: 8.x | |||||
libraries: | |||||
- my_cool_test_theme/global-styling | |||||
base theme: classy | |||||
#Using Classy as a base theme https://www.drupal.org/theme-guide/8/classy | |||||
regions: | |||||
header: Header |
@ -0,0 +1,145 @@ | |||||
<?php | |||||
/** | |||||
* @file | |||||
* Functions to support theming in the my_cool_test_theme theme. | |||||
*/ | |||||
/** | |||||
* Implements hook_preprocess_HOOK() for html.html.twig. | |||||
*/ | |||||
function my_cool_test_theme_preprocess_html(array &$variables) { | |||||
/* Add class to html tag */ | |||||
//$variables['html_attributes']->addClass('no-js'); | |||||
// Don't display the site name twice on the front page (and potentially others) | |||||
/*if (isset($variables['head_title_array']['title']) && isset($variables['head_title_array']['name']) && ($variables['head_title_array']['title'] == $variables['head_title_array']['name'])) { | |||||
$variables['head_title'] = $variables['head_title_array']['name']; | |||||
}*/ | |||||
} | |||||
/** | |||||
* Implements hook_page_attachments_alter(). | |||||
*/ | |||||
function my_cool_test_theme_page_attachments_alter(array &$page) { | |||||
// Tell IE to use latest rendering engine (not to use compatibility mode). | |||||
/*$ie_edge = [ | |||||
'#type' => 'html_tag', | |||||
'#tag' => 'meta', | |||||
'#attributes' => [ | |||||
'http-equiv' => 'X-UA-Compatible', | |||||
'content' => 'IE=edge', | |||||
], | |||||
]; | |||||
$page['#attached']['html_head'][] = [$ie_edge, 'ie_edge'];*/ | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_page() for page.html.twig. | |||||
*/ | |||||
function my_cool_test_theme_preprocess_page(array &$variables) { | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_page_alter(). | |||||
*/ | |||||
function my_cool_test_theme_theme_suggestions_page_alter(array &$suggestions, array $variables) { | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_node_alter(). | |||||
*/ | |||||
function my_cool_test_theme_theme_suggestions_node_alter(array &$suggestions, array $variables) { | |||||
/*$node = $variables['elements']['#node']; | |||||
if ($variables['elements']['#view_mode'] == "full") { | |||||
}*/ | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_HOOK() for Block document templates. | |||||
*/ | |||||
function my_cool_test_theme_preprocess_block(array &$variables) { | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_field_alter(). | |||||
*/ | |||||
function my_cool_test_theme_theme_suggestions_field_alter(array &$suggestions, array $variables) { | |||||
/*$element = $variables['element']; | |||||
$suggestions[] = 'field__' . $element['#view_mode']; | |||||
$suggestions[] = 'field__' . $element['#view_mode'] . '__' . $element['#field_name'];*/ | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_field_alter(). | |||||
*/ | |||||
function my_cool_test_theme_theme_suggestions_fieldset_alter(array &$suggestions, array $variables) { | |||||
/*$element = $variables['element']; | |||||
if (isset($element['#attributes']['class']) && in_array('form-composite', $element['#attributes']['class'])) { | |||||
$suggestions[] = 'fieldset__form_composite'; | |||||
}*/ | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_node(). | |||||
*/ | |||||
function my_cool_test_theme_preprocess_node(array &$variables) { | |||||
// Default to turning off byline/submitted. | |||||
//$variables['display_submitted'] = FALSE; | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_views_view_alter(). | |||||
*/ | |||||
function my_cool_test_theme_theme_suggestions_views_view_alter(array &$suggestions, array $variables) { | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_form(). | |||||
*/ | |||||
function my_cool_test_theme_preprocess_form(array &$variables) { | |||||
//$variables['attributes']['novalidate'] = 'novalidate'; | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_select(). | |||||
*/ | |||||
function my_cool_test_theme_preprocess_select(array &$variables) { | |||||
//$variables['attributes']['class'][] = 'select-chosen'; | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_field(). | |||||
*/ | |||||
function my_cool_test_theme_preprocess_field(array &$variables, $hook) { | |||||
/*switch ($variables['element']['#field_name']) { | |||||
}*/ | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_details(). | |||||
*/ | |||||
function my_cool_test_theme_preprocess_details(array &$variables) { | |||||
/*$variables['attributes']['class'][] = 'details'; | |||||
$variables['summary_attributes']['class'] = 'summary';*/ | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_details_alter(). | |||||
*/ | |||||
function my_cool_test_theme_theme_suggestions_details_alter(array &$suggestions, array $variables) { | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_menu_local_task(). | |||||
*/ | |||||
function my_cool_test_theme_preprocess_menu_local_task(array &$variables) { | |||||
//$variables['element']['#link']['url']->setOption('attributes', ['class'=>'rounded']); | |||||
} |
@ -0,0 +1,9 @@ | |||||
name: test1 | |||||
type: theme | |||||
description: 'My Awesome theme' | |||||
package: Other | |||||
core: 8.x | |||||
libraries: | |||||
- test1/global-styling | |||||
base theme: stable |
@ -0,0 +1,145 @@ | |||||
<?php | |||||
/** | |||||
* @file | |||||
* Functions to support theming in the test1 theme. | |||||
*/ | |||||
/** | |||||
* Implements hook_preprocess_HOOK() for html.html.twig. | |||||
*/ | |||||
function test1_preprocess_html(array &$variables) { | |||||
/* Add class to html tag */ | |||||
//$variables['html_attributes']->addClass('no-js'); | |||||
// Don't display the site name twice on the front page (and potentially others) | |||||
/*if (isset($variables['head_title_array']['title']) && isset($variables['head_title_array']['name']) && ($variables['head_title_array']['title'] == $variables['head_title_array']['name'])) { | |||||
$variables['head_title'] = $variables['head_title_array']['name']; | |||||
}*/ | |||||
} | |||||
/** | |||||
* Implements hook_page_attachments_alter(). | |||||
*/ | |||||
function test1_page_attachments_alter(array &$page) { | |||||
// Tell IE to use latest rendering engine (not to use compatibility mode). | |||||
/*$ie_edge = [ | |||||
'#type' => 'html_tag', | |||||
'#tag' => 'meta', | |||||
'#attributes' => [ | |||||
'http-equiv' => 'X-UA-Compatible', | |||||
'content' => 'IE=edge', | |||||
], | |||||
]; | |||||
$page['#attached']['html_head'][] = [$ie_edge, 'ie_edge'];*/ | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_page() for page.html.twig. | |||||
*/ | |||||
function test1_preprocess_page(array &$variables) { | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_page_alter(). | |||||
*/ | |||||
function test1_theme_suggestions_page_alter(array &$suggestions, array $variables) { | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_node_alter(). | |||||
*/ | |||||
function test1_theme_suggestions_node_alter(array &$suggestions, array $variables) { | |||||
/*$node = $variables['elements']['#node']; | |||||
if ($variables['elements']['#view_mode'] == "full") { | |||||
}*/ | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_HOOK() for Block document templates. | |||||
*/ | |||||
function test1_preprocess_block(array &$variables) { | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_field_alter(). | |||||
*/ | |||||
function test1_theme_suggestions_field_alter(array &$suggestions, array $variables) { | |||||
/*$element = $variables['element']; | |||||
$suggestions[] = 'field__' . $element['#view_mode']; | |||||
$suggestions[] = 'field__' . $element['#view_mode'] . '__' . $element['#field_name'];*/ | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_field_alter(). | |||||
*/ | |||||
function test1_theme_suggestions_fieldset_alter(array &$suggestions, array $variables) { | |||||
/*$element = $variables['element']; | |||||
if (isset($element['#attributes']['class']) && in_array('form-composite', $element['#attributes']['class'])) { | |||||
$suggestions[] = 'fieldset__form_composite'; | |||||
}*/ | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_node(). | |||||
*/ | |||||
function test1_preprocess_node(array &$variables) { | |||||
// Default to turning off byline/submitted. | |||||
//$variables['display_submitted'] = FALSE; | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_views_view_alter(). | |||||
*/ | |||||
function test1_theme_suggestions_views_view_alter(array &$suggestions, array $variables) { | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_form(). | |||||
*/ | |||||
function test1_preprocess_form(array &$variables) { | |||||
//$variables['attributes']['novalidate'] = 'novalidate'; | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_select(). | |||||
*/ | |||||
function test1_preprocess_select(array &$variables) { | |||||
//$variables['attributes']['class'][] = 'select-chosen'; | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_field(). | |||||
*/ | |||||
function test1_preprocess_field(array &$variables, $hook) { | |||||
/*switch ($variables['element']['#field_name']) { | |||||
}*/ | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_details(). | |||||
*/ | |||||
function test1_preprocess_details(array &$variables) { | |||||
/*$variables['attributes']['class'][] = 'details'; | |||||
$variables['summary_attributes']['class'] = 'summary';*/ | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_details_alter(). | |||||
*/ | |||||
function test1_theme_suggestions_details_alter(array &$suggestions, array $variables) { | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_menu_local_task(). | |||||
*/ | |||||
function test1_preprocess_menu_local_task(array &$variables) { | |||||
//$variables['element']['#link']['url']->setOption('attributes', ['class'=>'rounded']); | |||||
} |
@ -0,0 +1,10 @@ | |||||
name: test2 | |||||
type: theme | |||||
description: 'My Awesome theme' | |||||
package: Other | |||||
core: 8.x | |||||
libraries: | |||||
- test2/global | |||||
base theme: classy | |||||
#Using Classy as a base theme https://www.drupal.org/theme-guide/8/classy |
@ -0,0 +1,7 @@ | |||||
global: | |||||
version: 1.0 | |||||
css: | |||||
theme: | |||||
#css/your_style_sheet.css : {} | |||||
js: | |||||
#js/your_js.js : {} |
@ -0,0 +1,145 @@ | |||||
<?php | |||||
/** | |||||
* @file | |||||
* Functions to support theming in the test2 theme. | |||||
*/ | |||||
/** | |||||
* Implements hook_preprocess_HOOK() for html.html.twig. | |||||
*/ | |||||
function test2_preprocess_html(array &$variables) { | |||||
/* Add class to html tag */ | |||||
//$variables['html_attributes']->addClass('no-js'); | |||||
// Don't display the site name twice on the front page (and potentially others) | |||||
/*if (isset($variables['head_title_array']['title']) && isset($variables['head_title_array']['name']) && ($variables['head_title_array']['title'] == $variables['head_title_array']['name'])) { | |||||
$variables['head_title'] = $variables['head_title_array']['name']; | |||||
}*/ | |||||
} | |||||
/** | |||||
* Implements hook_page_attachments_alter(). | |||||
*/ | |||||
function test2_page_attachments_alter(array &$page) { | |||||
// Tell IE to use latest rendering engine (not to use compatibility mode). | |||||
/*$ie_edge = [ | |||||
'#type' => 'html_tag', | |||||
'#tag' => 'meta', | |||||
'#attributes' => [ | |||||
'http-equiv' => 'X-UA-Compatible', | |||||
'content' => 'IE=edge', | |||||
], | |||||
]; | |||||
$page['#attached']['html_head'][] = [$ie_edge, 'ie_edge'];*/ | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_page() for page.html.twig. | |||||
*/ | |||||
function test2_preprocess_page(array &$variables) { | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_page_alter(). | |||||
*/ | |||||
function test2_theme_suggestions_page_alter(array &$suggestions, array $variables) { | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_node_alter(). | |||||
*/ | |||||
function test2_theme_suggestions_node_alter(array &$suggestions, array $variables) { | |||||
/*$node = $variables['elements']['#node']; | |||||
if ($variables['elements']['#view_mode'] == "full") { | |||||
}*/ | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_HOOK() for Block document templates. | |||||
*/ | |||||
function test2_preprocess_block(array &$variables) { | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_field_alter(). | |||||
*/ | |||||
function test2_theme_suggestions_field_alter(array &$suggestions, array $variables) { | |||||
/*$element = $variables['element']; | |||||
$suggestions[] = 'field__' . $element['#view_mode']; | |||||
$suggestions[] = 'field__' . $element['#view_mode'] . '__' . $element['#field_name'];*/ | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_field_alter(). | |||||
*/ | |||||
function test2_theme_suggestions_fieldset_alter(array &$suggestions, array $variables) { | |||||
/*$element = $variables['element']; | |||||
if (isset($element['#attributes']['class']) && in_array('form-composite', $element['#attributes']['class'])) { | |||||
$suggestions[] = 'fieldset__form_composite'; | |||||
}*/ | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_node(). | |||||
*/ | |||||
function test2_preprocess_node(array &$variables) { | |||||
// Default to turning off byline/submitted. | |||||
//$variables['display_submitted'] = FALSE; | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_views_view_alter(). | |||||
*/ | |||||
function test2_theme_suggestions_views_view_alter(array &$suggestions, array $variables) { | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_form(). | |||||
*/ | |||||
function test2_preprocess_form(array &$variables) { | |||||
//$variables['attributes']['novalidate'] = 'novalidate'; | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_select(). | |||||
*/ | |||||
function test2_preprocess_select(array &$variables) { | |||||
//$variables['attributes']['class'][] = 'select-chosen'; | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_field(). | |||||
*/ | |||||
function test2_preprocess_field(array &$variables, $hook) { | |||||
/*switch ($variables['element']['#field_name']) { | |||||
}*/ | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_details(). | |||||
*/ | |||||
function test2_preprocess_details(array &$variables) { | |||||
/*$variables['attributes']['class'][] = 'details'; | |||||
$variables['summary_attributes']['class'] = 'summary';*/ | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_details_alter(). | |||||
*/ | |||||
function test2_theme_suggestions_details_alter(array &$suggestions, array $variables) { | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_menu_local_task(). | |||||
*/ | |||||
function test2_preprocess_menu_local_task(array &$variables) { | |||||
//$variables['element']['#link']['url']->setOption('attributes', ['class'=>'rounded']); | |||||
} |
@ -0,0 +1,14 @@ | |||||
name: test4 | |||||
type: theme | |||||
description: 'My Awesome theme' | |||||
package: Other | |||||
core: 8.x | |||||
libraries: | |||||
- test4/global | |||||
- test4/another | |||||
base theme: classy | |||||
#Using Classy as a base theme https://www.drupal.org/theme-guide/8/classy | |||||
regions: | |||||
content: Content |
@ -0,0 +1,14 @@ | |||||
global: | |||||
version: 1.0 | |||||
css: | |||||
theme: | |||||
#css/your_style_sheet.css : {} | |||||
js: | |||||
#js/your_js.js : {} | |||||
another: | |||||
version: 1.0 | |||||
css: | |||||
theme: | |||||
#js/your_js.js : {} | |||||
js: | |||||
#js/your_js.js : {} |
@ -0,0 +1,145 @@ | |||||
<?php | |||||
/** | |||||
* @file | |||||
* Functions to support theming in the test4 theme. | |||||
*/ | |||||
/** | |||||
* Implements hook_preprocess_HOOK() for html.html.twig. | |||||
*/ | |||||
function test4_preprocess_html(array &$variables) { | |||||
/* Add class to html tag */ | |||||
//$variables['html_attributes']->addClass('no-js'); | |||||
// Don't display the site name twice on the front page (and potentially others) | |||||
/*if (isset($variables['head_title_array']['title']) && isset($variables['head_title_array']['name']) && ($variables['head_title_array']['title'] == $variables['head_title_array']['name'])) { | |||||
$variables['head_title'] = $variables['head_title_array']['name']; | |||||
}*/ | |||||
} | |||||
/** | |||||
* Implements hook_page_attachments_alter(). | |||||
*/ | |||||
function test4_page_attachments_alter(array &$page) { | |||||
// Tell IE to use latest rendering engine (not to use compatibility mode). | |||||
/*$ie_edge = [ | |||||
'#type' => 'html_tag', | |||||
'#tag' => 'meta', | |||||
'#attributes' => [ | |||||
'http-equiv' => 'X-UA-Compatible', | |||||
'content' => 'IE=edge', | |||||
], | |||||
]; | |||||
$page['#attached']['html_head'][] = [$ie_edge, 'ie_edge'];*/ | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_page() for page.html.twig. | |||||
*/ | |||||
function test4_preprocess_page(array &$variables) { | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_page_alter(). | |||||
*/ | |||||
function test4_theme_suggestions_page_alter(array &$suggestions, array $variables) { | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_node_alter(). | |||||
*/ | |||||
function test4_theme_suggestions_node_alter(array &$suggestions, array $variables) { | |||||
/*$node = $variables['elements']['#node']; | |||||
if ($variables['elements']['#view_mode'] == "full") { | |||||
}*/ | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_HOOK() for Block document templates. | |||||
*/ | |||||
function test4_preprocess_block(array &$variables) { | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_field_alter(). | |||||
*/ | |||||
function test4_theme_suggestions_field_alter(array &$suggestions, array $variables) { | |||||
/*$element = $variables['element']; | |||||
$suggestions[] = 'field__' . $element['#view_mode']; | |||||
$suggestions[] = 'field__' . $element['#view_mode'] . '__' . $element['#field_name'];*/ | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_field_alter(). | |||||
*/ | |||||
function test4_theme_suggestions_fieldset_alter(array &$suggestions, array $variables) { | |||||
/*$element = $variables['element']; | |||||
if (isset($element['#attributes']['class']) && in_array('form-composite', $element['#attributes']['class'])) { | |||||
$suggestions[] = 'fieldset__form_composite'; | |||||
}*/ | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_node(). | |||||
*/ | |||||
function test4_preprocess_node(array &$variables) { | |||||
// Default to turning off byline/submitted. | |||||
//$variables['display_submitted'] = FALSE; | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_views_view_alter(). | |||||
*/ | |||||
function test4_theme_suggestions_views_view_alter(array &$suggestions, array $variables) { | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_form(). | |||||
*/ | |||||
function test4_preprocess_form(array &$variables) { | |||||
//$variables['attributes']['novalidate'] = 'novalidate'; | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_select(). | |||||
*/ | |||||
function test4_preprocess_select(array &$variables) { | |||||
//$variables['attributes']['class'][] = 'select-chosen'; | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_field(). | |||||
*/ | |||||
function test4_preprocess_field(array &$variables, $hook) { | |||||
/*switch ($variables['element']['#field_name']) { | |||||
}*/ | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_details(). | |||||
*/ | |||||
function test4_preprocess_details(array &$variables) { | |||||
/*$variables['attributes']['class'][] = 'details'; | |||||
$variables['summary_attributes']['class'] = 'summary';*/ | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_details_alter(). | |||||
*/ | |||||
function test4_theme_suggestions_details_alter(array &$suggestions, array $variables) { | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_menu_local_task(). | |||||
*/ | |||||
function test4_preprocess_menu_local_task(array &$variables) { | |||||
//$variables['element']['#link']['url']->setOption('attributes', ['class'=>'rounded']); | |||||
} |
@ -0,0 +1,14 @@ | |||||
name: tests3 | |||||
type: theme | |||||
description: 'My Awesome theme' | |||||
package: Other | |||||
core: 8.x | |||||
libraries: | |||||
- tests3/global | |||||
- tests3/another | |||||
base theme: classy | |||||
#Using Classy as a base theme https://www.drupal.org/theme-guide/8/classy | |||||
regions: | |||||
content: Content |
@ -0,0 +1,14 @@ | |||||
global: | |||||
version: 1.0 | |||||
css: | |||||
theme: | |||||
#css/your_style_sheet.css : {} | |||||
js: | |||||
#js/your_js.js : {} | |||||
another: | |||||
version: 1.0 | |||||
css: | |||||
theme: | |||||
#js/your_js.js : {} | |||||
js: | |||||
#js/your_js.js : {} |
@ -0,0 +1,145 @@ | |||||
<?php | |||||
/** | |||||
* @file | |||||
* Functions to support theming in the tests3 theme. | |||||
*/ | |||||
/** | |||||
* Implements hook_preprocess_HOOK() for html.html.twig. | |||||
*/ | |||||
function tests3_preprocess_html(array &$variables) { | |||||
/* Add class to html tag */ | |||||
//$variables['html_attributes']->addClass('no-js'); | |||||
// Don't display the site name twice on the front page (and potentially others) | |||||
/*if (isset($variables['head_title_array']['title']) && isset($variables['head_title_array']['name']) && ($variables['head_title_array']['title'] == $variables['head_title_array']['name'])) { | |||||
$variables['head_title'] = $variables['head_title_array']['name']; | |||||
}*/ | |||||
} | |||||
/** | |||||
* Implements hook_page_attachments_alter(). | |||||
*/ | |||||
function tests3_page_attachments_alter(array &$page) { | |||||
// Tell IE to use latest rendering engine (not to use compatibility mode). | |||||
/*$ie_edge = [ | |||||
'#type' => 'html_tag', | |||||
'#tag' => 'meta', | |||||
'#attributes' => [ | |||||
'http-equiv' => 'X-UA-Compatible', | |||||
'content' => 'IE=edge', | |||||
], | |||||
]; | |||||
$page['#attached']['html_head'][] = [$ie_edge, 'ie_edge'];*/ | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_page() for page.html.twig. | |||||
*/ | |||||
function tests3_preprocess_page(array &$variables) { | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_page_alter(). | |||||
*/ | |||||
function tests3_theme_suggestions_page_alter(array &$suggestions, array $variables) { | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_node_alter(). | |||||
*/ | |||||
function tests3_theme_suggestions_node_alter(array &$suggestions, array $variables) { | |||||
/*$node = $variables['elements']['#node']; | |||||
if ($variables['elements']['#view_mode'] == "full") { | |||||
}*/ | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_HOOK() for Block document templates. | |||||
*/ | |||||
function tests3_preprocess_block(array &$variables) { | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_field_alter(). | |||||
*/ | |||||
function tests3_theme_suggestions_field_alter(array &$suggestions, array $variables) { | |||||
/*$element = $variables['element']; | |||||
$suggestions[] = 'field__' . $element['#view_mode']; | |||||
$suggestions[] = 'field__' . $element['#view_mode'] . '__' . $element['#field_name'];*/ | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_field_alter(). | |||||
*/ | |||||
function tests3_theme_suggestions_fieldset_alter(array &$suggestions, array $variables) { | |||||
/*$element = $variables['element']; | |||||
if (isset($element['#attributes']['class']) && in_array('form-composite', $element['#attributes']['class'])) { | |||||
$suggestions[] = 'fieldset__form_composite'; | |||||
}*/ | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_node(). | |||||
*/ | |||||
function tests3_preprocess_node(array &$variables) { | |||||
// Default to turning off byline/submitted. | |||||
//$variables['display_submitted'] = FALSE; | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_views_view_alter(). | |||||
*/ | |||||
function tests3_theme_suggestions_views_view_alter(array &$suggestions, array $variables) { | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_form(). | |||||
*/ | |||||
function tests3_preprocess_form(array &$variables) { | |||||
//$variables['attributes']['novalidate'] = 'novalidate'; | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_select(). | |||||
*/ | |||||
function tests3_preprocess_select(array &$variables) { | |||||
//$variables['attributes']['class'][] = 'select-chosen'; | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_field(). | |||||
*/ | |||||
function tests3_preprocess_field(array &$variables, $hook) { | |||||
/*switch ($variables['element']['#field_name']) { | |||||
}*/ | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_details(). | |||||
*/ | |||||
function tests3_preprocess_details(array &$variables) { | |||||
/*$variables['attributes']['class'][] = 'details'; | |||||
$variables['summary_attributes']['class'] = 'summary';*/ | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_details_alter(). | |||||
*/ | |||||
function tests3_theme_suggestions_details_alter(array &$suggestions, array $variables) { | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_menu_local_task(). | |||||
*/ | |||||
function tests3_preprocess_menu_local_task(array &$variables) { | |||||
//$variables['element']['#link']['url']->setOption('attributes', ['class'=>'rounded']); | |||||
} |
@ -0,0 +1,13 @@ | |||||
name: testv | |||||
type: theme | |||||
description: 'My Awesome theme' | |||||
package: Other | |||||
core: 8.x | |||||
libraries: | |||||
- testv/global | |||||
- testv/blog | |||||
base theme: stable | |||||
regions: | |||||
content: Content |
@ -0,0 +1,14 @@ | |||||
global: | |||||
version: 1.0 | |||||
css: | |||||
theme: | |||||
#css/your_style_sheet.css : {} | |||||
js: | |||||
#js/your_js.js : {} | |||||
blog: | |||||
version: 1.0 | |||||
css: | |||||
theme: | |||||
#js/your_js.js : {} | |||||
js: | |||||
#js/your_js.js : {} |
@ -0,0 +1,145 @@ | |||||
<?php | |||||
/** | |||||
* @file | |||||
* Functions to support theming in the testv theme. | |||||
*/ | |||||
/** | |||||
* Implements hook_preprocess_HOOK() for html.html.twig. | |||||
*/ | |||||
function testv_preprocess_html(array &$variables) { | |||||
/* Add class to html tag */ | |||||
//$variables['html_attributes']->addClass('no-js'); | |||||
// Don't display the site name twice on the front page (and potentially others) | |||||
/*if (isset($variables['head_title_array']['title']) && isset($variables['head_title_array']['name']) && ($variables['head_title_array']['title'] == $variables['head_title_array']['name'])) { | |||||
$variables['head_title'] = $variables['head_title_array']['name']; | |||||
}*/ | |||||
} | |||||
/** | |||||
* Implements hook_page_attachments_alter(). | |||||
*/ | |||||
function testv_page_attachments_alter(array &$page) { | |||||
// Tell IE to use latest rendering engine (not to use compatibility mode). | |||||
/*$ie_edge = [ | |||||
'#type' => 'html_tag', | |||||
'#tag' => 'meta', | |||||
'#attributes' => [ | |||||
'http-equiv' => 'X-UA-Compatible', | |||||
'content' => 'IE=edge', | |||||
], | |||||
]; | |||||
$page['#attached']['html_head'][] = [$ie_edge, 'ie_edge'];*/ | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_page() for page.html.twig. | |||||
*/ | |||||
function testv_preprocess_page(array &$variables) { | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_page_alter(). | |||||
*/ | |||||
function testv_theme_suggestions_page_alter(array &$suggestions, array $variables) { | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_node_alter(). | |||||
*/ | |||||
function testv_theme_suggestions_node_alter(array &$suggestions, array $variables) { | |||||
/*$node = $variables['elements']['#node']; | |||||
if ($variables['elements']['#view_mode'] == "full") { | |||||
}*/ | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_HOOK() for Block document templates. | |||||
*/ | |||||
function testv_preprocess_block(array &$variables) { | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_field_alter(). | |||||
*/ | |||||
function testv_theme_suggestions_field_alter(array &$suggestions, array $variables) { | |||||
/*$element = $variables['element']; | |||||
$suggestions[] = 'field__' . $element['#view_mode']; | |||||
$suggestions[] = 'field__' . $element['#view_mode'] . '__' . $element['#field_name'];*/ | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_field_alter(). | |||||
*/ | |||||
function testv_theme_suggestions_fieldset_alter(array &$suggestions, array $variables) { | |||||
/*$element = $variables['element']; | |||||
if (isset($element['#attributes']['class']) && in_array('form-composite', $element['#attributes']['class'])) { | |||||
$suggestions[] = 'fieldset__form_composite'; | |||||
}*/ | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_node(). | |||||
*/ | |||||
function testv_preprocess_node(array &$variables) { | |||||
// Default to turning off byline/submitted. | |||||
//$variables['display_submitted'] = FALSE; | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_views_view_alter(). | |||||
*/ | |||||
function testv_theme_suggestions_views_view_alter(array &$suggestions, array $variables) { | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_form(). | |||||
*/ | |||||
function testv_preprocess_form(array &$variables) { | |||||
//$variables['attributes']['novalidate'] = 'novalidate'; | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_select(). | |||||
*/ | |||||
function testv_preprocess_select(array &$variables) { | |||||
//$variables['attributes']['class'][] = 'select-chosen'; | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_field(). | |||||
*/ | |||||
function testv_preprocess_field(array &$variables, $hook) { | |||||
/*switch ($variables['element']['#field_name']) { | |||||
}*/ | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_details(). | |||||
*/ | |||||
function testv_preprocess_details(array &$variables) { | |||||
/*$variables['attributes']['class'][] = 'details'; | |||||
$variables['summary_attributes']['class'] = 'summary';*/ | |||||
} | |||||
/** | |||||
* Implements hook_theme_suggestions_details_alter(). | |||||
*/ | |||||
function testv_theme_suggestions_details_alter(array &$suggestions, array $variables) { | |||||
} | |||||
/** | |||||
* Implements hook_preprocess_menu_local_task(). | |||||
*/ | |||||
function testv_preprocess_menu_local_task(array &$variables) { | |||||
//$variables['element']['#link']['url']->setOption('attributes', ['class'=>'rounded']); | |||||
} |
@ -0,0 +1,31 @@ | |||||
<?php | |||||
/** | |||||
* @file | |||||
* The PHP page that handles updating the Drupal installation. | |||||
* | |||||
* All Drupal code is released under the GNU General Public License. | |||||
* See COPYRIGHT.txt and LICENSE.txt files in the "core" directory. | |||||
*/ | |||||
use Drupal\Core\Update\UpdateKernel; | |||||
use Symfony\Component\HttpFoundation\Request; | |||||
$autoloader = require_once 'autoload.php'; | |||||
// Disable garbage collection during test runs. Under certain circumstances the | |||||
// update path will create so many objects that garbage collection causes | |||||
// segmentation faults. | |||||
require_once 'core/includes/bootstrap.inc'; | |||||
if (drupal_valid_test_ua()) { | |||||
gc_collect_cycles(); | |||||
gc_disable(); | |||||
} | |||||
$kernel = new UpdateKernel('prod', $autoloader, FALSE); | |||||
$request = Request::createFromGlobals(); | |||||
$response = $kernel->handle($request); | |||||
$response->send(); | |||||
$kernel->terminate($request, $response); |
@ -0,0 +1,103 @@ | |||||
<?xml version="1.0" encoding="UTF-8"?> | |||||
<configuration> | |||||
<system.webServer> | |||||
<!-- Don't show directory listings for URLs which map to a directory. --> | |||||
<directoryBrowse enabled="false" /> | |||||
<!-- | |||||
Caching configuration was not delegated by default. Some hosters may not | |||||
delegate the caching configuration to site owners by default and that | |||||
may cause errors when users install. Uncomment this if you want to and | |||||
are allowed to enable caching. | |||||
--> | |||||
<!-- | |||||
<caching> | |||||
<profiles> | |||||
<add extension=".php" policy="DisableCache" kernelCachePolicy="DisableCache" /> | |||||
<add extension=".html" policy="CacheForTimePeriod" kernelCachePolicy="CacheForTimePeriod" duration="14:00:00" /> | |||||
</profiles> | |||||
</caching> | |||||
--> | |||||
<rewrite> | |||||
<rules> | |||||
<rule name="Protect files and directories from prying eyes" stopProcessing="true"> | |||||
<match url="\.(engine|inc|install|module|profile|po|sh|.*sql|theme|twig|tpl(\.php)?|xtmpl|yml|svn-base)$|^(code-style\.pl|Entries.*|Repository|Root|Tag|Template|all-wcprops|entries|format|composer\.(json|lock))$" /> | |||||
<action type="CustomResponse" statusCode="403" subStatusCode="0" statusReason="Forbidden" statusDescription="Access is forbidden." /> | |||||
</rule> | |||||
<rule name="Force simple error message for requests for non-existent favicon.ico" stopProcessing="true"> | |||||
<match url="favicon\.ico" /> | |||||
<action type="CustomResponse" statusCode="404" subStatusCode="1" statusReason="File Not Found" statusDescription="The requested file favicon.ico was not found" /> | |||||
<conditions> | |||||
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> | |||||
</conditions> | |||||
</rule> | |||||
<!-- If running on a PHP version affected by httpoxy vulnerability | |||||
uncomment the following rule to mitigate it's impact. To make this | |||||
rule work, you will also need to add HTTP_PROXY to the allowed server | |||||
variables manually in IIS. See https://www.drupal.org/node/2783079. | |||||
<rule name="Erase HTTP_PROXY" patternSyntax="Wildcard"> | |||||
<match url="*.*" /> | |||||
<serverVariables> | |||||
<set name="HTTP_PROXY" value="" /> | |||||
</serverVariables> | |||||
<action type="None" /> | |||||
</rule> | |||||
--> | |||||
<!-- To redirect all users to access the site WITH the 'www.' prefix, | |||||
http://example.com/foo will be redirected to http://www.example.com/foo) | |||||
adapt and uncomment the following: --> | |||||
<!-- | |||||
<rule name="Redirect to add www" stopProcessing="true"> | |||||
<match url="^(.*)$" ignoreCase="false" /> | |||||
<conditions> | |||||
<add input="{HTTP_HOST}" pattern="^example\.com$" /> | |||||
</conditions> | |||||
<action type="Redirect" redirectType="Permanent" url="http://www.example.com/{R:1}" /> | |||||
</rule> | |||||
--> | |||||
<!-- To redirect all users to access the site WITHOUT the 'www.' prefix, | |||||
http://www.example.com/foo will be redirected to http://example.com/foo) | |||||
adapt and uncomment the following: --> | |||||
<!-- | |||||
<rule name="Redirect to remove www" stopProcessing="true"> | |||||
<match url="^(.*)$" ignoreCase="false" /> | |||||
<conditions> | |||||
<add input="{HTTP_HOST}" pattern="^www\.example\.com$" /> | |||||
</conditions> | |||||
<action type="Redirect" redirectType="Permanent" url="http://example.com/{R:1}" /> | |||||
</rule> | |||||
--> | |||||
<!-- Pass all requests not referring directly to files in the filesystem | |||||
to index.php. --> | |||||
<rule name="Short URLS" stopProcessing="true"> | |||||
<match url="^(.*)$" ignoreCase="false" /> | |||||
<conditions> | |||||
<add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" /> | |||||
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" /> | |||||
<add input="{URL}" pattern="^/favicon.ico$" ignoreCase="false" negate="true" /> | |||||
</conditions> | |||||
<action type="Rewrite" url="index.php" /> | |||||
</rule> | |||||
</rules> | |||||
</rewrite> | |||||
<!-- If running Windows Server 2008 R2 this can be commented out --> | |||||
<!-- httpErrors> | |||||
<remove statusCode="404" subStatusCode="-1" /> | |||||
<error statusCode="404" prefixLanguageFilePath="" path="/index.php" responseMode="ExecuteURL" /> | |||||
</httpErrors --> | |||||
<defaultDocument> | |||||
<!-- Set the default document --> | |||||
<files> | |||||
<clear /> | |||||
<add value="index.php" /> | |||||
</files> | |||||
</defaultDocument> | |||||
</system.webServer> | |||||
</configuration> |
@ -0,0 +1 @@ | |||||
This directory contains commands, configuration and site aliases for Drush. See https://packagist.org/search/?type=drupal-drush for a directory of Drush commands installable via Composer. |
@ -0,0 +1,38 @@ | |||||
<?php | |||||
/* | |||||
* Customize this file as desired. See https://github.com/drush-ops/drush/blob/8.x/examples/policy.drush.inc for documentation. | |||||
*/ | |||||
/** | |||||
* Implements drush_hook_COMMAND_validate(). | |||||
* | |||||
* Encourage folks to use `composer` instead of Drush pm commands | |||||
*/ | |||||
function drush_policy_pm_updatecode_validate() { | |||||
return _deny_message(); | |||||
} | |||||
function drush_policy_pm_update_validate() { | |||||
return _deny_message(); | |||||
} | |||||
function drush_policy_pm_download_validate() { | |||||
return _deny_message(); | |||||
} | |||||
function _deny_message() { | |||||
if (!drush_get_option('pm-force')) { | |||||
$msg = 'This codebase is assembled with Composer instead of Drush. Use `composer update` and `composer require` instead of `drush pm-updatecode` and `drush pm-download`. You may override this error by using the --pm-force option.'; | |||||
return drush_set_error('POLICY_PM_DENY', dt($msg)); | |||||
} | |||||
} | |||||
/** | |||||
* Implements hook_drush_help_alter(). | |||||
*/ | |||||
function policy_drush_help_alter(&$command) { | |||||
if (in_array($command['command'], array('pm-updatecode', 'pm-update', 'pm-download'))) { | |||||
$command['options']['pm-force'] = 'Override site policy and allow Drush codebase management (pm-* commands)'; | |||||
} | |||||
} |
@ -0,0 +1,20 @@ | |||||
<?php | |||||
/** | |||||
* This file is included very early. See autoload.files in composer.json and | |||||
* https://getcomposer.org/doc/04-schema.md#files | |||||
*/ | |||||
use Dotenv\Dotenv; | |||||
use Dotenv\Exception\InvalidPathException; | |||||
/** | |||||
* Load any .env file. See /.env.example. | |||||
*/ | |||||
$dotenv = new Dotenv(__DIR__); | |||||
try { | |||||
$dotenv->load(); | |||||
} | |||||
catch (InvalidPathException $e) { | |||||
// Do nothing. Production environments rarely use .env files. | |||||
} |
@ -0,0 +1,68 @@ | |||||
# Useful things for Drupal projects | |||||
default: up | |||||
DRUPAL_ROOT ?= /var/www/site/docroot | |||||
PROJECT_ROOT ?= /var/www/site | |||||
IMAGE_NAME = drupal-project | |||||
# Spin up the docker container as defined in the docker-compose.yaml | |||||
up: | |||||
docker-compose up -d | |||||
# Spin down the docker container when you're no longer needing this as a local site | |||||
down: | |||||
docker-compose down | |||||
# This will do everything that is needed to get your site up and running for the first time | |||||
# Right now spins up container, then makes sure all composer dependencies are downloaded | |||||
first-launch: | |||||
make up | |||||
make install-dependencies | |||||
# Rebuilds the Drupal cache, useful anytime you make template changes or edit module files | |||||
cache-rebuild: | |||||
docker exec -ti -w $(PROJECT_ROOT) $(IMAGE_NAME) /bin/bash -ci "drupal cr all" | |||||
# Install all dependencies defined in the composer.json | |||||
install-dependencies: | |||||
docker exec -ti -w $(PROJECT_ROOT) $(IMAGE_NAME) /bin/bash -ci "composer install" | |||||
# Example command looks like "make require-module module=recaptcha" | |||||
require-module: | |||||
docker exec -ti -w $(PROJECT_ROOT) $(IMAGE_NAME) /bin/bash -ci "composer require drupal/$(module)" | |||||
# Example command looks like "make remove-module module=recaptcha" | |||||
remove-module: | |||||
docker exec -ti -w $(PROJECT_ROOT) $(IMAGE_NAME) /bin/bash -ci "drupal module:uninstall $(module)" | |||||
docker exec -ti -w $(PROJECT_ROOT) $(IMAGE_NAME) /bin/bash -ci "composer remove drupal/$(module)" | |||||
# Example command looks like "make install-module module=recaptcha" | |||||
install-module: | |||||
docker exec -ti -w $(PROJECT_ROOT) $(IMAGE_NAME) /bin/bash -ci "drupal module:install $(module)" | |||||
# If you put the db you want in the root of the project and run this command it will import that database | |||||
# the database filename must be starter.sql and in the root of this repo | |||||
# WARNING: You will lose any local changes you have made | |||||
import-db: | |||||
docker-compose down | |||||
sudo rm -Rf ../sites-databases/$(IMAGE_NAME) | |||||
docker-compose up -d | |||||
# See all the logs of the docker container, useful for finding PHP errors | |||||
logs: | |||||
docker logs $(IMAGE_NAME) -f | |||||
login: | |||||
docker exec -ti -w $(PROJECT_ROOT) $(IMAGE_NAME) /bin/bash | |||||
# Export the config from the DB into config files | |||||
config-export: | |||||
docker exec -ti -w $(PROJECT_ROOT) $(IMAGE_NAME) /bin/bash -ci "drupal config:export" | |||||
# import the config from config files into the DB | |||||
config-import: | |||||
docker exec -ti -w $(PROJECT_ROOT) $(IMAGE_NAME) /bin/bash -ci "drupal config:import" | |||||
setup-config: | |||||
docker exec -ti -w $(DRUPAL_ROOT) $(IMAGE_NAME) /bin/bash -ci "cp -R config_split/* config/default/default/. && drush config-import" |
@ -0,0 +1,15 @@ | |||||
<?xml version="1.0" encoding="UTF-8"?> | |||||
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||||
xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.1/phpunit.xsd" | |||||
backupGlobals="false" | |||||
colors="true" | |||||
bootstrap="vendor/autoload.php" | |||||
verbose="true" | |||||
> | |||||
<testsuites> | |||||
<testsuite name="drupal-composer-project tests"> | |||||
<directory>./test/</directory> | |||||
</testsuite> | |||||
</testsuites> | |||||
</phpunit> |
@ -0,0 +1,24 @@ | |||||
# Deny all requests from Apache 2.4+. | |||||
<IfModule mod_authz_core.c> | |||||
Require all denied | |||||
</IfModule> | |||||
# Deny all requests from Apache 2.0-2.2. | |||||
<IfModule !mod_authz_core.c> | |||||
Deny from all | |||||
</IfModule> | |||||
# Turn off all options we don't need. | |||||
Options -Indexes -ExecCGI -Includes -MultiViews | |||||
# Set the catch-all handler to prevent scripts from being executed. | |||||
SetHandler Drupal_Security_Do_Not_Remove_See_SA_2006_006 | |||||
<Files *> | |||||
# Override the handler again if we're run later in the evaluation list. | |||||
SetHandler Drupal_Security_Do_Not_Remove_See_SA_2013_003 | |||||
</Files> | |||||
# If we know how to do it safely, disable the PHP engine entirely. | |||||
<IfModule mod_php5.c> | |||||
php_flag engine off | |||||
</IfModule> |
@ -0,0 +1,29 @@ | |||||
#!/bin/bash | |||||
# set up ssmtp | |||||
if [[ $SESmailhub ]]; then | |||||
cat << EOF > /etc/ssmtp/ssmtp.conf | |||||
debug=yes | |||||
mailhub=$SESmailhub | |||||
Hostname=$HOSTNAME | |||||
FromLineOverride=yes | |||||
UseSTARTTLS=yes | |||||
EOF | |||||
fi | |||||
if [[ $SESAuthUser ]]; then | |||||
cat << EOF >> /etc/ssmtp/ssmtp.conf | |||||
$SESAuthUser | |||||
EOF | |||||
fi | |||||
if [[ $SESAuthPass ]]; then | |||||
cat << EOF >> /etc/ssmtp/ssmtp.conf | |||||
$SESAuthPass | |||||
EOF | |||||
fi | |||||
apache2-foreground |
@ -0,0 +1,60 @@ | |||||
<?php | |||||
$settings['update_free_access'] = FALSE; | |||||
$settings['file_private_path'] = '../private'; | |||||
$settings['container_yamls'][] = $app_root . '/' . $site_path . '/services.yml'; | |||||
$settings['file_scan_ignore_directories'] = [ | |||||
'node_modules', | |||||
'bower_components', | |||||
]; | |||||
$settings['entity_update_batch_size'] = 50; | |||||
$settings['hash_salt'] = 'asotenuarchqewsmaoeuSNTH56654+'; | |||||
$settings['trusted_host_patterns'] = [ | |||||
getenv('DRUPAL_TRUSTED_HOSTS'), | |||||
'nazarene-org\.docksal$', | |||||
]; | |||||
$databases = []; | |||||
$databases['default']['default'] = [ | |||||
'database' => getenv('DATABASE_NAME'), | |||||
'username' => getenv('DATABASE_USERNAME'), | |||||
'password' => getenv('DATABASE_PASSWORD'), | |||||
'prefix' => '', | |||||
'host' => getenv('DATABASE_HOST'), | |||||
'port' => '3306', | |||||
'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql', | |||||
'driver' => 'mysql', | |||||
]; | |||||
$config_directories = []; | |||||
$config_directories[CONFIG_SYNC_DIRECTORY] = '../config/default/default'; | |||||
$site_environment = getenv('SITE_ENV'); | |||||
$config['config_split.config_split.local']['status'] = FALSE; | |||||
$config['config_split.config_split.dev']['status'] = FALSE; | |||||
$config['config_split.config_split.stage']['status'] = FALSE; | |||||
$config['config_split.config_split.prod']['status'] = FALSE; | |||||
switch ($site_environment) { | |||||
case 'local': | |||||
$config['config_split.config_split.local']['status'] = TRUE; | |||||
break; | |||||
case 'dev': | |||||
$config['config_split.config_split.dev']['status'] = TRUE; | |||||
break; | |||||
case 'stage': | |||||
$config['config_split.config_split.stage']['status'] = TRUE; | |||||
break; | |||||
case 'prod': | |||||
$config['config_split.config_split.prod']['status'] = TRUE; | |||||
break; | |||||
} | |||||
/** | |||||
* Include a custom settings file if it exists. | |||||
*/ | |||||
$custom_settings = DRUPAL_ROOT . '/sites/default/custom.settings.php'; | |||||
if (file_exists($custom_settings)) { | |||||
include $custom_settings; | |||||
} | |||||
@ -0,0 +1,84 @@ | |||||
<?php | |||||
/** | |||||
* @file | |||||
* Contains \DrupalProject\composer\ScriptHandler. | |||||
*/ | |||||
namespace DrupalProject\composer; | |||||
use Composer\Script\Event; | |||||
use Composer\Semver\Comparator; | |||||
use DrupalFinder\DrupalFinder; | |||||
use Symfony\Component\Filesystem\Filesystem; | |||||
use Webmozart\PathUtil\Path; | |||||
class ScriptHandler { | |||||
public static function createRequiredFiles(Event $event) { | |||||
$fs = new Filesystem(); | |||||
$drupalFinder = new DrupalFinder(); | |||||
$drupalFinder->locateRoot(getcwd()); | |||||
$drupalRoot = $drupalFinder->getDrupalRoot(); | |||||
$dirs = [ | |||||
'modules', | |||||
'profiles', | |||||
'themes', | |||||
]; | |||||
// Required for unit testing | |||||
foreach ($dirs as $dir) { | |||||
if (!$fs->exists($drupalRoot . '/'. $dir)) { | |||||
$fs->mkdir($drupalRoot . '/'. $dir); | |||||
$fs->touch($drupalRoot . '/'. $dir . '/.gitkeep'); | |||||
} | |||||
} | |||||
// Create the files directory with chmod 0777 | |||||
if (!$fs->exists($drupalRoot . '/sites/default/files')) { | |||||
$oldmask = umask(0); | |||||
$fs->mkdir($drupalRoot . '/sites/default/files', 0777); | |||||
umask($oldmask); | |||||
$event->getIO()->write("Created a sites/default/files directory with chmod 0777"); | |||||
} | |||||
} | |||||
/** | |||||
* Checks if the installed version of Composer is compatible. | |||||
* | |||||
* Composer 1.0.0 and higher consider a `composer install` without having a | |||||
* lock file present as equal to `composer update`. We do not ship with a lock | |||||
* file to avoid merge conflicts downstream, meaning that if a project is | |||||
* installed with an older version of Composer the scaffolding of Drupal will | |||||
* not be triggered. We check this here instead of in drupal-scaffold to be | |||||
* able to give immediate feedback to the end user, rather than failing the | |||||
* installation after going through the lengthy process of compiling and | |||||
* downloading the Composer dependencies. | |||||
* | |||||
* @see https://github.com/composer/composer/pull/5035 | |||||
*/ | |||||
public static function checkComposerVersion(Event $event) { | |||||
$composer = $event->getComposer(); | |||||
$io = $event->getIO(); | |||||
$version = $composer::VERSION; | |||||
// The dev-channel of composer uses the git revision as version number, | |||||
// try to the branch alias instead. | |||||
if (preg_match('/^[0-9a-f]{40}$/i', $version)) { | |||||
$version = $composer::BRANCH_ALIAS_VERSION; | |||||
} | |||||
// If Composer is installed through git we have no easy way to determine if | |||||
// it is new enough, just display a warning. | |||||
if ($version === '@package_version@' || $version === '@package_branch_alias_version@') { | |||||
$io->writeError('<warning>You are running a development version of Composer. If you experience problems, please update Composer to the latest stable version.</warning>'); | |||||
} | |||||
elseif (Comparator::lessThan($version, '1.0.0')) { | |||||
$io->writeError('<error>Drupal-project requires Composer version 1.0.0 or higher. Please update your Composer before continuing</error>.'); | |||||
exit(1); | |||||
} | |||||
} | |||||
} |