Monday 19 June 2006 11:34:33 pm - 8 replies
Hi,
It would be very useful to add a ini setting were you could define the type of class you normally would create under a given node.
Takes this structure for example:
Ez publish (2) . . . News (61) . . . . . . National (62) . . . . . . Local (63) . . . Images (83) . . . Attachments (68)
In this case it would be natural to create an article object under News, an image object under Images, a file under Attachments and so on...
This could easily be defined in <i>content.ini</i> like this using the <i>node_id</i> as the key:
[DefaultCreateHere] #DefaultClassMap[node_id]=class_identifier # / DefaultClassMap[2]=menupage # / News DefaultClassMap[61]=article # / Images DefaultClassMap[83]=image # / Attachments DefaultClassMap[68]=file
And in the <i>design/admin/templates/children.tpl</i> [, override] we could use the <i>$node</i> var to do a "reverse dig" if the current node is not defined to check if the parent is specified in the <i>DefaultClassMap</i>.
First check if the current node is defined in the ini, if not; check if the parent node is, if not; check the parent parent node is, stop...
I don't think it would be relevant for further digging.
<select name="ClassID" onchange="updateLanguageSelector(this)" title="{'Use this menu to select the type of item you wish to create and click the "Create here" button. The item will be created within the current location.'|i18n( 'design/admin/node/view/full' )|wash()}">
{def $DefaultClassMap=ezini('DefaultCreateHere','DefaultClassMap','content.ini')}
{def $prefered_class=null}
{if $DefaultClassMap[$node.node_id]}
{set $prefered_class = $DefaultClassMap[$node.node_id]}
{elseif $DefaultClassMap[$node.parent_node_id]}
{set $prefered_class = $DefaultClassMap[$node.parent_node_id]}
{elseif $DefaultClassMap[$node.parent.parent_node_id]}
{set $prefered_class = $DefaultClassMap[$node.parent.parent_node_id]}
{/if}
{section var=CanCreateClasses loop=$can_create_classes}
{if $CanCreateClasses.item.can_instantiate_languages}
<option{eq($prefered_class, $CanCreateClasses.item.identifier)|choose( '', ' selected' )} value="{$CanCreateClasses.item.id}">{$CanCreateClasses.item.name|wash()}</option>
{/if}
{/section}
</select>
It is not a timesaver per say, just luxury ![]()
Just a suggestion,
Thanks!
PS! I have tested the code above, it works fine for me.
Modified on Tuesday 20 June 2006 1:49:16 am by Muu Sle
Tuesday 20 June 2006 9:01:36 am
A slightly modified version for eZ publish 3.7 of Muu Sle's code with support for defaults specified by the content class identifier:
<select name="ClassID" title="{'Use this menu to select the type of item you wish to create and click the "Create here" button. The item will be created within the current location.'|i18n( 'design/admin/node/view/full' )|wash()}">
{def $DefaultClassMapByNode=ezini('DefaultCreateHere','DefaultClassMapByNode','content.ini')
$DefaultClassMapByClass=ezini('DefaultCreateHere','DefaultClassMapByClass','content.ini')
$prefered_class=null}
{if is_set($DefaultClassMapByClass[$node.class_identifier])}
{set $prefered_class = $DefaultClassMapByClass[$node.class_identifier]}
{/if}
{if is_set($DefaultClassMapByNode[$node.node_id])}
{set $prefered_class = $DefaultClassMapByNode[$node.node_id]}
{elseif is_set($prefered_class)|not}
{if is_set($DefaultClassMapByNode[$node.parent_node_id])}
{set $prefered_class = $DefaultClassMapByNode[$node.parent_node_id]}
{elseif is_set($DefaultClassMapByNode[$node.parent.parent_node_id])}
{set $prefered_class = $DefaultClassMapByNode[$node.parent.parent_node_id]}
{/if}
{/if}
{section var=CanCreateClasses loop=$can_create_classes}
<option{eq($prefered_class, $CanCreateClasses.item.identifier)|choose( '', ' selected' )} value="{$CanCreateClasses.item.id}">{$CanCreateClasses.item.name|wash()}</option>
{/section}
{undef $DefaultClassMapByNode $prefered_class}
</select>
Example INI settings:
[DefaultCreateHere] DefaultClassMapByClass[gallery]=image DefaultClassMapByClass[forum]=forum_topic DefaultClassMapByClass[forum_topic]=forum_reply DefaultClassMapByNode[] DefaultClassMapByNode[2]=folder
First it looks for a default for the class of the current node, then this choice can be overriden for specific nodes. If then still no default is found, it will look for a node default of either the parent node, or the grandparent node.
Modified on Tuesday 20 June 2006 2:58:52 pm by Kristof Coomans
Monday 30 October 2006 12:16:23 pm
In fact, I was searching a way to limit available "create here" choices, not only suggest one.
I thought it was in eZ settings, but can't find where, then I found this post. I'll try to change this code a little to add a way to limit available classes as well in the "create here" function.
I know we can do this with roles & policies, but I want to do this in a more efficient and global manner. I think this is the way. But correct me if I'm wrong or if it already exists.
Cheers.
Saturday 27 January 2007 3:48:38 pm
I've packed the modified template for eZ 3.9.0 in an extension and it's in svn now:
http://pubsvn.ez.no/community/trunk/extension/defaultcreatehere
You must be logged in to post messages in this topic!