New module 'Viewfield'
This commit is contained in:
parent
0e730eca64
commit
e696a07d44
7 changed files with 1069 additions and 0 deletions
129
sites/all/modules/viewfield/CHANGELOG.txt
Normal file
129
sites/all/modules/viewfield/CHANGELOG.txt
Normal file
|
@ -0,0 +1,129 @@
|
|||
Viewfield x.x-x.x, xxxx-xx-xx
|
||||
-----------------------------
|
||||
|
||||
Viewfield 6.x-2.x, xxxx-xx-xx
|
||||
-----------------------------
|
||||
#1329428 by keithm: Changed for new token_replace() initial string argument.
|
||||
#1216684 by keithm, sun: Changed to merge include files into .module.
|
||||
#1181226 by sun, keithm: Changed to remove viewfield_views_query_alter().
|
||||
#535494 by keithm: Fixed stack discipline to avoid rendering same view twice.
|
||||
#1207552 by keithm: Changed to use widget defaults with force_default.
|
||||
#311587 by sun, keithm: Fixed force default handling.
|
||||
by keithm: Rolled back #903034 because it breaks views headers/footers.
|
||||
#903034 by keithm: Fixed bug producing output for empty view.
|
||||
#1048516 by GoZ, keithm: Fixed select list to test for deleted view.
|
||||
#1149592 by keithm: Fixed update_6004() to remove update_sql() call.
|
||||
#1147558 by dwightaspinwall, sun: Fixed updates with empty contents.
|
||||
#1141200 by wojtha, keithm: Fixed column vname to allow NULL.
|
||||
#416922 by keithm: Fixed update_6001 to check current size < 128 before update.
|
||||
#489908 by sun, keithm: Change default value settings to field instance level.
|
||||
- $field['super_default'] is gone, which previously allowed saving nodes
|
||||
with no viewfield value, but then to use the field's configured default
|
||||
values automatically. This had an effect only for nodes that were created
|
||||
before the viewfield was created, because viewfields in nodes created after
|
||||
any field is created receive the configured default value preselected in the
|
||||
node edit form, and CCK/Field API always stores a value, even if it is the
|
||||
same as the default value.
|
||||
- $field['super_default_widget'] is equally gone, without replacement, as it
|
||||
merely completed aforementioned functionality.
|
||||
- $field['widget']['override_default'] is also gone, ditto.
|
||||
- $field['token_enabled'] is also gone, as we can replace both legacy tokens
|
||||
and Token module tokens without conflicts.
|
||||
- Global default values are migrated to the instance level.
|
||||
|
||||
Viewfield 6.x-1.x, xxxx-xx-xx
|
||||
-----------------------------
|
||||
#416922 by frjo, keithm: Fixed vname too short.
|
||||
#1052370 by Anclywen: Fixed unrestricted list of allowed views.
|
||||
#1120884 by keithm: Fixed viewfield creation notices.
|
||||
#647746 by sun: Fixed %author id of node not always passed to view.
|
||||
#571128 by sun: Fixed field setting labels and descriptions (UX).
|
||||
#535494 by sun, chaps2: Fixed view is processed twice for tokens.
|
||||
#831574 by sun: Fixed array_filter PHP warning.
|
||||
#510356 by etzel, sun: Fixed exposed filters submitting to front page.
|
||||
#477244 by muhleder, japanitrat, sun: Fixed empty view result output.
|
||||
|
||||
Viewfield 6.x-1.0, 2010-08-24
|
||||
-----------------------------
|
||||
by sun: Fixed character encoding and line endings of all files.
|
||||
#509406 by sun, askibinski, KarenS: Fixed views field select options.
|
||||
#118764 by alex_b: Fixed typo in translating arguments.
|
||||
#100085 by Eaton: Implemented plugins as formatters.
|
||||
#235572 by plach. Updated to Drupal 6.
|
||||
by Zoltan Balogh: Added Hungarian translation.
|
||||
#348257 by jerdavis: Added selection of available view displays to viewfield
|
||||
drop-down lists.
|
||||
Allows users to select a specific view display rather than forcing them to
|
||||
create a new default display for each view.
|
||||
#367799 by webchick, jerdavis: Fixed metric boat-loads of notices.
|
||||
Cleaned up some code to remove some of the notices being thrown if
|
||||
error_reporting is E_ALL.
|
||||
#301503 by plach, artis, radman16, jerdavis: Fixed SQL error on non-node views.
|
||||
Added $table_queue check on $query to make sure we've got a node table in the
|
||||
queue before altering the query.
|
||||
#367799 by Darren Oh: Fixed more error notices.
|
||||
#386430 by muhleder: Fixed default value not being used until node is saved.
|
||||
#312131 by plach: Fixed argument caching.
|
||||
#376433 by revimage, jerdavis: Fixed lost settings when node is modified from
|
||||
outside the node edit form.
|
||||
Removed fieldset from viewfield in viewfield_select_process() and
|
||||
viewfield_field().
|
||||
#399872 by burlap, jerdavis: Fixed views access control.
|
||||
Added $view->access() check to view execution and rendering in
|
||||
_viewfield_get_view_content().
|
||||
#416922 by Darren Oh: Fixed lost settings on default views.
|
||||
by Darren Oh: Fixed error notice when force default is on.
|
||||
by Darren Oh: Reverted previous commit.
|
||||
Arguments would not display on the field settings page when force default was
|
||||
on.
|
||||
#386430 by Darren Oh: Reverted patch.
|
||||
Patch prevented nodes from overriding default values.
|
||||
by Darren Oh: Organized code and fixed coding standards compliance.
|
||||
by Darren Oh: Fixed more error notices.
|
||||
by Darren Oh: Added translation template.
|
||||
by Darren Oh: Fixed typo in changelog.
|
||||
by Darren Oh: Moved theme functions file to theme directory.
|
||||
by Darren Oh: Changed install file description.
|
||||
by Darren Oh: Fixed update to enable fields.
|
||||
by Zoltan Balogh: Updated Hungarian translation.
|
||||
#373373 by ramsalt: Fixed page view changing node title.
|
||||
#416922 by Darren Oh: Fixed upgrade for existing fields.
|
||||
#434920 by Darren Oh: Fixed argument defaults being lost on save.
|
||||
by Darren Oh: Fixed user keyword.
|
||||
by Darren Oh: Fixed caching error.
|
||||
#480432 by Aren Cambre, hadsie, scottrigby, jerdavis: Error when creating new
|
||||
viewfield.
|
||||
Added is_array() check to prevent errors when the field is first being
|
||||
created.
|
||||
#480432 by Darren Oh: Improved original fix to prevent error on line 276.
|
||||
by Darren Oh: Fixed undefined variable errors.
|
||||
#568304 by Darren Oh: Fixed rendering of fieldgroups after fieldgroup containing
|
||||
viewfield.
|
||||
A viewfield in a fieldgroup would prevent subsequent fieldgroups from being
|
||||
rendered if the build mode was not full.
|
||||
#568304 by Darren Oh: Fixed missing fieldgroups in full node view after last
|
||||
change.
|
||||
|
||||
|
||||
Viewfield 5.x-1.x, 2007-02-05
|
||||
-----------------------------
|
||||
by mfredrickson: Fixed ID for author argument token.
|
||||
Was using node ID instead of user ID.
|
||||
#100971 by eaton, webchick, alex_b, yched, and stefano73: Updated to Drupal 5.
|
||||
Some changes to the implementation:
|
||||
* More reliance on the views formatters (as seems to be the norm for CCK
|
||||
fields now) for formatting regular node views.
|
||||
* The full node formatter is now the "default". This may break some existing
|
||||
views. It's worth the pain.
|
||||
* Added paging as per stefano73/alex_b's work. Relatively untested, but it
|
||||
looks good so far. (Thanks!)
|
||||
|
||||
|
||||
Viewfield 4.7.x-1.x, 2006-11-10
|
||||
-------------------------------
|
||||
by mfredrickson: Initial commit.
|
||||
Nodes hold content. Views save queries. Wouldn't be great if a node could hold
|
||||
a saved query? Now it can. Viewfield is a CCK field module that allows
|
||||
administrators to put views directly into nodes. When creating a node, users
|
||||
can select from a list of views. When the node is displayed, the view is run
|
||||
and the content is inserted into the body of the node.
|
339
sites/all/modules/viewfield/LICENSE.txt
Normal file
339
sites/all/modules/viewfield/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.
|
27
sites/all/modules/viewfield/README.txt
Normal file
27
sites/all/modules/viewfield/README.txt
Normal file
|
@ -0,0 +1,27 @@
|
|||
|
||||
OVERVIEW
|
||||
|
||||
Nodes hold content. Views save queries. Wouldn't be great if a node could hold a
|
||||
saved query? Now it can. Viewfield is a CCK field module that allows
|
||||
administrators to put views directly into nodes. When creating a node, users can
|
||||
select from a list of views. When the node is displayed, the view is run and the
|
||||
content is inserted into the body of the node.
|
||||
|
||||
|
||||
|
||||
INSTALLATION
|
||||
|
||||
This module requires the views.module and content.module. Enable these modules,
|
||||
then enable viewfield.module. You're ready to go.
|
||||
|
||||
TODO
|
||||
|
||||
1. Provide better control over each view in multiselect fields.
|
||||
2. Use exposed views to allow for more point and click control over the view at
|
||||
node add time.
|
||||
3. Integrate this module back into views when CCK becomes part of core.
|
||||
|
||||
AUTHOR
|
||||
|
||||
Mark Fredrickson
|
||||
mark.m.fredrickson@advantagelabs.com
|
4
sites/all/modules/viewfield/viewfield.css
Normal file
4
sites/all/modules/viewfield/viewfield.css
Normal file
|
@ -0,0 +1,4 @@
|
|||
|
||||
tr .viewfield-select .form-item {
|
||||
white-space: normal;
|
||||
}
|
13
sites/all/modules/viewfield/viewfield.info
Normal file
13
sites/all/modules/viewfield/viewfield.info
Normal file
|
@ -0,0 +1,13 @@
|
|||
name = Viewfield
|
||||
description = Defines a field type to display a view.
|
||||
package = CCK
|
||||
dependencies[] = views
|
||||
dependencies[] = content
|
||||
core = 6.x
|
||||
|
||||
; Information added by drupal.org packaging script on 2012-07-02
|
||||
version = "6.x-2.0"
|
||||
core = "6.x"
|
||||
project = "viewfield"
|
||||
datestamp = "1341254541"
|
||||
|
172
sites/all/modules/viewfield/viewfield.install
Normal file
172
sites/all/modules/viewfield/viewfield.install
Normal file
|
@ -0,0 +1,172 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Installation functions.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Implementation of hook_install().
|
||||
*/
|
||||
function viewfield_install() {
|
||||
drupal_load('module', 'content');
|
||||
content_notify('install', 'viewfield');
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of hook_uninstall().
|
||||
*/
|
||||
function viewfield_uninstall() {
|
||||
drupal_load('module', 'content');
|
||||
content_notify('uninstall', 'viewfield');
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of hook_enable().
|
||||
*
|
||||
* Notify content module when this module is enabled.
|
||||
*/
|
||||
function viewfield_enable() {
|
||||
drupal_load('module', 'content');
|
||||
content_notify('enable', 'viewfield');
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of hook_disable().
|
||||
*
|
||||
* Notify content module when this module is disabled.
|
||||
*/
|
||||
function viewfield_disable() {
|
||||
drupal_load('module', 'content');
|
||||
content_notify('disable', 'viewfield');
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of hook_update_N().
|
||||
*/
|
||||
function viewfield_update_6000() {
|
||||
if ($abort = content_check_update('viewfield')) {
|
||||
return $abort;
|
||||
}
|
||||
$ret = array();
|
||||
$result = db_query("SELECT * FROM {content_node_field} WHERE type = 'viewfield'");
|
||||
while ($field = db_fetch_array($result)) {
|
||||
$field_result = db_query("SELECT * FROM {content_node_field_instance} WHERE field_name = '%s'", $field['field_name']);
|
||||
while ($instance = db_fetch_array($field_result)) {
|
||||
$instance['widget_settings'] = unserialize($instance['widget_settings']);
|
||||
$widget_settings = serialize(array('force_default' => $instance['widget_settings']['force_default']));
|
||||
$instance['display_settings'] = unserialize($instance['display_settings']);
|
||||
foreach ($instance['display_settings'] as $display_context => $display_setting) {
|
||||
$instance['display_settings'][$display_context]['format'] = $display_setting['format'] == 'hidden' ? $display_setting['format'] : 'default';
|
||||
}
|
||||
$display_settings = serialize($instance['display_settings']);
|
||||
$update = db_query("UPDATE {content_node_field_instance} SET widget_settings = '%s', display_settings = '%s' WHERE field_name = '%s' AND type_name = '%s'", $widget_settings, $display_settings, $instance['field_name'], $instance['type_name']);
|
||||
$ret[] = array('success' => $result !== FALSE, 'query' => "UPDATE {content_node_field_instance} SET widget_settings = '$widget_settings', display_settings = '$display_settings' WHERE field_name = '$instance[field_name]' AND type_name = '$instance[type_name]'");
|
||||
}
|
||||
$display = $display_setting['format'] == 'block' ? 'block_1' : 'default';
|
||||
$field['global_settings'] = unserialize($field['global_settings']);
|
||||
$field['global_settings']['token_enabled'] = TRUE;
|
||||
$super_default_widget = $field['global_settings']['super_default_widget'][0][$field['field_name']];
|
||||
$field['global_settings']['super_default_widget'] = array(
|
||||
'vname' => empty($super_default_widget['vnames']) ? NULL : $super_default_widget['vnames'] .'|'. $display,
|
||||
'vargs' => $super_default_widget['vargs'],
|
||||
);
|
||||
$global_settings = serialize($field['global_settings']);
|
||||
$update = db_query("UPDATE {content_node_field} SET global_settings = '%s' WHERE field_name = '%s'", $global_settings, $field['field_name']);
|
||||
$ret[] = array('success' => $update !== FALSE, 'query' => "UPDATE {content_node_field} SET global_settings = '$global_settings' WHERE field_name = '$field[field_name]'");
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update vname fields to varchar(128).
|
||||
*
|
||||
* Removed due to error:
|
||||
* @see viewfield_update_6003()
|
||||
* @see http://drupal.org/node/1141200
|
||||
*/
|
||||
function viewfield_update_6001() {
|
||||
$ret = array();
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Moved to update_6004() because update_6001() was fixed as update_6003().
|
||||
*/
|
||||
function viewfield_update_6002() {
|
||||
$ret = array();
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update vname fields to varchar(128).
|
||||
*
|
||||
* @see viewfield_field_settings()
|
||||
*/
|
||||
function viewfield_update_6003() {
|
||||
if ($abort = content_check_update('viewfield')) {
|
||||
return $abort;
|
||||
}
|
||||
$ret = array();
|
||||
$new_length = 128;
|
||||
$result = db_query("SELECT * FROM {" . content_field_tablename() . "} WHERE type = 'viewfield'");
|
||||
while ($field = db_fetch_array($result)) {
|
||||
$field['db_columns'] = unserialize($field['db_columns']);
|
||||
if ($field['db_columns']['vname']['length'] < $new_length) {
|
||||
$field['db_columns']['vname']['length'] = $new_length;
|
||||
$db_columns = serialize($field['db_columns']);
|
||||
$update = db_query("UPDATE {" . content_field_tablename() . "} SET db_columns = '%s' WHERE field_name = '%s'", $db_columns, $field['field_name']);
|
||||
$ret[] = array('success' => $update !== FALSE, 'query' => "UPDATE {" . content_field_tablename() . "} SET db_columns = '$db_columns' WHERE field_name = '$field[field_name]'");
|
||||
}
|
||||
}
|
||||
foreach (content_fields() as $field) {
|
||||
if ($field['type'] == 'viewfield') {
|
||||
$field_database_info = content_database_info($field);
|
||||
$table_name = $field_database_info['table'];
|
||||
$vname_info = $field_database_info['columns']['vname'];
|
||||
// Apply to all fields, not just those with length < 128 because of bug in
|
||||
// 6001. If that update had been applied already, we want to make sure
|
||||
// this one gets applied.
|
||||
db_change_field($ret, $table_name, $vname_info['column'], $vname_info['column'], array(
|
||||
'type' => 'varchar',
|
||||
'length' => $new_length,
|
||||
'not null' => FALSE,
|
||||
'default' => NULL,
|
||||
));
|
||||
}
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Migrate global default_value settings to instance level.
|
||||
*/
|
||||
function viewfield_update_6004() {
|
||||
if ($abort = content_check_update('viewfield')) {
|
||||
return $abort;
|
||||
}
|
||||
$ret = array();
|
||||
$settings_updates = array();
|
||||
$instance_table = content_instance_tablename();
|
||||
$field_table = content_field_tablename();
|
||||
$result = db_query("SELECT * FROM {". $instance_table ."} it LEFT JOIN {". $field_table ."} ft ON ft.field_name = it.field_name WHERE ft.type = 'viewfield'");
|
||||
while ($field = db_fetch_array($result)) {
|
||||
$global_settings = unserialize($field['global_settings']);
|
||||
$widget_settings = unserialize($field['widget_settings']);
|
||||
if (isset($global_settings['super_default_widget']['vname']) && !isset($widget_settings['default_value'][0]['vname'])) {
|
||||
$widget_settings['default_value'][0]['vname'] = $global_settings['super_default_widget']['vname'];
|
||||
$widget_settings['default_value'][0]['vargs'] = $global_settings['super_default_widget']['vargs'];
|
||||
$settings_updates[] = array(
|
||||
'field_name' => $field['field_name'],
|
||||
'type_name' => $field['type_name'],
|
||||
'widget_settings' => serialize($widget_settings),
|
||||
);
|
||||
}
|
||||
}
|
||||
foreach ($settings_updates as $settings_update) {
|
||||
$sql = "UPDATE {" . $instance_table . "} SET widget_settings = '%s' WHERE field_name = '%s' AND type_name = '%s'";
|
||||
$update = db_query($sql, $settings_update['widget_settings'], $settings_update['field_name'], $settings_update['type_name']);
|
||||
$ret[] = array('success' => $update !== FALSE, 'query' => $sql);
|
||||
}
|
||||
return $ret;
|
||||
}
|
385
sites/all/modules/viewfield/viewfield.module
Normal file
385
sites/all/modules/viewfield/viewfield.module
Normal file
|
@ -0,0 +1,385 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Core functions.
|
||||
*
|
||||
* @todo Double-check potential performance issues mentioned in code comments.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Implementation of hook_field_info().
|
||||
*/
|
||||
function viewfield_field_info() {
|
||||
return array(
|
||||
'viewfield' => array(
|
||||
// Should be "View", but that would translate into "view" (show) for many
|
||||
// languages due to missing string translation contexts.
|
||||
'label' => t('Views'),
|
||||
'description' => t('Displays a selected view in a node.'),
|
||||
'callbacks' => array(
|
||||
'tables' => CONTENT_CALLBACK_NONE,
|
||||
'arguments' => CONTENT_CALLBACK_NONE,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of hook_field_settings().
|
||||
*/
|
||||
function viewfield_field_settings($op, $field) {
|
||||
switch ($op) {
|
||||
case 'form':
|
||||
$form['allowed_views'] = array(
|
||||
'#type' => 'checkboxes',
|
||||
'#title' => t('Allowed values'),
|
||||
'#default_value' => is_array($field['allowed_views']) ? $field['allowed_views'] : array(),
|
||||
'#options' => drupal_map_assoc(array_keys(views_get_all_views())),
|
||||
'#description' => t('Only selected views will be available for content authors. Leave empty to allow all.'),
|
||||
);
|
||||
return $form;
|
||||
|
||||
case 'validate':
|
||||
if ($field['force_default'] && $field['multiple']) {
|
||||
form_set_error('multiple', t('Multiple views are not supported if force default is enabled.'));
|
||||
}
|
||||
break;
|
||||
|
||||
case 'save':
|
||||
return array(
|
||||
'allowed_views',
|
||||
);
|
||||
|
||||
case 'database columns':
|
||||
return array(
|
||||
// Views requires at least 96 chars for the view name and display, plus
|
||||
// we need 1 for our delimiter. Round up to a common value of 128.
|
||||
'vname' => array('type' => 'varchar', 'not null' => FALSE, 'length' => 128),
|
||||
'vargs' => array('type' => 'varchar', 'not null' => FALSE, 'length' => 255),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of hook_field().
|
||||
*/
|
||||
function viewfield_field($op, &$node, $field, &$items, $teaser, $page) {
|
||||
switch ($op) {
|
||||
case 'presave':
|
||||
foreach ($items as $delta => $item) {
|
||||
if (empty($item['vname'])) {
|
||||
unset($items[$delta]);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 'sanitize':
|
||||
// Replace field values with widget defaults when force_default is set.
|
||||
if ($field['widget']['force_default']) {
|
||||
$items = $field['widget']['default_value'];
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of hook_content_is_empty().
|
||||
*/
|
||||
function viewfield_content_is_empty($item, $field) {
|
||||
return empty($item['vname']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of hook_field_formatter_info().
|
||||
*/
|
||||
function viewfield_field_formatter_info() {
|
||||
return array(
|
||||
'default' => array(
|
||||
'label' => t('Default'),
|
||||
'field types' => array('viewfield')
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a themed view avoiding viewfield recursion.
|
||||
*/
|
||||
function theme_viewfield_formatter_default($element) {
|
||||
// $_viewfield_stack keeps a record of the current node to prevent infinite
|
||||
// recursion during the view rendering process.
|
||||
global $_viewfield_stack;
|
||||
|
||||
$node = $element['#node'];
|
||||
|
||||
if (!empty($element['#item']['vname']) && !isset($_viewfield_stack[$node->nid])) {
|
||||
// Push id of current node unless it's a new node being previewed.
|
||||
if ($node->nid) {
|
||||
$_viewfield_stack[$node->nid] = $node->nid;
|
||||
}
|
||||
|
||||
list($view_name, $display) = explode('|', $element['#item']['vname'], 2);
|
||||
$view_args = _viewfield_get_view_args($element['#item']['vargs'], $element['#node']);
|
||||
|
||||
|
||||
// Render the view like Views would do.
|
||||
// @see views_embed_view()
|
||||
$view = views_get_view($view_name);
|
||||
if ($view && $view->access($display)) {
|
||||
// Override the view's path to the current path. Otherwise, exposed views
|
||||
// filters would submit to the front page.
|
||||
$view->override_path = $_GET['q'];
|
||||
|
||||
$output = $view->preview($display, $view_args);
|
||||
}
|
||||
|
||||
// This node is "safe" again.
|
||||
if ($node->nid) {
|
||||
unset($_viewfield_stack[$node->nid]);
|
||||
}
|
||||
|
||||
// Only return an actual view result to not break empty value behavior.
|
||||
if (isset($output)) {
|
||||
return $output;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of hook_widget_info().
|
||||
*/
|
||||
function viewfield_widget_info() {
|
||||
return array(
|
||||
'viewfield_select' => array(
|
||||
'label' => 'Select List',
|
||||
'field types' => array('viewfield'),
|
||||
'multiple_values' => CONTENT_HANDLE_CORE,
|
||||
'callbacks' => array(
|
||||
'default value' => CONTENT_CALLBACK_DEFAULT,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of hook_widget_settings().
|
||||
*/
|
||||
function viewfield_widget_settings($op, $widget) {
|
||||
switch ($op) {
|
||||
case 'form':
|
||||
$form['force_default'] = array(
|
||||
'#type' => 'checkbox',
|
||||
'#title' => t('Always use default value'),
|
||||
'#default_value' => $widget['force_default'],
|
||||
'#description' => t('Hides this field in forms and forces the default value defined below.'),
|
||||
);
|
||||
return $form;
|
||||
|
||||
case 'save':
|
||||
return array(
|
||||
'force_default',
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of hook_widget().
|
||||
*/
|
||||
function viewfield_widget(&$form, &$form_state, $field, $items, $delta = 0) {
|
||||
$element = array(
|
||||
'#type' => $field['widget']['type'],
|
||||
'#default_value' => isset($items[$delta]) ? $items[$delta] : NULL,
|
||||
);
|
||||
|
||||
return $element;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of FAPI hook_elements().
|
||||
*/
|
||||
function viewfield_elements() {
|
||||
return array(
|
||||
'viewfield_select' => array(
|
||||
'#input' => TRUE,
|
||||
'#columns' => array('vname', 'vargs'),
|
||||
'#delta' => 0,
|
||||
'#process' => array('viewfield_select_process'),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
function viewfield_select_process($element, $edit, $form_state, $form) {
|
||||
// This form is used for both the default value field in the admin as well as
|
||||
// the node edit form, so we have to make sure we show the default value field
|
||||
// always.
|
||||
$is_field_settings_form = !isset($form['#node']);
|
||||
|
||||
$field = isset($form['#field_info'][$element['#field_name']]) ? $form['#field_info'][$element['#field_name']] : NULL;
|
||||
$element['#field'] = $field;
|
||||
// Display the form to let the user pick a view.
|
||||
$options = _viewfield_potential_references($field, $element['#delta']);
|
||||
$element['vname'] = array(
|
||||
'#type' => 'select',
|
||||
'#title' => $element['#title'],
|
||||
'#options' => $options,
|
||||
'#default_value' => isset($element['#default_value']['vname']) ? $element['#default_value']['vname'] : NULL,
|
||||
'#required' => $element['#required'],
|
||||
'#access' => $is_field_settings_form || !$field['widget']['force_default'],
|
||||
'#description' => $element['#description'],
|
||||
);
|
||||
// If there is only one option, only show arguments.
|
||||
if (count($options) == 1 && !$is_field_settings_form) {
|
||||
list($key, $label) = each($options);
|
||||
$element['vname']['#access'] = FALSE;
|
||||
$element['vname']['#default_value'] = $key;
|
||||
}
|
||||
|
||||
$element['vargs'] = array(
|
||||
'#type' => 'textfield',
|
||||
'#title' => !isset($label) ? t('Arguments') : t('%field (@value) arguments', array(
|
||||
'%field' => $field['widget']['label'],
|
||||
'@value' => $label,
|
||||
)),
|
||||
'#default_value' => isset($element['#default_value']['vargs']) ? $element['#default_value']['vargs'] : NULL,
|
||||
'#access' => $is_field_settings_form || !$field['widget']['force_default'],
|
||||
'#description' => t('A comma separated list of arguments to pass to the selected view. Wrap arguments containing commas in double quotes. Replace double quotes in arguments with two double quotes.'),
|
||||
);
|
||||
$token_description = t('Available tokens: %nid for the id of the current node; %author for the node author; %viewer for the viewing user');
|
||||
if (module_exists('token')) {
|
||||
$element['vargs']['#description'] .=
|
||||
'<br />' . $token_description . '; ' . t('or any token from the placeholder token list.')
|
||||
. '<br />' . t('Note: Using placeholder tokens in combination with the %fields row style may negatively affect site performance.', array('%fields' => t('Fields')));
|
||||
// Only show token help for first value or in field settings form.
|
||||
if ($element['#delta'] == 0 && ($is_field_settings_form || !$field['widget']['force_default'])) {
|
||||
$element['token_help'] = array(
|
||||
'#type' => 'fieldset',
|
||||
'#title' => t('Placeholder tokens'),
|
||||
'#collapsible' => TRUE,
|
||||
'#collapsed' => TRUE,
|
||||
);
|
||||
$element['token_help']['tokens'] = array(
|
||||
'#value' => theme('token_help', 'node'),
|
||||
);
|
||||
}
|
||||
}
|
||||
else {
|
||||
$element['vargs']['#description'] .= '<br />' . $token_description . '.';
|
||||
}
|
||||
|
||||
return $element;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepare a list of views for selection.
|
||||
*/
|
||||
function _viewfield_potential_references($field, $delta = 0) {
|
||||
$options = array();
|
||||
if (isset($field['allowed_views']) && is_array($field['allowed_views'])) {
|
||||
$field['allowed_views'] = array_filter($field['allowed_views']);
|
||||
}
|
||||
if (empty($field['allowed_views'])) {
|
||||
$field['allowed_views'] = array_keys(views_get_all_views());
|
||||
}
|
||||
foreach ($field['allowed_views'] as $view_name) {
|
||||
// Check for deleted views saved in allowed_views.
|
||||
if ($view = views_get_view($view_name)) {
|
||||
foreach ($view->display as $display) {
|
||||
$options[$view->name .'|'. $display->id] = $view->name .' - '. $display->display_title;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Add a '0' option for non-required or subsequent values of multiple fields.
|
||||
if (empty($field['required']) || ($field['multiple'] && $delta > 0)) {
|
||||
array_unshift($options, '<'. t('none') .'>');
|
||||
}
|
||||
return $options;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of hook_theme().
|
||||
*/
|
||||
function viewfield_theme() {
|
||||
return array(
|
||||
'viewfield_select' => array(
|
||||
'arguments' => array('element' => NULL),
|
||||
),
|
||||
'viewfield_formatter_default' => array(
|
||||
'arguments' => array('element' => NULL),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add CSS to force help text to wrap correctly on node edit form.
|
||||
*/
|
||||
function theme_viewfield_select($element) {
|
||||
if (!empty($element['#children'])) {
|
||||
$field = $element['#field'];
|
||||
if ($field['multiple'] && $element['#delta'] == 0) {
|
||||
// This is needed only for multiple viewfields.
|
||||
drupal_add_css(drupal_get_path('module', 'viewfield') .'/viewfield.css');
|
||||
}
|
||||
return '<div class="viewfield-select">'. $element['#children'] .'</div>';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Perform argument replacement
|
||||
*/
|
||||
function _viewfield_get_view_args($vargs, $node) {
|
||||
$args = array();
|
||||
// Prevent token_replace() from running this function a second time
|
||||
// before it completes the first time.
|
||||
static $tokens = TRUE;
|
||||
if ($tokens && !empty($vargs)) {
|
||||
$pos = 0;
|
||||
while ($pos < strlen($vargs)) {
|
||||
$found = FALSE;
|
||||
// If string starts with a quote, start after quote and get everything
|
||||
// before next quote.
|
||||
if (strpos($vargs, '"', $pos) === $pos) {
|
||||
if (($quote = strpos($vargs, '"', ++$pos)) !== FALSE) {
|
||||
// Skip pairs of quotes.
|
||||
while (!(($ql = strspn($vargs, '"', $quote)) & 1)) {
|
||||
$quote = strpos($vargs, '"', $quote + $ql);
|
||||
}
|
||||
$args[] = str_replace('""', '"', substr($vargs, $pos, $quote + $ql - $pos - 1));
|
||||
$pos = $quote + $ql + 1;
|
||||
$found = TRUE;
|
||||
}
|
||||
}
|
||||
elseif (($comma = strpos($vargs, ',', $pos)) !== FALSE) {
|
||||
// Otherwise, get everything before next comma.
|
||||
$args[] = substr($vargs, $pos, $comma - $pos);
|
||||
// Skip to after comma and repeat
|
||||
$pos = $comma + 1;
|
||||
$found = TRUE;
|
||||
}
|
||||
if (!$found) {
|
||||
$args[] = substr($vargs, $pos);
|
||||
$pos = strlen($vargs);
|
||||
}
|
||||
}
|
||||
// Try to replace tokens if $args might contain one.
|
||||
if (strpos($vargs, '[') !== FALSE && module_exists('token')) {
|
||||
$tokens = FALSE;
|
||||
// If the view field is being loaded as a "view field" of "view row",
|
||||
// instead of a simple "node field", the node object is not fully populated:
|
||||
// we need a full node to perform a correct replacement.
|
||||
$node = node_load($node->nid);
|
||||
foreach ($args as $key => $text) {
|
||||
$args[$key] = token_replace($text, 'node', $node);
|
||||
}
|
||||
$tokens = TRUE;
|
||||
}
|
||||
// For backwards compatibility, we scan for %nid, etc.
|
||||
foreach ($args as $key => $value) {
|
||||
$args[$key] = strtr($value, array(
|
||||
'%nid' => $node->nid,
|
||||
'%author' => isset($node->uid) ? $node->uid : (isset($node_values->uid) ? $node_values->uid : NULL),
|
||||
'%viewer' => $GLOBALS['user']->uid,
|
||||
));
|
||||
}
|
||||
}
|
||||
return $args;
|
||||
}
|
Reference in a new issue