Showroom feature
This commit is contained in:
		@@ -0,0 +1,76 @@
 | 
			
		||||
For complete changelog, see:
 | 
			
		||||
http://drupalcode.org/project/taxonomy_access.git/log/refs/heads/7.x-1.x
 | 
			
		||||
 | 
			
		||||
Taxonomy Access 7.x-1.x-dev, xxxx-xx-xx
 | 
			
		||||
---------------------------------------
 | 
			
		||||
 | 
			
		||||
Taxonomy Access 7.x-1.0, 2015-09-18
 | 
			
		||||
---------------------------------------
 | 
			
		||||
o The return value of taxonomy_access_global_defaults() has changed. Callers
 | 
			
		||||
  may use _taxonomy_access_format_grant_record() to format each element of the
 | 
			
		||||
  return array for hook_node_access_records().
 | 
			
		||||
 | 
			
		||||
o The following constants have been added:
 | 
			
		||||
  - TAXONOMY_ACCESS_GLOBAL_DEFAULT = 0
 | 
			
		||||
  - TAXONOMY_ACCESS_VOCABULARY_DEFAULT = 0
 | 
			
		||||
  - TAXONOMY_ACCESS_NODE_ALLOW = 1
 | 
			
		||||
  - TAXONOMY_ACCESS_NODE_IGNORE = 0
 | 
			
		||||
  - TAXONOMY_ACCESS_NODE_DENY = 2
 | 
			
		||||
  - TAXONOMY_ACCESS_GLOBAL_DEFAULT = 0
 | 
			
		||||
  - TAXONOMY_ACCESS_GLOBAL_DEFAULT = 0
 | 
			
		||||
 | 
			
		||||
o Drupal core 7.8 is now explicitly required.
 | 
			
		||||
 | 
			
		||||
o The "Add tag" (create) grant now defaults to "Allow" for anonymous and
 | 
			
		||||
  authenticated users upon installation. (Existing installations will not be
 | 
			
		||||
  affected.)
 | 
			
		||||
 | 
			
		||||
Taxonomy Access 7.x-1.x-rc1, 2011-09-09
 | 
			
		||||
---------------------------------------
 | 
			
		||||
o Administrative paths have changed.
 | 
			
		||||
 | 
			
		||||
o Renamed grant realm from 'term_access' to 'taxonomy_access_role'.
 | 
			
		||||
 | 
			
		||||
o Field widgets are now automatically hidden if the user cannot add any terms.
 | 
			
		||||
 | 
			
		||||
o The vocabulary default for the "Add tag" grant (create op) now controls
 | 
			
		||||
  whether new terms can be created in the vocabulary in autocomplete fields.
 | 
			
		||||
 | 
			
		||||
o Moved "Add tag" (create op) functionality from hook_form_alter() to
 | 
			
		||||
  hook_field_widget_form_alter().
 | 
			
		||||
 | 
			
		||||
o Terms disallowed by "Add tag" (create op) are disabled rather than removed.
 | 
			
		||||
  This may be a configurable setting in the future.
 | 
			
		||||
 | 
			
		||||
o "Add tag" (create op) now allows selection of allowed child terms when
 | 
			
		||||
  the parent term is disabled.
 | 
			
		||||
 | 
			
		||||
o Optimized grant update functionality to reduce queries.
 | 
			
		||||
 | 
			
		||||
o Renamed several API functions:
 | 
			
		||||
 | 
			
		||||
  - from: taxonomy_access_grant_update()
 | 
			
		||||
    to:   taxonomy_access_set_term_grants()
 | 
			
		||||
 | 
			
		||||
  - from: taxonomy_access_defaults_update()
 | 
			
		||||
    to:   taxonomy_access_set_default_grants()
 | 
			
		||||
 | 
			
		||||
  - form: taxonomy_access_recursive_grant_update()
 | 
			
		||||
    to:   taxonomy_access_set_recursive_grants()
 | 
			
		||||
 | 
			
		||||
  - from: taxonomy_access_delete_roles()
 | 
			
		||||
    to:   taxonomy_access_delete_role_grants()
 | 
			
		||||
 | 
			
		||||
  - from: taxonomy_access_delete_terms()
 | 
			
		||||
    to:   taxonomy_access_delete_term_grants()
 | 
			
		||||
 | 
			
		||||
  - from: taxonomy_access_delete_defaults()
 | 
			
		||||
    to:   taxonomy_access_delete_default_grants()
 | 
			
		||||
 | 
			
		||||
o Renamed "List" and "Create" grants to "View tag" and "Add tag" for clarity.
 | 
			
		||||
 | 
			
		||||
o Automatically update node access as needed on shutdown.  
 | 
			
		||||
  Hooks should merely add their list of nodes to 
 | 
			
		||||
  taxonomy_access_affected_nodes() to be processed at the end of the request.
 | 
			
		||||
 | 
			
		||||
o Provide record deletion API.
 | 
			
		||||
@@ -0,0 +1,50 @@
 | 
			
		||||
TO INSTALL, simply install and enable the module, in these steps.
 | 
			
		||||
 | 
			
		||||
PLEASE CHECK that you use the right version of Taxonomy Access for your 
 | 
			
		||||
  version of DRUPAL.
 | 
			
		||||
 | 
			
		||||
IMPORTANT: This is a complicated module. When you first learn to use this 
 | 
			
		||||
  module, ALWAYS TRY IT FIRST ON A TEST SITE.
 | 
			
		||||
 | 
			
		||||
NOTE: If you want to USE TWO OR MORE "ACCESS" MODULES AT THE SAME TIME, TEST 
 | 
			
		||||
  THEM CAREFULLY. (e.g: OG, node_privacy_by_role, taxonomy access, etc.)
 | 
			
		||||
 | 
			
		||||
TO UPDATE from previous versions of taxonomy_access: PLEASE READ UPDATE.TXT!
 | 
			
		||||
  WHEN UPDATING, ALWAYS disable the module first before uploading the new 
 | 
			
		||||
  module, on the page:
 | 
			
		||||
  "Administration >> Modules"
 | 
			
		||||
  (http://www.example.com/admin/modules).
 | 
			
		||||
 | 
			
		||||
-----------------------
 | 
			
		||||
INSTALLATION
 | 
			
		||||
-----------------------
 | 
			
		||||
 | 
			
		||||
1. COPY the taxonomy_access directory to your Drupal 
 | 
			
		||||
   installation's module directory.
 | 
			
		||||
   (By default: sites/all/modules/taxonomy_access/ in your Drupal directory.)
 | 
			
		||||
 | 
			
		||||
2. ENABLE THE MODULE on page: 
 | 
			
		||||
   "Administration >> Modules"
 | 
			
		||||
   (http://www.example.com/admin/modules).
 | 
			
		||||
 | 
			
		||||
3. REBUILD YOUR NODE ACCESS PERMISSIONS on page:
 | 
			
		||||
   "Administration >> Reports >> Status report >> Node Access Permissions"
 | 
			
		||||
   (http://www.example.com/admin/reports/status/rebuild).
 | 
			
		||||
 | 
			
		||||
4. GRANT ADMINISTRATORS CONTROL of Taxonomy Access on page:
 | 
			
		||||
   "Administration >> People >> Permissions"
 | 
			
		||||
   (http://www.example.com/admin/people/permissions).
 | 
			
		||||
 | 
			
		||||
   To administer Taxonomy Access, administrators must have "access 
 | 
			
		||||
   administration pages" checked (under "system module") and "administer 
 | 
			
		||||
   permissions" checked (under "user module"). 
 | 
			
		||||
 | 
			
		||||
5. CONFIGURE ACCESS GRANTS to the various categories at: 
 | 
			
		||||
   "Administration >> Configuration >> Taxonomy access control"
 | 
			
		||||
   (http://www.example.com/admin/config/people/taxonomy_access).
 | 
			
		||||
 | 
			
		||||
   Be sure to configure the authenticated role, as users with custom roles 
 | 
			
		||||
   also have the authenticated user role.
 | 
			
		||||
 | 
			
		||||
NOTE: DATABASE TABLES are automatically added to database. Module creates two 
 | 
			
		||||
   database tables: 'taxonomy_access_term' and 'taxonomy_access_default'.
 | 
			
		||||
							
								
								
									
										339
									
								
								sites/all/modules/contrib/taxonomy/taxonomy_access/LICENSE.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										339
									
								
								sites/all/modules/contrib/taxonomy/taxonomy_access/LICENSE.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,339 @@
 | 
			
		||||
                    GNU GENERAL PUBLIC LICENSE
 | 
			
		||||
                       Version 2, June 1991
 | 
			
		||||
 | 
			
		||||
 Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
 | 
			
		||||
 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.
 | 
			
		||||
 | 
			
		||||
    <one line to give the program's name and a brief idea of what it does.>
 | 
			
		||||
    Copyright (C) <year>  <name of author>
 | 
			
		||||
 | 
			
		||||
    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.
 | 
			
		||||
							
								
								
									
										106
									
								
								sites/all/modules/contrib/taxonomy/taxonomy_access/README.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								sites/all/modules/contrib/taxonomy/taxonomy_access/README.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,106 @@
 | 
			
		||||
-----------------------
 | 
			
		||||
GENERAL DESCRIPTION
 | 
			
		||||
-----------------------
 | 
			
		||||
This module allows you to set access permissions for various taxonomy 
 | 
			
		||||
categories based on user role.  
 | 
			
		||||
 | 
			
		||||
There are permissions to VIEW, UPDATE, and DELETE nodes in each category.
 | 
			
		||||
Additionally, the ADD TAG permission control whether the user can add a 
 | 
			
		||||
taxonomy term to a node, and the VIEW TAG permission controls whether the user
 | 
			
		||||
can see the taxonomy term listed on the node.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-----------------------
 | 
			
		||||
HELP PAGES
 | 
			
		||||
-----------------------
 | 
			
		||||
For more information about how to control access permissions with the Taxonomy
 | 
			
		||||
access control module (TAC), see the module's help page at:
 | 
			
		||||
"Administration >> Help >> Taxonomy access control"
 | 
			
		||||
(admin/help/taxonomy_access).
 | 
			
		||||
 | 
			
		||||
Also see the help pages at drupal.org: http://drupal.org/node/31601
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-----------------------
 | 
			
		||||
DATABASE TABLES
 | 
			
		||||
-----------------------
 | 
			
		||||
Module creates two tables in database: 'taxonomy_access_term' and
 | 
			
		||||
'taxonomy_access_default'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-----------------------
 | 
			
		||||
TROUBLESHOOTING
 | 
			
		||||
-----------------------
 | 
			
		||||
 | 
			
		||||
If users can view or edit pages that they do not have permission for:
 | 
			
		||||
 | 
			
		||||
1. Make sure the user role does not have "administer nodes" permission.  This 
 | 
			
		||||
   permission will override any settings from Taxonomy Access.
 | 
			
		||||
 | 
			
		||||
2. Check whether the user role has "edit any [type] content" permissions 
 | 
			
		||||
   under "node module" on the page: 
 | 
			
		||||
   "Administration >> People >> Permissions"
 | 
			
		||||
   (http://www.example.com/admin/people/permissions).
 | 
			
		||||
 | 
			
		||||
   Granting this permission overrides TAC's "Update" permissions for the given 
 | 
			
		||||
   content type, so you will not be able to deny the role edit access to any 
 | 
			
		||||
   nodes in that type.  (The same is true of "delete any [type] content" 
 | 
			
		||||
   permissions.)
 | 
			
		||||
 | 
			
		||||
3. Check to see if the user has other roles that may be granting other 
 | 
			
		||||
   permissions. Remember: Deny overrides Allow within a role, but Allow from 
 | 
			
		||||
   one role can override Deny from another.
 | 
			
		||||
 | 
			
		||||
4. Review the configuration for the authenticated user role on page:
 | 
			
		||||
   "Administration >> People >> Permissions"
 | 
			
		||||
   (http://www.example.com/admin/people/permissions).
 | 
			
		||||
 | 
			
		||||
   Remember that users with custom roles also have the authenticated role, so 
 | 
			
		||||
   they gain any permissions granted that role.
 | 
			
		||||
 | 
			
		||||
5. Check whether you have ANY OTHER node access modules installed.
 | 
			
		||||
   Other modules can override TAC's grants.
 | 
			
		||||
 | 
			
		||||
6. Do a General Database Housekeeping
 | 
			
		||||
  (Tables: 'node_access','taxonomy_access_term' and 'taxonomy_access_default'):
 | 
			
		||||
 | 
			
		||||
   First DISABLE, then RE-ENABLE the Taxonomy access module on page:
 | 
			
		||||
   "Administration >> Modules"
 | 
			
		||||
   (http://www.example.com/admin/modules).
 | 
			
		||||
    
 | 
			
		||||
  This will force the complete rebuild of the 'node_access' table.
 | 
			
		||||
  
 | 
			
		||||
7. For debugging, install devel_node_access module (Devel project).
 | 
			
		||||
   This can show you some information about node_access values in 
 | 
			
		||||
   the database when viewing a node page.
 | 
			
		||||
 | 
			
		||||
8. Force rebuilding of the permissions cache (table 'node_access'):
 | 
			
		||||
   "Rebuild permissions" button on page:
 | 
			
		||||
   "Administration >> Reports >> Status report >> Node Access Permissions"
 | 
			
		||||
   (http://www.example.com/admin/reports/status/rebuild).
 | 
			
		||||
 | 
			
		||||
   If the site is experiencing problems with permissions to content, you may
 | 
			
		||||
   have to rebuild the permissions cache. Possible causes for permission
 | 
			
		||||
   problems are disabling modules or configuration changes to permissions.
 | 
			
		||||
   Rebuilding will remove all privileges to posts, and replace them with
 | 
			
		||||
   permissions based on the current modules and settings.
 | 
			
		||||
 | 
			
		||||
-----------------------
 | 
			
		||||
UNINSTALLING
 | 
			
		||||
-----------------------
 | 
			
		||||
 | 
			
		||||
1. First DISABLE the Taxonomy access module on page:
 | 
			
		||||
   "Administration >> Modules"
 | 
			
		||||
   (http://www.example.com/admin/modules).
 | 
			
		||||
 | 
			
		||||
2. After disabling, you can uninstall completely by choosing Taxonomy
 | 
			
		||||
   Access on page: 
 | 
			
		||||
   "Administration >> Modules >> Uninstall"
 | 
			
		||||
   (http://www.example.com/admin/modules/uninstall).
 | 
			
		||||
 | 
			
		||||
   This will remove all your settings of Taxonomy Access: variables and tables
 | 
			
		||||
   ('taxonomy_access_term' and 'taxonomy_access_default').
 | 
			
		||||
 | 
			
		||||
3. After uninstalling, if the site is experiencing problems with permissions to
 | 
			
		||||
   content, you can rebuild the permission cache.
 | 
			
		||||
   See "Troubleshooting" #8.
 | 
			
		||||
@@ -0,0 +1,29 @@
 | 
			
		||||
READ THIS FILE if you are updating from previous versions of 
 | 
			
		||||
  'taxonomy_access.module'.
 | 
			
		||||
 | 
			
		||||
If you are installing taxonomy_access.module for the first time, you may ignore
 | 
			
		||||
  this file.
 | 
			
		||||
 | 
			
		||||
-----------------------
 | 
			
		||||
UPDATING
 | 
			
		||||
-----------------------
 | 
			
		||||
 | 
			
		||||
1. DISABLE THE MODULE on page: 
 | 
			
		||||
   "Administration >> Modules"
 | 
			
		||||
   (http://www.example.com/admin/modules).
 | 
			
		||||
 | 
			
		||||
2. BACK UP your database.
 | 
			
		||||
 | 
			
		||||
3. COPY the new taxonomy_access directory over the existing module directory
 | 
			
		||||
   (By default: sites/all/modules/taxonomy_access/ in your Drupal directory.)
 | 
			
		||||
 | 
			
		||||
4. LOG IN AS MAIN ADMINISTRATOR (user with user ID 1).
 | 
			
		||||
 | 
			
		||||
5. ENABLE THE MODULE on page: 
 | 
			
		||||
   "Administration >> Modules"
 | 
			
		||||
   (http://www.example.com/admin/modules).
 | 
			
		||||
 | 
			
		||||
6. RUN UPDATE.PHP by visiting:
 | 
			
		||||
   http://www.example.com/update.php
 | 
			
		||||
 | 
			
		||||
7. TEST YOUR SITE'S ACCESS CONTROL.  If there are problems, see the README.txt.
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 160 B  | 
@@ -0,0 +1,60 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Disable disallowed terms in taxonomy fields, and re-enable on submit.
 | 
			
		||||
 *
 | 
			
		||||
 * We do this in jQuery because FAPI does not yet support it:
 | 
			
		||||
 * @see
 | 
			
		||||
 *   http://drupal.org/node/284917
 | 
			
		||||
 * @see
 | 
			
		||||
 *   http://drupal.org/node/342316
 | 
			
		||||
 *
 | 
			
		||||
 * @todo
 | 
			
		||||
 *   Use clearer coding standards.
 | 
			
		||||
 * @see
 | 
			
		||||
 *   http://jsdemystified.drupalgardens.com/
 | 
			
		||||
 */
 | 
			
		||||
Drupal.behaviors.tac_create = {};
 | 
			
		||||
Drupal.behaviors.tac_create.attach = function(context, settings) {
 | 
			
		||||
  var $ = jQuery;
 | 
			
		||||
  var $fields = $(Drupal.settings.taxonomy_access);
 | 
			
		||||
 | 
			
		||||
  // For each controlled field, disable disallowed terms.
 | 
			
		||||
  $.each($fields, function(i, field) {
 | 
			
		||||
    var fieldname = "." + field.field;
 | 
			
		||||
 | 
			
		||||
    // Disable disallowed term and its label, if any.
 | 
			
		||||
    $.each(field.disallowed_tids, function(j, tid) {
 | 
			
		||||
 | 
			
		||||
      // Children of the widget element with the specified tid as a value.
 | 
			
		||||
      // Can be either <option> or <input>.
 | 
			
		||||
      // .tac_fieldname [value='1']
 | 
			
		||||
      selector = fieldname + " [value='" + tid + "']";
 | 
			
		||||
      $(selector).attr('disabled','disabled');
 | 
			
		||||
 | 
			
		||||
      // Label sibling adjacent the child element.
 | 
			
		||||
      // .tac_fieldname [value='1'] + label
 | 
			
		||||
      label_selector = fieldname + " [value='" + tid + "']" + " + label";
 | 
			
		||||
      $(label_selector).attr('class','option disabled');
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  // Re-enable and re-select disallowed defaults on submit.
 | 
			
		||||
  $("form").submit(function() {
 | 
			
		||||
 | 
			
		||||
    // For each controlled field, re-enable disallowed terms.
 | 
			
		||||
    $.each($fields, function(i, field) {
 | 
			
		||||
      var fieldname = "." + field.field;
 | 
			
		||||
 | 
			
		||||
      // Enable and select disallowed defaults.
 | 
			
		||||
      $.each(field.disallowed_defaults, function(j, tid) {
 | 
			
		||||
 | 
			
		||||
        // Children of the widget element with the specified tid as a value.
 | 
			
		||||
        // Can be either <option> or <input>.
 | 
			
		||||
        // .tac_fieldname [value='1']
 | 
			
		||||
        selector = fieldname + " [value='" + tid + "']";
 | 
			
		||||
        $(selector).attr('disabled','');
 | 
			
		||||
        $(selector).attr('selected','selected');
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,910 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * Administrative interface for taxonomy access control.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Page callback: Renders the TAC permissions administration overview page.
 | 
			
		||||
 *
 | 
			
		||||
 * @return
 | 
			
		||||
 *   Form to render.
 | 
			
		||||
 *
 | 
			
		||||
 * @see taxonomy_access_menu()
 | 
			
		||||
 */
 | 
			
		||||
function taxonomy_access_admin() {
 | 
			
		||||
  $roles = _taxonomy_access_user_roles();
 | 
			
		||||
  $active_rids = db_query(
 | 
			
		||||
    'SELECT rid FROM {taxonomy_access_default} WHERE vid = :vid',
 | 
			
		||||
    array(':vid' => TAXONOMY_ACCESS_GLOBAL_DEFAULT)
 | 
			
		||||
  )->fetchCol();
 | 
			
		||||
 | 
			
		||||
  $header = array(t('Role'), t('Status'), t('Operations'));
 | 
			
		||||
  $rows = array();
 | 
			
		||||
 | 
			
		||||
  foreach ($roles as $rid => $name) {
 | 
			
		||||
    $row = array();
 | 
			
		||||
    $row[] = $name;
 | 
			
		||||
 | 
			
		||||
    if (in_array($rid, $active_rids)) {
 | 
			
		||||
      // Add edit operation link for active roles.
 | 
			
		||||
      $row[] = array('data' => t('Enabled'));
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      // Add enable link for unconfigured roles.
 | 
			
		||||
      $row[] = array('data' => t('Disabled'));
 | 
			
		||||
    }
 | 
			
		||||
    $row[] = array('data' => l(
 | 
			
		||||
      t("Configure"),
 | 
			
		||||
      TAXONOMY_ACCESS_CONFIG . "/role/$rid/edit",
 | 
			
		||||
      array('attributes' => array('class' => array('module-link', 'module-link-configure')))));
 | 
			
		||||
    $rows[] = $row;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  $build['role_table'] = array(
 | 
			
		||||
    '#theme' => 'table',
 | 
			
		||||
    '#header' => $header,
 | 
			
		||||
    '#rows' => $rows,
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  return $build;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Form constructor for a form to to delete access rules for a particular role.
 | 
			
		||||
 *
 | 
			
		||||
 * @param int $rid
 | 
			
		||||
 *   The role ID to disable.
 | 
			
		||||
 *
 | 
			
		||||
 * @see taxonomy_access_role_delete_confirm_submit()
 | 
			
		||||
 * @see taxonomy_access_menu()
 | 
			
		||||
 * @ingroup forms
 | 
			
		||||
 */
 | 
			
		||||
function taxonomy_access_role_delete_confirm($form, &$form_state, $rid) {
 | 
			
		||||
  $roles = _taxonomy_access_user_roles();
 | 
			
		||||
  if (taxonomy_access_role_enabled($rid)) {
 | 
			
		||||
    $form['rid'] = array(
 | 
			
		||||
      '#type' => 'value',
 | 
			
		||||
      '#value' => $rid,
 | 
			
		||||
    );
 | 
			
		||||
    return confirm_form($form,
 | 
			
		||||
      t("Are you sure you want to delete all taxonomy access rules for the role %role?",
 | 
			
		||||
        array('%role' => $roles[$rid])),
 | 
			
		||||
      TAXONOMY_ACCESS_CONFIG . '/role/%/edit',
 | 
			
		||||
      t('This action cannot be undone.'),
 | 
			
		||||
      t('Delete all'),
 | 
			
		||||
      t('Cancel'));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Form submission handler for taxonomy_role_delete_confirm().
 | 
			
		||||
 */
 | 
			
		||||
function taxonomy_access_role_delete_confirm_submit($form, &$form_state) {
 | 
			
		||||
  $roles = _taxonomy_access_user_roles();
 | 
			
		||||
  $rid = $form_state['values']['rid'];
 | 
			
		||||
  if (is_numeric($rid)
 | 
			
		||||
      && $rid != DRUPAL_ANONYMOUS_RID
 | 
			
		||||
      && $rid != DRUPAL_AUTHENTICATED_RID) {
 | 
			
		||||
    if ($form_state['values']['confirm']) {
 | 
			
		||||
      $form_state['redirect'] = TAXONOMY_ACCESS_CONFIG;
 | 
			
		||||
      taxonomy_access_delete_role_grants($rid);
 | 
			
		||||
      drupal_set_message(t('All taxonomy access rules deleted for role %role.',
 | 
			
		||||
          array('%role' => $roles[$rid])));
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Generates a URL to enable a role with a token for CSRF protection.
 | 
			
		||||
 *
 | 
			
		||||
 * @param int $rid
 | 
			
		||||
 *   The role ID.
 | 
			
		||||
 *
 | 
			
		||||
 * @return string
 | 
			
		||||
 *   The full URL for the request path.
 | 
			
		||||
 */
 | 
			
		||||
function taxonomy_access_enable_role_url($rid) {
 | 
			
		||||
  // Create a query array with a token to validate the sumbission.
 | 
			
		||||
  $query = drupal_get_destination();
 | 
			
		||||
  $query['token'] = drupal_get_token($rid);
 | 
			
		||||
 | 
			
		||||
  // Build and return the URL with the token and destination.
 | 
			
		||||
  return url(
 | 
			
		||||
    TAXONOMY_ACCESS_CONFIG . "/role/$rid/enable",
 | 
			
		||||
    array('query' => $query)
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Page callback: Enables a role if the proper token is provided.
 | 
			
		||||
 *
 | 
			
		||||
 * @param int $rid
 | 
			
		||||
 *   The role ID.
 | 
			
		||||
 */
 | 
			
		||||
function taxonomy_access_enable_role_validate($rid) {
 | 
			
		||||
  $rid = intval($rid);
 | 
			
		||||
  // If a valid token is not provided, return a 403.
 | 
			
		||||
  $query = drupal_get_query_parameters();
 | 
			
		||||
  if (empty($query['token']) || !drupal_valid_token($query['token'], $rid)) {
 | 
			
		||||
    return MENU_ACCESS_DENIED;
 | 
			
		||||
  }
 | 
			
		||||
  // Return a 404 for the anonymous or authenticated roles.
 | 
			
		||||
  if (in_array($rid, array(DRUPAL_ANONYMOUS_RID, DRUPAL_AUTHENTICATED_RID))) {
 | 
			
		||||
    return MENU_NOT_FOUND;
 | 
			
		||||
  }
 | 
			
		||||
  // Return a 404 for invalid role IDs.
 | 
			
		||||
  $roles = _taxonomy_access_user_roles();
 | 
			
		||||
  if (empty($roles[$rid])) {
 | 
			
		||||
    return MENU_NOT_FOUND;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // If the parameters pass validation, enable the role and complete redirect.
 | 
			
		||||
  if (taxonomy_access_enable_role($rid)) {
 | 
			
		||||
    drupal_set_message(t('Role %name enabled successfully.',
 | 
			
		||||
      array('%name' => $roles[$rid])));
 | 
			
		||||
  }
 | 
			
		||||
  drupal_goto();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Form constructor for a form to manage grants by role.
 | 
			
		||||
 *
 | 
			
		||||
 * @param int $rid
 | 
			
		||||
 *   The role ID.
 | 
			
		||||
 *
 | 
			
		||||
 * @see taxonomy_access_admin_form_submit()
 | 
			
		||||
 * @see taxonomy_access_menu()
 | 
			
		||||
 * @ingroup forms
 | 
			
		||||
 */
 | 
			
		||||
function taxonomy_access_admin_role($form, $form_state, $rid) {
 | 
			
		||||
  // Always include the role ID in the form.
 | 
			
		||||
  $rid = intval($rid);
 | 
			
		||||
  $form['rid'] = array('#type' => 'value', '#value' => $rid);
 | 
			
		||||
 | 
			
		||||
  // For custom roles, allow the user to enable or disable grants for the role.
 | 
			
		||||
  if (!in_array($rid, array(DRUPAL_ANONYMOUS_RID, DRUPAL_AUTHENTICATED_RID))) {
 | 
			
		||||
    $roles = _taxonomy_access_user_roles();
 | 
			
		||||
 | 
			
		||||
    // If the role is not enabled, return only a link to enable it.
 | 
			
		||||
    if (!taxonomy_access_role_enabled($rid)) {
 | 
			
		||||
      $form['status'] = array(
 | 
			
		||||
        '#markup' => '<p>' . t(
 | 
			
		||||
          'Access control for the %name role is disabled. <a href="@url">Enable @name</a>.',
 | 
			
		||||
          array(
 | 
			
		||||
            '%name' => $roles[$rid],
 | 
			
		||||
            '@name' => $roles[$rid],
 | 
			
		||||
            '@url' => taxonomy_access_enable_role_url($rid))) . '</p>'
 | 
			
		||||
      );
 | 
			
		||||
      return $form;
 | 
			
		||||
    }
 | 
			
		||||
    // Otherwise, add a link to disable and build the rest of the form.
 | 
			
		||||
    else {
 | 
			
		||||
      $disable_url = url(
 | 
			
		||||
        TAXONOMY_ACCESS_CONFIG . "/role/$rid/delete",
 | 
			
		||||
        array('query' => drupal_get_destination())
 | 
			
		||||
      );
 | 
			
		||||
      $form['status'] = array(
 | 
			
		||||
        '#markup' => '<p>' . t(
 | 
			
		||||
          'Access control for the %name role is enabled. <a href="@url">Disable @name</a>.',
 | 
			
		||||
          array('@name' => $roles[$rid], '%name' => $roles[$rid], '@url' => $disable_url)) . '</p>'
 | 
			
		||||
      );
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Retrieve role grants and display an administration form.
 | 
			
		||||
  // Disable list filtering while preparing this form.
 | 
			
		||||
  taxonomy_access_disable_list();
 | 
			
		||||
 | 
			
		||||
  // Fetch all grants for the role.
 | 
			
		||||
  $defaults =
 | 
			
		||||
    db_query(
 | 
			
		||||
      'SELECT vid, grant_view, grant_update, grant_delete, grant_create,
 | 
			
		||||
              grant_list
 | 
			
		||||
       FROM {taxonomy_access_default}
 | 
			
		||||
       WHERE rid = :rid',
 | 
			
		||||
      array(':rid' => $rid))
 | 
			
		||||
    ->fetchAllAssoc('vid', PDO::FETCH_ASSOC);
 | 
			
		||||
 | 
			
		||||
  $records =
 | 
			
		||||
    db_query(
 | 
			
		||||
      'SELECT ta.tid, td.vid, ta.grant_view, ta.grant_update, ta.grant_delete,
 | 
			
		||||
              ta.grant_create, ta.grant_list
 | 
			
		||||
       FROM {taxonomy_access_term} ta
 | 
			
		||||
       INNER JOIN {taxonomy_term_data} td ON ta.tid = td.tid
 | 
			
		||||
       WHERE rid = :rid',
 | 
			
		||||
      array(':rid' => $rid))
 | 
			
		||||
    ->fetchAllAssoc('tid', PDO::FETCH_ASSOC);
 | 
			
		||||
  $term_grants = array();
 | 
			
		||||
  foreach ($records as $record) {
 | 
			
		||||
    $term_grants[$record['vid']][$record['tid']] = $record;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Add a fieldset for the global default.
 | 
			
		||||
  $form['global_default'] = array(
 | 
			
		||||
    '#type' => 'fieldset',
 | 
			
		||||
    '#title' => t('Global default'),
 | 
			
		||||
    '#description' => t('The global default controls access to untagged nodes. It is also used as the default for disabled vocabularies.'),
 | 
			
		||||
    '#collapsible' => TRUE,
 | 
			
		||||
    // Collapse if there are vocabularies configured.
 | 
			
		||||
    '#collapsed' => (sizeof($defaults) > 1),
 | 
			
		||||
  );
 | 
			
		||||
  // Print term grant table.
 | 
			
		||||
  $form['global_default']['grants'] = taxonomy_access_grant_add_table($defaults[TAXONOMY_ACCESS_GLOBAL_DEFAULT], TAXONOMY_ACCESS_VOCABULARY_DEFAULT);
 | 
			
		||||
 | 
			
		||||
  // Fetch all vocabularies and determine which are enabled for the role.
 | 
			
		||||
  $vocabs = array();
 | 
			
		||||
  $disabled = array();
 | 
			
		||||
  foreach (taxonomy_get_vocabularies() as $vocab) {
 | 
			
		||||
    $vocabs[$vocab->vid] = $vocab;
 | 
			
		||||
    if (!isset($defaults[$vocab->vid])) {
 | 
			
		||||
      $disabled[$vocab->vid] = $vocab->name;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Add a fieldset to enable vocabularies.
 | 
			
		||||
  if (!empty($disabled)) {
 | 
			
		||||
    $form['enable_vocabs'] = array(
 | 
			
		||||
      '#type' => 'fieldset',
 | 
			
		||||
      '#collapsible' => TRUE,
 | 
			
		||||
      '#collapsed' => TRUE,
 | 
			
		||||
      '#title' => t('Add vocabulary'),
 | 
			
		||||
      '#attributes' => array('class' => array('container-inline', 'taxonomy-access-add')),
 | 
			
		||||
    );
 | 
			
		||||
    $form['enable_vocabs']['enable_vocab'] = array(
 | 
			
		||||
      '#type' => 'select',
 | 
			
		||||
      '#title' => t('Vocabulary'),
 | 
			
		||||
      '#options' => $disabled,
 | 
			
		||||
    );
 | 
			
		||||
    $form['enable_vocabs']['add'] = array(
 | 
			
		||||
      '#type' => 'submit',
 | 
			
		||||
      '#submit' => array('taxonomy_access_enable_vocab_submit'),
 | 
			
		||||
      '#value' => t('Add'),
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Add a fieldset for each enabled vocabulary.
 | 
			
		||||
  foreach ($defaults as $vid => $vocab_default) {
 | 
			
		||||
    if (!empty($vocabs[$vid])) {
 | 
			
		||||
      $vocab = $vocabs[$vid];
 | 
			
		||||
      $name = $vocab->machine_name;
 | 
			
		||||
 | 
			
		||||
      // Fetch unconfigured terms and reorder term records by hierarchy.
 | 
			
		||||
      $sort = array();
 | 
			
		||||
      $add_options = array();
 | 
			
		||||
      if ($tree = taxonomy_get_tree($vid)) {
 | 
			
		||||
        foreach ($tree as $term) {
 | 
			
		||||
          if (empty($term_grants[$vid][$term->tid])) {
 | 
			
		||||
            $add_options["term $term->tid"] = str_repeat('-', $term->depth) . ' ' .check_plain($term->name);
 | 
			
		||||
          }
 | 
			
		||||
          else {
 | 
			
		||||
            $sort[$term->tid] = $term_grants[$vid][$term->tid];
 | 
			
		||||
            $sort[$term->tid]['name'] =  str_repeat('-', $term->depth) . ' ' . check_plain($term->name);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        $term_grants[$vid] = $sort;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      $grants = array(TAXONOMY_ACCESS_VOCABULARY_DEFAULT => $vocab_default);
 | 
			
		||||
      $grants[TAXONOMY_ACCESS_VOCABULARY_DEFAULT]['name'] = t('Default');
 | 
			
		||||
      if (!empty($term_grants[$vid])) {
 | 
			
		||||
        $grants += $term_grants[$vid];
 | 
			
		||||
      }
 | 
			
		||||
      $form[$name] = array(
 | 
			
		||||
        '#type' => 'fieldset',
 | 
			
		||||
        '#title' => $vocab->name,
 | 
			
		||||
        '#attributes' => array('class' => array('taxonomy-access-vocab')),
 | 
			
		||||
        '#description' => t('The default settings apply to all terms in %vocab that do not have their own below.', array('%vocab' => $vocab->name)),
 | 
			
		||||
        '#collapsible' => TRUE,
 | 
			
		||||
        '#collapsed' => FALSE,
 | 
			
		||||
      );
 | 
			
		||||
      // Term grant table.
 | 
			
		||||
      $form[$name]['grants'] =
 | 
			
		||||
        taxonomy_access_grant_table($grants, $vocab->vid, t('Term'), !empty($term_grants[$vid]));
 | 
			
		||||
      // Fieldset to add a new term if there are any.
 | 
			
		||||
      if (!empty($add_options)) {
 | 
			
		||||
        $form[$name]['new'] = array(
 | 
			
		||||
          '#type' => 'fieldset',
 | 
			
		||||
          '#collapsible' => TRUE,
 | 
			
		||||
          '#collapsed' => TRUE,
 | 
			
		||||
          '#title' => t('Add term'),
 | 
			
		||||
          '#tree' => TRUE,
 | 
			
		||||
          '#attributes' => array('class' => array('container-inline', 'taxonomy-access-add')),
 | 
			
		||||
        );
 | 
			
		||||
        $form[$name]['new'][$vid]['item'] = array(
 | 
			
		||||
          '#type' => 'select',
 | 
			
		||||
          '#title' => t('Term'),
 | 
			
		||||
          '#options' => $add_options,
 | 
			
		||||
        );
 | 
			
		||||
        $form[$name]['new'][$vid]['recursive'] = array(
 | 
			
		||||
          '#type' => 'checkbox',
 | 
			
		||||
          '#title' => t('with descendants'),
 | 
			
		||||
        );
 | 
			
		||||
        $form[$name]['new'][$vid]['grants'] =
 | 
			
		||||
          taxonomy_access_grant_add_table($vocab_default, $vid);
 | 
			
		||||
        $form[$name]['new'][$vid]['add'] = array(
 | 
			
		||||
          '#type' => 'submit',
 | 
			
		||||
          '#name' => $vid,
 | 
			
		||||
          '#submit' => array('taxonomy_access_add_term_submit'),
 | 
			
		||||
          '#value' => t('Add'),
 | 
			
		||||
        );
 | 
			
		||||
      }
 | 
			
		||||
      $disable_url = url(
 | 
			
		||||
        TAXONOMY_ACCESS_CONFIG . "/role/$rid/disable/$vid",
 | 
			
		||||
        array('query' => drupal_get_destination())
 | 
			
		||||
      );
 | 
			
		||||
      $form[$name]['disable'] = array(
 | 
			
		||||
          '#markup' => '<p>' . t(
 | 
			
		||||
            'To disable the %vocab vocabulary, <a href="@url">delete all @vocab access rules</a>.',
 | 
			
		||||
            array('%vocab' => $vocab->name, '@vocab' => $vocab->name, '@url' => $disable_url)) . '</p>'
 | 
			
		||||
      );
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  $form['actions'] = array('#type' => 'actions');
 | 
			
		||||
  $form['actions']['submit'] = array(
 | 
			
		||||
    '#type' => 'submit',
 | 
			
		||||
    '#value' => t('Save all'),
 | 
			
		||||
    '#submit' => array('taxonomy_access_save_all_submit'),
 | 
			
		||||
  );
 | 
			
		||||
  if (!empty($term_grants)) {
 | 
			
		||||
    $form['actions']['delete'] = array(
 | 
			
		||||
      '#type' => 'submit',
 | 
			
		||||
      '#value' => t('Delete selected'),
 | 
			
		||||
      '#submit' => array('taxonomy_access_delete_selected_submit'),
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return $form;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Generates a grant table for multiple access rules.
 | 
			
		||||
 *
 | 
			
		||||
 * @param array $rows
 | 
			
		||||
 *   An array of grant row data, keyed by an ID (term, vocab, role, etc.). Each
 | 
			
		||||
 *   row should include the following keys:
 | 
			
		||||
 *   - name: (optional) The label for the row (e.g., a term, vocabulary, or
 | 
			
		||||
 *     role name).
 | 
			
		||||
 *   - view: The View grant value select box for the element.
 | 
			
		||||
 *   - update: The Update grant value select box for the element.
 | 
			
		||||
 *   - delete: The Delete grant value select box for the element.
 | 
			
		||||
 *   - create: The Add tag grant value select box for the element.
 | 
			
		||||
 *   - list: The View tag grant value select box for the element.
 | 
			
		||||
 * @param int $parent_vid
 | 
			
		||||
 *   The parent ID for the table in the form tree structure (typically a
 | 
			
		||||
 *   vocabulary id).
 | 
			
		||||
 * @param string $first_col
 | 
			
		||||
 *   The header for the first column (in the 'name' key for each row).
 | 
			
		||||
 * @param bool $delete
 | 
			
		||||
 *   (optional) Whether to add a deletion checkbox to each row along with a
 | 
			
		||||
 *   "Check all" box in the table header. The checbox is automatically disabled
 | 
			
		||||
 *   for TAXONOMY_ACCESS_VOCABULARY_DEFAULT. Defaults to TRUE.
 | 
			
		||||
 *
 | 
			
		||||
 * @return
 | 
			
		||||
 *   Renderable array containing the table.
 | 
			
		||||
 *
 | 
			
		||||
 * @see taxonomy_access_grant_table()
 | 
			
		||||
 */
 | 
			
		||||
function taxonomy_access_grant_table(array $rows, $parent_vid, $first_col, $delete = TRUE) {
 | 
			
		||||
  $header = taxonomy_access_grant_table_header();
 | 
			
		||||
  if ($first_col) {
 | 
			
		||||
    array_unshift(
 | 
			
		||||
      $header,
 | 
			
		||||
      array('data' => $first_col, 'class' => array('taxonomy-access-label'))
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
  if ($delete) {
 | 
			
		||||
    drupal_add_js('misc/tableselect.js');
 | 
			
		||||
    array_unshift($header, array('class' => array('select-all')));
 | 
			
		||||
  }
 | 
			
		||||
  $table = array(
 | 
			
		||||
    '#type' => 'taxonomy_access_grant_table',
 | 
			
		||||
    '#tree' => TRUE,
 | 
			
		||||
    '#header' => $header,
 | 
			
		||||
  );
 | 
			
		||||
  foreach ($rows as $id => $row) {
 | 
			
		||||
    $table[$parent_vid][$id] = taxonomy_access_admin_build_row($row, 'name', $delete);
 | 
			
		||||
  }
 | 
			
		||||
  // Disable the delete checkbox for the default.
 | 
			
		||||
  if ($delete && isset($table[$parent_vid][TAXONOMY_ACCESS_VOCABULARY_DEFAULT])) {
 | 
			
		||||
    $table[$parent_vid][TAXONOMY_ACCESS_VOCABULARY_DEFAULT]['remove']['#disabled'] = TRUE;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return $table;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Generates a grant table for adding access rules with one set of values.
 | 
			
		||||
 *
 | 
			
		||||
 * @param array $rows
 | 
			
		||||
 *   An associative array of access rule data, with the following keys:
 | 
			
		||||
 *   - view: The View grant value select box for the element.
 | 
			
		||||
 *   - update: The Update grant value select box for the element.
 | 
			
		||||
 *   - delete: The Delete grant value select box for the element.
 | 
			
		||||
 *   - create: The Add tag grant value select box for the element.
 | 
			
		||||
 *   - list: The View tag grant value select box for the element.
 | 
			
		||||
 * @param int $id
 | 
			
		||||
 *   The ID for this set (e.g., a vocabulary ID).
 | 
			
		||||
 *
 | 
			
		||||
 * @return
 | 
			
		||||
 *   Renderable array containing the table.
 | 
			
		||||
 *
 | 
			
		||||
 * @see taxonomy_access_grant_table()
 | 
			
		||||
 */
 | 
			
		||||
function taxonomy_access_grant_add_table($row, $id) {
 | 
			
		||||
  $header = taxonomy_access_grant_table_header();
 | 
			
		||||
  $table = array(
 | 
			
		||||
    '#type' => 'taxonomy_access_grant_table',
 | 
			
		||||
    '#tree' => TRUE,
 | 
			
		||||
    '#header' => $header,
 | 
			
		||||
  );
 | 
			
		||||
  $table[$id][TAXONOMY_ACCESS_VOCABULARY_DEFAULT] = taxonomy_access_admin_build_row($row);
 | 
			
		||||
 | 
			
		||||
  return $table;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Returns a header array for grant form tables.
 | 
			
		||||
 *
 | 
			
		||||
 * @return array
 | 
			
		||||
 *   An array of header cell data for a grant table.
 | 
			
		||||
 */
 | 
			
		||||
function taxonomy_access_grant_table_header() {
 | 
			
		||||
  $header = array(
 | 
			
		||||
    array('data' => t('View')),
 | 
			
		||||
    array('data' => t('Update')),
 | 
			
		||||
    array('data' => t('Delete')),
 | 
			
		||||
    array('data' => t('Add Tag')),
 | 
			
		||||
    array('data' => t('View Tag')),
 | 
			
		||||
  );
 | 
			
		||||
  foreach ($header as &$cell) {
 | 
			
		||||
    $cell['class'] = array('taxonomy-access-grant');
 | 
			
		||||
  }
 | 
			
		||||
  return $header;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Theme our grant table.
 | 
			
		||||
 *
 | 
			
		||||
 * @todo
 | 
			
		||||
 *   Use a separate theme function for taxonomy_access_grant_add_table() to get
 | 
			
		||||
 *   out of nesting hell?
 | 
			
		||||
 * @todo
 | 
			
		||||
 *   I clearly have no idea what I'm doing here.
 | 
			
		||||
 */
 | 
			
		||||
function theme_taxonomy_access_grant_table($element_data) {
 | 
			
		||||
  $table = array();
 | 
			
		||||
  $table['header'] = $element_data['elements']['#header'];
 | 
			
		||||
  $table['attributes']['class'] = array('taxonomy-access-grant-table');
 | 
			
		||||
  $rows = array();
 | 
			
		||||
  foreach (element_children($element_data['elements']) as $element_key) {
 | 
			
		||||
    $child = $element_data['elements'][$element_key];
 | 
			
		||||
    foreach (element_children($child) as $child_key) {
 | 
			
		||||
      $record = $child[$child_key];
 | 
			
		||||
      $row = array();
 | 
			
		||||
      foreach (element_children($record) as $record_key) {
 | 
			
		||||
        $data = array('data' => $record[$record_key]);
 | 
			
		||||
        // If it's the default, add styling.
 | 
			
		||||
        if ($record_key == 'name') {
 | 
			
		||||
          $data['class'] = array('taxonomy-access-label');
 | 
			
		||||
          if ($child_key == TAXONOMY_ACCESS_VOCABULARY_DEFAULT) {
 | 
			
		||||
            $data['class'][] = 'taxonomy-access-default';
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        // Add grant classes to grant cells.
 | 
			
		||||
        elseif (in_array($record_key, array('view', 'update', 'delete', 'create', 'list'))) {
 | 
			
		||||
          $grant_class = $record_key . '-' . $data['data']['#default_value'];
 | 
			
		||||
          $data['class'] = array('taxonomy-access-grant', $grant_class);
 | 
			
		||||
        }
 | 
			
		||||
        $row[] = $data;
 | 
			
		||||
      }
 | 
			
		||||
      $rows[] = $row;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  $table['rows'] = $rows;
 | 
			
		||||
  return theme('table', $table);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Assembles a row of grant options for a term or default on the admin form.
 | 
			
		||||
 *
 | 
			
		||||
 * @param array $grants
 | 
			
		||||
 *   An array of grants to use as form defaults.
 | 
			
		||||
 * @param $label_key
 | 
			
		||||
 *   (optional) Key of the column to use as a label in each grant row. Defaults
 | 
			
		||||
 *   to NULL.
 | 
			
		||||
 */
 | 
			
		||||
function taxonomy_access_admin_build_row(array $grants, $label_key = NULL, $delete = FALSE) {
 | 
			
		||||
  $form['#tree'] = TRUE;
 | 
			
		||||
  if ($delete) {
 | 
			
		||||
    $form['remove'] = array(
 | 
			
		||||
      '#type' => 'checkbox',
 | 
			
		||||
      '#title' => t('Delete access rule for @name', array('@name' => $grants[$label_key])),
 | 
			
		||||
      '#title_display' => 'invisible',
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
  if ($label_key) {
 | 
			
		||||
    $form[$label_key] = array(
 | 
			
		||||
      '#type' => 'markup',
 | 
			
		||||
      '#markup' => check_plain($grants[$label_key]),
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
  foreach (array('view', 'update', 'delete', 'create', 'list') as $grant) {
 | 
			
		||||
    $for = $label_key ? $grants[$label_key] : NULL;
 | 
			
		||||
    $form[$grant] = array(
 | 
			
		||||
      '#type' => 'select',
 | 
			
		||||
      '#title' => _taxonomy_access_grant_field_label($grant, $for),
 | 
			
		||||
      '#title_display' => 'invisible',
 | 
			
		||||
      '#default_value' => is_string($grants['grant_' . $grant]) ? $grants['grant_' . $grant] : TAXONOMY_ACCESS_NODE_IGNORE,
 | 
			
		||||
      '#required' => TRUE,
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
  foreach (array('view', 'update', 'delete') as $grant) {
 | 
			
		||||
    $form[$grant]['#options'] = array(
 | 
			
		||||
      TAXONOMY_ACCESS_NODE_ALLOW => t('Allow'),
 | 
			
		||||
      TAXONOMY_ACCESS_NODE_IGNORE => t('Ignore'),
 | 
			
		||||
      TAXONOMY_ACCESS_NODE_DENY => t('Deny'),
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
  foreach (array('create', 'list') as $grant) {
 | 
			
		||||
    $form[$grant]['#options'] = array(
 | 
			
		||||
      TAXONOMY_ACCESS_TERM_ALLOW => t('Allow'),
 | 
			
		||||
      TAXONOMY_ACCESS_TERM_DENY => t('Deny'),
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
  return $form;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Returns the proper invisible field label for each grant table element.
 | 
			
		||||
 */
 | 
			
		||||
function _taxonomy_access_grant_field_label($grant, $for = NULL) {
 | 
			
		||||
  if ($for) {
 | 
			
		||||
    $label = array('@label', $for);
 | 
			
		||||
    $titles = array(
 | 
			
		||||
      'view' => t('View grant for @label', $label),
 | 
			
		||||
      'update' => t('Update grant for @label', $label),
 | 
			
		||||
      'delete' => t('Delete grant for @label', $label),
 | 
			
		||||
      'create' => t('Add tag grant for @label', $label),
 | 
			
		||||
      'list' => t('View tag grant for @label', $label),
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
  else {
 | 
			
		||||
    $titles = array(
 | 
			
		||||
      'view' => t('View grant'),
 | 
			
		||||
      'update' => t('Update grant'),
 | 
			
		||||
      'delete' => t('Delete grant'),
 | 
			
		||||
      'create' => t('Add tag grant'),
 | 
			
		||||
      'list' => t('View tag grant'),
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 return $titles[$grant];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Form submission handler for taxonomy_access_admin_role().
 | 
			
		||||
 *
 | 
			
		||||
 * Processes submissions for the vocabulary 'Add' button.
 | 
			
		||||
 */
 | 
			
		||||
function taxonomy_access_enable_vocab_submit($form, &$form_state) {
 | 
			
		||||
  $rid = $form_state['values']['rid'];
 | 
			
		||||
  $vid = $form_state['values']['enable_vocab'];
 | 
			
		||||
  $roles = _taxonomy_access_user_roles();
 | 
			
		||||
  $vocab = taxonomy_vocabulary_load($vid);
 | 
			
		||||
  if (taxonomy_access_enable_vocab($vid, $rid)) {
 | 
			
		||||
    drupal_set_message(t(
 | 
			
		||||
      'Vocabulary %vocab enabled successfully for the %role role.',
 | 
			
		||||
      array(
 | 
			
		||||
        '%vocab' => $vocab->name,
 | 
			
		||||
        '%role' => $roles[$rid])));
 | 
			
		||||
  }
 | 
			
		||||
  else {
 | 
			
		||||
    drupal_set_message(t('The vocabulary could not be enabled.'), 'error');
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Form submission handler for taxonomy_access_admin_role().
 | 
			
		||||
 *
 | 
			
		||||
 * Processes submissions for the term 'Add' button.
 | 
			
		||||
 */
 | 
			
		||||
function taxonomy_access_add_term_submit($form, &$form_state) {
 | 
			
		||||
  $vid = $form_state['clicked_button']['#name'];
 | 
			
		||||
  $new = $form_state['values']['new'][$vid];
 | 
			
		||||
  $rid = $form_state['values']['rid'];
 | 
			
		||||
  list($type, $id) = explode(' ', $new['item']);
 | 
			
		||||
  $rows = array();
 | 
			
		||||
 | 
			
		||||
  $rows[$id] =
 | 
			
		||||
    _taxonomy_access_format_grant_record($id, $rid, $new['grants'][$vid][TAXONOMY_ACCESS_VOCABULARY_DEFAULT]);
 | 
			
		||||
 | 
			
		||||
  // If we are adding children recursively, add those as well.
 | 
			
		||||
  if ($new['recursive'] == 1) {
 | 
			
		||||
    $children = _taxonomy_access_get_descendants($id);
 | 
			
		||||
    foreach ($children as $tid) {
 | 
			
		||||
      $rows[$tid] =
 | 
			
		||||
        _taxonomy_access_format_grant_record($tid, $rid, $new['grants'][$vid][TAXONOMY_ACCESS_VOCABULARY_DEFAULT]);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Set the grants for the row or rows.
 | 
			
		||||
  taxonomy_access_set_term_grants($rows);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Page callback: Returns a confirmation form to disable a vocabulary.
 | 
			
		||||
 *
 | 
			
		||||
 * @param int $rid
 | 
			
		||||
 *   The role ID.
 | 
			
		||||
 * @param object $vocab
 | 
			
		||||
 *   The vocabulary object.
 | 
			
		||||
 *
 | 
			
		||||
 * @todo
 | 
			
		||||
 *   Check if vocab is enabled and return a 404 otherwise?
 | 
			
		||||
 *
 | 
			
		||||
 * @see taxonomy_access_menu()
 | 
			
		||||
 * @see taxonomy_access_admin_role().
 | 
			
		||||
 * @see taxonomy_access_disable_vocab_confirm_page()
 | 
			
		||||
 */
 | 
			
		||||
function taxonomy_access_disable_vocab_confirm_page($rid, $vocab) {
 | 
			
		||||
  $rid = intval($rid);
 | 
			
		||||
 | 
			
		||||
  // Return a 404 on invalid vid or rid.
 | 
			
		||||
  if (!$vocab->vid || !$rid) {
 | 
			
		||||
    return MENU_NOT_FOUND;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return drupal_get_form('taxonomy_access_disable_vocab_confirm', $rid, $vocab);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Returns a confirmation form for disabling a vocabulary for a role.
 | 
			
		||||
 *
 | 
			
		||||
 * @param int $rid
 | 
			
		||||
 *   The role ID.
 | 
			
		||||
 * @param object $vocab
 | 
			
		||||
 *   The vocabulary object.
 | 
			
		||||
 *
 | 
			
		||||
 * @see taxonomy_access_disable_vocab_confirm_page()
 | 
			
		||||
 * @see taxonomy_access_disable_vocab_confirm_submit()
 | 
			
		||||
 * @ingroup forms
 | 
			
		||||
 */
 | 
			
		||||
function taxonomy_access_disable_vocab_confirm($form, &$form_state, $rid, $vocab) {
 | 
			
		||||
  $roles = _taxonomy_access_user_roles();
 | 
			
		||||
  if (taxonomy_access_role_enabled($rid)) {
 | 
			
		||||
    $form['rid'] = array(
 | 
			
		||||
      '#type' => 'value',
 | 
			
		||||
      '#value' => $rid,
 | 
			
		||||
    );
 | 
			
		||||
    $form['vid'] = array(
 | 
			
		||||
      '#type' => 'value',
 | 
			
		||||
      '#value' => $vocab->vid,
 | 
			
		||||
    );
 | 
			
		||||
    $form['vocab_name'] = array(
 | 
			
		||||
      '#type' => 'value',
 | 
			
		||||
      '#value' => $vocab->name,
 | 
			
		||||
    );
 | 
			
		||||
    return confirm_form($form,
 | 
			
		||||
      t("Are you sure you want to delete all Taxonomy access rules for %vocab in the %role role?",
 | 
			
		||||
        array('%role' => $roles[$rid], '%vocab' => $vocab->name)),
 | 
			
		||||
      TAXONOMY_ACCESS_CONFIG . '/role/%/edit',
 | 
			
		||||
      t('This action cannot be undone.'),
 | 
			
		||||
      t('Delete all'),
 | 
			
		||||
      t('Cancel'));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Form submission handler for taxonomy_access_disable_vocab_confirm().
 | 
			
		||||
 *
 | 
			
		||||
 * @param int $rid
 | 
			
		||||
 *   The role ID to disable.
 | 
			
		||||
 *
 | 
			
		||||
 * @todo
 | 
			
		||||
 *   Set a message on invalid $rid or $vid?
 | 
			
		||||
 */
 | 
			
		||||
function taxonomy_access_disable_vocab_confirm_submit($form, &$form_state) {
 | 
			
		||||
  $roles = _taxonomy_access_user_roles();
 | 
			
		||||
  $rid = intval($form_state['values']['rid']);
 | 
			
		||||
  $vid = intval($form_state['values']['vid']);
 | 
			
		||||
  // Do not proceed for invalid role IDs, and do not allow the global default
 | 
			
		||||
  // to be deleted.
 | 
			
		||||
  if (!$vid || !$rid || empty($roles[$rid])) {
 | 
			
		||||
    return FALSE;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if ($form_state['values']['confirm']) {
 | 
			
		||||
    $form_state['redirect'] = TAXONOMY_ACCESS_CONFIG;
 | 
			
		||||
    if (taxonomy_access_disable_vocab($vid, $rid)) {
 | 
			
		||||
      drupal_set_message(
 | 
			
		||||
        t('All Taxonomy access rules deleted for %vocab in role %role.',
 | 
			
		||||
          array(
 | 
			
		||||
            '%vocab' => $form_state['values']['vocab_name'],
 | 
			
		||||
            '%role' => $roles[$rid])
 | 
			
		||||
         ));
 | 
			
		||||
      return TRUE;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Form submission handler for taxonomy_access_admin_role().
 | 
			
		||||
 *
 | 
			
		||||
 * Processes submissions for the "Delete selected" button.
 | 
			
		||||
 *
 | 
			
		||||
 * @todo
 | 
			
		||||
 *   The parent form could probably be refactored to make this more efficient
 | 
			
		||||
 *   (by putting these elements in a flat list) but that would require changing
 | 
			
		||||
 *   taxonomy_access_grant_table() and taxonomy_access_build_row().
 | 
			
		||||
 */
 | 
			
		||||
function taxonomy_access_delete_selected_submit($form, &$form_state) {
 | 
			
		||||
  $rid = intval($form_state['values']['rid']);
 | 
			
		||||
  $delete_tids = array();
 | 
			
		||||
  foreach ($form_state['values']['grants'] as $vid => $tids) {
 | 
			
		||||
    foreach ($tids as $tid => $record) {
 | 
			
		||||
      if (!empty($record['remove'])) {
 | 
			
		||||
        $delete_tids[] = $tid;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  if ($rid) {
 | 
			
		||||
    if (taxonomy_access_delete_term_grants($delete_tids, $rid)) {
 | 
			
		||||
      drupal_set_message(format_plural(
 | 
			
		||||
          sizeof($delete_tids),
 | 
			
		||||
          '1 term access rule was deleted.',
 | 
			
		||||
          '@count term access rules were deleted.'));
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      drupal_set_message(t('The records could not be deleted.'), 'warning');
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * Form submission handler for taxonomy_access_admin_form().
 | 
			
		||||
 *
 | 
			
		||||
 * Processes submissions for the 'Save all' button.
 | 
			
		||||
 */
 | 
			
		||||
function taxonomy_access_save_all_submit($form, &$form_state) {
 | 
			
		||||
  $values = $form_state['values'];
 | 
			
		||||
  $rid = $values['rid'];
 | 
			
		||||
  $vocabs = taxonomy_get_vocabularies();
 | 
			
		||||
 | 
			
		||||
  // Create four lists of records to update.
 | 
			
		||||
  $update_terms = array();
 | 
			
		||||
  $skip_terms = array();
 | 
			
		||||
  $update_defaults = array();
 | 
			
		||||
  $skip_defaults = array();
 | 
			
		||||
 | 
			
		||||
  foreach ($values['grants'] as $vid => $rows) {
 | 
			
		||||
    if ($vid == TAXONOMY_ACCESS_GLOBAL_DEFAULT) {
 | 
			
		||||
      $element = $form['global_default'];
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      $vocab = $vocabs[$vid];
 | 
			
		||||
      $element = $form[$vocab->machine_name];
 | 
			
		||||
    }
 | 
			
		||||
    foreach ($rows as $tid => $row) {
 | 
			
		||||
      // Check the default values for this row.
 | 
			
		||||
      $defaults = array();
 | 
			
		||||
      $grants = array();
 | 
			
		||||
      foreach (array('view', 'update', 'delete', 'create', 'list') as $grant_name) {
 | 
			
		||||
        $grants[$grant_name] = $row[$grant_name];
 | 
			
		||||
        $defaults[$grant_name] =
 | 
			
		||||
          $element['grants'][$vid][$tid][$grant_name]['#default_value'];
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // Proceed if the user changed the row (values differ from defaults).
 | 
			
		||||
      if ($defaults != $grants) {
 | 
			
		||||
        // If the grants for node access match the defaults, then we
 | 
			
		||||
        // can skip updating node access records for this row.
 | 
			
		||||
        $update_nodes = FALSE;
 | 
			
		||||
        foreach (array('view', 'update', 'delete') as $op) {
 | 
			
		||||
          if ($defaults[$op] != $grants[$op]) {
 | 
			
		||||
            $update_nodes = TRUE;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Add the row to one of the four arrays.
 | 
			
		||||
        switch (TRUE) {
 | 
			
		||||
          // Term record with node grant changes.
 | 
			
		||||
          case ($tid && $update_nodes):
 | 
			
		||||
            $update_terms[$tid] =
 | 
			
		||||
              _taxonomy_access_format_grant_record($tid, $rid, $grants);
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
          // Term record and no node grant changes.
 | 
			
		||||
          case ($tid && !$update_nodes):
 | 
			
		||||
            $skip_terms[$tid] =
 | 
			
		||||
              _taxonomy_access_format_grant_record($tid, $rid, $grants);
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
          // Vocab record with node grant changes.
 | 
			
		||||
          case (!$tid && $update_nodes):
 | 
			
		||||
            $update_defaults[$vid] =
 | 
			
		||||
              _taxonomy_access_format_grant_record($vid, $rid, $grants, TRUE);
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
          // Vocab record and no node grant changes.
 | 
			
		||||
          case (!$tid && !$update_nodes):
 | 
			
		||||
            $skip_defaults[$vid] =
 | 
			
		||||
              _taxonomy_access_format_grant_record($vid, $rid, $grants, TRUE);
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Process each set.
 | 
			
		||||
  if (!empty($update_terms)) {
 | 
			
		||||
    taxonomy_access_set_term_grants($update_terms);
 | 
			
		||||
  }
 | 
			
		||||
  if (!empty($skip_terms)) {
 | 
			
		||||
    taxonomy_access_set_term_grants($skip_terms, FALSE);
 | 
			
		||||
  }
 | 
			
		||||
  if (!empty($update_defaults)) {
 | 
			
		||||
    taxonomy_access_set_default_grants($update_defaults);
 | 
			
		||||
  }
 | 
			
		||||
  if (!empty($skip_defaults)) {
 | 
			
		||||
    taxonomy_access_set_default_grants($skip_defaults, FALSE);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Generates HTML markup with form instructions for the admin form.
 | 
			
		||||
 *
 | 
			
		||||
 * @return
 | 
			
		||||
 *   Instructions HTML string.
 | 
			
		||||
 */
 | 
			
		||||
function _taxonomy_access_admin_instructions_html() {
 | 
			
		||||
  $instructions = '';
 | 
			
		||||
  $instructions .= ''
 | 
			
		||||
    . "<br /><br />"
 | 
			
		||||
    . "<div class=\"instructions\">"
 | 
			
		||||
    . "<h2>" . t("Explanation of fields") . "</h2>"
 | 
			
		||||
    . _taxonomy_access_grant_help_table()
 | 
			
		||||
    . "<p>"
 | 
			
		||||
    . t('Options for View, Update, and Delete are <em>Allow</em> (<acronym title="Allow">A</acronym>), <em>Ignore</em> (<acronym title="Ignore">I</acronym>), and <em>Deny</em> (<acronym title="Deny">D</acronym>).')
 | 
			
		||||
    . "</p>\n\n"
 | 
			
		||||
    . "<ul>\n"
 | 
			
		||||
    . "<li>"
 | 
			
		||||
    . t('<em>Deny</em> (<acronym title="Deny">D</acronym>) overrides <em>Allow</em> (<acronym title="Allow">A</acronym>) within this role.')
 | 
			
		||||
    . "</li>"
 | 
			
		||||
    . "<li>"
 | 
			
		||||
    . t('Both <em>Allow</em> (<acronym title="Allow">A</acronym>) and <em>Deny</em> (<acronym title="Deny">D</acronym>) override <em>Ignore</em> (<acronym title="Ignore">I</acronym>) within this role.')
 | 
			
		||||
    . "</li>"
 | 
			
		||||
    . "<li>"
 | 
			
		||||
    . t('If a user has <strong>multiple roles</strong>, an <em>Allow</em> (<acronym title="Allow">A</acronym>) from another role <strong>will</strong> override a <em>Deny</em> (<acronym title="Deny">D</acronym>) here.')
 | 
			
		||||
    . "</li>"
 | 
			
		||||
    . "</ul>\n\n"
 | 
			
		||||
    ;
 | 
			
		||||
  if (arg(4) != DRUPAL_ANONYMOUS_RID && arg(4) != DRUPAL_AUTHENTICATED_RID) {
 | 
			
		||||
    // Role other than Anonymous or Authenticated
 | 
			
		||||
    $instructions .= ''
 | 
			
		||||
      . "<p>"
 | 
			
		||||
      . t('<strong>Remember:</strong> This role <strong>will</strong> inherit permissions from the <em>authenticated user</em> role.  Be sure to <a href="@url">configure the authenticated user</a> properly.',
 | 
			
		||||
        array("@url" => url(
 | 
			
		||||
            TAXONOMY_ACCESS_CONFIG
 | 
			
		||||
            . "/role/"
 | 
			
		||||
            .  DRUPAL_AUTHENTICATED_RID
 | 
			
		||||
            . '/edit')))
 | 
			
		||||
      . "</p>\n\n"
 | 
			
		||||
      ;
 | 
			
		||||
  }
 | 
			
		||||
  $instructions .= ''
 | 
			
		||||
    . "<p>"
 | 
			
		||||
    . t('For more information and for troubleshooting guidelines, see the <a href="@help">help page</a> and the !readme.',
 | 
			
		||||
      array(
 | 
			
		||||
        '@help' => url('admin/help/taxonomy_access'),
 | 
			
		||||
        '!readme' => "<code>README.txt</code>"
 | 
			
		||||
      ))
 | 
			
		||||
    . "</p>\n\n"
 | 
			
		||||
    . "</div>\n\n"
 | 
			
		||||
    ;
 | 
			
		||||
 | 
			
		||||
  return $instructions;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,873 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * Implements the Add Tag (create) grant on editing forms.
 | 
			
		||||
 *
 | 
			
		||||
 * These functions need to be included in three circumstances:
 | 
			
		||||
 * - Form building for forms with taxonomy fields.
 | 
			
		||||
 *   - taxonomy_access_field_widget_form_alter()
 | 
			
		||||
 *   - taxonomy_access_field_widget_taxonomy_autocomplete_form_alter()
 | 
			
		||||
 * - Form validation for forms with taxonomy fields.
 | 
			
		||||
 *   - taxonomy_access_autocomplete_validate()
 | 
			
		||||
 *   - taxonomy_access_options_validate()
 | 
			
		||||
 *   - taxonomy_access_field_attach_validate()
 | 
			
		||||
 * - Taxonomy autocomplete AJAX requests.
 | 
			
		||||
 *   - taxonomy_access_autocomplete()
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @defgroup tac_create Taxonomy Access Control: Add tag (create) permission
 | 
			
		||||
 * @{
 | 
			
		||||
 * Implement access control for taxonomy terms on node editing forms.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Implements the create grant for autocomplete fields.
 | 
			
		||||
 *
 | 
			
		||||
 * - Denies access if the user cannot alter the field values.
 | 
			
		||||
 * - Determines whether the user can autocreate new terms for the field.
 | 
			
		||||
 * - Removes default values disallowed by create.
 | 
			
		||||
 * - Adds information on autocreate and disallowed defaults to the element so
 | 
			
		||||
 *   it is available to the validator.
 | 
			
		||||
 * - Adds the custom validator.
 | 
			
		||||
 * - Sets a custom autocomplete path to filter autocomplete by create.
 | 
			
		||||
 *
 | 
			
		||||
 * Some of the logic here is borrowed from taxonomy_autocomplete_validate().
 | 
			
		||||
 *
 | 
			
		||||
 * @see taxonomy_access_field_widget_taxonomy_autocomplete_form_alter()
 | 
			
		||||
 */
 | 
			
		||||
function _taxonomy_access_autocomplete_alter(&$element, &$form_state, $context) {
 | 
			
		||||
 | 
			
		||||
  // Collect a list of terms and filter out those disallowed by create.
 | 
			
		||||
  $filtered = array();
 | 
			
		||||
  foreach ($context['items'] as $item) {
 | 
			
		||||
    $filtered[$item['tid']] = $item;
 | 
			
		||||
  }
 | 
			
		||||
  $disallowed_defaults = taxonomy_access_create_disallowed(array_keys($filtered));
 | 
			
		||||
  foreach ($disallowed_defaults as $tid) {
 | 
			
		||||
    unset($filtered[$tid]);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Assemble a list of all vocabularies for the field.
 | 
			
		||||
  $vids = array();
 | 
			
		||||
  foreach ($context['field']['settings']['allowed_values'] as $tree) {
 | 
			
		||||
    if ($vocab = taxonomy_vocabulary_machine_name_load($tree['vocabulary'])) {
 | 
			
		||||
      $vids[] = $vocab->vid;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Determine whether the user has create for any terms in the given vocabs.
 | 
			
		||||
  $allowed_terms = FALSE;
 | 
			
		||||
  foreach ($vids as $vid) {
 | 
			
		||||
    $terms = taxonomy_access_user_create_terms_by_vocab($vid);
 | 
			
		||||
    if (!empty($terms)) {
 | 
			
		||||
      $allowed_terms = TRUE;
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Filter the vids to vocabs in which the user may create new terms.
 | 
			
		||||
  $allowed_vids = taxonomy_access_create_default_allowed($vids);
 | 
			
		||||
 | 
			
		||||
  // If the field already has the maximum number of values, and all of these
 | 
			
		||||
  // values are disallowed, deny access to the field.
 | 
			
		||||
  if ($context['field']['cardinality'] != FIELD_CARDINALITY_UNLIMITED) {
 | 
			
		||||
    if (sizeof($disallowed_defaults) >= $context['field']['cardinality']) {
 | 
			
		||||
      $element['#access'] = FALSE;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // If the user may not create any terms on this field, deny access.
 | 
			
		||||
  if (empty($allowed_vids) && !$allowed_terms) {
 | 
			
		||||
    $element['#access'] = FALSE;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Set the default value from the filtered item list.
 | 
			
		||||
  $element['#default_value'] =
 | 
			
		||||
    taxonomy_access_autocomplete_default_value($filtered);
 | 
			
		||||
 | 
			
		||||
  // Custom validation.  Set values for the validator indicating:
 | 
			
		||||
  // 1. Whether the user can autocreate terms in this field (vocab. default).
 | 
			
		||||
  // 2. Which tids were removed due to create restrictions.
 | 
			
		||||
  $element['#allow_autocreate'] = empty($allowed_vids) ? FALSE : TRUE;
 | 
			
		||||
  $element['#disallowed_defaults'] = $disallowed_defaults;
 | 
			
		||||
  $element['#element_validate'] =
 | 
			
		||||
    array('taxonomy_access_autocomplete_validate');
 | 
			
		||||
 | 
			
		||||
  // Use a custom autocomplete path to filter by create rather than list.
 | 
			
		||||
  $element['#autocomplete_path'] =
 | 
			
		||||
    'taxonomy_access/autocomplete/' . $context['field']['field_name'];
 | 
			
		||||
 | 
			
		||||
  unset($context);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Implements the create grant for options widgets.
 | 
			
		||||
 *
 | 
			
		||||
 * - Denies access if the user cannot alter the field values.
 | 
			
		||||
 * - Attaches jQuery to disable values disallowed by create.
 | 
			
		||||
 * - Adds the disallowed values from the element so they are available to the
 | 
			
		||||
 *   custom validator.
 | 
			
		||||
 * - Adds the custom validator.
 | 
			
		||||
 *
 | 
			
		||||
 * We use jQuery to disable the options because of FAPI limitations:
 | 
			
		||||
 * @see http://drupal.org/node/284917
 | 
			
		||||
 * @see http://drupal.org/node/342316
 | 
			
		||||
 * @see http://drupal.org/node/12089
 | 
			
		||||
 *
 | 
			
		||||
 * @see taxonomy_access_field_widget_form_alter()
 | 
			
		||||
 */
 | 
			
		||||
function _taxonomy_access_options_alter(&$element, &$form_state, $context) {
 | 
			
		||||
 | 
			
		||||
  // Check for an existing entity ID.
 | 
			
		||||
  $entity_id = 0;
 | 
			
		||||
  if (!empty($form_state['build_info']['args'][0])) {
 | 
			
		||||
    $info = entity_get_info($context['instance']['entity_type']);
 | 
			
		||||
    $pseudo_entity = (object) $form_state['build_info']['args'][0];
 | 
			
		||||
    if (isset($pseudo_entity->{$info['entity keys']['id']})) {
 | 
			
		||||
      $entity_id = $pseudo_entity->{$info['entity keys']['id']};
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  // Collect a list of terms and determine which are allowed
 | 
			
		||||
  $tids = array_keys($element['#options']);
 | 
			
		||||
 | 
			
		||||
  // Ignore the "none" option if present.
 | 
			
		||||
  $key = array_search('_none', $tids);
 | 
			
		||||
  if ($key !== FALSE) {
 | 
			
		||||
    unset($tids[$key]);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  $allowed_tids = taxonomy_access_create_allowed($tids);
 | 
			
		||||
  $disallowed_tids = taxonomy_access_create_disallowed($tids);
 | 
			
		||||
 | 
			
		||||
  // If no options are allowed, deny access to the field.
 | 
			
		||||
  if (empty($allowed_tids)) {
 | 
			
		||||
    $element['#access'] = FALSE;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // On node creation, simply remove disallowed default values.
 | 
			
		||||
  if (!$entity_id) {
 | 
			
		||||
    $disallowed_defaults = array();
 | 
			
		||||
    if (is_array($element['#default_value'])) {
 | 
			
		||||
      foreach ($element['#default_value'] as $key => $value) {
 | 
			
		||||
        if (in_array($value, $disallowed_tids)) {
 | 
			
		||||
          unset($element['#default_value'][0]);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    elseif (in_array($element['#default_value'], $disallowed_tids)) {
 | 
			
		||||
      unset($element['#default_value']);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  // If the node already exists, check:
 | 
			
		||||
  // 1. Whether the field already has the maximum number of values
 | 
			
		||||
  // 2. Whether all of these values are disallowed.
 | 
			
		||||
  // If both these things are true, then the user cannot edit the field's
 | 
			
		||||
  // value, so disallow access.
 | 
			
		||||
  else {
 | 
			
		||||
    $defaults =
 | 
			
		||||
      is_array($element['#default_value'])
 | 
			
		||||
      ? $element['#default_value']
 | 
			
		||||
      : array($element['#default_value'])
 | 
			
		||||
      ;
 | 
			
		||||
 | 
			
		||||
    $disallowed_defaults =
 | 
			
		||||
      array_intersect($defaults, $disallowed_tids);
 | 
			
		||||
 | 
			
		||||
    if ($context['field']['cardinality'] != FIELD_CARDINALITY_UNLIMITED) {
 | 
			
		||||
      if (sizeof($disallowed_defaults) >= $context['field']['cardinality']) {
 | 
			
		||||
        $element['#access'] = FALSE;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // If there are disallowed, terms, add CSS and JS for jQuery.
 | 
			
		||||
  // We use jQuery because FAPI does not currently support attributes
 | 
			
		||||
  // for individual options.
 | 
			
		||||
  if (!empty($disallowed_tids)) {
 | 
			
		||||
 | 
			
		||||
    // Add a css class to the field that we can use in jQuery.
 | 
			
		||||
    $class_name = 'tac_' . $element['#field_name'];
 | 
			
		||||
    $element['#attributes']['class'][] = $class_name;
 | 
			
		||||
 | 
			
		||||
    // Add js for disabling create options.
 | 
			
		||||
    $settings[] = array(
 | 
			
		||||
      'field' => $class_name,
 | 
			
		||||
      'disallowed_tids' => $disallowed_tids,
 | 
			
		||||
      'disallowed_defaults' => $disallowed_defaults,
 | 
			
		||||
    );
 | 
			
		||||
    $element['#attached']['js'][] =
 | 
			
		||||
      drupal_get_path('module', 'taxonomy_access') . '/tac_create.js';
 | 
			
		||||
    $element['#attached']['js'][] = array(
 | 
			
		||||
      'data' => array('taxonomy_access' => $settings),
 | 
			
		||||
      'type' => 'setting',
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  $element['#disallowed_defaults'] = $disallowed_defaults;
 | 
			
		||||
  $element['#element_validate'] = array('taxonomy_access_options_validate');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Retrieve terms that the current user may create.
 | 
			
		||||
 *
 | 
			
		||||
 * @return array|true
 | 
			
		||||
 *   An array of term IDs, or TRUE if the user may create all terms.
 | 
			
		||||
 *
 | 
			
		||||
 * @see taxonomy_access_user_create_terms_by_vocab()
 | 
			
		||||
 * @see _taxonomy_access_user_term_grants()
 | 
			
		||||
 */
 | 
			
		||||
function taxonomy_access_user_create_terms() {
 | 
			
		||||
  // Cache the terms the current user can create.
 | 
			
		||||
  $terms = &drupal_static(__FUNCTION__, NULL);
 | 
			
		||||
  if (is_null($terms)) {
 | 
			
		||||
    $terms = _taxonomy_access_user_term_grants(TRUE);
 | 
			
		||||
  }
 | 
			
		||||
  return $terms;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Retrieve terms that the current user may create in specific vocabularies.
 | 
			
		||||
 *
 | 
			
		||||
 * @param int $vid
 | 
			
		||||
 *   A vid to use as a filter.
 | 
			
		||||
 *
 | 
			
		||||
 * @return array|true
 | 
			
		||||
 *   An array of term IDs, or TRUE if the user may create all terms.
 | 
			
		||||
 *
 | 
			
		||||
 * @see taxonomy_access_user_create_terms()
 | 
			
		||||
 * @see _taxonomy_access_user_term_grants()
 | 
			
		||||
 */
 | 
			
		||||
function taxonomy_access_user_create_terms_by_vocab($vid) {
 | 
			
		||||
  // Cache the terms the current user can create per vocabulary.
 | 
			
		||||
  static $terms = array();
 | 
			
		||||
  if (!isset($terms[$vid])) {
 | 
			
		||||
    $terms[$vid] = _taxonomy_access_user_term_grants(TRUE, array($vid));
 | 
			
		||||
  }
 | 
			
		||||
  return $terms[$vid];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Retrieve terms that the current user may create.
 | 
			
		||||
 *
 | 
			
		||||
 * @return array|true
 | 
			
		||||
 *   An array of term IDs, or TRUE if the user may create all terms.
 | 
			
		||||
 *
 | 
			
		||||
 * @see _taxonomy_access_create_defaults()
 | 
			
		||||
 */
 | 
			
		||||
function taxonomy_access_user_create_defaults() {
 | 
			
		||||
  // Cache the terms the current user can create.
 | 
			
		||||
  static $vids = NULL;
 | 
			
		||||
  if (is_null($vids)) {
 | 
			
		||||
    $vids = _taxonomy_access_create_defaults();
 | 
			
		||||
  }
 | 
			
		||||
  return $vids;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Check a list of term IDs for terms the user may not create.
 | 
			
		||||
 *
 | 
			
		||||
 * @param array $tids
 | 
			
		||||
 *   The array of term IDs.
 | 
			
		||||
 *
 | 
			
		||||
 * @return array
 | 
			
		||||
 *   An array of disallowed term IDs.
 | 
			
		||||
 */
 | 
			
		||||
function taxonomy_access_create_disallowed(array $tids) {
 | 
			
		||||
  $all_allowed = taxonomy_access_user_create_terms();
 | 
			
		||||
 | 
			
		||||
  // If the user's create grant info is exactly TRUE, no terms are disallowed.
 | 
			
		||||
  if ($all_allowed === TRUE) {
 | 
			
		||||
    return array();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return array_diff($tids, $all_allowed);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Filter a list of term IDs to terms the user may create.
 | 
			
		||||
 *
 | 
			
		||||
 * @param array $tids
 | 
			
		||||
 *   The array of term IDs.
 | 
			
		||||
 *
 | 
			
		||||
 * @return array
 | 
			
		||||
 *   An array of disallowed term IDs.
 | 
			
		||||
 */
 | 
			
		||||
function taxonomy_access_create_allowed(array $tids) {
 | 
			
		||||
  $all_allowed = taxonomy_access_user_create_terms();
 | 
			
		||||
 | 
			
		||||
  // If the user's create grant info is exactly TRUE, all terms are allowed.
 | 
			
		||||
  if ($all_allowed === TRUE) {
 | 
			
		||||
    return $tids;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return array_intersect($tids, $all_allowed);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Filter a list of vocab IDs to those in which the user may create by default.
 | 
			
		||||
 *
 | 
			
		||||
 * @param array $vids
 | 
			
		||||
 *   The array of vocabulary IDs.
 | 
			
		||||
 *
 | 
			
		||||
 * @return array
 | 
			
		||||
 *   An array of disallowed vocabulary IDs.
 | 
			
		||||
 */
 | 
			
		||||
function taxonomy_access_create_default_allowed(array $vids) {
 | 
			
		||||
  $all_allowed = taxonomy_access_user_create_defaults();
 | 
			
		||||
 | 
			
		||||
  // If the user's create grant info is exactly TRUE, all terms are allowed.
 | 
			
		||||
  if ($all_allowed === TRUE) {
 | 
			
		||||
    return $vids;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return array_intersect($vids, $all_allowed);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Retrieve vocabularies in which the current user may create terms.
 | 
			
		||||
 *
 | 
			
		||||
 * @param object|null $account
 | 
			
		||||
 *   (optional) The account for which to retrieve grants.  If no account is
 | 
			
		||||
 *   passed, the current user will be used.  Defaults to NULL.
 | 
			
		||||
 *
 | 
			
		||||
 * @return array
 | 
			
		||||
 *   An array of term IDs, or TRUE if the user has the grant for all terms.
 | 
			
		||||
 */
 | 
			
		||||
function _taxonomy_access_create_defaults($account = NULL) {
 | 
			
		||||
 | 
			
		||||
  // If the user can administer taxonomy, return TRUE for a global grant.
 | 
			
		||||
  if (user_access('administer taxonomy', $account)) {
 | 
			
		||||
    return TRUE;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Build a term grant query.
 | 
			
		||||
  $query = _taxonomy_access_grant_query(array('create'), TRUE);
 | 
			
		||||
 | 
			
		||||
  // Select term grants for the current user's roles.
 | 
			
		||||
  if (is_null($account)) {
 | 
			
		||||
    global $user;
 | 
			
		||||
    $account = $user;
 | 
			
		||||
  }
 | 
			
		||||
  $query
 | 
			
		||||
    ->fields('td', array('vid'))
 | 
			
		||||
    ->groupBy('td.vid')
 | 
			
		||||
    ->condition('tadg.rid', array_keys($account->roles), 'IN')
 | 
			
		||||
    ;
 | 
			
		||||
 | 
			
		||||
  // Fetch term IDs.
 | 
			
		||||
  $r = $query->execute()->fetchAll();
 | 
			
		||||
  $vids = array();
 | 
			
		||||
 | 
			
		||||
  // If there are results, initialize a flag to test whether the user
 | 
			
		||||
  // has the grant for all terms.
 | 
			
		||||
  $grants_for_all_vocabs = empty($r) ? FALSE : TRUE;
 | 
			
		||||
 | 
			
		||||
  foreach ($r as $record) {
 | 
			
		||||
    // If the user has the grant, add the term to the array.
 | 
			
		||||
    if ($record->grant_create) {
 | 
			
		||||
      $vids[] = $record->vid;
 | 
			
		||||
    }
 | 
			
		||||
    // Otherwise, flag that the user does not have the grant for all terms.
 | 
			
		||||
    else {
 | 
			
		||||
      $grants_for_all_vocabs = FALSE;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // If the user has the grant for all terms, return TRUE for a global grant.
 | 
			
		||||
  if ($grants_for_all_vocabs) {
 | 
			
		||||
    return TRUE;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return $vids;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Autocomplete menu callback: filter allowed terms by create, not list.
 | 
			
		||||
 *
 | 
			
		||||
 * For now we essentially duplicate the code from taxonomy.module, because
 | 
			
		||||
 * it calls drupal_json_output without providing the logic separately.
 | 
			
		||||
 *
 | 
			
		||||
 * @see http://drupal.org/node/1169964
 | 
			
		||||
 * @see taxonomy_autocomplete()
 | 
			
		||||
 */
 | 
			
		||||
function taxonomy_access_autocomplete($field_name, $tags_typed = '') {
 | 
			
		||||
  // Enforce that list grants do not filter the autocomplete.
 | 
			
		||||
  taxonomy_access_disable_list();
 | 
			
		||||
 | 
			
		||||
  $field = field_info_field($field_name);
 | 
			
		||||
 | 
			
		||||
  // The user enters a comma-separated list of tags. We only autocomplete the last tag.
 | 
			
		||||
  $tags_typed = drupal_explode_tags($tags_typed);
 | 
			
		||||
  $tag_last = drupal_strtolower(array_pop($tags_typed));
 | 
			
		||||
 | 
			
		||||
  $matches = array();
 | 
			
		||||
  if ($tag_last != '') {
 | 
			
		||||
 | 
			
		||||
    // Part of the criteria for the query come from the field's own settings.
 | 
			
		||||
    $vids = array();
 | 
			
		||||
    $vocabularies = taxonomy_vocabulary_get_names();
 | 
			
		||||
    foreach ($field['settings']['allowed_values'] as $tree) {
 | 
			
		||||
      $vids[] = $vocabularies[$tree['vocabulary']]->vid;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $query = db_select('taxonomy_term_data', 't');
 | 
			
		||||
    $query->addTag('translatable');
 | 
			
		||||
    $query->addTag('term_access');
 | 
			
		||||
 | 
			
		||||
    // Do not select already entered terms.
 | 
			
		||||
    if (!empty($tags_typed)) {
 | 
			
		||||
      $query->condition('t.name', $tags_typed, 'NOT IN');
 | 
			
		||||
    }
 | 
			
		||||
    // Select rows that match by term name.
 | 
			
		||||
    $tags_return = $query
 | 
			
		||||
      ->fields('t', array('tid', 'name'))
 | 
			
		||||
      ->condition('t.vid', $vids)
 | 
			
		||||
      ->condition('t.name', '%' . db_like($tag_last) . '%', 'LIKE')
 | 
			
		||||
      ->range(0, 10)
 | 
			
		||||
      ->execute()
 | 
			
		||||
      ->fetchAllKeyed();
 | 
			
		||||
 | 
			
		||||
    // Unset suggestions disallowed by create grants.
 | 
			
		||||
    $disallowed = taxonomy_access_create_disallowed(array_keys($tags_return));
 | 
			
		||||
    foreach ($disallowed as $tid) {
 | 
			
		||||
      unset($tags_return[$tid]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $prefix = count($tags_typed) ? drupal_implode_tags($tags_typed) . ', ' : '';
 | 
			
		||||
 | 
			
		||||
    $term_matches = array();
 | 
			
		||||
    foreach ($tags_return as $tid => $name) {
 | 
			
		||||
      $n = $name;
 | 
			
		||||
      // Term names containing commas or quotes must be wrapped in quotes.
 | 
			
		||||
      if (strpos($name, ',') !== FALSE || strpos($name, '"') !== FALSE) {
 | 
			
		||||
        $n = '"' . str_replace('"', '""', $name) . '"';
 | 
			
		||||
      }
 | 
			
		||||
      $term_matches[$prefix . $n] = check_plain($name);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  drupal_json_output($term_matches);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Validates taxonomy autocomplete values for create grants.
 | 
			
		||||
 *
 | 
			
		||||
 * For now we essentially duplicate the code from taxonomy.module, because
 | 
			
		||||
 * it calls form_set_value() without providing the logic separately.
 | 
			
		||||
 *
 | 
			
		||||
 * We use two properties set in hook_field_widget_form_alter():
 | 
			
		||||
 *  - $element['#allow_autocreate']
 | 
			
		||||
 *  - $element['#disallowed_defaults']
 | 
			
		||||
 *
 | 
			
		||||
 * @todo
 | 
			
		||||
 *   Specify autocreate per vocabulary?
 | 
			
		||||
 *
 | 
			
		||||
 * @see taxonomy_autocomplete_validate()
 | 
			
		||||
 * @see taxonomy_access_autocomplete()
 | 
			
		||||
 * @see taxonomy_access_field_widget_taxonomy_autocomplete_form_alter()
 | 
			
		||||
 */
 | 
			
		||||
function _taxonomy_access_autocomplete_validate($element, &$form_state) {
 | 
			
		||||
  // Autocomplete widgets do not send their tids in the form, so we must detect
 | 
			
		||||
  // them here and process them independently.
 | 
			
		||||
  $value = array();
 | 
			
		||||
  if ($tags = $element['#value']) {
 | 
			
		||||
    // Collect candidate vocabularies.
 | 
			
		||||
    $field = field_widget_field($element, $form_state);
 | 
			
		||||
    $vocabularies = array();
 | 
			
		||||
    foreach ($field['settings']['allowed_values'] as $tree) {
 | 
			
		||||
      if ($vocabulary = taxonomy_vocabulary_machine_name_load($tree['vocabulary'])) {
 | 
			
		||||
        $vocabularies[$vocabulary->vid] = $vocabulary;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Translate term names into actual terms.
 | 
			
		||||
    $typed_terms = drupal_explode_tags($tags);
 | 
			
		||||
    foreach ($typed_terms as $typed_term) {
 | 
			
		||||
      // See if the term exists in the chosen vocabulary and return the tid;
 | 
			
		||||
      // otherwise, create a new 'autocreate' term for insert/update.
 | 
			
		||||
      if ($possibilities = taxonomy_term_load_multiple(array(), array('name' => trim($typed_term), 'vid' => array_keys($vocabularies)))) {
 | 
			
		||||
        $term = array_pop($possibilities);
 | 
			
		||||
      }
 | 
			
		||||
      // Only autocreate if the user has create for the vocab. default.
 | 
			
		||||
      elseif ($element['#allow_autocreate']) {
 | 
			
		||||
        $vocabulary = reset($vocabularies);
 | 
			
		||||
        $term = array(
 | 
			
		||||
          'tid' => 'autocreate',
 | 
			
		||||
          'vid' => $vocabulary->vid,
 | 
			
		||||
          'name' => $typed_term,
 | 
			
		||||
          'vocabulary_machine_name' => $vocabulary->machine_name,
 | 
			
		||||
        );
 | 
			
		||||
      }
 | 
			
		||||
      // If they cannot autocreate and this is a new term, set an error.
 | 
			
		||||
      else {
 | 
			
		||||
        form_error(
 | 
			
		||||
          $element,
 | 
			
		||||
          t('You may not create new tags in %name.',
 | 
			
		||||
            array('%name' => t($element['#title']))
 | 
			
		||||
          )
 | 
			
		||||
        );
 | 
			
		||||
      }
 | 
			
		||||
      if ($term) {
 | 
			
		||||
        $value[] = (array) $term;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Add in the terms that were disallowed.
 | 
			
		||||
  // taxonomy.module expects arrays, not objects.
 | 
			
		||||
  $disallowed = taxonomy_term_load_multiple($element['#disallowed_defaults']);
 | 
			
		||||
  foreach ($disallowed as $key => $term) {
 | 
			
		||||
    $disallowed[$key] = (array) $term;
 | 
			
		||||
  }
 | 
			
		||||
  $value = array_merge($value, $disallowed);
 | 
			
		||||
 | 
			
		||||
  // Subsequent validation will be handled by hook_field_attach_validate().
 | 
			
		||||
  // Set the value in the form.
 | 
			
		||||
  form_set_value($element, $value, $form_state);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Form element validation handler for taxonomy option fields.
 | 
			
		||||
 *
 | 
			
		||||
 * We use a property set in hook_field_widget_form_alter():
 | 
			
		||||
 *  - $element['#disallowed_defaults']
 | 
			
		||||
 *
 | 
			
		||||
 * @see options_field_widget_validate()
 | 
			
		||||
 * @see taxonomy_access_field_widget_form_alter()
 | 
			
		||||
 */
 | 
			
		||||
function _taxonomy_access_options_validate($element, &$form_state) {
 | 
			
		||||
  if ($element['#required'] && $element['#value'] == '_none') {
 | 
			
		||||
    form_error($element, t('!name field is required.', array('!name' => $element['#title'])));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Clone the element and add in disallowed defaults.
 | 
			
		||||
  $el = $element;
 | 
			
		||||
  if (!empty($element['#disallowed_defaults'])) {
 | 
			
		||||
    if (empty($el['#value'])) {
 | 
			
		||||
      $el['#value'] = $element['#disallowed_defaults'];
 | 
			
		||||
    }
 | 
			
		||||
    elseif (is_array($el['#value'])) {
 | 
			
		||||
      $el['#value'] = array_unique(array_merge($el['#value'], $element['#disallowed_defaults']));
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      $el['#value'] = array_unique(array_merge(array($el['#value']), $element['#disallowed_defaults']));
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Transpose selections from field => delta to delta => field, turning
 | 
			
		||||
  // multiple selected options into multiple parent elements.
 | 
			
		||||
  $items = _options_form_to_storage($el);
 | 
			
		||||
 | 
			
		||||
  // Subsequent validation will be handled by hook_field_attach_validate().
 | 
			
		||||
  // Set the value in the form.
 | 
			
		||||
  form_set_value($element, $items, $form_state);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Default value re-generation for autocomplete fields.
 | 
			
		||||
 *
 | 
			
		||||
 * @param array $items
 | 
			
		||||
 *   An array of values from form build info, filtered by create grants.
 | 
			
		||||
 *
 | 
			
		||||
 * @return string
 | 
			
		||||
 *   Field default value.
 | 
			
		||||
 *
 | 
			
		||||
 * @see taxonomy_field_widget_form()
 | 
			
		||||
 */
 | 
			
		||||
function taxonomy_access_autocomplete_default_value(array $items) {
 | 
			
		||||
  // Preserve the original state of the list flag.
 | 
			
		||||
  $flag_state = taxonomy_access_list_enabled();
 | 
			
		||||
 | 
			
		||||
  // Enforce that list grants do not filter the options list.
 | 
			
		||||
  taxonomy_access_disable_list();
 | 
			
		||||
 | 
			
		||||
  // Assemble list of tags.
 | 
			
		||||
  $tags = array();
 | 
			
		||||
  foreach ($items as $item) {
 | 
			
		||||
    $tags[$item['tid']] = isset($item['taxonomy_term']) ? $item['taxonomy_term'] : taxonomy_term_load($item['tid']);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Assemble the default value using taxonomy.module.
 | 
			
		||||
  $tags = taxonomy_implode_tags($tags);
 | 
			
		||||
 | 
			
		||||
  // Restore list flag to previous state.
 | 
			
		||||
  if ($flag_state) {
 | 
			
		||||
    taxonomy_access_enable_list();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return $tags;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Validates form submissions of taxonomy fields for create grants.
 | 
			
		||||
 *
 | 
			
		||||
 * @todo
 | 
			
		||||
 *   Use field label and term names in errors rather than field name and tids.
 | 
			
		||||
 *
 | 
			
		||||
 * @see http://drupal.org/node/1220212
 | 
			
		||||
 * @see entity_form_field_validate()
 | 
			
		||||
 */
 | 
			
		||||
function _taxonomy_access_field_validate($entity_type, $entity, &$errors) {
 | 
			
		||||
  // Check for a pre-existing entity (i.e., the entity is being updated).
 | 
			
		||||
  $old_fields = FALSE;
 | 
			
		||||
 | 
			
		||||
  // The entity is actually a "pseudo-entity," and the user profile form
 | 
			
		||||
  // neglects to include the uid. So, we need to load it manually.
 | 
			
		||||
  if ($entity_type == 'user') {
 | 
			
		||||
    // Some modules which extend the user profile form cause additional
 | 
			
		||||
    // validation to happen with "pseudo-entities" that do not include the
 | 
			
		||||
    // name. So, check if it exists.
 | 
			
		||||
    if (isset($entity->name)) {
 | 
			
		||||
      if ($account = user_load_by_name($entity->name)) {
 | 
			
		||||
        $entity->uid = $account->uid;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  list($entity_id, , $bundle) = entity_extract_ids($entity_type, $entity);
 | 
			
		||||
  if ($entity_id) {
 | 
			
		||||
    // Load the entity.
 | 
			
		||||
    $old_entity = entity_load($entity_type, array($entity_id));
 | 
			
		||||
    $old_entity = $old_entity[$entity_id];
 | 
			
		||||
 | 
			
		||||
    // Fetch the original entity's taxonomy fields.
 | 
			
		||||
    $old_fields =
 | 
			
		||||
      _taxonomy_access_entity_fields($entity_type, $old_entity, $bundle);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Fetch the updated entity's taxonomy fields.
 | 
			
		||||
  $new_fields =
 | 
			
		||||
    _taxonomy_access_entity_fields($entity_type, $entity, $bundle);
 | 
			
		||||
 | 
			
		||||
  // Set errors if there are any disallowed changes.
 | 
			
		||||
  $changes = _taxonomy_access_compare_fields($new_fields, $old_fields);
 | 
			
		||||
 | 
			
		||||
  // We care about the overall value list, so delta is not important.
 | 
			
		||||
  $delta = 0;
 | 
			
		||||
 | 
			
		||||
  // Check each field and langcode for disallowed changes.
 | 
			
		||||
  foreach ($changes as $field_name => $langcodes) {
 | 
			
		||||
    foreach ($langcodes as $langcode => $disallowed) {
 | 
			
		||||
      if ($disallowed) {
 | 
			
		||||
        if (!empty($disallowed['added'])) {
 | 
			
		||||
          $text = 'You may not add the following tags to %field: %tids';
 | 
			
		||||
          $errors[$field_name][$langcode][$delta][] = array(
 | 
			
		||||
            'error' => 'taxonomy_access_disallowed_added',
 | 
			
		||||
            'message' => t($text, array(
 | 
			
		||||
              '%field' => $field_name,
 | 
			
		||||
              '%tids' => implode(', ', $disallowed['added']),
 | 
			
		||||
            )),
 | 
			
		||||
          );
 | 
			
		||||
        }
 | 
			
		||||
        if (!empty($disallowed['removed'])) {
 | 
			
		||||
          $text = 'You may not remove the following tags from %field: %tids';
 | 
			
		||||
          $errors[$field_name][$langcode][$delta][] = array(
 | 
			
		||||
            'error' => 'taxonomy_access_disallowed_removed',
 | 
			
		||||
            'message' => t($text, array(
 | 
			
		||||
              '%field' => $field_name,
 | 
			
		||||
              '%tids' => implode(', ', $disallowed['removed']),
 | 
			
		||||
            )),
 | 
			
		||||
          );
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Helper function to extract the taxonomy fields from an entity.
 | 
			
		||||
 *
 | 
			
		||||
 * @param object $entity
 | 
			
		||||
 *   The entity object.
 | 
			
		||||
 *
 | 
			
		||||
 * @return array
 | 
			
		||||
 *   An associative array of field information, containing:
 | 
			
		||||
 *   - field_list: A flat array of all this entity's taxonomy fields, with the
 | 
			
		||||
 *     format $field_name => $field_name.
 | 
			
		||||
 *   - langcodes: A flat array of all langcodes in this entity's fields, with
 | 
			
		||||
 *     the format $langcode => $langcode.
 | 
			
		||||
 *   - data: An associative array of non-empty fields:
 | 
			
		||||
 *     - $field_name: An associative array keyed by langcode.
 | 
			
		||||
 *       - $langcode: Array of field values for this field name and langcode.
 | 
			
		||||
 *
 | 
			
		||||
 * @see http://drupal.org/node/1220168
 | 
			
		||||
 */
 | 
			
		||||
function _taxonomy_access_entity_fields($entity_type, $entity, $bundle) {
 | 
			
		||||
  // Maintain separate lists of field names and langcodes for quick comparison.
 | 
			
		||||
  $fields = array();
 | 
			
		||||
  $fields['field_list'] = array();
 | 
			
		||||
  $fields['langcodes'] = array();
 | 
			
		||||
  $fields['data'] = array();
 | 
			
		||||
 | 
			
		||||
  // If there is no entity, return the empty structure.
 | 
			
		||||
  if (!$entity) {
 | 
			
		||||
    return $fields;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Get a list of possible fields for the bundle.
 | 
			
		||||
  // The bundle does not contain the field type (see #122016), so our only use
 | 
			
		||||
  // for it is the field names.
 | 
			
		||||
  $possible = array_keys(field_info_instances($entity_type, $bundle));
 | 
			
		||||
 | 
			
		||||
  // Sort through the entity for relevant field data.
 | 
			
		||||
  foreach ($entity as $field_name => $field) {
 | 
			
		||||
 | 
			
		||||
    // Only proceed if this element is a valid field for the bundle.
 | 
			
		||||
    if (in_array($field_name, $possible, TRUE)) {
 | 
			
		||||
 | 
			
		||||
      // Check whether each entity field is a taxonomy field.
 | 
			
		||||
      $info = field_info_field($field_name);
 | 
			
		||||
      if ($info['type'] == 'taxonomy_term_reference') {
 | 
			
		||||
        foreach ($field as $langcode => $values) {
 | 
			
		||||
 | 
			
		||||
          // Add non-empty fields to the lists.
 | 
			
		||||
          if (!empty($values)) {
 | 
			
		||||
            $fields['langcodes'][$langcode] = $langcode;
 | 
			
		||||
            $fields['field_list'][$field_name] = $field_name;
 | 
			
		||||
            $fields['data'][$field_name][$langcode] = $values;
 | 
			
		||||
          }
 | 
			
		||||
          unset($values);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    unset($info);
 | 
			
		||||
    unset($field);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  unset($entity);
 | 
			
		||||
 | 
			
		||||
  return $fields;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Helper function to compare field values and look for disallowed changes.
 | 
			
		||||
 *
 | 
			
		||||
 * @param array $new
 | 
			
		||||
 *   An associative array of the updated field information as returned by
 | 
			
		||||
 *   _taxonomy_access_entity_fields().
 | 
			
		||||
 * @param array $old
 | 
			
		||||
 *   (optional) An associative array of the original field information,
 | 
			
		||||
 *   or FALSE if there is no original field data.  Defaults to FALSE.
 | 
			
		||||
 *
 | 
			
		||||
 * @return array
 | 
			
		||||
 *   An array of disallowed changes, with the structure:
 | 
			
		||||
 *   - $field_name: An associative array keyed by langcode.
 | 
			
		||||
 *     - $langcode: Disallowed changes for this field name and langcode,
 | 
			
		||||
 *       or FALSE if none.
 | 
			
		||||
 *       - 'added' => An array of added terms that are disallowed.
 | 
			
		||||
 *       - 'removed' => An array of removed termss that are disallowed.
 | 
			
		||||
 *
 | 
			
		||||
 * @see _taxonomy_access_entity_fields()
 | 
			
		||||
 * @see _taxonomy_access_disallowed_changes()
 | 
			
		||||
 */
 | 
			
		||||
function _taxonomy_access_compare_fields($new, $old = FALSE) {
 | 
			
		||||
  $disallowed_changes = array();
 | 
			
		||||
 | 
			
		||||
  // If there are no original fields, simply process new.
 | 
			
		||||
  if (!$old) {
 | 
			
		||||
    foreach ($new['data'] as $field_name => $langcodes) {
 | 
			
		||||
      foreach ($langcodes as $langcode => $values) {
 | 
			
		||||
        $changes = _taxonomy_access_disallowed_changes($values, array());
 | 
			
		||||
        if ($changes) {
 | 
			
		||||
          if (!isset($disallowed_changes[$field_name])) {
 | 
			
		||||
            $disallowed_changes[$field_name] = array();
 | 
			
		||||
          }
 | 
			
		||||
          $disallowed_changes[$field_name][$langcode] = $changes;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Otherwise, aggregate and compare field data.
 | 
			
		||||
  else {
 | 
			
		||||
    $all_fields = $new['field_list'] + $old['field_list'];
 | 
			
		||||
    $all_langcodes = $new['langcodes'] + $old['langcodes'];
 | 
			
		||||
 | 
			
		||||
    foreach ($all_fields as $field_name) {
 | 
			
		||||
      foreach ($all_langcodes as $langcode) {
 | 
			
		||||
        $new_values = array();
 | 
			
		||||
        if (isset($new['field_list'][$field_name])
 | 
			
		||||
          && isset($new['data'][$field_name][$langcode])) {
 | 
			
		||||
          $new_values = $new['data'][$field_name][$langcode];
 | 
			
		||||
        }
 | 
			
		||||
        $old_values = array();
 | 
			
		||||
        if (isset($old['field_list'][$field_name])
 | 
			
		||||
          && isset($old['data'][$field_name][$langcode])) {
 | 
			
		||||
          $old_values = $old['data'][$field_name][$langcode];
 | 
			
		||||
        }
 | 
			
		||||
        $changes = _taxonomy_access_disallowed_changes($new_values, $old_values);
 | 
			
		||||
        if ($changes) {
 | 
			
		||||
          if (!isset($disallowed_changes[$field_name])) {
 | 
			
		||||
            $disallowed_changes[$field_name] = array();
 | 
			
		||||
          }
 | 
			
		||||
          $disallowed_changes[$field_name][$langcode] = $changes;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  unset($old);
 | 
			
		||||
  unset($new);
 | 
			
		||||
  return $disallowed_changes;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Helper function to check for term reference changes disallowed by create.
 | 
			
		||||
 *
 | 
			
		||||
 * @param array $new_field
 | 
			
		||||
 *   The entity or form values of the updated field.
 | 
			
		||||
 * @param array $old_field
 | 
			
		||||
 *   The entity or form values of the original field.
 | 
			
		||||
 *
 | 
			
		||||
 * @return array|false
 | 
			
		||||
 *   Returns FALSE if there are no disallowed changes.  Otherwise, an array:
 | 
			
		||||
 *   - 'added' => An array of added terms that are disallowed.
 | 
			
		||||
 *   - 'removed' => An array of removed termss that are disallowed.
 | 
			
		||||
 */
 | 
			
		||||
function _taxonomy_access_disallowed_changes(array $new_field, array $old_field) {
 | 
			
		||||
 | 
			
		||||
  // Assemble a list of term IDs from the original entity, if any.
 | 
			
		||||
  $old_tids = array();
 | 
			
		||||
  foreach ($old_field as $old_item) {
 | 
			
		||||
    // Some things are NULL for some reason.
 | 
			
		||||
    if ($old_item['tid']) {
 | 
			
		||||
      $old_tids[] = $old_item['tid'];
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Assemble a list of term IDs from the updated entity.
 | 
			
		||||
  $new_tids = array();
 | 
			
		||||
  foreach ($new_field as $delta => $new_item) {
 | 
			
		||||
    // Some things are NULL for some reason.
 | 
			
		||||
    // Allow the special tid "autocreate" so users can create new terms.
 | 
			
		||||
    if ($new_item['tid'] && ($new_item['tid'] != 'autocreate')) {
 | 
			
		||||
      $new_tids[$delta] = $new_item['tid'];
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Check for added tids, and unset ones the user may not add.
 | 
			
		||||
  $added = array_diff($new_tids, $old_tids);
 | 
			
		||||
  $may_not_add = taxonomy_access_create_disallowed($added);
 | 
			
		||||
 | 
			
		||||
  // Check for removed tids, and restore ones the user may not remove.
 | 
			
		||||
  $removed = array_diff($old_tids, $new_tids);
 | 
			
		||||
  $may_not_remove = taxonomy_access_create_disallowed($removed);
 | 
			
		||||
 | 
			
		||||
  // If there were any disallowed changes, return them.
 | 
			
		||||
  if (!empty($may_not_add) || !empty($may_not_remove)) {
 | 
			
		||||
    return array('added' => $may_not_add, 'removed' => $may_not_remove);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Return FALSE if all changes were valid.
 | 
			
		||||
  return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * End of "defgroup tac_create".
 | 
			
		||||
 * @}
 | 
			
		||||
 */
 | 
			
		||||
@@ -0,0 +1,94 @@
 | 
			
		||||
table.grant_help th {
 | 
			
		||||
 vertical-align: top;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
table.grant_help td p {
 | 
			
		||||
 margin-top: 0px;
 | 
			
		||||
 margin-bottom: 8px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
table.grant_help em.perm {
 | 
			
		||||
  font-weight: bold;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
label.disabled {
 | 
			
		||||
  color: #999;
 | 
			
		||||
  font-style: italic;
 | 
			
		||||
}
 | 
			
		||||
.view-0,
 | 
			
		||||
.update-0,
 | 
			
		||||
.delete-0 {
 | 
			
		||||
  background-color: #fffce5;
 | 
			
		||||
}
 | 
			
		||||
.view-1,
 | 
			
		||||
.update-1,
 | 
			
		||||
.delete-1,
 | 
			
		||||
.create-1,
 | 
			
		||||
.list-1 {
 | 
			
		||||
  background-color: #e5ffe2;
 | 
			
		||||
}
 | 
			
		||||
.view-2,
 | 
			
		||||
.update-2,
 | 
			
		||||
.delete-2,
 | 
			
		||||
.create-0,
 | 
			
		||||
.list-0 {
 | 
			
		||||
 background-color: #fef5f1;
 | 
			
		||||
}
 | 
			
		||||
.taxonomy-access-grant-table {
 | 
			
		||||
  margin-top: 0.5em;
 | 
			
		||||
  margin-bottom: 0.5em;
 | 
			
		||||
  width: inherit;
 | 
			
		||||
}
 | 
			
		||||
.taxonomy-access-grant-table th.select-all {
 | 
			
		||||
  width: 2em;
 | 
			
		||||
}
 | 
			
		||||
.taxonomy-access-grant-table td.taxonomy-access-label {
 | 
			
		||||
  padding-right: 4em;
 | 
			
		||||
  min-width: 12em;
 | 
			
		||||
}
 | 
			
		||||
.taxonomy-access-grant-table td.taxonomy-access-default {
 | 
			
		||||
  font-style: italic;
 | 
			
		||||
  font-weight: bold;
 | 
			
		||||
}
 | 
			
		||||
.taxonomy-access-grant-table td.taxonomy-access-grant {
 | 
			
		||||
  width: 7em;
 | 
			
		||||
}
 | 
			
		||||
fieldset#edit-vocabs .fieldset-description {
 | 
			
		||||
  display: block;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * I apologize, because what follows is a hodgepodge to override the default
 | 
			
		||||
 * fieldset styling in both Seven and Bartik, and might not even work in some
 | 
			
		||||
 * themes.
 | 
			
		||||
 */
 | 
			
		||||
#taxonomy-access-admin-role fieldset {
 | 
			
		||||
  margin-bottom: 0.5em;
 | 
			
		||||
  margin-top: 0.5em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#taxonomy-access-admin-role fieldset.taxonomy-access-add.collapsible,
 | 
			
		||||
#taxonomy-access-admin-role fieldset.taxonomy-access-add.collapsed {
 | 
			
		||||
  margin-top: 0px;
 | 
			
		||||
  margin-bottom: 1em;
 | 
			
		||||
  border: none;
 | 
			
		||||
  background: none;
 | 
			
		||||
}
 | 
			
		||||
fieldset.taxonomy-access-add > legend {
 | 
			
		||||
  background: none;
 | 
			
		||||
  border: none;
 | 
			
		||||
  font-family: inherit;
 | 
			
		||||
  position: static;
 | 
			
		||||
}
 | 
			
		||||
fieldset.taxonomy-access-add > legend a {
 | 
			
		||||
  color: #0076bc;
 | 
			
		||||
}
 | 
			
		||||
fieldset.taxonomy-access-add  .fieldset-wrapper {
 | 
			
		||||
  margin-top: 0px;
 | 
			
		||||
  padding-top: 0.5em;
 | 
			
		||||
}
 | 
			
		||||
html.js fieldset.collapsible.taxonomy-access-add > legend .fieldset-legend,
 | 
			
		||||
html.js fieldset.collapsed.taxonomy-access-add > legend .fieldset-legend {
 | 
			
		||||
  background: transparent url(images/add.png) no-repeat 0 center;
 | 
			
		||||
  text-transform: none;
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,14 @@
 | 
			
		||||
name = Taxonomy Access Control
 | 
			
		||||
description = Access control for user roles based on taxonomy categories.
 | 
			
		||||
dependencies[] = taxonomy (>=7.8)
 | 
			
		||||
core = 7.x
 | 
			
		||||
configure = admin/config/people/taxonomy_access
 | 
			
		||||
 | 
			
		||||
files[] = taxonomy_access.test
 | 
			
		||||
 | 
			
		||||
; Information added by Drupal.org packaging script on 2015-09-19
 | 
			
		||||
version = "7.x-1.0"
 | 
			
		||||
core = "7.x"
 | 
			
		||||
project = "taxonomy_access"
 | 
			
		||||
datestamp = "1442635740"
 | 
			
		||||
 | 
			
		||||
@@ -0,0 +1,302 @@
 | 
			
		||||
<?php
 | 
			
		||||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 *  Install, update, and uninstall functions for Taxonomy Access Control.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Implements hook_update_last_removed().
 | 
			
		||||
 */
 | 
			
		||||
function taxonomy_access_last_removed() {
 | 
			
		||||
  return 5;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Implements hook_install().
 | 
			
		||||
 *
 | 
			
		||||
 * Adds tables to database: 'taxonomy_access_term', 'taxonomy_access_default'
 | 
			
		||||
 */
 | 
			
		||||
function taxonomy_access_install() {
 | 
			
		||||
 | 
			
		||||
  // Default global perms for roles 1 (anonymous) and 2 (authenticated).
 | 
			
		||||
  db_query(
 | 
			
		||||
    'INSERT INTO {taxonomy_access_default}
 | 
			
		||||
    (vid, rid, grant_view, grant_update, grant_delete, grant_create, grant_list)
 | 
			
		||||
    VALUES
 | 
			
		||||
    (:vid, :rid, :node_allow, :ignore, :ignore, :term_allow, :term_allow)',
 | 
			
		||||
    array(
 | 
			
		||||
      ':vid' => TAXONOMY_ACCESS_GLOBAL_DEFAULT,
 | 
			
		||||
      ':rid' => DRUPAL_ANONYMOUS_RID,
 | 
			
		||||
      ':node_allow' => TAXONOMY_ACCESS_NODE_ALLOW,
 | 
			
		||||
      ':ignore' => TAXONOMY_ACCESS_NODE_IGNORE,
 | 
			
		||||
      ':term_allow' => TAXONOMY_ACCESS_TERM_ALLOW)
 | 
			
		||||
  );
 | 
			
		||||
  db_query(
 | 
			
		||||
    'INSERT INTO {taxonomy_access_default}
 | 
			
		||||
    (vid, rid, grant_view, grant_update, grant_delete, grant_create, grant_list)
 | 
			
		||||
    VALUES
 | 
			
		||||
    (:vid, :rid, :node_allow, :ignore, :ignore, :term_allow, :term_allow)',
 | 
			
		||||
    array(
 | 
			
		||||
      ':vid' => TAXONOMY_ACCESS_GLOBAL_DEFAULT,
 | 
			
		||||
      ':rid' => DRUPAL_AUTHENTICATED_RID,
 | 
			
		||||
      ':node_allow' => TAXONOMY_ACCESS_NODE_ALLOW,
 | 
			
		||||
      ':ignore' => TAXONOMY_ACCESS_NODE_IGNORE,
 | 
			
		||||
      ':term_allow' => TAXONOMY_ACCESS_TERM_ALLOW)
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Implements hook_schema().
 | 
			
		||||
 */
 | 
			
		||||
function taxonomy_access_schema() {
 | 
			
		||||
  $schema = array();
 | 
			
		||||
 | 
			
		||||
  $schema['taxonomy_access_term'] = array(
 | 
			
		||||
    'description' => 'Identifies which roles may view, update, delete, create, and list nodes with a given term.',
 | 
			
		||||
    'fields' => array(
 | 
			
		||||
      'tid' => array(
 | 
			
		||||
        'description' => 'The term_data.tid this record affects.  Overrides vocabulary default in taxonomy_access_default.',
 | 
			
		||||
        'type' => 'int',
 | 
			
		||||
        'unsigned' => TRUE,
 | 
			
		||||
        'not null' => TRUE,
 | 
			
		||||
        'default' => TAXONOMY_ACCESS_VOCABULARY_DEFAULT,
 | 
			
		||||
      ),
 | 
			
		||||
      'rid' => array(
 | 
			
		||||
        'description' => "The role.rid a user must possess to gain this row's privileges on nodes for this term.",
 | 
			
		||||
        'type' => 'int',
 | 
			
		||||
        'unsigned' => TRUE,
 | 
			
		||||
        'not null' => TRUE,
 | 
			
		||||
        'default' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'grant_view' => array(
 | 
			
		||||
        'description' => 'Whether this role can view nodes with this term. 0=>Ignore, 1=>Allow, 2=>Deny.',
 | 
			
		||||
        'type' => 'int',
 | 
			
		||||
        'unsigned' => TRUE,
 | 
			
		||||
        'size' => 'tiny',
 | 
			
		||||
        'not null' => TRUE,
 | 
			
		||||
        'default' => TAXONOMY_ACCESS_NODE_IGNORE,
 | 
			
		||||
      ),
 | 
			
		||||
      'grant_update' => array(
 | 
			
		||||
        'description' => 'Whether this role can edit nodes with this term. 0=>Ignore, 1=>Allow, 2=>Deny.',
 | 
			
		||||
        'type' => 'int',
 | 
			
		||||
        'unsigned' => TRUE,
 | 
			
		||||
        'size' => 'tiny',
 | 
			
		||||
        'not null' => TRUE,
 | 
			
		||||
        'default' => TAXONOMY_ACCESS_NODE_IGNORE,
 | 
			
		||||
      ),
 | 
			
		||||
      'grant_delete' => array(
 | 
			
		||||
        'description' => 'Whether this role can delete nodes with this term. 0=>Ignore, 1=>Allow, 2=>Deny.',
 | 
			
		||||
        'type' => 'int',
 | 
			
		||||
        'unsigned' => TRUE,
 | 
			
		||||
        'size' => 'tiny',
 | 
			
		||||
        'not null' => TRUE,
 | 
			
		||||
        'default' => TAXONOMY_ACCESS_NODE_IGNORE,
 | 
			
		||||
      ),
 | 
			
		||||
      'grant_create' => array(
 | 
			
		||||
        'description' => 'Whether this role can set this term when adding or editing a node. 0=>No, 1=>Yes.',
 | 
			
		||||
        'type' => 'int',
 | 
			
		||||
        'unsigned' => TRUE,
 | 
			
		||||
        'size' => 'tiny',
 | 
			
		||||
        'not null' => TRUE,
 | 
			
		||||
        'default' => TAXONOMY_ACCESS_TERM_DENY,
 | 
			
		||||
      ),
 | 
			
		||||
      'grant_list' => array(
 | 
			
		||||
        'description' => 'Whether this role can view the name of this term on a node or in category lists. 0=>No, 1=>Yes.',
 | 
			
		||||
        'type' => 'int',
 | 
			
		||||
        'unsigned' => TRUE,
 | 
			
		||||
        'size' => 'tiny',
 | 
			
		||||
        'not null' => TRUE,
 | 
			
		||||
        'default' => TAXONOMY_ACCESS_TERM_ALLOW,
 | 
			
		||||
      ),
 | 
			
		||||
    ),
 | 
			
		||||
    'primary key' => array('tid', 'rid'),
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  $schema['taxonomy_access_default'] = array(
 | 
			
		||||
    'description' => 'Sets vocabulary defaults for which roles may view, update, delete, create, and list nodes with a given term. Overridden by {taxonomy_access_term}.',
 | 
			
		||||
    'fields' => array(
 | 
			
		||||
      'vid' => array(
 | 
			
		||||
        'description' => 'The vocabulary.vid for which this row sets defaults.',
 | 
			
		||||
        'type' => 'int',
 | 
			
		||||
        'unsigned' => TRUE,
 | 
			
		||||
        'not null' => TRUE,
 | 
			
		||||
        'default' => TAXONOMY_ACCESS_VOCABULARY_DEFAULT,
 | 
			
		||||
      ),
 | 
			
		||||
      'rid' => array(
 | 
			
		||||
        'description' => "The role.rid a user must possess to gain this row's privileges on nodes for terms in this vocabulary.",
 | 
			
		||||
        'type' => 'int',
 | 
			
		||||
        'unsigned' => TRUE,
 | 
			
		||||
        'not null' => TRUE,
 | 
			
		||||
        'default' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'grant_view' => array(
 | 
			
		||||
        'description' => 'Whether this role can view nodes with terms in this vocabulary. 0=>Ignore, 1=>Allow, 2=>Deny.',
 | 
			
		||||
        'type' => 'int',
 | 
			
		||||
        'unsigned' => TRUE,
 | 
			
		||||
        'size' => 'tiny',
 | 
			
		||||
        'not null' => TRUE,
 | 
			
		||||
        'default' => TAXONOMY_ACCESS_NODE_IGNORE,
 | 
			
		||||
      ),
 | 
			
		||||
      'grant_update' => array(
 | 
			
		||||
        'description' => 'Whether this role can edit nodes with terms in this vocabulary. 0=>Ignore, 1=>Allow, 2=>Deny.',
 | 
			
		||||
        'type' => 'int',
 | 
			
		||||
        'unsigned' => TRUE,
 | 
			
		||||
        'size' => 'tiny',
 | 
			
		||||
        'not null' => TRUE,
 | 
			
		||||
        'default' => TAXONOMY_ACCESS_NODE_IGNORE,
 | 
			
		||||
      ),
 | 
			
		||||
      'grant_delete' => array(
 | 
			
		||||
        'description' => 'Whether this role can delete nodes with terms in this vocabulary. 0=>Ignore, 1=>Allow, 2=>Deny.',
 | 
			
		||||
        'type' => 'int',
 | 
			
		||||
        'unsigned' => TRUE,
 | 
			
		||||
        'size' => 'tiny',
 | 
			
		||||
        'not null' => TRUE,
 | 
			
		||||
        'default' => TAXONOMY_ACCESS_NODE_IGNORE,
 | 
			
		||||
      ),
 | 
			
		||||
      'grant_create' => array(
 | 
			
		||||
        'description' => 'Whether this role can set terms in this vocabulary when adding or editing a node. 0=>No, 1=>Yes.',
 | 
			
		||||
        'type' => 'int',
 | 
			
		||||
        'unsigned' => TRUE,
 | 
			
		||||
        'size' => 'tiny',
 | 
			
		||||
        'not null' => TRUE,
 | 
			
		||||
        'default' => TAXONOMY_ACCESS_TERM_DENY,
 | 
			
		||||
      ),
 | 
			
		||||
      'grant_list' => array(
 | 
			
		||||
        'description' => 'Whether this role can view the name of terms in this vocabulary on a node or in category lists. 0=>No, 1=>Yes.',
 | 
			
		||||
        'type' => 'int',
 | 
			
		||||
        'unsigned' => TRUE,
 | 
			
		||||
        'size' => 'tiny',
 | 
			
		||||
        'not null' => TRUE,
 | 
			
		||||
        'default' => TAXONOMY_ACCESS_TERM_DENY,
 | 
			
		||||
      ),
 | 
			
		||||
    ),
 | 
			
		||||
    'primary key' => array('vid', 'rid'),
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  return $schema;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Add vocabulary defaults for all configured vocabularies.
 | 
			
		||||
 */
 | 
			
		||||
function taxonomy_access_update_7002() {
 | 
			
		||||
  // Get a list of all vocabularies with any term configurations for each role.
 | 
			
		||||
  $ta_configs = db_query(
 | 
			
		||||
    "SELECT td.vid, ta.rid
 | 
			
		||||
     FROM {taxonomy_access_term} ta
 | 
			
		||||
     INNER JOIN {taxonomy_term_data} td ON ta.tid = td.tid
 | 
			
		||||
     GROUP BY td.vid, ta.rid"
 | 
			
		||||
  )->fetchAll();
 | 
			
		||||
 | 
			
		||||
  // Get a list of all configured vocabularies.
 | 
			
		||||
  $td_configs = db_query(
 | 
			
		||||
    "SELECT vid, rid
 | 
			
		||||
     FROM {taxonomy_access_default}"
 | 
			
		||||
  )->fetchAll();
 | 
			
		||||
 | 
			
		||||
  $records = array();
 | 
			
		||||
  $global_defaults = taxonomy_access_global_defaults();
 | 
			
		||||
 | 
			
		||||
  foreach ($ta_configs as $config) {
 | 
			
		||||
    if (!in_array($config, $td_configs)) {
 | 
			
		||||
      $record = (array) $global_defaults[$config->rid];
 | 
			
		||||
      $records[] = _taxonomy_access_format_grant_record($config->vid, $config->rid, $record, TRUE);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (taxonomy_access_set_default_grants($records)) {
 | 
			
		||||
    return t('Update completed successfully.');
 | 
			
		||||
  }
 | 
			
		||||
  else {
 | 
			
		||||
    return t('Update failed.');
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Rename grant realm.
 | 
			
		||||
 */
 | 
			
		||||
function taxonomy_access_update_7001() {
 | 
			
		||||
  db_query(
 | 
			
		||||
    "UPDATE {node_access} SET realm = 'taxonomy_access_role'
 | 
			
		||||
    WHERE realm = 'term_access'"
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Rename database tables to follow Drupal 7 standards.
 | 
			
		||||
 */
 | 
			
		||||
function taxonomy_access_update_7000() {
 | 
			
		||||
  db_rename_table('term_access', 'taxonomy_access_term');
 | 
			
		||||
  db_rename_table('term_access_defaults', 'taxonomy_access_default');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Implements hook_enable().
 | 
			
		||||
 *
 | 
			
		||||
 * Housekeeping: while we were away, did you delete any terms/vocabs/roles?
 | 
			
		||||
 * 1: Weight this module below the Taxonomy module.
 | 
			
		||||
 * 2: Delete ta, tad rows for missing roles.
 | 
			
		||||
 * 3: Delete ta rows for missing terms.
 | 
			
		||||
 * 4: Delete tad rows for missing vocabs.
 | 
			
		||||
 */
 | 
			
		||||
function taxonomy_access_enable() {
 | 
			
		||||
 | 
			
		||||
  // Weight this module below the Taxonomy module.
 | 
			
		||||
  $tax_weight =
 | 
			
		||||
    db_query(
 | 
			
		||||
      "SELECT weight FROM {system}
 | 
			
		||||
      WHERE name = 'taxonomy'"
 | 
			
		||||
    )
 | 
			
		||||
    ->fetchField()
 | 
			
		||||
    ;
 | 
			
		||||
 | 
			
		||||
  db_update('system')
 | 
			
		||||
  ->fields(array('weight' => ($tax_weight + 1)))
 | 
			
		||||
  ->condition('name', 'taxonomy_access')
 | 
			
		||||
  ->execute();
 | 
			
		||||
 | 
			
		||||
  // Delete any records for roles not in {roles}.
 | 
			
		||||
  $roles = _taxonomy_access_user_roles();
 | 
			
		||||
  $config_roles =
 | 
			
		||||
    db_query("SELECT DISTINCT rid FROM {taxonomy_access_default}")
 | 
			
		||||
    ->fetchCol();
 | 
			
		||||
  $missing_roles = array_diff($config_roles, array_keys($roles));
 | 
			
		||||
 | 
			
		||||
  // Core flags node access for rebuild on enable, so skip node updates.
 | 
			
		||||
  foreach ($missing_roles as $rid) {
 | 
			
		||||
    taxonomy_access_delete_role_grants($rid, FALSE);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Delete any term configurations not in {taxonomy_term_data}.
 | 
			
		||||
  $term_ids =
 | 
			
		||||
    db_query(
 | 
			
		||||
      "SELECT ta.tid
 | 
			
		||||
      FROM {taxonomy_access_term} ta
 | 
			
		||||
      LEFT JOIN {taxonomy_term_data} td ON ta.tid = td.tid
 | 
			
		||||
      WHERE ta.tid <> :tid AND td.tid IS NULL",
 | 
			
		||||
      array(':tid' => TAXONOMY_ACCESS_VOCABULARY_DEFAULT))
 | 
			
		||||
    ->fetchCol()
 | 
			
		||||
    ;
 | 
			
		||||
 | 
			
		||||
  // Core flags node access for rebuild on enable, so skip node updates.
 | 
			
		||||
  taxonomy_access_delete_term_grants($term_ids, NULL, FALSE);
 | 
			
		||||
  unset($term_ids);
 | 
			
		||||
 | 
			
		||||
  // Delete any defaults for vocabularies not in {taxonomy_vocabulary}.
 | 
			
		||||
  $vocab_ids =
 | 
			
		||||
    db_query(
 | 
			
		||||
      "SELECT tad.vid
 | 
			
		||||
      FROM {taxonomy_access_default} tad
 | 
			
		||||
      LEFT JOIN {taxonomy_vocabulary} tv ON tad.vid = tv.vid
 | 
			
		||||
      WHERE tad.vid <> :vid AND tv.vid IS NULL",
 | 
			
		||||
      array(':vid' => TAXONOMY_ACCESS_GLOBAL_DEFAULT))
 | 
			
		||||
    ->fetchCol()
 | 
			
		||||
    ;
 | 
			
		||||
 | 
			
		||||
  // Core flags node access for rebuild on enable, so skip node updates.
 | 
			
		||||
  taxonomy_access_delete_default_grants($vocab_ids, FALSE);
 | 
			
		||||
  unset($vocab_ids);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -31,5 +31,71 @@ function showroom_field_default_field_bases() {
 | 
			
		||||
    'type' => 'text_with_summary',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported field_base: 'field_showroom'.
 | 
			
		||||
  $field_bases['field_showroom'] = array(
 | 
			
		||||
    'active' => 1,
 | 
			
		||||
    'cardinality' => 1,
 | 
			
		||||
    'deleted' => 0,
 | 
			
		||||
    'entity_types' => array(),
 | 
			
		||||
    'field_name' => 'field_showroom',
 | 
			
		||||
    'field_permissions' => array(
 | 
			
		||||
      'type' => 2,
 | 
			
		||||
    ),
 | 
			
		||||
    'indexes' => array(
 | 
			
		||||
      'tid' => array(
 | 
			
		||||
        0 => 'tid',
 | 
			
		||||
      ),
 | 
			
		||||
    ),
 | 
			
		||||
    'locked' => 0,
 | 
			
		||||
    'module' => 'taxonomy',
 | 
			
		||||
    'settings' => array(
 | 
			
		||||
      'allowed_values' => array(
 | 
			
		||||
        0 => array(
 | 
			
		||||
          'vocabulary' => 'showroom',
 | 
			
		||||
          'parent' => 0,
 | 
			
		||||
          'depth' => '',
 | 
			
		||||
        ),
 | 
			
		||||
      ),
 | 
			
		||||
      'entity_translation_sync' => FALSE,
 | 
			
		||||
      'options_list_callback' => 'content_taxonomy_allowed_values',
 | 
			
		||||
      'profile2_private' => FALSE,
 | 
			
		||||
    ),
 | 
			
		||||
    'translatable' => 0,
 | 
			
		||||
    'type' => 'taxonomy_term_reference',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported field_base: 'field_tode_showroom'.
 | 
			
		||||
  $field_bases['field_tode_showroom'] = array(
 | 
			
		||||
    'active' => 1,
 | 
			
		||||
    'cardinality' => 1,
 | 
			
		||||
    'deleted' => 0,
 | 
			
		||||
    'entity_types' => array(),
 | 
			
		||||
    'field_name' => 'field_tode_showroom',
 | 
			
		||||
    'field_permissions' => array(
 | 
			
		||||
      'type' => 2,
 | 
			
		||||
    ),
 | 
			
		||||
    'indexes' => array(
 | 
			
		||||
      'tid' => array(
 | 
			
		||||
        0 => 'tid',
 | 
			
		||||
      ),
 | 
			
		||||
    ),
 | 
			
		||||
    'locked' => 0,
 | 
			
		||||
    'module' => 'taxonomy',
 | 
			
		||||
    'settings' => array(
 | 
			
		||||
      'allowed_values' => array(
 | 
			
		||||
        0 => array(
 | 
			
		||||
          'vocabulary' => 'showroom',
 | 
			
		||||
          'parent' => 0,
 | 
			
		||||
          'depth' => '',
 | 
			
		||||
        ),
 | 
			
		||||
      ),
 | 
			
		||||
      'entity_translation_sync' => FALSE,
 | 
			
		||||
      'options_list_callback' => 'content_taxonomy_allowed_values',
 | 
			
		||||
      'profile2_private' => FALSE,
 | 
			
		||||
    ),
 | 
			
		||||
    'translatable' => 0,
 | 
			
		||||
    'type' => 'taxonomy_term_reference',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  return $field_bases;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -10,6 +10,904 @@
 | 
			
		||||
function showroom_field_default_field_instances() {
 | 
			
		||||
  $field_instances = array();
 | 
			
		||||
 | 
			
		||||
  // Exported field_instance: 'node-showroom-body'.
 | 
			
		||||
  $field_instances['node-showroom-body'] = array(
 | 
			
		||||
    'bundle' => 'showroom',
 | 
			
		||||
    'default_value' => NULL,
 | 
			
		||||
    'deleted' => 0,
 | 
			
		||||
    'description' => '',
 | 
			
		||||
    'display' => array(
 | 
			
		||||
      'bookmark' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'hidden',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'cardbig' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'hidden',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'cardfull' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'hidden',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'cardmedium' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'hidden',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'cardsmall' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'hidden',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'default' => array(
 | 
			
		||||
        'label' => 'hidden',
 | 
			
		||||
        'module' => 'text',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'text_default',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'homeblock' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'hidden',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'teaser' => array(
 | 
			
		||||
        'label' => 'hidden',
 | 
			
		||||
        'module' => 'text',
 | 
			
		||||
        'settings' => array(
 | 
			
		||||
          'trim_length' => 600,
 | 
			
		||||
        ),
 | 
			
		||||
        'type' => 'text_summary_or_trimmed',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
    ),
 | 
			
		||||
    'entity_type' => 'node',
 | 
			
		||||
    'field_name' => 'body',
 | 
			
		||||
    'label' => 'Body',
 | 
			
		||||
    'required' => FALSE,
 | 
			
		||||
    'settings' => array(
 | 
			
		||||
      'display_summary' => TRUE,
 | 
			
		||||
      'entity_translation_sync' => FALSE,
 | 
			
		||||
      'text_processing' => 1,
 | 
			
		||||
      'user_register_form' => FALSE,
 | 
			
		||||
    ),
 | 
			
		||||
    'widget' => array(
 | 
			
		||||
      'module' => 'text',
 | 
			
		||||
      'settings' => array(
 | 
			
		||||
        'rows' => 20,
 | 
			
		||||
        'summary_rows' => 5,
 | 
			
		||||
      ),
 | 
			
		||||
      'type' => 'text_textarea_with_summary',
 | 
			
		||||
      'weight' => 5,
 | 
			
		||||
    ),
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported field_instance: 'node-showroom-field_public_address'.
 | 
			
		||||
  $field_instances['node-showroom-field_public_address'] = array(
 | 
			
		||||
    'bundle' => 'showroom',
 | 
			
		||||
    'default_value' => NULL,
 | 
			
		||||
    'deleted' => 0,
 | 
			
		||||
    'description' => '',
 | 
			
		||||
    'display' => array(
 | 
			
		||||
      'bookmark' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'hidden',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'cardbig' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'hidden',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'cardfull' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'hidden',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'cardmedium' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'hidden',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'cardsmall' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'hidden',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'default' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'module' => 'addressfield',
 | 
			
		||||
        'settings' => array(
 | 
			
		||||
          'format_handlers' => array(
 | 
			
		||||
            0 => 'address',
 | 
			
		||||
          ),
 | 
			
		||||
          'use_widget_handlers' => 1,
 | 
			
		||||
        ),
 | 
			
		||||
        'type' => 'addressfield_default',
 | 
			
		||||
        'weight' => 2,
 | 
			
		||||
      ),
 | 
			
		||||
      'homeblock' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'hidden',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'teaser' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'hidden',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
    ),
 | 
			
		||||
    'entity_type' => 'node',
 | 
			
		||||
    'field_name' => 'field_public_address',
 | 
			
		||||
    'label' => 'Adresse',
 | 
			
		||||
    'required' => 0,
 | 
			
		||||
    'settings' => array(
 | 
			
		||||
      'entity_translation_sync' => FALSE,
 | 
			
		||||
      'user_register_form' => FALSE,
 | 
			
		||||
    ),
 | 
			
		||||
    'widget' => array(
 | 
			
		||||
      'active' => 1,
 | 
			
		||||
      'module' => 'addressfield',
 | 
			
		||||
      'settings' => array(
 | 
			
		||||
        'available_countries' => array(
 | 
			
		||||
          'AD' => 'AD',
 | 
			
		||||
          'AE' => 'AE',
 | 
			
		||||
          'AF' => 'AF',
 | 
			
		||||
          'AG' => 'AG',
 | 
			
		||||
          'AI' => 'AI',
 | 
			
		||||
          'AL' => 'AL',
 | 
			
		||||
          'AM' => 'AM',
 | 
			
		||||
          'AN' => 'AN',
 | 
			
		||||
          'AO' => 'AO',
 | 
			
		||||
          'AQ' => 'AQ',
 | 
			
		||||
          'AR' => 'AR',
 | 
			
		||||
          'AS' => 'AS',
 | 
			
		||||
          'AT' => 'AT',
 | 
			
		||||
          'AU' => 'AU',
 | 
			
		||||
          'AW' => 'AW',
 | 
			
		||||
          'AX' => 'AX',
 | 
			
		||||
          'AZ' => 'AZ',
 | 
			
		||||
          'BA' => 'BA',
 | 
			
		||||
          'BB' => 'BB',
 | 
			
		||||
          'BD' => 'BD',
 | 
			
		||||
          'BE' => 'BE',
 | 
			
		||||
          'BF' => 'BF',
 | 
			
		||||
          'BG' => 'BG',
 | 
			
		||||
          'BH' => 'BH',
 | 
			
		||||
          'BI' => 'BI',
 | 
			
		||||
          'BJ' => 'BJ',
 | 
			
		||||
          'BL' => 'BL',
 | 
			
		||||
          'BM' => 'BM',
 | 
			
		||||
          'BN' => 'BN',
 | 
			
		||||
          'BO' => 'BO',
 | 
			
		||||
          'BQ' => 'BQ',
 | 
			
		||||
          'BR' => 'BR',
 | 
			
		||||
          'BS' => 'BS',
 | 
			
		||||
          'BT' => 'BT',
 | 
			
		||||
          'BV' => 'BV',
 | 
			
		||||
          'BW' => 'BW',
 | 
			
		||||
          'BY' => 'BY',
 | 
			
		||||
          'BZ' => 'BZ',
 | 
			
		||||
          'CA' => 'CA',
 | 
			
		||||
          'CC' => 'CC',
 | 
			
		||||
          'CD' => 'CD',
 | 
			
		||||
          'CF' => 'CF',
 | 
			
		||||
          'CG' => 'CG',
 | 
			
		||||
          'CH' => 'CH',
 | 
			
		||||
          'CI' => 'CI',
 | 
			
		||||
          'CK' => 'CK',
 | 
			
		||||
          'CL' => 'CL',
 | 
			
		||||
          'CM' => 'CM',
 | 
			
		||||
          'CN' => 'CN',
 | 
			
		||||
          'CO' => 'CO',
 | 
			
		||||
          'CR' => 'CR',
 | 
			
		||||
          'CU' => 'CU',
 | 
			
		||||
          'CV' => 'CV',
 | 
			
		||||
          'CW' => 'CW',
 | 
			
		||||
          'CX' => 'CX',
 | 
			
		||||
          'CY' => 'CY',
 | 
			
		||||
          'CZ' => 'CZ',
 | 
			
		||||
          'DE' => 'DE',
 | 
			
		||||
          'DJ' => 'DJ',
 | 
			
		||||
          'DK' => 'DK',
 | 
			
		||||
          'DM' => 'DM',
 | 
			
		||||
          'DO' => 'DO',
 | 
			
		||||
          'DZ' => 'DZ',
 | 
			
		||||
          'EC' => 'EC',
 | 
			
		||||
          'EE' => 'EE',
 | 
			
		||||
          'EG' => 'EG',
 | 
			
		||||
          'EH' => 'EH',
 | 
			
		||||
          'ER' => 'ER',
 | 
			
		||||
          'ES' => 'ES',
 | 
			
		||||
          'ET' => 'ET',
 | 
			
		||||
          'FI' => 'FI',
 | 
			
		||||
          'FJ' => 'FJ',
 | 
			
		||||
          'FK' => 'FK',
 | 
			
		||||
          'FM' => 'FM',
 | 
			
		||||
          'FO' => 'FO',
 | 
			
		||||
          'FR' => 'FR',
 | 
			
		||||
          'GA' => 'GA',
 | 
			
		||||
          'GB' => 'GB',
 | 
			
		||||
          'GD' => 'GD',
 | 
			
		||||
          'GE' => 'GE',
 | 
			
		||||
          'GF' => 'GF',
 | 
			
		||||
          'GG' => 'GG',
 | 
			
		||||
          'GH' => 'GH',
 | 
			
		||||
          'GI' => 'GI',
 | 
			
		||||
          'GL' => 'GL',
 | 
			
		||||
          'GM' => 'GM',
 | 
			
		||||
          'GN' => 'GN',
 | 
			
		||||
          'GP' => 'GP',
 | 
			
		||||
          'GQ' => 'GQ',
 | 
			
		||||
          'GR' => 'GR',
 | 
			
		||||
          'GS' => 'GS',
 | 
			
		||||
          'GT' => 'GT',
 | 
			
		||||
          'GU' => 'GU',
 | 
			
		||||
          'GW' => 'GW',
 | 
			
		||||
          'GY' => 'GY',
 | 
			
		||||
          'HK' => 'HK',
 | 
			
		||||
          'HM' => 'HM',
 | 
			
		||||
          'HN' => 'HN',
 | 
			
		||||
          'HR' => 'HR',
 | 
			
		||||
          'HT' => 'HT',
 | 
			
		||||
          'HU' => 'HU',
 | 
			
		||||
          'ID' => 'ID',
 | 
			
		||||
          'IE' => 'IE',
 | 
			
		||||
          'IL' => 'IL',
 | 
			
		||||
          'IM' => 'IM',
 | 
			
		||||
          'IN' => 'IN',
 | 
			
		||||
          'IO' => 'IO',
 | 
			
		||||
          'IQ' => 'IQ',
 | 
			
		||||
          'IR' => 'IR',
 | 
			
		||||
          'IS' => 'IS',
 | 
			
		||||
          'IT' => 'IT',
 | 
			
		||||
          'JE' => 'JE',
 | 
			
		||||
          'JM' => 'JM',
 | 
			
		||||
          'JO' => 'JO',
 | 
			
		||||
          'JP' => 'JP',
 | 
			
		||||
          'KE' => 'KE',
 | 
			
		||||
          'KG' => 'KG',
 | 
			
		||||
          'KH' => 'KH',
 | 
			
		||||
          'KI' => 'KI',
 | 
			
		||||
          'KM' => 'KM',
 | 
			
		||||
          'KN' => 'KN',
 | 
			
		||||
          'KP' => 'KP',
 | 
			
		||||
          'KR' => 'KR',
 | 
			
		||||
          'KW' => 'KW',
 | 
			
		||||
          'KY' => 'KY',
 | 
			
		||||
          'KZ' => 'KZ',
 | 
			
		||||
          'LA' => 'LA',
 | 
			
		||||
          'LB' => 'LB',
 | 
			
		||||
          'LC' => 'LC',
 | 
			
		||||
          'LI' => 'LI',
 | 
			
		||||
          'LK' => 'LK',
 | 
			
		||||
          'LR' => 'LR',
 | 
			
		||||
          'LS' => 'LS',
 | 
			
		||||
          'LT' => 'LT',
 | 
			
		||||
          'LU' => 'LU',
 | 
			
		||||
          'LV' => 'LV',
 | 
			
		||||
          'LY' => 'LY',
 | 
			
		||||
          'MA' => 'MA',
 | 
			
		||||
          'MC' => 'MC',
 | 
			
		||||
          'MD' => 'MD',
 | 
			
		||||
          'ME' => 'ME',
 | 
			
		||||
          'MF' => 'MF',
 | 
			
		||||
          'MG' => 'MG',
 | 
			
		||||
          'MH' => 'MH',
 | 
			
		||||
          'MK' => 'MK',
 | 
			
		||||
          'ML' => 'ML',
 | 
			
		||||
          'MM' => 'MM',
 | 
			
		||||
          'MN' => 'MN',
 | 
			
		||||
          'MO' => 'MO',
 | 
			
		||||
          'MP' => 'MP',
 | 
			
		||||
          'MQ' => 'MQ',
 | 
			
		||||
          'MR' => 'MR',
 | 
			
		||||
          'MS' => 'MS',
 | 
			
		||||
          'MT' => 'MT',
 | 
			
		||||
          'MU' => 'MU',
 | 
			
		||||
          'MV' => 'MV',
 | 
			
		||||
          'MW' => 'MW',
 | 
			
		||||
          'MX' => 'MX',
 | 
			
		||||
          'MY' => 'MY',
 | 
			
		||||
          'MZ' => 'MZ',
 | 
			
		||||
          'NA' => 'NA',
 | 
			
		||||
          'NC' => 'NC',
 | 
			
		||||
          'NE' => 'NE',
 | 
			
		||||
          'NF' => 'NF',
 | 
			
		||||
          'NG' => 'NG',
 | 
			
		||||
          'NI' => 'NI',
 | 
			
		||||
          'NL' => 'NL',
 | 
			
		||||
          'NO' => 'NO',
 | 
			
		||||
          'NP' => 'NP',
 | 
			
		||||
          'NR' => 'NR',
 | 
			
		||||
          'NU' => 'NU',
 | 
			
		||||
          'NZ' => 'NZ',
 | 
			
		||||
          'OM' => 'OM',
 | 
			
		||||
          'PA' => 'PA',
 | 
			
		||||
          'PE' => 'PE',
 | 
			
		||||
          'PF' => 'PF',
 | 
			
		||||
          'PG' => 'PG',
 | 
			
		||||
          'PH' => 'PH',
 | 
			
		||||
          'PK' => 'PK',
 | 
			
		||||
          'PL' => 'PL',
 | 
			
		||||
          'PM' => 'PM',
 | 
			
		||||
          'PN' => 'PN',
 | 
			
		||||
          'PR' => 'PR',
 | 
			
		||||
          'PS' => 'PS',
 | 
			
		||||
          'PT' => 'PT',
 | 
			
		||||
          'PW' => 'PW',
 | 
			
		||||
          'PY' => 'PY',
 | 
			
		||||
          'QA' => 'QA',
 | 
			
		||||
          'RE' => 'RE',
 | 
			
		||||
          'RO' => 'RO',
 | 
			
		||||
          'RS' => 'RS',
 | 
			
		||||
          'RU' => 'RU',
 | 
			
		||||
          'RW' => 'RW',
 | 
			
		||||
          'SA' => 'SA',
 | 
			
		||||
          'SB' => 'SB',
 | 
			
		||||
          'SC' => 'SC',
 | 
			
		||||
          'SD' => 'SD',
 | 
			
		||||
          'SE' => 'SE',
 | 
			
		||||
          'SG' => 'SG',
 | 
			
		||||
          'SH' => 'SH',
 | 
			
		||||
          'SI' => 'SI',
 | 
			
		||||
          'SJ' => 'SJ',
 | 
			
		||||
          'SK' => 'SK',
 | 
			
		||||
          'SL' => 'SL',
 | 
			
		||||
          'SM' => 'SM',
 | 
			
		||||
          'SN' => 'SN',
 | 
			
		||||
          'SO' => 'SO',
 | 
			
		||||
          'SR' => 'SR',
 | 
			
		||||
          'SS' => 'SS',
 | 
			
		||||
          'ST' => 'ST',
 | 
			
		||||
          'SV' => 'SV',
 | 
			
		||||
          'SX' => 'SX',
 | 
			
		||||
          'SY' => 'SY',
 | 
			
		||||
          'SZ' => 'SZ',
 | 
			
		||||
          'TC' => 'TC',
 | 
			
		||||
          'TD' => 'TD',
 | 
			
		||||
          'TF' => 'TF',
 | 
			
		||||
          'TG' => 'TG',
 | 
			
		||||
          'TH' => 'TH',
 | 
			
		||||
          'TJ' => 'TJ',
 | 
			
		||||
          'TK' => 'TK',
 | 
			
		||||
          'TL' => 'TL',
 | 
			
		||||
          'TM' => 'TM',
 | 
			
		||||
          'TN' => 'TN',
 | 
			
		||||
          'TO' => 'TO',
 | 
			
		||||
          'TR' => 'TR',
 | 
			
		||||
          'TT' => 'TT',
 | 
			
		||||
          'TV' => 'TV',
 | 
			
		||||
          'TW' => 'TW',
 | 
			
		||||
          'TZ' => 'TZ',
 | 
			
		||||
          'UA' => 'UA',
 | 
			
		||||
          'UG' => 'UG',
 | 
			
		||||
          'UM' => 'UM',
 | 
			
		||||
          'US' => 'US',
 | 
			
		||||
          'UY' => 'UY',
 | 
			
		||||
          'UZ' => 'UZ',
 | 
			
		||||
          'VA' => 'VA',
 | 
			
		||||
          'VC' => 'VC',
 | 
			
		||||
          'VE' => 'VE',
 | 
			
		||||
          'VG' => 'VG',
 | 
			
		||||
          'VI' => 'VI',
 | 
			
		||||
          'VN' => 'VN',
 | 
			
		||||
          'VU' => 'VU',
 | 
			
		||||
          'WF' => 'WF',
 | 
			
		||||
          'WS' => 'WS',
 | 
			
		||||
          'YE' => 'YE',
 | 
			
		||||
          'YT' => 'YT',
 | 
			
		||||
          'ZA' => 'ZA',
 | 
			
		||||
          'ZM' => 'ZM',
 | 
			
		||||
          'ZW' => 'ZW',
 | 
			
		||||
        ),
 | 
			
		||||
        'default_country' => '',
 | 
			
		||||
        'format_handlers' => array(
 | 
			
		||||
          'address' => 'address',
 | 
			
		||||
          'address-hide-postal-code' => 0,
 | 
			
		||||
          'address-hide-street' => 0,
 | 
			
		||||
          'address-hide-country' => 0,
 | 
			
		||||
          'organisation' => 0,
 | 
			
		||||
          'name-full' => 0,
 | 
			
		||||
          'name-oneline' => 0,
 | 
			
		||||
          'address-optional' => 0,
 | 
			
		||||
        ),
 | 
			
		||||
      ),
 | 
			
		||||
      'type' => 'addressfield_standard',
 | 
			
		||||
      'weight' => 8,
 | 
			
		||||
    ),
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported field_instance: 'node-showroom-field_public_email'.
 | 
			
		||||
  $field_instances['node-showroom-field_public_email'] = array(
 | 
			
		||||
    'bundle' => 'showroom',
 | 
			
		||||
    'default_value' => NULL,
 | 
			
		||||
    'deleted' => 0,
 | 
			
		||||
    'description' => '',
 | 
			
		||||
    'display' => array(
 | 
			
		||||
      'bookmark' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'hidden',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'cardbig' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'hidden',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'cardfull' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'hidden',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'cardmedium' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'hidden',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'cardsmall' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'hidden',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'default' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'module' => 'email',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'email_default',
 | 
			
		||||
        'weight' => 3,
 | 
			
		||||
      ),
 | 
			
		||||
      'homeblock' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'hidden',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'teaser' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'hidden',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
    ),
 | 
			
		||||
    'entity_type' => 'node',
 | 
			
		||||
    'field_name' => 'field_public_email',
 | 
			
		||||
    'label' => 'Email',
 | 
			
		||||
    'required' => 0,
 | 
			
		||||
    'settings' => array(
 | 
			
		||||
      'entity_translation_sync' => FALSE,
 | 
			
		||||
      'user_register_form' => FALSE,
 | 
			
		||||
    ),
 | 
			
		||||
    'widget' => array(
 | 
			
		||||
      'active' => 1,
 | 
			
		||||
      'module' => 'email',
 | 
			
		||||
      'settings' => array(
 | 
			
		||||
        'size' => 60,
 | 
			
		||||
      ),
 | 
			
		||||
      'type' => 'email_textfield',
 | 
			
		||||
      'weight' => 10,
 | 
			
		||||
    ),
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported field_instance: 'node-showroom-field_public_phone'.
 | 
			
		||||
  $field_instances['node-showroom-field_public_phone'] = array(
 | 
			
		||||
    'bundle' => 'showroom',
 | 
			
		||||
    'deleted' => 0,
 | 
			
		||||
    'description' => '',
 | 
			
		||||
    'display' => array(
 | 
			
		||||
      'bookmark' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'hidden',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'cardbig' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'hidden',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'cardfull' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'hidden',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'cardmedium' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'hidden',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'cardsmall' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'hidden',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'default' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'module' => 'cck_phone',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'global_phone_number',
 | 
			
		||||
        'weight' => 4,
 | 
			
		||||
      ),
 | 
			
		||||
      'homeblock' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'hidden',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'teaser' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'hidden',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
    ),
 | 
			
		||||
    'entity_type' => 'node',
 | 
			
		||||
    'field_name' => 'field_public_phone',
 | 
			
		||||
    'label' => 'Phone',
 | 
			
		||||
    'required' => 0,
 | 
			
		||||
    'settings' => array(
 | 
			
		||||
      'all_country_codes' => 1,
 | 
			
		||||
      'country_code_position' => 'after',
 | 
			
		||||
      'country_codes' => array(
 | 
			
		||||
        'country_selection' => array(
 | 
			
		||||
          'ad' => 0,
 | 
			
		||||
          'ae' => 0,
 | 
			
		||||
          'af' => 0,
 | 
			
		||||
          'ag' => 0,
 | 
			
		||||
          'ai' => 0,
 | 
			
		||||
          'al' => 0,
 | 
			
		||||
          'am' => 0,
 | 
			
		||||
          'an' => 0,
 | 
			
		||||
          'ao' => 0,
 | 
			
		||||
          'ar' => 0,
 | 
			
		||||
          'as' => 0,
 | 
			
		||||
          'at' => 0,
 | 
			
		||||
          'au' => 0,
 | 
			
		||||
          'aw' => 0,
 | 
			
		||||
          'az' => 0,
 | 
			
		||||
          'ba' => 0,
 | 
			
		||||
          'bb' => 0,
 | 
			
		||||
          'bd' => 0,
 | 
			
		||||
          'be' => 0,
 | 
			
		||||
          'bf' => 0,
 | 
			
		||||
          'bg' => 0,
 | 
			
		||||
          'bh' => 0,
 | 
			
		||||
          'bi' => 0,
 | 
			
		||||
          'bj' => 0,
 | 
			
		||||
          'bm' => 0,
 | 
			
		||||
          'bn' => 0,
 | 
			
		||||
          'bo' => 0,
 | 
			
		||||
          'br' => 0,
 | 
			
		||||
          'bs' => 0,
 | 
			
		||||
          'bt' => 0,
 | 
			
		||||
          'bw' => 0,
 | 
			
		||||
          'by' => 0,
 | 
			
		||||
          'bz' => 0,
 | 
			
		||||
          'ca' => 0,
 | 
			
		||||
          'cc' => 0,
 | 
			
		||||
          'cd' => 0,
 | 
			
		||||
          'cf' => 0,
 | 
			
		||||
          'cg' => 0,
 | 
			
		||||
          'ch' => 0,
 | 
			
		||||
          'ci' => 0,
 | 
			
		||||
          'ck' => 0,
 | 
			
		||||
          'cl' => 0,
 | 
			
		||||
          'cm' => 0,
 | 
			
		||||
          'cn' => 0,
 | 
			
		||||
          'co' => 0,
 | 
			
		||||
          'cr' => 0,
 | 
			
		||||
          'cu' => 0,
 | 
			
		||||
          'cv' => 0,
 | 
			
		||||
          'cx' => 0,
 | 
			
		||||
          'cy' => 0,
 | 
			
		||||
          'cz' => 0,
 | 
			
		||||
          'de' => 0,
 | 
			
		||||
          'dj' => 0,
 | 
			
		||||
          'dk' => 0,
 | 
			
		||||
          'dm' => 0,
 | 
			
		||||
          'do' => 0,
 | 
			
		||||
          'dz' => 0,
 | 
			
		||||
          'ec' => 0,
 | 
			
		||||
          'ee' => 0,
 | 
			
		||||
          'eg' => 0,
 | 
			
		||||
          'er' => 0,
 | 
			
		||||
          'es' => 0,
 | 
			
		||||
          'et' => 0,
 | 
			
		||||
          'fi' => 0,
 | 
			
		||||
          'fj' => 0,
 | 
			
		||||
          'fk' => 0,
 | 
			
		||||
          'fm' => 0,
 | 
			
		||||
          'fo' => 0,
 | 
			
		||||
          'fr' => 0,
 | 
			
		||||
          'ga' => 0,
 | 
			
		||||
          'gb' => 0,
 | 
			
		||||
          'gd' => 0,
 | 
			
		||||
          'ge' => 0,
 | 
			
		||||
          'gf' => 0,
 | 
			
		||||
          'gh' => 0,
 | 
			
		||||
          'gi' => 0,
 | 
			
		||||
          'gl' => 0,
 | 
			
		||||
          'gm' => 0,
 | 
			
		||||
          'gn' => 0,
 | 
			
		||||
          'gp' => 0,
 | 
			
		||||
          'gq' => 0,
 | 
			
		||||
          'gr' => 0,
 | 
			
		||||
          'gt' => 0,
 | 
			
		||||
          'gu' => 0,
 | 
			
		||||
          'gw' => 0,
 | 
			
		||||
          'gy' => 0,
 | 
			
		||||
          'hk' => 0,
 | 
			
		||||
          'hn' => 0,
 | 
			
		||||
          'hr' => 0,
 | 
			
		||||
          'ht' => 0,
 | 
			
		||||
          'hu' => 0,
 | 
			
		||||
          'id' => 0,
 | 
			
		||||
          'ie' => 0,
 | 
			
		||||
          'il' => 0,
 | 
			
		||||
          'in' => 0,
 | 
			
		||||
          'io' => 0,
 | 
			
		||||
          'iq' => 0,
 | 
			
		||||
          'ir' => 0,
 | 
			
		||||
          'is' => 0,
 | 
			
		||||
          'it' => 0,
 | 
			
		||||
          'jm' => 0,
 | 
			
		||||
          'jo' => 0,
 | 
			
		||||
          'jp' => 0,
 | 
			
		||||
          'ke' => 0,
 | 
			
		||||
          'kg' => 0,
 | 
			
		||||
          'kh' => 0,
 | 
			
		||||
          'ki' => 0,
 | 
			
		||||
          'km' => 0,
 | 
			
		||||
          'kn' => 0,
 | 
			
		||||
          'kp' => 0,
 | 
			
		||||
          'kr' => 0,
 | 
			
		||||
          'kw' => 0,
 | 
			
		||||
          'ky' => 0,
 | 
			
		||||
          'kz' => 0,
 | 
			
		||||
          'la' => 0,
 | 
			
		||||
          'lb' => 0,
 | 
			
		||||
          'lc' => 0,
 | 
			
		||||
          'li' => 0,
 | 
			
		||||
          'lk' => 0,
 | 
			
		||||
          'lr' => 0,
 | 
			
		||||
          'ls' => 0,
 | 
			
		||||
          'lt' => 0,
 | 
			
		||||
          'lu' => 0,
 | 
			
		||||
          'lv' => 0,
 | 
			
		||||
          'ly' => 0,
 | 
			
		||||
          'ma' => 0,
 | 
			
		||||
          'mc' => 0,
 | 
			
		||||
          'md' => 0,
 | 
			
		||||
          'me' => 0,
 | 
			
		||||
          'mg' => 0,
 | 
			
		||||
          'mh' => 0,
 | 
			
		||||
          'mk' => 0,
 | 
			
		||||
          'ml' => 0,
 | 
			
		||||
          'mm' => 0,
 | 
			
		||||
          'mn' => 0,
 | 
			
		||||
          'mo' => 0,
 | 
			
		||||
          'mp' => 0,
 | 
			
		||||
          'mq' => 0,
 | 
			
		||||
          'mr' => 0,
 | 
			
		||||
          'ms' => 0,
 | 
			
		||||
          'mt' => 0,
 | 
			
		||||
          'mu' => 0,
 | 
			
		||||
          'mv' => 0,
 | 
			
		||||
          'mw' => 0,
 | 
			
		||||
          'mx' => 0,
 | 
			
		||||
          'my' => 0,
 | 
			
		||||
          'mz' => 0,
 | 
			
		||||
          'na' => 0,
 | 
			
		||||
          'nc' => 0,
 | 
			
		||||
          'ne' => 0,
 | 
			
		||||
          'nf' => 0,
 | 
			
		||||
          'ng' => 0,
 | 
			
		||||
          'ni' => 0,
 | 
			
		||||
          'nl' => 0,
 | 
			
		||||
          'no' => 0,
 | 
			
		||||
          'np' => 0,
 | 
			
		||||
          'nr' => 0,
 | 
			
		||||
          'nu' => 0,
 | 
			
		||||
          'nz' => 0,
 | 
			
		||||
          'om' => 0,
 | 
			
		||||
          'pa' => 0,
 | 
			
		||||
          'pe' => 0,
 | 
			
		||||
          'pf' => 0,
 | 
			
		||||
          'pg' => 0,
 | 
			
		||||
          'ph' => 0,
 | 
			
		||||
          'pk' => 0,
 | 
			
		||||
          'pl' => 0,
 | 
			
		||||
          'pm' => 0,
 | 
			
		||||
          'pr' => 0,
 | 
			
		||||
          'ps' => 0,
 | 
			
		||||
          'pt' => 0,
 | 
			
		||||
          'pw' => 0,
 | 
			
		||||
          'py' => 0,
 | 
			
		||||
          'qa' => 0,
 | 
			
		||||
          'ro' => 0,
 | 
			
		||||
          'rs' => 0,
 | 
			
		||||
          'ru' => 0,
 | 
			
		||||
          'rw' => 0,
 | 
			
		||||
          'sa' => 0,
 | 
			
		||||
          'sb' => 0,
 | 
			
		||||
          'sc' => 0,
 | 
			
		||||
          'sd' => 0,
 | 
			
		||||
          'se' => 0,
 | 
			
		||||
          'sg' => 0,
 | 
			
		||||
          'sh' => 0,
 | 
			
		||||
          'si' => 0,
 | 
			
		||||
          'sk' => 0,
 | 
			
		||||
          'sl' => 0,
 | 
			
		||||
          'sm' => 0,
 | 
			
		||||
          'sn' => 0,
 | 
			
		||||
          'so' => 0,
 | 
			
		||||
          'sr' => 0,
 | 
			
		||||
          'ss' => 0,
 | 
			
		||||
          'st' => 0,
 | 
			
		||||
          'sv' => 0,
 | 
			
		||||
          'sy' => 0,
 | 
			
		||||
          'sz' => 0,
 | 
			
		||||
          'tc' => 0,
 | 
			
		||||
          'td' => 0,
 | 
			
		||||
          'tg' => 0,
 | 
			
		||||
          'th' => 0,
 | 
			
		||||
          'tj' => 0,
 | 
			
		||||
          'tk' => 0,
 | 
			
		||||
          'tm' => 0,
 | 
			
		||||
          'tn' => 0,
 | 
			
		||||
          'to' => 0,
 | 
			
		||||
          'tp' => 0,
 | 
			
		||||
          'tr' => 0,
 | 
			
		||||
          'tt' => 0,
 | 
			
		||||
          'tv' => 0,
 | 
			
		||||
          'tw' => 0,
 | 
			
		||||
          'tz' => 0,
 | 
			
		||||
          'ua' => 0,
 | 
			
		||||
          'ug' => 0,
 | 
			
		||||
          'us' => 0,
 | 
			
		||||
          'uy' => 0,
 | 
			
		||||
          'uz' => 0,
 | 
			
		||||
          'va' => 0,
 | 
			
		||||
          'vc' => 0,
 | 
			
		||||
          've' => 0,
 | 
			
		||||
          'vg' => 0,
 | 
			
		||||
          'vi' => 0,
 | 
			
		||||
          'vn' => 0,
 | 
			
		||||
          'vu' => 0,
 | 
			
		||||
          'wf' => 0,
 | 
			
		||||
          'ws' => 0,
 | 
			
		||||
          'ye' => 0,
 | 
			
		||||
          'yt' => 0,
 | 
			
		||||
          'za' => 0,
 | 
			
		||||
          'zm' => 0,
 | 
			
		||||
          'zw' => 0,
 | 
			
		||||
        ),
 | 
			
		||||
        'hide_single_cc' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'default_country' => 'af',
 | 
			
		||||
      'enable_country_level_validation' => 1,
 | 
			
		||||
      'enable_default_country' => 0,
 | 
			
		||||
      'enable_extension' => 0,
 | 
			
		||||
      'entity_translation_sync' => FALSE,
 | 
			
		||||
      'user_register_form' => FALSE,
 | 
			
		||||
    ),
 | 
			
		||||
    'widget' => array(
 | 
			
		||||
      'active' => 0,
 | 
			
		||||
      'module' => 'cck_phone',
 | 
			
		||||
      'settings' => array(
 | 
			
		||||
        'size' => 15,
 | 
			
		||||
      ),
 | 
			
		||||
      'type' => 'phone_number',
 | 
			
		||||
      'weight' => 12,
 | 
			
		||||
    ),
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported field_instance: 'node-showroom-field_tode_showroom'.
 | 
			
		||||
  $field_instances['node-showroom-field_tode_showroom'] = array(
 | 
			
		||||
    'bundle' => 'showroom',
 | 
			
		||||
    'deleted' => 0,
 | 
			
		||||
    'description' => '',
 | 
			
		||||
    'display' => array(
 | 
			
		||||
      'bookmark' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'hidden',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'cardbig' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'hidden',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'cardfull' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'hidden',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'cardmedium' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'hidden',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'cardsmall' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'hidden',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'default' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'module' => 'taxonomy',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'taxonomy_term_reference_link',
 | 
			
		||||
        'weight' => 1,
 | 
			
		||||
      ),
 | 
			
		||||
      'homeblock' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'hidden',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'teaser' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'hidden',
 | 
			
		||||
        'weight' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
    ),
 | 
			
		||||
    'entity_type' => 'node',
 | 
			
		||||
    'field_name' => 'field_tode_showroom',
 | 
			
		||||
    'label' => 'Showroom',
 | 
			
		||||
    'required' => 0,
 | 
			
		||||
    'settings' => array(
 | 
			
		||||
      'entity_translation_sync' => FALSE,
 | 
			
		||||
      'user_register_form' => FALSE,
 | 
			
		||||
    ),
 | 
			
		||||
    'widget' => array(
 | 
			
		||||
      'active' => 1,
 | 
			
		||||
      'module' => 'tode',
 | 
			
		||||
      'settings' => array(
 | 
			
		||||
        'choose_term_parent' => 0,
 | 
			
		||||
        'maxlength' => 255,
 | 
			
		||||
        'redirect_node_to_term' => 0,
 | 
			
		||||
        'redirect_term_to_node' => 1,
 | 
			
		||||
        'show_create_tode' => 0,
 | 
			
		||||
        'show_term_form' => 0,
 | 
			
		||||
        'size' => 60,
 | 
			
		||||
      ),
 | 
			
		||||
      'type' => 'tode',
 | 
			
		||||
      'weight' => 1,
 | 
			
		||||
    ),
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported field_instance: 'taxonomy_term-showroom-description_field'.
 | 
			
		||||
  $field_instances['taxonomy_term-showroom-description_field'] = array(
 | 
			
		||||
    'bundle' => 'showroom',
 | 
			
		||||
@@ -86,10 +984,49 @@ function showroom_field_default_field_instances() {
 | 
			
		||||
    ),
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported field_instance: 'user-user-field_showroom'.
 | 
			
		||||
  $field_instances['user-user-field_showroom'] = array(
 | 
			
		||||
    'bundle' => 'user',
 | 
			
		||||
    'default_value' => NULL,
 | 
			
		||||
    'deleted' => 0,
 | 
			
		||||
    'description' => '',
 | 
			
		||||
    'display' => array(
 | 
			
		||||
      'default' => array(
 | 
			
		||||
        'label' => 'above',
 | 
			
		||||
        'module' => 'taxonomy',
 | 
			
		||||
        'settings' => array(),
 | 
			
		||||
        'type' => 'taxonomy_term_reference_link',
 | 
			
		||||
        'weight' => 2,
 | 
			
		||||
      ),
 | 
			
		||||
    ),
 | 
			
		||||
    'entity_type' => 'user',
 | 
			
		||||
    'field_name' => 'field_showroom',
 | 
			
		||||
    'label' => 'Showroom',
 | 
			
		||||
    'required' => 0,
 | 
			
		||||
    'settings' => array(
 | 
			
		||||
      'entity_translation_sync' => FALSE,
 | 
			
		||||
      'user_register_form' => 1,
 | 
			
		||||
    ),
 | 
			
		||||
    'widget' => array(
 | 
			
		||||
      'active' => 1,
 | 
			
		||||
      'module' => 'options',
 | 
			
		||||
      'settings' => array(
 | 
			
		||||
        'content_taxonomy_opt_groups' => 0,
 | 
			
		||||
      ),
 | 
			
		||||
      'type' => 'options_select',
 | 
			
		||||
      'weight' => 3,
 | 
			
		||||
    ),
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Translatables
 | 
			
		||||
  // Included for use with string extractors like potx.
 | 
			
		||||
  t('Adresse');
 | 
			
		||||
  t('Body');
 | 
			
		||||
  t('Description');
 | 
			
		||||
  t('Email');
 | 
			
		||||
  t('Nom');
 | 
			
		||||
  t('Phone');
 | 
			
		||||
  t('Showroom');
 | 
			
		||||
 | 
			
		||||
  return $field_instances;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -12,3 +12,21 @@ function showroom_ctools_plugin_api($module = NULL, $api = NULL) {
 | 
			
		||||
    return array("version" => "1");
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Implements hook_node_info().
 | 
			
		||||
 */
 | 
			
		||||
function showroom_node_info() {
 | 
			
		||||
  $items = array(
 | 
			
		||||
    'showroom' => array(
 | 
			
		||||
      'name' => t('Showroom'),
 | 
			
		||||
      'base' => 'node_content',
 | 
			
		||||
      'description' => '',
 | 
			
		||||
      'has_title' => '1',
 | 
			
		||||
      'title_label' => t('Name'),
 | 
			
		||||
      'help' => '',
 | 
			
		||||
    ),
 | 
			
		||||
  );
 | 
			
		||||
  drupal_alter('node_info', $items);
 | 
			
		||||
  return $items;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -10,20 +10,166 @@
 | 
			
		||||
function showroom_user_default_permissions() {
 | 
			
		||||
  $permissions = array();
 | 
			
		||||
 | 
			
		||||
  // Exported permission: 'assign Showroom role'.
 | 
			
		||||
  $permissions['assign Showroom role'] = array(
 | 
			
		||||
    'name' => 'assign Showroom role',
 | 
			
		||||
    'roles' => array(
 | 
			
		||||
      'administrator' => 'administrator',
 | 
			
		||||
      'root' => 'root',
 | 
			
		||||
    ),
 | 
			
		||||
    'module' => 'role_delegation',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported permission: 'create field_showroom'.
 | 
			
		||||
  $permissions['create field_showroom'] = array(
 | 
			
		||||
    'name' => 'create field_showroom',
 | 
			
		||||
    'roles' => array(
 | 
			
		||||
      'administrator' => 'administrator',
 | 
			
		||||
      'root' => 'root',
 | 
			
		||||
    ),
 | 
			
		||||
    'module' => 'field_permissions',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported permission: 'create field_tode_showroom'.
 | 
			
		||||
  $permissions['create field_tode_showroom'] = array(
 | 
			
		||||
    'name' => 'create field_tode_showroom',
 | 
			
		||||
    'roles' => array(
 | 
			
		||||
      'administrator' => 'administrator',
 | 
			
		||||
      'root' => 'root',
 | 
			
		||||
    ),
 | 
			
		||||
    'module' => 'field_permissions',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported permission: 'create showroom content'.
 | 
			
		||||
  $permissions['create showroom content'] = array(
 | 
			
		||||
    'name' => 'create showroom content',
 | 
			
		||||
    'roles' => array(
 | 
			
		||||
      'administrator' => 'administrator',
 | 
			
		||||
    ),
 | 
			
		||||
    'module' => 'node',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported permission: 'delete any showroom content'.
 | 
			
		||||
  $permissions['delete any showroom content'] = array(
 | 
			
		||||
    'name' => 'delete any showroom content',
 | 
			
		||||
    'roles' => array(
 | 
			
		||||
      'administrator' => 'administrator',
 | 
			
		||||
    ),
 | 
			
		||||
    'module' => 'node',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported permission: 'delete own showroom content'.
 | 
			
		||||
  $permissions['delete own showroom content'] = array(
 | 
			
		||||
    'name' => 'delete own showroom content',
 | 
			
		||||
    'roles' => array(
 | 
			
		||||
      'administrator' => 'administrator',
 | 
			
		||||
    ),
 | 
			
		||||
    'module' => 'node',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported permission: 'delete terms in showroom'.
 | 
			
		||||
  $permissions['delete terms in showroom'] = array(
 | 
			
		||||
    'name' => 'delete terms in showroom',
 | 
			
		||||
    'roles' => array(),
 | 
			
		||||
    'roles' => array(
 | 
			
		||||
      'administrator' => 'administrator',
 | 
			
		||||
    ),
 | 
			
		||||
    'module' => 'taxonomy',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported permission: 'delete users with role 15'.
 | 
			
		||||
  $permissions['delete users with role 15'] = array(
 | 
			
		||||
    'name' => 'delete users with role 15',
 | 
			
		||||
    'roles' => array(
 | 
			
		||||
      'administrator' => 'administrator',
 | 
			
		||||
      'root' => 'root',
 | 
			
		||||
    ),
 | 
			
		||||
    'module' => 'administerusersbyrole',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported permission: 'edit any showroom content'.
 | 
			
		||||
  $permissions['edit any showroom content'] = array(
 | 
			
		||||
    'name' => 'edit any showroom content',
 | 
			
		||||
    'roles' => array(
 | 
			
		||||
      'administrator' => 'administrator',
 | 
			
		||||
    ),
 | 
			
		||||
    'module' => 'node',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported permission: 'edit field_showroom'.
 | 
			
		||||
  $permissions['edit field_showroom'] = array(
 | 
			
		||||
    'name' => 'edit field_showroom',
 | 
			
		||||
    'roles' => array(
 | 
			
		||||
      'administrator' => 'administrator',
 | 
			
		||||
      'root' => 'root',
 | 
			
		||||
    ),
 | 
			
		||||
    'module' => 'field_permissions',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported permission: 'edit field_tode_showroom'.
 | 
			
		||||
  $permissions['edit field_tode_showroom'] = array(
 | 
			
		||||
    'name' => 'edit field_tode_showroom',
 | 
			
		||||
    'roles' => array(
 | 
			
		||||
      'administrator' => 'administrator',
 | 
			
		||||
      'root' => 'root',
 | 
			
		||||
    ),
 | 
			
		||||
    'module' => 'field_permissions',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported permission: 'edit own field_showroom'.
 | 
			
		||||
  $permissions['edit own field_showroom'] = array(
 | 
			
		||||
    'name' => 'edit own field_showroom',
 | 
			
		||||
    'roles' => array(
 | 
			
		||||
      'administrator' => 'administrator',
 | 
			
		||||
      'root' => 'root',
 | 
			
		||||
    ),
 | 
			
		||||
    'module' => 'field_permissions',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported permission: 'edit own field_tode_showroom'.
 | 
			
		||||
  $permissions['edit own field_tode_showroom'] = array(
 | 
			
		||||
    'name' => 'edit own field_tode_showroom',
 | 
			
		||||
    'roles' => array(
 | 
			
		||||
      'administrator' => 'administrator',
 | 
			
		||||
      'root' => 'root',
 | 
			
		||||
    ),
 | 
			
		||||
    'module' => 'field_permissions',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported permission: 'edit own showroom content'.
 | 
			
		||||
  $permissions['edit own showroom content'] = array(
 | 
			
		||||
    'name' => 'edit own showroom content',
 | 
			
		||||
    'roles' => array(
 | 
			
		||||
      'administrator' => 'administrator',
 | 
			
		||||
    ),
 | 
			
		||||
    'module' => 'node',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported permission: 'edit terms in showroom'.
 | 
			
		||||
  $permissions['edit terms in showroom'] = array(
 | 
			
		||||
    'name' => 'edit terms in showroom',
 | 
			
		||||
    'roles' => array(),
 | 
			
		||||
    'roles' => array(
 | 
			
		||||
      'administrator' => 'administrator',
 | 
			
		||||
    ),
 | 
			
		||||
    'module' => 'taxonomy',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported permission: 'edit users with role 15'.
 | 
			
		||||
  $permissions['edit users with role 15'] = array(
 | 
			
		||||
    'name' => 'edit users with role 15',
 | 
			
		||||
    'roles' => array(
 | 
			
		||||
      'administrator' => 'administrator',
 | 
			
		||||
      'root' => 'root',
 | 
			
		||||
    ),
 | 
			
		||||
    'module' => 'administerusersbyrole',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported permission: 'enter showroom revision log entry'.
 | 
			
		||||
  $permissions['enter showroom revision log entry'] = array(
 | 
			
		||||
    'name' => 'enter showroom revision log entry',
 | 
			
		||||
    'roles' => array(),
 | 
			
		||||
    'module' => 'override_node_options',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported permission: 'merge showroom terms'.
 | 
			
		||||
  $permissions['merge showroom terms'] = array(
 | 
			
		||||
    'name' => 'merge showroom terms',
 | 
			
		||||
@@ -31,5 +177,95 @@ function showroom_user_default_permissions() {
 | 
			
		||||
    'module' => 'term_merge',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported permission: 'override showroom authored by option'.
 | 
			
		||||
  $permissions['override showroom authored by option'] = array(
 | 
			
		||||
    'name' => 'override showroom authored by option',
 | 
			
		||||
    'roles' => array(),
 | 
			
		||||
    'module' => 'override_node_options',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported permission: 'override showroom authored on option'.
 | 
			
		||||
  $permissions['override showroom authored on option'] = array(
 | 
			
		||||
    'name' => 'override showroom authored on option',
 | 
			
		||||
    'roles' => array(),
 | 
			
		||||
    'module' => 'override_node_options',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported permission: 'override showroom promote to front page option'.
 | 
			
		||||
  $permissions['override showroom promote to front page option'] = array(
 | 
			
		||||
    'name' => 'override showroom promote to front page option',
 | 
			
		||||
    'roles' => array(),
 | 
			
		||||
    'module' => 'override_node_options',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported permission: 'override showroom published option'.
 | 
			
		||||
  $permissions['override showroom published option'] = array(
 | 
			
		||||
    'name' => 'override showroom published option',
 | 
			
		||||
    'roles' => array(),
 | 
			
		||||
    'module' => 'override_node_options',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported permission: 'override showroom revision option'.
 | 
			
		||||
  $permissions['override showroom revision option'] = array(
 | 
			
		||||
    'name' => 'override showroom revision option',
 | 
			
		||||
    'roles' => array(),
 | 
			
		||||
    'module' => 'override_node_options',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported permission: 'override showroom sticky option'.
 | 
			
		||||
  $permissions['override showroom sticky option'] = array(
 | 
			
		||||
    'name' => 'override showroom sticky option',
 | 
			
		||||
    'roles' => array(),
 | 
			
		||||
    'module' => 'override_node_options',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported permission: 'show showroom title'.
 | 
			
		||||
  $permissions['show showroom title'] = array(
 | 
			
		||||
    'name' => 'show showroom title',
 | 
			
		||||
    'roles' => array(),
 | 
			
		||||
    'module' => 'materio_page_title',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported permission: 'view field_showroom'.
 | 
			
		||||
  $permissions['view field_showroom'] = array(
 | 
			
		||||
    'name' => 'view field_showroom',
 | 
			
		||||
    'roles' => array(
 | 
			
		||||
      'Showroom' => 'Showroom',
 | 
			
		||||
      'administrator' => 'administrator',
 | 
			
		||||
      'root' => 'root',
 | 
			
		||||
    ),
 | 
			
		||||
    'module' => 'field_permissions',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported permission: 'view field_tode_showroom'.
 | 
			
		||||
  $permissions['view field_tode_showroom'] = array(
 | 
			
		||||
    'name' => 'view field_tode_showroom',
 | 
			
		||||
    'roles' => array(
 | 
			
		||||
      'administrator' => 'administrator',
 | 
			
		||||
      'root' => 'root',
 | 
			
		||||
    ),
 | 
			
		||||
    'module' => 'field_permissions',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported permission: 'view own field_showroom'.
 | 
			
		||||
  $permissions['view own field_showroom'] = array(
 | 
			
		||||
    'name' => 'view own field_showroom',
 | 
			
		||||
    'roles' => array(
 | 
			
		||||
      'administrator' => 'administrator',
 | 
			
		||||
      'root' => 'root',
 | 
			
		||||
    ),
 | 
			
		||||
    'module' => 'field_permissions',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported permission: 'view own field_tode_showroom'.
 | 
			
		||||
  $permissions['view own field_tode_showroom'] = array(
 | 
			
		||||
    'name' => 'view own field_tode_showroom',
 | 
			
		||||
    'roles' => array(
 | 
			
		||||
      'administrator' => 'administrator',
 | 
			
		||||
      'root' => 'root',
 | 
			
		||||
    ),
 | 
			
		||||
    'module' => 'field_permissions',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  return $permissions;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -10,22 +10,10 @@
 | 
			
		||||
function showroom_user_default_roles() {
 | 
			
		||||
  $roles = array();
 | 
			
		||||
 | 
			
		||||
  // Exported role: Translator CN.
 | 
			
		||||
  $roles['Translator CN'] = array(
 | 
			
		||||
    'name' => 'Translator CN',
 | 
			
		||||
    'weight' => 12,
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported role: Translator EN.
 | 
			
		||||
  $roles['Translator EN'] = array(
 | 
			
		||||
    'name' => 'Translator EN',
 | 
			
		||||
    'weight' => 10,
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // Exported role: Translator FR.
 | 
			
		||||
  $roles['Translator FR'] = array(
 | 
			
		||||
    'name' => 'Translator FR',
 | 
			
		||||
    'weight' => 11,
 | 
			
		||||
  // Exported role: Showroom.
 | 
			
		||||
  $roles['Showroom'] = array(
 | 
			
		||||
    'name' => 'Showroom',
 | 
			
		||||
    'weight' => 13,
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  return $roles;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,24 +1,105 @@
 | 
			
		||||
name = Showroom
 | 
			
		||||
core = 7.x
 | 
			
		||||
package = Materio
 | 
			
		||||
dependencies[] = addressfield
 | 
			
		||||
dependencies[] = administerusersbyrole
 | 
			
		||||
dependencies[] = cck_phone
 | 
			
		||||
dependencies[] = ctools
 | 
			
		||||
dependencies[] = email
 | 
			
		||||
dependencies[] = features
 | 
			
		||||
dependencies[] = field_permissions
 | 
			
		||||
dependencies[] = materio_content_types
 | 
			
		||||
dependencies[] = materio_page_title
 | 
			
		||||
dependencies[] = materio_subscriptions
 | 
			
		||||
dependencies[] = metatag
 | 
			
		||||
dependencies[] = node
 | 
			
		||||
dependencies[] = options
 | 
			
		||||
dependencies[] = override_node_options
 | 
			
		||||
dependencies[] = role_delegation
 | 
			
		||||
dependencies[] = rules
 | 
			
		||||
dependencies[] = strongarm
 | 
			
		||||
dependencies[] = taxonomy
 | 
			
		||||
dependencies[] = taxonomy_access
 | 
			
		||||
dependencies[] = term_merge
 | 
			
		||||
dependencies[] = text
 | 
			
		||||
dependencies[] = tode
 | 
			
		||||
features[ctools][] = strongarm:strongarm:1
 | 
			
		||||
features[features_api][] = api:2
 | 
			
		||||
features[field_base][] = description_field
 | 
			
		||||
features[field_base][] = field_showroom
 | 
			
		||||
features[field_base][] = field_tode_showroom
 | 
			
		||||
features[field_instance][] = node-showroom-body
 | 
			
		||||
features[field_instance][] = node-showroom-field_public_address
 | 
			
		||||
features[field_instance][] = node-showroom-field_public_email
 | 
			
		||||
features[field_instance][] = node-showroom-field_public_phone
 | 
			
		||||
features[field_instance][] = node-showroom-field_tode_showroom
 | 
			
		||||
features[field_instance][] = taxonomy_term-showroom-description_field
 | 
			
		||||
features[field_instance][] = taxonomy_term-showroom-name_field
 | 
			
		||||
features[field_instance][] = user-user-field_showroom
 | 
			
		||||
features[node][] = showroom
 | 
			
		||||
features[rules_config][] = rules_auto_tag_news_with_showroom
 | 
			
		||||
features[taxonomy][] = showroom
 | 
			
		||||
features[user_permission][] = assign Showroom role
 | 
			
		||||
features[user_permission][] = create field_showroom
 | 
			
		||||
features[user_permission][] = create field_tode_showroom
 | 
			
		||||
features[user_permission][] = create showroom content
 | 
			
		||||
features[user_permission][] = delete any showroom content
 | 
			
		||||
features[user_permission][] = delete own showroom content
 | 
			
		||||
features[user_permission][] = delete terms in showroom
 | 
			
		||||
features[user_permission][] = delete users with role 15
 | 
			
		||||
features[user_permission][] = edit any showroom content
 | 
			
		||||
features[user_permission][] = edit field_showroom
 | 
			
		||||
features[user_permission][] = edit field_tode_showroom
 | 
			
		||||
features[user_permission][] = edit own field_showroom
 | 
			
		||||
features[user_permission][] = edit own field_tode_showroom
 | 
			
		||||
features[user_permission][] = edit own showroom content
 | 
			
		||||
features[user_permission][] = edit terms in showroom
 | 
			
		||||
features[user_permission][] = edit users with role 15
 | 
			
		||||
features[user_permission][] = enter showroom revision log entry
 | 
			
		||||
features[user_permission][] = merge showroom terms
 | 
			
		||||
features[user_role][] = Translator CN
 | 
			
		||||
features[user_role][] = Translator EN
 | 
			
		||||
features[user_role][] = Translator FR
 | 
			
		||||
features[user_permission][] = override showroom authored by option
 | 
			
		||||
features[user_permission][] = override showroom authored on option
 | 
			
		||||
features[user_permission][] = override showroom promote to front page option
 | 
			
		||||
features[user_permission][] = override showroom published option
 | 
			
		||||
features[user_permission][] = override showroom revision option
 | 
			
		||||
features[user_permission][] = override showroom sticky option
 | 
			
		||||
features[user_permission][] = show showroom title
 | 
			
		||||
features[user_permission][] = view field_showroom
 | 
			
		||||
features[user_permission][] = view field_tode_showroom
 | 
			
		||||
features[user_permission][] = view own field_showroom
 | 
			
		||||
features[user_permission][] = view own field_tode_showroom
 | 
			
		||||
features[user_role][] = Showroom
 | 
			
		||||
features[variable][] = additional_settings__active_tab_showroom
 | 
			
		||||
features[variable][] = ant_pattern_showroom
 | 
			
		||||
features[variable][] = ant_php_showroom
 | 
			
		||||
features[variable][] = ant_showroom
 | 
			
		||||
features[variable][] = date_popup_authored_enabled_showroom
 | 
			
		||||
features[variable][] = date_popup_authored_format_showroom
 | 
			
		||||
features[variable][] = date_popup_authored_year_range_showroom
 | 
			
		||||
features[variable][] = diff_enable_revisions_page_node_showroom
 | 
			
		||||
features[variable][] = diff_show_preview_changes_node_showroom
 | 
			
		||||
features[variable][] = diff_view_mode_preview_node_showroom
 | 
			
		||||
features[variable][] = entity_translation_hide_translation_links_showroom
 | 
			
		||||
features[variable][] = entity_translation_node_metadata_showroom
 | 
			
		||||
features[variable][] = field_bundle_settings_node__showroom
 | 
			
		||||
features[variable][] = i18n_node_extended_showroom
 | 
			
		||||
features[variable][] = i18n_node_options_showroom
 | 
			
		||||
features[variable][] = language_content_type_showroom
 | 
			
		||||
features[variable][] = menu_options_showroom
 | 
			
		||||
features[variable][] = menu_parent_showroom
 | 
			
		||||
features[variable][] = metatag_enable_node__showroom
 | 
			
		||||
features[variable][] = metatag_enable_taxonomy_term__showroom
 | 
			
		||||
features[variable][] = node_options_showroom
 | 
			
		||||
features[variable][] = node_preview_showroom
 | 
			
		||||
features[variable][] = node_submitted_showroom
 | 
			
		||||
features[variable][] = nodeformscols_field_placements_showroom_default
 | 
			
		||||
features[variable][] = print_html_display_comment_showroom
 | 
			
		||||
features[variable][] = print_html_display_showroom
 | 
			
		||||
features[variable][] = print_html_display_urllist_showroom
 | 
			
		||||
features[variable][] = save_continue_showroom
 | 
			
		||||
features[variable][] = simplenews_content_type_showroom
 | 
			
		||||
features[variable][] = unique_field_comp_showroom
 | 
			
		||||
features[variable][] = unique_field_fields_showroom
 | 
			
		||||
features[variable][] = unique_field_scope_showroom
 | 
			
		||||
features[variable][] = unique_field_show_matches_showroom
 | 
			
		||||
project path = sites/all/modules/features
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,31 @@
 | 
			
		||||
<?php
 | 
			
		||||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * showroom.rules_defaults.inc
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Implements hook_default_rules_configuration().
 | 
			
		||||
 */
 | 
			
		||||
function showroom_default_rules_configuration() {
 | 
			
		||||
  $items = array();
 | 
			
		||||
  $items['rules_auto_tag_news_with_showroom'] = entity_import('rules_config', '{ "rules_auto_tag_news_with_showroom" : {
 | 
			
		||||
      "LABEL" : "auto tag news with showroom",
 | 
			
		||||
      "PLUGIN" : "reaction rule",
 | 
			
		||||
      "REQUIRES" : [ "rules" ],
 | 
			
		||||
      "ON" : [ "node_presave" ],
 | 
			
		||||
      "IF" : [
 | 
			
		||||
        { "node_is_of_type" : { "node" : [ "node" ], "type" : { "value" : { "breve" : "breve" } } } },
 | 
			
		||||
        { "user_has_role" : { "account" : [ "node:author" ], "roles" : { "value" : { "15" : "15" } } } }
 | 
			
		||||
      ],
 | 
			
		||||
      "DO" : [
 | 
			
		||||
        { "data_set" : {
 | 
			
		||||
            "data" : [ "node:field-showroom" ],
 | 
			
		||||
            "value" : [ "node:author:field-showroom" ]
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      ]
 | 
			
		||||
    }
 | 
			
		||||
  }');
 | 
			
		||||
  return $items;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										336
									
								
								sites/all/modules/features/showroom/showroom.strongarm.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										336
									
								
								sites/all/modules/features/showroom/showroom.strongarm.inc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,336 @@
 | 
			
		||||
<?php
 | 
			
		||||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * showroom.strongarm.inc
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Implements hook_strongarm().
 | 
			
		||||
 */
 | 
			
		||||
function showroom_strongarm() {
 | 
			
		||||
  $export = array();
 | 
			
		||||
 | 
			
		||||
  $strongarm = new stdClass();
 | 
			
		||||
  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
 | 
			
		||||
  $strongarm->api_version = 1;
 | 
			
		||||
  $strongarm->name = 'additional_settings__active_tab_showroom';
 | 
			
		||||
  $strongarm->value = 'edit-auto-nodetitle';
 | 
			
		||||
  $export['additional_settings__active_tab_showroom'] = $strongarm;
 | 
			
		||||
 | 
			
		||||
  $strongarm = new stdClass();
 | 
			
		||||
  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
 | 
			
		||||
  $strongarm->api_version = 1;
 | 
			
		||||
  $strongarm->name = 'ant_pattern_showroom';
 | 
			
		||||
  $strongarm->value = '<?php 
 | 
			
		||||
$items = field_get_items(\'node\', $node, \'field_tode_showroom\');
 | 
			
		||||
return t($items[0][\'name\']);
 | 
			
		||||
?>
 | 
			
		||||
';
 | 
			
		||||
  $export['ant_pattern_showroom'] = $strongarm;
 | 
			
		||||
 | 
			
		||||
  $strongarm = new stdClass();
 | 
			
		||||
  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
 | 
			
		||||
  $strongarm->api_version = 1;
 | 
			
		||||
  $strongarm->name = 'ant_php_showroom';
 | 
			
		||||
  $strongarm->value = 0;
 | 
			
		||||
  $export['ant_php_showroom'] = $strongarm;
 | 
			
		||||
 | 
			
		||||
  $strongarm = new stdClass();
 | 
			
		||||
  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
 | 
			
		||||
  $strongarm->api_version = 1;
 | 
			
		||||
  $strongarm->name = 'ant_showroom';
 | 
			
		||||
  $strongarm->value = '1';
 | 
			
		||||
  $export['ant_showroom'] = $strongarm;
 | 
			
		||||
 | 
			
		||||
  $strongarm = new stdClass();
 | 
			
		||||
  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
 | 
			
		||||
  $strongarm->api_version = 1;
 | 
			
		||||
  $strongarm->name = 'date_popup_authored_enabled_showroom';
 | 
			
		||||
  $strongarm->value = 1;
 | 
			
		||||
  $export['date_popup_authored_enabled_showroom'] = $strongarm;
 | 
			
		||||
 | 
			
		||||
  $strongarm = new stdClass();
 | 
			
		||||
  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
 | 
			
		||||
  $strongarm->api_version = 1;
 | 
			
		||||
  $strongarm->name = 'date_popup_authored_format_showroom';
 | 
			
		||||
  $strongarm->value = 'Y-m-d H:i';
 | 
			
		||||
  $export['date_popup_authored_format_showroom'] = $strongarm;
 | 
			
		||||
 | 
			
		||||
  $strongarm = new stdClass();
 | 
			
		||||
  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
 | 
			
		||||
  $strongarm->api_version = 1;
 | 
			
		||||
  $strongarm->name = 'date_popup_authored_year_range_showroom';
 | 
			
		||||
  $strongarm->value = '3';
 | 
			
		||||
  $export['date_popup_authored_year_range_showroom'] = $strongarm;
 | 
			
		||||
 | 
			
		||||
  $strongarm = new stdClass();
 | 
			
		||||
  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
 | 
			
		||||
  $strongarm->api_version = 1;
 | 
			
		||||
  $strongarm->name = 'diff_enable_revisions_page_node_showroom';
 | 
			
		||||
  $strongarm->value = 1;
 | 
			
		||||
  $export['diff_enable_revisions_page_node_showroom'] = $strongarm;
 | 
			
		||||
 | 
			
		||||
  $strongarm = new stdClass();
 | 
			
		||||
  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
 | 
			
		||||
  $strongarm->api_version = 1;
 | 
			
		||||
  $strongarm->name = 'diff_show_preview_changes_node_showroom';
 | 
			
		||||
  $strongarm->value = 1;
 | 
			
		||||
  $export['diff_show_preview_changes_node_showroom'] = $strongarm;
 | 
			
		||||
 | 
			
		||||
  $strongarm = new stdClass();
 | 
			
		||||
  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
 | 
			
		||||
  $strongarm->api_version = 1;
 | 
			
		||||
  $strongarm->name = 'diff_view_mode_preview_node_showroom';
 | 
			
		||||
  $strongarm->value = 'full';
 | 
			
		||||
  $export['diff_view_mode_preview_node_showroom'] = $strongarm;
 | 
			
		||||
 | 
			
		||||
  $strongarm = new stdClass();
 | 
			
		||||
  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
 | 
			
		||||
  $strongarm->api_version = 1;
 | 
			
		||||
  $strongarm->name = 'entity_translation_hide_translation_links_showroom';
 | 
			
		||||
  $strongarm->value = 0;
 | 
			
		||||
  $export['entity_translation_hide_translation_links_showroom'] = $strongarm;
 | 
			
		||||
 | 
			
		||||
  $strongarm = new stdClass();
 | 
			
		||||
  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
 | 
			
		||||
  $strongarm->api_version = 1;
 | 
			
		||||
  $strongarm->name = 'entity_translation_node_metadata_showroom';
 | 
			
		||||
  $strongarm->value = '0';
 | 
			
		||||
  $export['entity_translation_node_metadata_showroom'] = $strongarm;
 | 
			
		||||
 | 
			
		||||
  $strongarm = new stdClass();
 | 
			
		||||
  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
 | 
			
		||||
  $strongarm->api_version = 1;
 | 
			
		||||
  $strongarm->name = 'field_bundle_settings_node__showroom';
 | 
			
		||||
  $strongarm->value = array(
 | 
			
		||||
    'view_modes' => array(),
 | 
			
		||||
    'extra_fields' => array(
 | 
			
		||||
      'form' => array(
 | 
			
		||||
        'metatags' => array(
 | 
			
		||||
          'weight' => '6',
 | 
			
		||||
        ),
 | 
			
		||||
        'title' => array(
 | 
			
		||||
          'weight' => '0',
 | 
			
		||||
        ),
 | 
			
		||||
        'path' => array(
 | 
			
		||||
          'weight' => '3',
 | 
			
		||||
        ),
 | 
			
		||||
        'redirect' => array(
 | 
			
		||||
          'weight' => '4',
 | 
			
		||||
        ),
 | 
			
		||||
        'language' => array(
 | 
			
		||||
          'weight' => '2',
 | 
			
		||||
        ),
 | 
			
		||||
      ),
 | 
			
		||||
      'display' => array(),
 | 
			
		||||
    ),
 | 
			
		||||
  );
 | 
			
		||||
  $export['field_bundle_settings_node__showroom'] = $strongarm;
 | 
			
		||||
 | 
			
		||||
  $strongarm = new stdClass();
 | 
			
		||||
  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
 | 
			
		||||
  $strongarm->api_version = 1;
 | 
			
		||||
  $strongarm->name = 'i18n_node_extended_showroom';
 | 
			
		||||
  $strongarm->value = 1;
 | 
			
		||||
  $export['i18n_node_extended_showroom'] = $strongarm;
 | 
			
		||||
 | 
			
		||||
  $strongarm = new stdClass();
 | 
			
		||||
  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
 | 
			
		||||
  $strongarm->api_version = 1;
 | 
			
		||||
  $strongarm->name = 'i18n_node_options_showroom';
 | 
			
		||||
  $strongarm->value = array();
 | 
			
		||||
  $export['i18n_node_options_showroom'] = $strongarm;
 | 
			
		||||
 | 
			
		||||
  $strongarm = new stdClass();
 | 
			
		||||
  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
 | 
			
		||||
  $strongarm->api_version = 1;
 | 
			
		||||
  $strongarm->name = 'language_content_type_showroom';
 | 
			
		||||
  $strongarm->value = '4';
 | 
			
		||||
  $export['language_content_type_showroom'] = $strongarm;
 | 
			
		||||
 | 
			
		||||
  $strongarm = new stdClass();
 | 
			
		||||
  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
 | 
			
		||||
  $strongarm->api_version = 1;
 | 
			
		||||
  $strongarm->name = 'menu_options_showroom';
 | 
			
		||||
  $strongarm->value = array();
 | 
			
		||||
  $export['menu_options_showroom'] = $strongarm;
 | 
			
		||||
 | 
			
		||||
  $strongarm = new stdClass();
 | 
			
		||||
  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
 | 
			
		||||
  $strongarm->api_version = 1;
 | 
			
		||||
  $strongarm->name = 'menu_parent_showroom';
 | 
			
		||||
  $strongarm->value = 'main-menu:0';
 | 
			
		||||
  $export['menu_parent_showroom'] = $strongarm;
 | 
			
		||||
 | 
			
		||||
  $strongarm = new stdClass();
 | 
			
		||||
  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
 | 
			
		||||
  $strongarm->api_version = 1;
 | 
			
		||||
  $strongarm->name = 'metatag_enable_node__showroom';
 | 
			
		||||
  $strongarm->value = TRUE;
 | 
			
		||||
  $export['metatag_enable_node__showroom'] = $strongarm;
 | 
			
		||||
 | 
			
		||||
  $strongarm = new stdClass();
 | 
			
		||||
  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
 | 
			
		||||
  $strongarm->api_version = 1;
 | 
			
		||||
  $strongarm->name = 'metatag_enable_taxonomy_term__showroom';
 | 
			
		||||
  $strongarm->value = TRUE;
 | 
			
		||||
  $export['metatag_enable_taxonomy_term__showroom'] = $strongarm;
 | 
			
		||||
 | 
			
		||||
  $strongarm = new stdClass();
 | 
			
		||||
  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
 | 
			
		||||
  $strongarm->api_version = 1;
 | 
			
		||||
  $strongarm->name = 'nodeformscols_field_placements_showroom_default';
 | 
			
		||||
  $strongarm->value = array(
 | 
			
		||||
    'additional_settings' => array(
 | 
			
		||||
      'region' => 'main',
 | 
			
		||||
      'weight' => '5',
 | 
			
		||||
      'has_required' => FALSE,
 | 
			
		||||
      'title' => 'Onglets verticaux',
 | 
			
		||||
      'hidden' => 0,
 | 
			
		||||
    ),
 | 
			
		||||
    'actions' => array(
 | 
			
		||||
      'region' => 'right',
 | 
			
		||||
      'weight' => '2',
 | 
			
		||||
      'has_required' => FALSE,
 | 
			
		||||
      'title' => 'Enregistrer',
 | 
			
		||||
      'hidden' => 0,
 | 
			
		||||
    ),
 | 
			
		||||
    'entity_translation_entity_form_language_update' => array(
 | 
			
		||||
      'region' => 'right',
 | 
			
		||||
      'weight' => '1',
 | 
			
		||||
      'has_required' => FALSE,
 | 
			
		||||
      'title' => NULL,
 | 
			
		||||
      'hidden' => 0,
 | 
			
		||||
    ),
 | 
			
		||||
    'language' => array(
 | 
			
		||||
      'region' => 'right',
 | 
			
		||||
      'weight' => '0',
 | 
			
		||||
      'has_required' => FALSE,
 | 
			
		||||
      'title' => 'Langue',
 | 
			
		||||
      'hidden' => 0,
 | 
			
		||||
    ),
 | 
			
		||||
    'body' => array(
 | 
			
		||||
      'region' => 'main',
 | 
			
		||||
      'weight' => '1',
 | 
			
		||||
      'has_required' => FALSE,
 | 
			
		||||
      'title' => 'Body',
 | 
			
		||||
      'hidden' => 0,
 | 
			
		||||
    ),
 | 
			
		||||
    'field_tode_showroom' => array(
 | 
			
		||||
      'region' => 'main',
 | 
			
		||||
      'weight' => '0',
 | 
			
		||||
      'has_required' => FALSE,
 | 
			
		||||
      'title' => 'Showroom',
 | 
			
		||||
      'hidden' => 0,
 | 
			
		||||
    ),
 | 
			
		||||
    'field_public_address' => array(
 | 
			
		||||
      'region' => 'main',
 | 
			
		||||
      'weight' => '4',
 | 
			
		||||
      'has_required' => TRUE,
 | 
			
		||||
      'title' => 'Adresse',
 | 
			
		||||
    ),
 | 
			
		||||
    'field_public_email' => array(
 | 
			
		||||
      'region' => 'main',
 | 
			
		||||
      'weight' => '2',
 | 
			
		||||
      'has_required' => FALSE,
 | 
			
		||||
      'title' => 'Email',
 | 
			
		||||
      'hidden' => 0,
 | 
			
		||||
    ),
 | 
			
		||||
    'field_public_phone' => array(
 | 
			
		||||
      'region' => 'main',
 | 
			
		||||
      'weight' => '3',
 | 
			
		||||
      'has_required' => FALSE,
 | 
			
		||||
      'title' => 'Phone',
 | 
			
		||||
      'hidden' => 0,
 | 
			
		||||
    ),
 | 
			
		||||
  );
 | 
			
		||||
  $export['nodeformscols_field_placements_showroom_default'] = $strongarm;
 | 
			
		||||
 | 
			
		||||
  $strongarm = new stdClass();
 | 
			
		||||
  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
 | 
			
		||||
  $strongarm->api_version = 1;
 | 
			
		||||
  $strongarm->name = 'node_options_showroom';
 | 
			
		||||
  $strongarm->value = array(
 | 
			
		||||
    0 => 'status',
 | 
			
		||||
  );
 | 
			
		||||
  $export['node_options_showroom'] = $strongarm;
 | 
			
		||||
 | 
			
		||||
  $strongarm = new stdClass();
 | 
			
		||||
  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
 | 
			
		||||
  $strongarm->api_version = 1;
 | 
			
		||||
  $strongarm->name = 'node_preview_showroom';
 | 
			
		||||
  $strongarm->value = '0';
 | 
			
		||||
  $export['node_preview_showroom'] = $strongarm;
 | 
			
		||||
 | 
			
		||||
  $strongarm = new stdClass();
 | 
			
		||||
  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
 | 
			
		||||
  $strongarm->api_version = 1;
 | 
			
		||||
  $strongarm->name = 'node_submitted_showroom';
 | 
			
		||||
  $strongarm->value = 0;
 | 
			
		||||
  $export['node_submitted_showroom'] = $strongarm;
 | 
			
		||||
 | 
			
		||||
  $strongarm = new stdClass();
 | 
			
		||||
  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
 | 
			
		||||
  $strongarm->api_version = 1;
 | 
			
		||||
  $strongarm->name = 'print_html_display_comment_showroom';
 | 
			
		||||
  $strongarm->value = 0;
 | 
			
		||||
  $export['print_html_display_comment_showroom'] = $strongarm;
 | 
			
		||||
 | 
			
		||||
  $strongarm = new stdClass();
 | 
			
		||||
  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
 | 
			
		||||
  $strongarm->api_version = 1;
 | 
			
		||||
  $strongarm->name = 'print_html_display_showroom';
 | 
			
		||||
  $strongarm->value = 0;
 | 
			
		||||
  $export['print_html_display_showroom'] = $strongarm;
 | 
			
		||||
 | 
			
		||||
  $strongarm = new stdClass();
 | 
			
		||||
  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
 | 
			
		||||
  $strongarm->api_version = 1;
 | 
			
		||||
  $strongarm->name = 'print_html_display_urllist_showroom';
 | 
			
		||||
  $strongarm->value = 0;
 | 
			
		||||
  $export['print_html_display_urllist_showroom'] = $strongarm;
 | 
			
		||||
 | 
			
		||||
  $strongarm = new stdClass();
 | 
			
		||||
  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
 | 
			
		||||
  $strongarm->api_version = 1;
 | 
			
		||||
  $strongarm->name = 'save_continue_showroom';
 | 
			
		||||
  $strongarm->value = 'Enregistrer et ajouter les champs';
 | 
			
		||||
  $export['save_continue_showroom'] = $strongarm;
 | 
			
		||||
 | 
			
		||||
  $strongarm = new stdClass();
 | 
			
		||||
  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
 | 
			
		||||
  $strongarm->api_version = 1;
 | 
			
		||||
  $strongarm->name = 'simplenews_content_type_showroom';
 | 
			
		||||
  $strongarm->value = 0;
 | 
			
		||||
  $export['simplenews_content_type_showroom'] = $strongarm;
 | 
			
		||||
 | 
			
		||||
  $strongarm = new stdClass();
 | 
			
		||||
  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
 | 
			
		||||
  $strongarm->api_version = 1;
 | 
			
		||||
  $strongarm->name = 'unique_field_comp_showroom';
 | 
			
		||||
  $strongarm->value = 'each';
 | 
			
		||||
  $export['unique_field_comp_showroom'] = $strongarm;
 | 
			
		||||
 | 
			
		||||
  $strongarm = new stdClass();
 | 
			
		||||
  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
 | 
			
		||||
  $strongarm->api_version = 1;
 | 
			
		||||
  $strongarm->name = 'unique_field_fields_showroom';
 | 
			
		||||
  $strongarm->value = array();
 | 
			
		||||
  $export['unique_field_fields_showroom'] = $strongarm;
 | 
			
		||||
 | 
			
		||||
  $strongarm = new stdClass();
 | 
			
		||||
  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
 | 
			
		||||
  $strongarm->api_version = 1;
 | 
			
		||||
  $strongarm->name = 'unique_field_scope_showroom';
 | 
			
		||||
  $strongarm->value = 'type';
 | 
			
		||||
  $export['unique_field_scope_showroom'] = $strongarm;
 | 
			
		||||
 | 
			
		||||
  $strongarm = new stdClass();
 | 
			
		||||
  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
 | 
			
		||||
  $strongarm->api_version = 1;
 | 
			
		||||
  $strongarm->name = 'unique_field_show_matches_showroom';
 | 
			
		||||
  $strongarm->value = array();
 | 
			
		||||
  $export['unique_field_show_matches_showroom'] = $strongarm;
 | 
			
		||||
 | 
			
		||||
  return $export;
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user