Commit b14b878e authored by Riccardo Padovani's avatar Riccardo Padovani

Removed panels module

parent 38ed9d72
CHANGELOG for Panels 3.0 for Drupal 7
Panels 7.x-3.0-dev
==================
#1025716: Panels fields broken in last update.
#1056464 by EclipseGc: Fix broken delete statement in mini panel delete.
#954324 by EclipseGc: Fix broken delete statement in mini panel uninstall.
#1008120: "classes" not passing through to rounded shadow pane stylizer style, preventing style from working.
Panels 7.x-3.0-alpha2 (10-Jan-2011)
=====================
#920266 by dereine: Typo in cache.inc caused wsods in rare circumstances.
#879482 by mvc: Ensure Panels and CTools module files are loaded during update. Apparently could cause WSOD if not.
#917614 by jskulski: IPE broken in IE.
#906520: Improve CSS for rounded shadow boxes on IE7.
#932632 by mikeytown2: Fix notice in .install file.
#927840: Add clear-block to dashboard HTML to ensure themes do not do weird things to it.
#869766: Fix occasional problem with flexible layout pushing the entire layout to the left in certain fixed-width only configurations.
#949310: E_STRICT violation on declaration of render_pane() method of display renderers.
#940002: Custom style modal was broken.
#953484: Panes were not properly using classes array.
#941532: panel nodes had some serious problems do to hook_node_*.
#954324: Mini panels failed during uninstall.
#827628: "Add content" dialog could lose content with the same title as other content.
Fix the naked style to support content that needs to be rendered.
#958072: Fix panels_node_node_access to not throw warnings on menu access tests.
#965286: Panel node update was trying to use db_insert() instead of db_update().
#964334: Panels breaks views' row styles with the panels fields style.
#941802: Fix radio layout butotn.
#980696 by das-peter: Update calls to drupal_set_html_head() to D7.
#961662 by Nick Lewis: Account for pager info in simple caching.
#980870 by das-peter: CSS handling during caching broken.
#970076: Remove old hook_update functions.
#978768 by linclark: Fix notice with panel fields.
#977296: Regions with _ such as with two column bricks would not save content.
#987902: Fix flexible layout splitter resize brokenness.
#967734 by das-peter and intoxination: Upgrade node_get_types() in wizard.
#1020824: Finish fixing node template page wizard.
Fix landing page wizard.
Known Issue http://drupal.org/node/191771
'Node' panes can have two titles or have two title areas.
Cause:
Content that comes into a pane is already formatted, and this happens
in theme('node'). theme('node') assumes it will be printing a title
most of the time. However, Panels wants the titles of panes to be
consistent, so it removes the title from the node to prevent your
node.tpl.php from printing it. The result is often an empty h2 which
has odd effects.
Solution:
Add an if statement to your node.tpl.php to prevent printing that h2
if $node->title is empty.
Known Issue http://drupal.org/node/186454
Internet Explorer is really bad about making the rightmost panel
fall beneath the others.
Cause:
Internet explorer calculates margins and padding differntly from
everyone else, and this makes it entirely too easy for widths
to add up to greater than the amount of allotted space, despite
using percentage widths.
Solution:
There are two solutions to this problem:
1) In your theme, try to eliminate padding from the the <div>
that directly contains your content; you can do this by
adding an empty <div> inside it that surrounds the content
and very specifically is set to margin: 0 and padding: 0
2) if that doesn't work, override the widths of the panel-panel
divs and reduce them by 1 or 2%; usually this will give IE
enough space to quit pushing things around.
Known Issue http://drupal.org/node/154351
TinyMCE, FCKEditor and other wysiwyg editors really blow up on Panels
content editing.
Cause:
The modal dialogs that Panels uses are very particular about javascript
and these editors are too much for them. Also, these editors get
cranky about complicated forms with several text areas.
Solution:
Disable these editors on all of your panels admin pages. The important
URLs are admin/panels/* and panels/ajax/*. More details instructions
may follow if someone familiar with these systems submits a patch at
the above drupal.org URL.
Known Issue http://drupal.org/node/180650
The rounded corners style shows up as just a small graphic rather than
a full box around the panels as it shoujld.
Cause:
The rounded corners CSS relies on the ID for the panel, but the ID is
optional.
Solution:
Make sure your panel has an ID of some sort. With mini panels there is
no easy workaround as mini panels currently do not have IDs of their
own.
Known Issue http://drupal.org/node/165745
You see a message similar to this:
Table 'drupal.panels_info' doesn't exist query: SELECT * FROM panels_info
WHERE path = 'front_page_new' in...
The important piece of information is 'panels_info'.
Cause:
The Meta Tags module (also known as nodewords.module) directly reads the
the panels tables and modifies its forms to add the tags. Unfortunately
for this module, Panels has changed *greatly* in the leap from 1.0 to
2.0 and the tables aren't the same. However, the nodewords module doesn't
yet know this. Look in the nodewords issue queue for panels patches and
you should find something.
Known Issue http://drupal.org/node/153399
The drag and drop content UI doesn't seem to work at all under Safari.
Cause:
Safari 2 has some serious problems with the javascript code.
Solution:
Upgrade to Safari 3 if possible. If not, use an an alternative browser
such as Firefox or Opera.
Known Issue http://drupal.org/node/207859
When using the secure pages module, the Panels administrative UI gives
unhelpful "An error occurred" popups when trying to add or edit content.
Cause:
The secure pages module tries to move the entire administrative section
of the site to HTTPS, but Panels' AJAX calls are using a path that
secure pages doesn't know about. When trying to make non-secure ajax calls
from a secure page, the browser denies the call.
Solution:
The solution is to simply add panels/* to your Secure Pages configuration.
\ No newline at end of file
This diff is collapsed.
Welcome to Panels 3.
A little documentation should go here, but Panels 3 is alsoi a beast - you're
best off checking the online handbook on Drupal.org, or this issue:
http://drupal.org/node/887560.
Upgrading from Panels-6.x-3.x to Panels-7.x-3.x
- Style and layout plugins may no longer be registered by a central hook.
Only the plugin directories method may be used.
- Layout 'panels function' is now 'regions function'.
- Layout 'panels' key is now 'regions'.
- panels_get_pane_title() deprecated.
- panels_plugin_get_function() deprecated.
- panels_required_context removed. These were deprecated long ago and
existed only to prevent crashes.
- panels_optional_context removed.
- $renderer->plugins['layout']['panels'] changed to $renderer->plugin['layout']['regions']
- display_renderer class is now in 'renderer', not 'handler'.
.dashboard-entry .dashboard-link {
font-size: 120%;
font-weight: bold;
}
.dashboard-entry .dashboard-icon img {
vertical-align: middle;
}
.dashboard-title {
font-weight: bold;
font-size: 140%;
margin-bottom: .5em;
}
.dashboard-link form input {
margin: 0;
}
.dashboard-link form select {
margin: 0;
}
.dashboard-left {
width: 47%;
float: left;
}
.dashboard-right {
margin-left: 2em;
width: 47%;
float: left;
}
.dashboard-question {
margin-top: 14em;
padding: 1em;
text-align: center;
}
.dashboard-content table {
margin: 0;
width: 100%;
}
.dashboard-content {
padding: 0 1em;
}
.panels-dashboard .links {
text-align: right;
}
.dashboard-pages .page-manager-page-operations {
text-align: right;
}
.dashboard-block {
padding-bottom: 1em;
border-bottom: 1px dotted #ddd;
margin-bottom: 1em;
}
div.panel-pane div.admin-links {
font-size: xx-small;
margin-right: 1em;
}
div.panel-pane div.admin-links li a {
color: #ccc;
}
div.panel-pane div.admin-links li {
padding-bottom: 2px;
background: white;
z-index: 201;
}
div.panel-pane div.admin-links:hover a,
div.panel-pane div.admin-links-hover a {
color: #000;
}
div.panel-pane div.admin-links a:before {
content: "[";
}
div.panel-pane div.admin-links a:after {
content: "]";
}
div.panel-pane div.panel-hide {
display: none;
}
/** For IE we add the class via js; for other browsers we rely on :hover **/
div.panel-pane div.panel-hide-hover,
div.panel-pane:hover div.panel-hide {
display: block;
position: absolute;
z-index: 200;
margin-top: -1.5em;
}
div.panel-pane div.node {
margin: 0;
padding: 0;
}
div.panel-pane div.feed a {
float: right;
}
.layout-link {
float: left;
padding: 1em;
width: 125px;
height: 160px;
}
.layout-link img {
margin-left: auto;
margin-right: auto;
}
/* general style for the layout-icon */
.layout-icon .caption {
width: 90px;
margin-bottom: 1em;
}
/* styles for the basic panel-%implementation% edit page */
.layout-container,
.right-container {
float: right;
padding: 0 0 0 .5em;
margin: 0;
width: 48.5%;
}
.info-container,
.left-container {
padding-right: .5em;
width: 48.5%;
}
.right-container fieldset,
.left-container fieldset,
.layout-container fieldset {
margin-top: 0;
}
.layout-container .form-item {
margin: 0;
}
.layout-container .form-submit {
margin-top: 1em;
}
.layout-container .layout-icon,
.left-container .layout-icon {
float: right;
margin-left: .5em;
}
.content-list ol {
padding-left: 0;
list-style-position: inside;
}
.content-list dt {
font-weight: bold;
}
.content-list dd {
margin-left: 2em;
}
/* styles for the choose layout page */
.panels-layouts-checkboxes .form-checkboxes .form-item,
#panels-choose-layout .form-type-radio,
.panels-choose-layout .form-type-radio {
float: left;
margin-right: .5em;
width: 90px;
}
.panels-layouts-checkboxes .form-checkboxes .form-item .layout-icon,
#panels-choose-layout .form-type-radio .form-item .layout-icon,
.panels-choose-layout .form-type-radio .form-item .layout-icon {
float: none;
height: 11em;
width: 90px;
}
.panels-layouts-checkboxes .form-checkboxes .option input,
#panels-choose-layout .form-type-radio input,
.panels-choose-layout .form-type-radio input {
width: 50px;
display: block;
text-align: center;
}
.panels-layouts-checkboxes .form-submit,
#panels-choose-layout .form-submit {
clear: left;
}
.panels-layouts-checkboxes .panels-layout-list label,
#panels-choose-layout .panels-layout-list label {
width: 300px;
float: left;
clear: left;
background: url(../images/go-right.png) right no-repeat;
margin-right: 20px;
}
.panels-layouts-checkboxes .panels-layouts-category {
font-weight: bold;
width: 100%;
float: left;
}
.panels-layouts-checkboxes .description {
clear: left;
}
.change-layout-display .layout-icon {
float: left;
}
.change-layout-display > img {
padding: 25px 25px 25px 0;
float: left;
}
table .operation {
text-align: right;
padding-right: 6px;
}
table .argument-operation input {
padding: 0;
margin: 0;
position: relative;
top: 3px;
}
.panels-admin-view {
padding: 1em;
border: 1px dotted black;
margin-bottom: 1em;
}
tr.changed td {
background-color: #FFFFDD !important;
}
tr.changed td span.star {
font-weight: bold;
color: #E09010;
}
td select {
margin: 0;
padding: 0;
}
.panels-style-settings,
.panels-style-settings-box,
#panels-style-setting {
float: left;
}
.panels-style-settings-box .form-item {
margin: 0 1em 0 0;
}
This diff is collapsed.
div.panels-page-type-container {
clear: left;
}
div.panels-page-type-container .form-checkboxes .form-item {
float: left;
width: 15em;
}
#panels-page-settings .form-submit {
display: block;
clear: left;
}
<p>Panels is a pluggable rendering engine. Apart from its datastructure, almost nothing in Panels is hardcoded; every level of its rendering process is controlled by plugins (of the <a href="topic:ctools/plugins">CTools</a> variety), and therefore can be overriden. Some of these plugins' behaviors are obvious from the UI, whereas others are much more under-the-hood.</p>
<p>Most site builders and module authors will find that plugins are the only way they need to interact with Panels to do what they want. However, if you are building whole new UIs/applications that are to be driven by the Panels engine, you'll also need the more traditional API that manages Panels editing and CRUD. Panels Node and Mini Panels are examples of 'applications' in this sense, as is <a href="http://drupal.org/project/og_panels">OG Panels</a>.</p>
<p>This page is divided into two sections, the first dealing with Panels' rendering system & the plugins the drive it, and the second with the requirements for creating a Panels-driven application/UI. The former is a good starting place and should be of interest to anyone wanting to begin working with the Panels API.</p>
<h2>The Panels Rendering System</h2>
<p>Panels' rendering system takes a fully-loaded panels_display object and turns it into HTML. It doesn't care how that object was built or where it comes from - it's just a rendering engine. So long as the calling code provides a well-formed panels_display object, the engine will spit out HTML. Exactly how that process works is determined entirely by plugins.</p>
<p>Panels utilizes eight different types of plugins within its rendering system, four owned by Panels and four by CTools. Let's run through that list.</p>
<dl>
<dt><a href="topic:panels/plugins-layout">Layout plugins</a></dt>
<dd><em>Owned by Panels.</em></dd>
<dd>Layout plugins provide the HTML output skeleton for any panel: they define a set of regions and (optionally) accompanying CSS/JS, very analogous to how themes define block regions. While layout plugins with complex logic are possible (the Flexible layout, for example), most layouts are nothing more than a region list, a tpl.php skeleton, and some CSS.</dd>
<dt><a href="topic:panels/plugins-style">Style plugins</a></dt>
<dd><em>Owned by Panels.</em></dd>
<dd>Style plugins control the markup that wraps both individual panes and whole panel regions. A basic style plugin need not provide more than some basic CSS and a theme function or tpl.php file.</dd>
<dt><a href="topic:ctools/plugins-style-bases">Style Bases</a></dt>
<dd><em>Owned by CTools.</em></dd>
<dd>Panels implements the 'style_bases' plugin type in order to interact with the Stylizer system, which technically lives in CTools, though true 'ownership' is a little blurred. Regardless, Panels uses this plugin to interact with Stylaizer in order to allow the creation of style plugins in the UI.</dd>
<dd>This plugin is probably of interest only to module developers; site builders can safely skip it.</dd>
<dt><a href="topic:ctools/context-context">Context plugins</a></dt>
<dd><em>Owned by CTools.</em></dd>
<dd>Context plugins are abstracted wrappers around bits of data - a node, user, or taxonomy term are easy examples. Panels uses context plugins so that it can work with all these different bits of data without caring about the details of the datastructure itself. Context can be a confusing concept, and you can learn more in the <a href="topic:ctools/context">CTools help</a>.</dd>
<dd>Note that <a href="topic:ctools/context-arguments">argument</a> and <a href="topic:ctools/context-relationships">relationship</a> plugins are technically also used by Panels, but because they're really means for creating more context, they don't get separate entries in this list.</dd>
<dt><a href="topic:ctools/plugins-content">Content Type plugins</a></dt>
<dd><em>Owned by CTools: can utilize context.</em></dd>
<dd>At the heart of the Panels rendering process, content type plugins define the rendering logic for every pane. Offering Panels a renderable chunk from your module means defining one of these. For those accustomed to the block system, they can be thought of as a more verbose block definition, contained neatly inside a single plugin.</dd>
<dd>Content type plugins rely on context to provide them with source data, when necessary; this makes content plugins nice and portable.</dd>
<dt><a href="topic:ctools/context-access">Access plugins</a></dt>
<dd><em>Owned by CTools: can utilize context.</em></dd>
<dd>Access plugins are essentially portable access checking logic, responsible for answering "Yes" or "No" given some contextual data. Panels uses these to define 'visibility rules' on individual panes. The other place these are commonly seen is in defining 'Selection rules' on Page Manager variants.</dd>
<dd>If your module introduces new permissioning concepts or access logic (NOT a basic hook_perm() implementation), you may want to consider also encapsulating that logic in one or more of these plugins. For example, Organic Groups might implement an access plugin to allow/deny based on group membership, or the Date module might implement allow/deny logic based on request time.</dd>
<dt><a href="topic:panels/plugins-cache">Cache plugins</a></dt>
<dd><em>Owned by Panels; should utilize context.</em></dd>
<dd>Panels cache plugins define caching strategies that can be applied to individual panes, or to whole displays. Caching plugins must deal with two basic issues: the cache backend to use for reading/writing, and TTL-managing strategies.</dd>
<dd>TTL strategies can (and should) integrate heavily with the context, as that is where the real differential benefit of Panels-based caching is vs. standard core caching.</dd>
<dt><a href="topic:panels/plugins-renderers">Display Renderers</a></dt>
<dd><em>Owned by Panels: utilizes everything else.</em></dd>
<dd>In the simplest terms, display renderers take a fully-loaded panels_display object and render it. They are very complex, powerful plugins - one could use them to cause Panels to bypass every single other plugin in this list. Fortunately, there is virtually no circumstance under which one would need to implement these plugins in the process of building a single site; only contrib developers working on highly complex use cases are likely to ever need them.</dd>
<dd>In short, each display renderer plugin <strong>is</strong> a self-contained Panels rendering engine. If you want to grok the Panels rendering system, study these.</dd>
</dl>
<h2>Panels-based Applications</h2>
<p>At its core, Panels is a rendering engine with no UI (though it does provide common elements for reuse in admin UIs). So if you're working with Panels via the web UI, it means you're working with a Panels application. The three that ship with this version of Panels are Mini Panels, Panel Nodes, and the integration with CTools' Page Manager.</p>
<p>Panels also implements a task_handler plugin, which is owned by Page Manager in CTools. Task handlers aren't strictly a part of Panels' rendering system itself though (strictly speaking, they wrap it), so we won't cover them here.</p>
\ No newline at end of file
[advanced help settings]
line break = TRUE
[glossary]
title = Panels glossary of terms
weight = 100
[about]
title = About Panels
weight = -100
[common-tasks]
title = Accomplishing common tasks in Panels
weight = -50
[tutorials]
title = Panels tutorials and how-tos
weight = -30
[tutorial-landing]
title = Creating a simple landing page
parent = tutorials
[tutorial-node]
title = Styling a node page
parent = tutorials
[tutorial-vocabulary]
title = Styling a vocabulary
parent = tutorials
[apps]
title = Panels-based applications
parent = api
[panels-pages]
title = Panel pages, via Page Manager
parent = apps
[panels-mini]
title = Mini panels
parent = apps
[panels-node]
title = Panel nodes
parent = apps
[api]
title = Working with the Panels API
weight = 50
[render-api]
title = Panels plugins
parent = api
[plugins-layout]
title = Layout plugins
parent = render-api
weight = -10
[plugins-style]
title = Style plugins
parent = render-api
weight = -7
[plugins-cache]
title = Cache plugins
parent = render-api
weight = -4
[plugins-renderers]
title = Display Renderer plugins
parent = render-api
weight = -1
<h2>Getting Started:</h2>
<p>Layout plugins are one of the simplest and most powerful sections of the Panels API. There are two different ways that a layout can be implemented via Panels. Panels supports both module and theme implementations of Panels. The module implementation requires that hook_ctools_plugin_directory define the directory in which your layout plugins exist. (This same hook defines the directory for all Panels plugins) Alternately, if you intend on implementing a layout in a theme this can be done primary through the theme's info file. The CTools help does a great job of actually explaining this portion of the API <a href="topic:ctools/plugins-implementing">ctools: plugins</a>.</p>
<p>For purposes of this example, our module name is going to be "layout_sample" and our plugin will be "first_layout".</p>
<h2>Directory Structure:</h2>
<p>We're going to assume that you've laid your directory structure out very similarly to how panels does it. Something like this is rather likely:
<pre>layout_sample
layout_sample.info
layout_sample.module
plugins
layouts
first_layout
first_layout.css
first_layout.inc
first_layout.png
layout-sample-first-layout.tpl.php</pre>
The name of our .inc file is going to be the key to the entire layout plugin.</p>
<h2>The .module File:</h2>
<p>First, declare where your custom layouts reside by implementing the CTools hook <code>hook_ctools_plugin_directory()</code>:
<pre>
/**
* Implements hook_ctools_plugin_directory().
*/
function layout_sample_ctools_plugin_directory($module, $plugin) {
if ($module == 'panels' && $plugin == 'layouts') {
return 'plugins/layouts';
}
}
</pre>
<h2>The .inc File:</h2>
<p>We will start with the first_layout.inc file as it's the most important file we're dealing with here. First_layout.inc will look similar to the following:
<pre>
$plugin = array(
'title' => t('First Layout'),
'icon' => 'first_layout.png',
'theme' => 'layout_sample_first_layout',
'css' => 'first_layout.css',
'panels' => array(
'main' => t('Main region'),
'right' => t('Right region'),
),
);
</pre>
The include file defines all the other files that our layout will utilize in order to be truly useful. The array is fairly self explanitory but for the sake of specificity:
<ol>
<li><strong>Title:</strong><br />The title of our layout. (Utilized within the panels administration screens)</li>
<li><strong>Icon:</strong><br />The graphical representation of our layout. (Utilized within the panels administration screens)</li>
<li><strong>Theme:</strong><br />The template file of our layout. (Sharp eyed readers will note that the theme definition utilizes underscores instead of dashes, and does not have ".tpl.php" after it. This is refering to the layout-sample-first-layout.tpl.php file all the same, it is simply how the naming convention works. Utilize dashes in the tpl file name and underscores when refering to it in your include file.)</li>
<li><strong>CSS:</strong><br />The css file to be utilized for our layout. (Utilized within the panels administration screens, AND when viewing the actual panel itself.)</li>
<li><strong>Panels:</strong><br />Defines all the various regions within your panel. This will be further utilized within our tpl.php file.</li>
</ol>
There are many additional properties that can be added to the include file. For purposes of this document we'll also make mention of the 'admin css' property. 'Admin css' is especially useful when utilizing a fixed width layout with fixed with panel regions. This can break under most administrative circumstances, and panels provides you with the ability to give an additional css layout for the administrative section. It's a simple nicety and looks like this:
<pre>
$plugin = array(
'title' => t('First Layout'),
'icon' => 'first_layout.png',
'theme' => 'layout_sample_first_layout',
'css' => 'first_layout.css',
'admin css' => 'first_layout_admin.css',
'panels' => array(
'main' => t('Main region'),
'right' => t('Right region'),
),
);
</pre>
</p>
<h2>The tpl.php File:</h2>
<p>The tpl.php file is very similar to any other template file within drupal. The difference here is that we're being passed an array of regions through $content, and we also have a css id available to us for the entire panel in the form of $css_id. The template is very straight forward and will look similar to the following:
<pre>&lt;div class="panel-display panel-stacked-twothirds-onethird clearfix" &lt;?php if (!empty($css_id)) { print "id=\"$css_id\""; } ?&gt;&gt;
&lt;div class="panel-panel panel-col-first panel-region-main"&gt;
&lt;div class="inside"&gt;&lt;?php print $content['main']; ?&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="panel-panel panel-col-last panel-region-right"&gt;
&lt;div class="inside"&gt;&lt;?php print $content['right']; ?&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</pre>
This is simply an example of what the html could look like. You can alter an update this html to fit your own needs.
</p>
<h2>The Other Files:</h2>
<p>The css and png files are as simple as any other css or png file you've ever utilized. Panels provides some images for its graphical representations of its layouts. I would heavily encourage you to modify these to suit your needs. The CSS files (admin and non) will be included at the appropriate times. Simply set them up to fit your purposes. If you're utilizing fixed width panel regions it's probably smart to provide an admin css file as well with your panel layout.</p>
This module provides by default the ability to translate panel display and
panel pane titles.
Further it introduced an extension to the ctools content_types plugin.
You can now define translatable settings which will be registered in i18n.
Out of the box the module extends the custom content content_type to allow
translation of the content.
Requirements:
Ctools 7.x-1.x-dev (Jan 28-2014 or newer)
Panels 7.x-3.x-dev (Jan 28-2014 or newer)
Plugin definition extension:
------------------------------
This example shows how the content_type custom is extended:
#### Default: ####
/**
* Plugins are described by creating a $plugin array which will be used
* by the system that includes this file.
*/
$plugin = array(
'title' => t('Custom content'),
'no title override' => TRUE,
'defaults' => array('admin_title' => '', 'title' => '', 'body' => '', 'format' => filter_fallback_format(), 'substitute' => TRUE),
'js' => array('misc/autocomplete.js', 'misc/textarea.js', 'misc/collapse.js'),
// Make sure the edit form is only used for some subtypes.
'edit form' => '',
'add form' => '',
'edit text' => t('Edit'),
'all contexts' => TRUE,
);
#### Extended Configuration: ####
/**
* Plugins are described by creating a $plugin array which will be used
* by the system that includes this file.
*/
$plugin = array(
'title' => t('Custom content'),
'no title override' => TRUE,
'defaults' => array('admin_title' => '', 'title' => '', 'body' => '', 'format' => filter_fallback_format(), 'substitute' => TRUE),
'js' => array('misc/autocomplete.js', 'misc/textarea.js', 'misc/collapse.js'),
// Make sure the edit form is only used for some subtypes.
'edit form' => '',
'add form' => '',
'edit text' => t('Edit'),
'all contexts' => TRUE,
'i18n_settings' = array(
'title',
'body' => array('format' => 'plain_text'),
'items|0|title'
),
);
The new key "i18n_settings" defines an array with the settings that are
translatable. The array contains the names of the settings, they have to be
available in the "defaults" array of the content definition. If you need to
define a format use the name of the setting as the array item key and as item
another array with the detail configuration. E.g
'i18n_settings' = array('body' => array('format' => 'plain_text'))
If i18n_settings is a string it's used as callback. The expected return is an
array equal to the one used in the fix configuration.
You can even declare nested settings as translatable, to do so use '|' as
delimiter.
E.g. 'items|0|title' is evaluated as $settings['items'][0]['title']
#### Callback: ####
/**
* Plugins are described by creating a $plugin array which will be used
* by the system that includes this file.
*/
$plugin = array(
'title' => t('Custom content'),
'no title override' => TRUE,
'defaults' => array('admin_title' => '', 'title' => '', 'body' => '', 'format' => filter_fallback_format(), 'substitute' => TRUE),
'js' => array('misc/autocomplete.js', 'misc/textarea.js', 'misc/collapse.js'),
// Make sure the edit form is only used for some subtypes.
'edit form' => '',
'add form' => '',
'edit text' => t('Edit'),
'all contexts' => TRUE,
'i18n_settings' => 'ctools_custom_content_type_i18n_settings',
);
function ctools_custom_content_type_i18n_settings($conf) {
return array(
'title',
'body' => array('format' => $conf['format']),
);
}
<?php
/**
* @file
* Internationalization (i18n) hooks
*/
/**
* Implements hook_i18n_object_info().
*/
function i18n_panels_i18n_object_info() {
$info['pane_configuration'] = array(
'title' => t('Pane Configuration'),
'key' => 'uuid',
'string translation' => array(
'textgroup' => 'panels',
'type' => 'pane_configuration',
'properties' => array(
'title' => t('Pane Title'),
),
),
);
$info['display_configuration'] = array(
'title' => t('Display Configuration'),
'key' => 'uuid',
'string translation' => array(
'textgroup' => 'panels',
'type' => 'display_configuration',
'properties' => array(
'title' => t('Display Title'),
),
),
);
return $info;
}
/**
* Implements hook_i18n_string_info().
*/
function i18n_panels_i18n_string_info() {
$groups['panels'] = array(
'title' => t('Panels'),
'description' => t('Translatable panels items: display and pane configuration items. E.g. Title.'),
// This group doesn't have strings with format.
'format' => FALSE,
// This group can list all strings.
'list' => FALSE,
);
return $groups;
}
name = Panels translation
description = Supports translatable panels items.
dependencies[] = i18n
dependencies[] = panels
dependencies[] = i18n_string
dependencies[] = i18n_translation
package = Multilingual - Internationalization
core = 7.x
; Information added by Drupal.org packaging script on 2014-02-12
version = "7.x-3.4"
core = "7.x"
project = "panels"
datestamp = "1392221614"
<?php
/**
* @file
* Internationalization (i18n) submodule: Panels translation.
*/
/**
* Implements hook_requirements().
*/
function i18n_panels_requirements($phase) {
$requirements = array();
// Check only for status report, to allow update / install.
if ($phase == 'runtime') {
// Check if the panels module runs with uuids.
$requirements['uuid'] = array(
'title' => t('Panels uuid support.'),
'severity' => REQUIREMENT_OK,
'value' => t('Available'),
);
if (!db_field_exists('panels_pane', 'uuid')) {
$requirements['uuid']['severity'] = REQUIREMENT_ERROR;
$requirements['uuid']['value'] = t('Not found. Please apply the provided patches and run the update script.');
}
}
return $requirements;
}
<?php
/**
* @file
* Contains template preprocess files for the add content modal themes.
*/
/**
* Preprocess the primary entry level theme.
*/
function template_preprocess_panels_add_content_modal(&$vars) {
// Process the list of categories.
foreach ($vars['categories'] as $key => $category_info) {
// 'root' category is actually displayed under the categories, so
// skip it.
if ($key == 'root') {
continue;
}
$class = 'panels-modal-add-category';
if ($key == $vars['category']) {
$class .= ' active';
}
$url = $vars['renderer']->get_url('select-content', $vars['region'], $key);
$vars['categories_array'][] = ctools_ajax_text_button($category_info['title'], $url, '', $class);
}
// Now render the top level buttons (aka the root category) if any.
$vars['root_content'] = '';
if (!empty($vars['categories']['root'])) {
foreach ($vars['categories']['root']['content'] as $content_type) {
$vars['root_content'] .= theme('panels_add_content_link', array('renderer' => $vars['renderer'], 'region' => $vars['region'], 'content_type' => $content_type));
}
}
}
/**
* Process the panels add content modal.
*
* This is run here so that preprocess can make changes before links are
* actually rendered.
*/
function template_process_panels_add_content_modal(&$vars) {
$content = !empty($vars['categories'][$vars['category']]['content']) ? $vars['categories'][$vars['category']]['content'] : array();
// If no category is selected or the category is empty or our special empty
// category render a 'header' that will appear instead of the columns.
if (empty($vars['category']) || empty($content) || $vars['category'] == 'root') {
$vars['header'] = t('Content options are divided by category. Please select a category from the left to proceed.');
}
else {
$titles = array_keys($content);
natcasesort($titles);
// This will default to 2 columns in the theme definition but could be
// changed by a preprocess. Ensure there is at least one column.
$columns = max(1, $vars['column_count']);
$vars['columns'] = array_fill(1, $columns, '');
$col_size = count($titles) / $columns;
$count = 0;
foreach ($titles as $title) {
$which = floor($count++ / $col_size) + 1;
$vars['columns'][$which] .= theme('panels_add_content_link', array('renderer' => $vars['renderer'], 'region' => $vars['region'], 'content_type' => $content[$title]));
}
}
$vars['messages'] = theme('status_messages');
}
/**
* Preprocess the add content link used in the modal.
*/
function template_preprocess_panels_add_content_link(&$vars) {
$vars['title'] = filter_xss_admin($vars['content_type']['title']);
$vars['description'] = isset($vars['content_type']['description']) ? $vars['content_type']['description'] : $vars['title'];
$vars['icon'] = ctools_content_admin_icon($vars['content_type']);
$vars['url'] = $vars['renderer']->get_url('add-pane', $vars['region'], $vars['content_type']['type_name'], $vars['content_type']['subtype_name']);
$vars['image_button'] = ctools_ajax_image_button($vars['icon'], $vars['url'], $vars['description'], 'panels-modal-add-config');
$vars['text_button'] = ctools_ajax_text_button($vars['title'], $vars['url'], $vars['description'], 'panels-modal-add-config');
}
<?php
/**
* @file callbacks.inc
* Minor menu callbacks for Panels helpers.
*/
/**
* A central administrative page for Panels.
*/
function panels_admin_page() {
// @todo I think this should return a renderable array somehow?
return theme('panels_dashboard');
}
function panels_dashboard_final_blocks(&$vars) {
// Add in links for missing modules that we still want to mention:
if (empty($vars['links']['page_manager'])) {
$vars['links']['page_manager'] = array(
'weight' => -100,
'title' => t('Panel page'),
'description' => '<em>' . t('You must activate the page manager module for this functionality.') . '</em>',
);
}
if (empty($vars['links']['panels_mini'])) {
$vars['links']['panels_mini'] = array(
'title' => t('Mini panel'),
'description' => '<em>' . t('You must activate the Mini panels module for this functionality.') . '</em>',
);
}
if (empty($vars['links']['panels_node'])) {
$vars['links']['panels_mini'] = array(
'title' => t('Panel node'),
'description' => '<em>' . t('You must activate the panel node module for this functionality.') . '</em>',
);
}
}
/**
* Implementation of hook_panels_dashboard_blocks().
*
* Adds page information to the Panels dashboard.
*/
function panels_panels_dashboard_blocks(&$vars) {
$vars['links']['panels_layout'] = array(
'title' => l(t('Custom layout'), 'admin/structure/panels/layouts/add'),
'description' => t('Custom layouts can add more, site-specific layouts that you can use in your panels.'),
);
// Load all mini panels and their displays.
ctools_include('export');
$items = ctools_export_crud_load_all('panels_layout');
$count = 0;
$rows = array();
foreach ($items as $item) {
$rows[] = array(
check_plain($item->admin_title),
array(
'data' => l(t('Edit'), "admin/structure/panels/layouts/list/$item->name/edit"),
'class' => 'links',
),
);
// Only show 10.
if (++$count >= 10) {
break;
}
}
if ($rows) {
$content = theme('table', array('rows' => $rows, 'attributes' => array('class' => 'panels-manage')));
}
else {
$content = '<p>' . t('There are no custom layouts.') . '</p>';
}
$vars['blocks']['panels_layout'] = array(
'title' => t('Manage custom layouts'),
'link' => l(t('Go to list'), 'admin/structure/panels/layouts'),
'content' => $content,
'class' => 'dashboard-layouts',
'section' => 'right',
);
}
function template_preprocess_panels_dashboard(&$vars) {
ctools_add_css('panels-dashboard', 'panels');
ctools_include('plugins');
$vars['image_path'] = ctools_image_path('', 'panels');
$vars['links'] = array();
$vars['blocks'] = array();
foreach (module_implements('panels_dashboard_blocks') as $module) {
$function = $module . '_panels_dashboard_blocks';
$function($vars);
}
// Add in any default links for modules that are not active
panels_dashboard_final_blocks($vars);
// If page manager module is enabled, add a very low eight block to
// list the page wizards.
if (module_exists('page_manager')) {
$vars['blocks']['wizards'] = array(
'weight' => -101,
'section' => 'right',
'title' => t('Page wizards'),
'content' => '',
'class' => 'dashboard-wizards',
);
ctools_include('page-wizard');
$plugins = page_manager_get_page_wizards();
uasort($plugins, 'ctools_plugin_sort');
foreach ($plugins as $id => $plugin) {
if (isset($plugin['type']) && $plugin['type'] == 'panels') {
$link = array(
'title' => l($plugin['title'], 'admin/structure/pages/wizard/' . $id),
'description' => $plugin['description'],
);
$vars['blocks']['wizards']['content'] .= theme('panels_dashboard_link', array('link' => $link));
}
}
}
uasort($vars['links'], 'ctools_plugin_sort');
$vars['blocks']['links'] = array(
'weight' => -100,
'section' => 'left',
'title' => t('Create new') . '...',
'content' => '',
'class' => 'dashboard-create',
);
// Turn the links into a block
foreach ($vars['links'] as $link) {
$vars['blocks']['links']['content'] .= theme('panels_dashboard_link', array('link' => $link));
}
uasort($vars['blocks'], 'ctools_plugin_sort');
$vars['left'] = '';
$vars['right'] = '';
// Render all the blocks
foreach ($vars['blocks'] as $block) {
$section = !empty($block['section']) ? $block['section'] : 'left';
$vars[$section] .= theme('panels_dashboard_block', array('block' => $block));
}
}
function panels_admin_settings_page() {
$form = array();
if (module_exists('page_manager')) {
foreach (page_manager_get_tasks() as $task) {
if ($function = ctools_plugin_get_function($task, 'admin settings')) {
$function($form);
}
}
}
ctools_include('content');
foreach (ctools_get_content_types() as $content) {
if ($function = ctools_plugin_get_function($content, 'admin settings')) {
$function($form);
}
}
ctools_include('plugins', 'panels');
$pipelines = panels_get_renderer_pipelines();
$options = array();
foreach ($pipelines as $key => $value) {
$options[$key] = $value->admin_title;
}
if (count($options) > 1) {
$form['panels_renderer_default'] = array(
'#type' => 'select',
'#title' => t('Default renderer'),
'#options' => $options,
'#default_value' => variable_get('panels_renderer_default', 'standard'),
'#description' => t('The default renderer for new panel pages.'),
);
}
if (empty($form)) {
return array('#value' => t('There are currently no settings to change, but additional plugins or modules may provide them in the future.'));
}
return system_settings_form($form);
}
/**
* Settings for panel contexts created by the page manager.
*/
function panels_admin_panel_context_page() {
ctools_include('common', 'panels');
return drupal_get_form('panels_common_settings', 'panels_page');
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
<?php
/**
* Legacy state manager for Panels.
*
* Checks all possible ways (using discovery of patterned method names) in which
* Panels may need to operate in legacy mode,
* sets variables as appropriate, and returns an informational
*
*/
class PanelsLegacyState {
var $legacy = NULL;
function t() {
$func = get_t();
$args = func_get_args();
return call_user_func_array($func, $args);
}
function getStatus() {
if (!isset($this->legacy)) {
$this->determineStatus();
}
return $this->legacy;
}
/**
* Run all compatibility checks.
*/
function determineStatus() {
$this->legacy = array();
foreach(get_class_methods($this) as $method) {
if (strtolower(substr($method, 0, 5)) == 'check') {
$this->legacy[$method] = $this->$method();
}
}
$this->legacy = array_filter($this->legacy);
}
// At this time there are no legacy checks.
}
<?php
/**
* @file
* Contains helper functions for the Panels page wizards.
*/
/**
* Add layout form helper for panels page wizards.
*
* This is not a proper form, it is meant to be called by a form to add
* elements to it.
*/
function panels_page_wizard_add_layout(&$form, &$form_state) {
$form_state['allowed_layouts'] = 'panels_page';
$form_state['display'] = $form_state['wizard cache']->display;
// Tell the Panels form not to display buttons.
$form_state['no buttons'] = TRUE;
// Change the #id of the form so the CSS applies properly.
$form['#id'] = 'panels-choose-layout';
$form['layout_prefix'] = array(
'#value' => '<fieldset><legend>' . t('Layout') . '</legend>',
);
ctools_include('common', 'panels');
ctools_include('display-layout', 'panels');
ctools_include('plugins', 'panels');
$form = panels_choose_layout($form, $form_state);
$form['layout_suffix'] = array(
'#value' => '</fieldset>',
);
// $form_state['cache'] = FALSE;
}
/**
* Add content editor form helper for panels page wizards.
*
* This is not a proper form, it is meant to be called by a form to add
* elements to it.
*/
function panels_page_wizard_add_content(&$form, &$form_state) {
ctools_include('ajax');
ctools_include('plugins', 'panels');
ctools_include('common', 'panels');
ctools_include('display-edit', 'panels');
// Panels provides this caching mechanism to make it easy to use the
// wizard to cache the display.
$cache = panels_edit_cache_get('panels_page_wizard:' . $form_state['plugin']['name']);
$form_state['renderer'] = panels_get_renderer_handler('editor', $cache->display);
$form_state['renderer']->cache = &$cache;
$form_state['display'] = &$cache->display;
$form_state['content_types'] = $cache->content_types;
// Tell the Panels form not to display buttons.
$form_state['no buttons'] = TRUE;
$form_state['display_title'] = !empty($cache->display_title);
$form = panels_edit_display_form($form, $form_state);
}
/**
* Add content form submit handler
*
* This is not a proper submit handler, it is meant to be called by a form's
* submit handler to handle submission.
*/
function panels_page_wizard_add_content_submit(&$form, &$form_state) {
// Call the normal panels edit form submit to make sure values are stored
// on the display
panels_edit_display_form_submit($form, $form_state);
$cache = &$form_state['wizard cache'];
// Copy the "being edited" cached display to the "actual" cached display.
$cache->display = &$form_state['display'];
unset($cache->display_cache);
}
<?php
/**
* @file
* Bulk export of panels_layouts objects generated by Bulk export module.
*/
/**
* Implements hook_default_panels_renderer_pipeline().
*/
function panels_default_panels_renderer_pipeline() {
$pipelines = array();
$pipeline = new stdClass;
$pipeline->disabled = FALSE; /* Edit this to true to make a default pipeline disabled initially */
$pipeline->api_version = 1;
$pipeline->name = 'standard';
$pipeline->admin_title = t('Standard');
$pipeline->admin_description = t('Renders a panel normally. This is the most common option.');
$pipeline->weight = -100;
$pipeline->settings = array(
'renderers' => array(
0 => array(
'access' => array(),
'renderer' => 'standard',
'options' => array(),
),
),
);
$pipelines[$pipeline->name] = $pipeline;
return $pipelines;
}
This diff is collapsed.
This diff is collapsed.
/**
* @file layout.js
*
* Contains javascript to make layout modification a little nicer.
*/
(function ($) {
Drupal.Panels.Layout = {};
Drupal.Panels.Layout.autoAttach = function() {
$('div.form-item div.layout-icon').click(function() {
$widget = $('input', $(this).parent());
// Toggle if a checkbox, turn on if a radio.
$widget.attr('checked', !$widget.attr('checked') || $widget.is('input[type=radio]'));
});
};
$(Drupal.Panels.Layout.autoAttach);
})(jQuery);
/**
* @file
* Implement basic methods required by all of panels.
*/
(function ($) {
Drupal.Panels = Drupal.Panels || {};
Drupal.Panels.changed = function(item) {
if (!item.is('.changed')) {
item.addClass('changed');
item.find('div.grabber span.text').append(' <span class="star">*</span> ');
}
};
Drupal.Panels.restripeTable = function(table) {
// :even and :odd are reversed because jquery counts from 0 and
// we count from 1, so we're out of sync.
$('tbody tr:not(:hidden)', $(table))
.removeClass('even')
.removeClass('odd')
.filter(':even')
.addClass('odd')
.end()
.filter(':odd')
.addClass('even');
};
})(jQuery);
<?php
/**
* @file
* Hooks provided by Panels.
*/
/**
* Allow modules to provide their own caching mechanism for the display editor.
*
* @param string $argument
* The second half of the cache key. Full key module:TASK_NAME:HANDLER_NAME
* passed part: TASK_NAME:HANDLER_NAME
* @param stdClass $cache
* The display to cache.
*/
function hook_panels_cache_set($argument, $cache) {
list($handler, $item) = _panels_mini_panels_cache_get($argument);
$item->mini_panels_display_cache = $cache;
$handler->edit_cache_set_key($item, $argument);
}
/**
* Allow modules to provide their own caching mechanism for the display editor.
*
* @param string $argument
* The second half of the cache key. Full key module:TASK_NAME:HANDLER_NAME
* passed part: TASK_NAME:HANDLER_NAME
*
* @return stdClass|NULL
* The cached display or NULL if the cache wasn't hit.
*/
function hook_panels_cache_get($argument) {
ctools_include('common', 'panels');
list($handler, $item) = _panels_mini_panels_cache_get($argument);
if (isset($item->mini_panels_display_cache)) {
return $item->mini_panels_display_cache;
}
$cache = new stdClass();
$cache->display = $item->display;
$cache->display->context = ctools_context_load_contexts($item);
$cache->display->cache_key = 'panels_mini:' . $argument;
$cache->content_types = panels_common_get_allowed_types('panels_mini', $cache->display->context);
$cache->display_title = TRUE;
// @TODO support locking.
$cache->locked = FALSE;
return $cache;
}
/**
* Allow modules to provide their own caching mechanism for the display editor.
*
* @param string $argument
* The second half of the cache key. Full key module:TASK_NAME:HANDLER_NAME
* passed part: TASK_NAME:HANDLER_NAME
* @param stdClass $cache
* The display to cache.
*
* @return stdClass
* The cached display.
*/
function hook_panels_cache_save($argument, $cache) {
list($handler, $item) = _panels_mini_panels_cache_get($argument);
$item->display = $cache->display;
panels_mini_save($item);
$handler->edit_cache_clear($item);
return $item;
}
/**
* Allow modules to provide their own caching mechanism for the display editor.
*
* @param string $argument
* The second half of the cache key. Full key module:TASK_NAME:HANDLER_NAME
* passed part: TASK_NAME:HANDLER_NAME
* @param stdClass $cache
* The cached display.
*/
function hook_panels_cache_clear($argument, $cache) {
list($handler, $item) = _panels_mini_panels_cache_get($argument);
$handler->edit_cache_clear($item);
}
/**
* Allow modules to adjust the rendering array of the panels dashboard.
*
* @param array $vars
* The output variables.
*/
function hook_panels_dashboard_blocks(&$vars) {
$vars['links']['panels_node'] = array(
'title' => l(t('Panel node'), 'node/add/panel'),
'description' => t('Panel nodes are node content and appear in your searches, but are more limited than panel pages.'),
'weight' => -1,
);
}
/**
* Allow to alter the pane content to render.
*
* This happens after the keyword substitution.
*
* @param stdClass $content
* The content block to render.
* @param stdClass $pane
* The pane object.
* @param array $args
* The display arguments.
* @param array $contexts
* Array with the used contexts.
*/
function hook_panels_pane_content_alter($content, $pane, $args, $contexts) {
// Don't display titles.
unset($content->title);
}
/**
* Allow modules to provide a mechanism to break locks.
*
* @param string $argument
* The second half of the cache key. Full key module:TASK_NAME:HANDLER_NAME
* passed part: TASK_NAME:HANDLER_NAME
* @param stdClass $cache
* The cached display.
*/
function hook_panels_edit_cache_break_lock($argument, $cache) {
$cache->locked = FALSE;
}
/**
* Fired before a panels display is rendered.
*
* Last chance to modify the panels display or add output before the keyword
* substitution runs and the panels display is rendered.
*
* @param panels_display $panels_display
* The panels display that will be rendered.
* @param stdClass $renderer
* The renderer object that will be used to render.
*
* @return string
* Additional output to add before the panels display.
*/
function hook_panels_pre_render($panels_display, $renderer) {
$translation = i18n_string_object_translate('panels_display_configuration', $panels_display);
$panels_display->title = $translation->title;
}
/**
* Fired after a panels display is rendered.
*
* Allow to add additional output after the output of the panels display.
*
* @param panels_display $panels_display
* The rendered panels display.
* @param stdClass $renderer
* The used renderer object.
*
* @return string
* Additional output to add after the panels display.
*/
function hook_panels_post_render($panels_display, $renderer) {
return t('Output proudly sponsored by panels.');
}
/**
* Fired before a new pane is inserted in the storage.
*
* @param stdClass $pane
* Pane that will be rendered.
*/
function hook_panels_pane_insert($pane) {
// Check if this pane has a custom title enabled.
if (!empty($pane->configuration['override_title'])) {
$translation_object = (object) array(
'pid' => $pane->pid,
'title' => $pane->configuration['override_title_text'],
);
$status = i18n_string_object_update('panels_pane_configuration', $translation_object);
}
}
/**
* Fired before a changed pane is updated in the storage.
*
* @param stdClass $pane
* Pane that will be rendered.
*/
function hook_panels_pane_update($pane) {
// Check if this pane has a custom title enabled.
if (!empty($pane->configuration['override_title'])) {
$translation_object = (object) array(
'pid' => $pane->pid,
'title' => $pane->configuration['override_title_text'],
);
$status = i18n_string_object_update('panels_pane_configuration', $translation_object);
}
}
/**
* Fired before a panel is rendered.
*
* Last chance to modify the pane before the keyword substitution runs and the
* pane is rendered.
*
* @param stdClass $pane
* Pane that will be rendered.
*/
function hook_panels_pane_prerender($pane) {
// Check if this pane has a custom title enabled.
if (!empty($pane->configuration['override_title'])) {
$translation_object = (object) array(
'pid' => $pane->pid,
'title' => $pane->configuration['override_title_text'],
);
$translation_object = i18n_string_object_translate('panels_pane_configuration', $translation_object);
$pane->configuration['override_title_text'] = $translation_object->title;
}
}
/**
* Fired before panes are deleted.
*
* @param array $pids
* Array with the panel id's to delete.
*/
function hook_panels_pane_delete($pids) {
foreach ($pids as $pid) {
// Create dummy pane with pid as property.
$pane = (object) array('pid' => $pid);
i18n_string_object_remove('panels_pane_configuration', $pane);
}
}
/**
* Fired after a display is saved.
*
* @param panels_display $display
* The display to save.
*/
function hook_panels_display_save($display) {
i18n_string_object_update('display_configuration', $display);
}
/**
* Fired before a display is deleted.
*
* @param integer $did
* Id of the display to delete.
*/
function hook_panels_delete_display($did) {
$uuid = db_select('panels_display')
->fields('panels_display', array('uuid'))
->condition('did', $did)
->execute()
->fetchColumn();
$display = (object) array('uuid' => $uuid);
i18n_string_object_remove('display_configuration', $display);
}
name = Panels
description = Core Panels display functions; provides no external UI, at least one other Panels module should be enabled.
core = 7.x
package = "Panels"
configure = admin/structure/panels
dependencies[] = ctools (>=1.4)
files[] = panels.module
files[] = includes/common.inc
files[] = includes/legacy.inc
files[] = includes/plugins.inc
files[] = plugins/views/panels_views_plugin_row_fields.inc
; Information added by Drupal.org packaging script on 2014-02-12
version = "7.x-3.4"
core = "7.x"
project = "panels"
datestamp = "1392221614"
This diff is collapsed.
This diff is collapsed.
div.panels-ipe-handlebar-wrapper ul {
float: right;
text-align: left;
}
div.panels-ipe-handlebar-wrapper li {
margin: 0 0 0 .5em;
float: right;
}
div.panels-ipe-draghandle span.panels-ipe-draghandle-icon {
float: left;
}
div.panels-ipe-placeholder {
text-align: right;
}
div.panels-ipe-newblock {
left: 30px;
right: auto;
}
div.panels-ipe-handlebar-wrapper li a span,
div.panels-ipe-newblock a span {
text-align: right;
}
div.panels-ipe-newblock a.style {
margin-left: .5em;
margin-right: auto;
}
.panels-ipe-editing .panels-ipe-region {
float: right;
}
/** ============================================================================
* Controller form markup
*/
.ipe-throbber {
right: 49%;
right: auto;
}
div.panels-ipe-control .form-submit {
padding: 0 34px 2px 0.8em;
}
input#panels-ipe-save,
input#panels-ipe-cancel {
background-position: 86% 0;
}
div.panels-ipe-pseudobutton-container a.panels-ipe-startedit {
padding-right: 34px;
padding-left: 10px;
background-position: 93% 9px;
}
div.panels-ipe-pseudobutton-container a.panels-ipe-change-layout {
padding-right: 34px;
padding-left: 10px;
background-position: 93% 9px;
}
This diff is collapsed.
This diff is collapsed.
name = Panels In-Place Editor
description = Provide a UI for managing some Panels directly on the frontend, instead of having to use the backend.
package = "Panels"
dependencies[] = panels
core = 7.x
configure = admin/structure/panels
files[] = panels_ipe.module
; Information added by Drupal.org packaging script on 2014-02-12
version = "7.x-3.4"
core = "7.x"
project = "panels"
datestamp = "1392221614"
This diff is collapsed.
<?php
$plugin = array(
'renderer' => 'panels_renderer_ipe',
);
name = Mini panels
description = Create mini panels that can be used as blocks by Drupal and panes by other panel modules.
package = "Panels"
dependencies[] = panels
core = 7.x
files[] = plugins/export_ui/panels_mini_ui.class.php
; Information added by Drupal.org packaging script on 2014-02-12
version = "7.x-3.4"
core = "7.x"
project = "panels"
datestamp = "1392221614"
This diff is collapsed.
This diff is collapsed.
<?php
$plugin = array(
'renderer' => 'panels_renderer_editor',
);
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment