Roles, User, Sections [ urgent ]

Author Message

Clemens T

Tuesday 24 May 2005 1:38:27 am

Hey all,

1 - Is it possible for me to programmatically create a section and add a folder to it?

2 - I have a bunch of roles, a few users and a couple of sections. Now I want to be able to assign a role to a user and limit him to a section programmatically. Anyone on this one?

Thank you for your time,
Greets,
Clemens

kracker (the)

Tuesday 24 May 2005 2:00:20 am

All good ideas..

You have just switched around the hierarchy of their relationships.

Users are associated with roles not the other way around

Folders are associated with sections not the other way around.

Any user can edit roles, just assign them the required permissions in a role the user is associated with. Not sure of the exact permissions required ...

cheers,
//kracker

<i>Counting Crows : Rain King</i>

Member since: 2001.07.13 || http://ezpedia.se7enx.com/

Clemens T

Tuesday 24 May 2005 2:08:08 am

Yeah ok, I meant it like:

User has a role limited to a section. I don't want to use the admin interface, but do it in my own interface in 1 step. So a drop down is filled with sections and a drop down (for instance) with users.. and a drop down with roles. The admin clicks 'assign' and then I would like to create all the necessary relation/user-rights. Any hints? :)
Greetings,
Clemens
ps: thanks for your fast reply!!

kracker (the)

Tuesday 24 May 2005 2:47:44 am

Get ready for the ride of your life, seriously.

Anything you can imagine is possible with eZ publish but more and more I hear you users looking to do a lot of customizing but don't have a clue how to achieve this on your own.

It's eZ publish but that doesn't mean its going to be handed to you without a lot of work and learning.

Short answer is a custom extension (possibly a workflow, i don't know).

You can do it but your going to have to do a fair amount of work that most people around here simply do not even try to reply to general aka vague questions about what is possible.

Instead I suggest asking very specific and small questions as stepping stones to your goal. Those might get answers, not what I've seen of most users in you situation over the past 6 months, sorry we are still a fairly small community with very view users contributing this level of example implementations back into the community.

./kracker

<i>Counting Crows : Long December ...</i>

Member since: 2001.07.13 || http://ezpedia.se7enx.com/

Clemens T

Tuesday 24 May 2005 4:49:59 am

Thanks Kracker, I know this is a community that needs to be built op by every programmer. I already bought the book, but it hasn't arrived yet. I'm sorry for the vague questions, I was only looking for pointers, so I could study the material related to it. Thanks for your honest anwswer!
Greets
Clemens

edit: Once I know how this system works (and yes, I'm still a newbie), I'll try and assist people on this forum. Just like you are doing, I'm seeing a lot of excellent responses from your side. Good job, keep it up! :)

Lex 007

Tuesday 24 May 2005 7:34:28 am

Hi,

You should check the files in kernel/section and "reverse engineer" what's going on in there. Check also the classes :
- eZContentObjectTreeNode : kernel/classes/ezcontentobjecttreenode.php
- eZSection : kernel/classes/ezsection.php

The main logic for your programming shouldn't be too hard to do (by re-using core eZ Publish functions), but designing a GUI will be harder. If you need a GUI, I strongly suggest you create an extension with a new module. If not, just program a cronjob with a proper INI file (fast and easy to debug ;)

Lex

kracker (the)

Tuesday 24 May 2005 8:23:14 pm

@Clemens,

Thank you for saying so, I do what I can as I can, Time will tell it's value to the eZ community :)

Enjoy you copy of the eZ publish book, I look forward to your contributions, ideas and insight.

I often over look that the first place a new user of eZ publish might turn is the most active part of the current ez.no/community (site). When in truth, the most productive place for a new user to direct the first few weeks of regular attention is into the eZ publish documentation resources (IMHO).

<i>http://www.ez.no/ez_publish/documentation
http://www.ez.no/ez_publish/documentation/faq

http://www.ez.no/ez_publish/documentation/development/extensions/module/hello_world
http://www.ez.no/ez_publish/documentation/development/extensions/building_an_ez_publish_module</i>

@Lex 007

Thank you for pointing / nudging Clemens in the right direction. It really helps us all when we seasoned users share our experiences to users who do not yet have those experiences and knowledge to rely on.

happy hacking,
//kracker

<i>FSF : Richard Stallman : Copyright vs Community in the age of computer networks </i>

Member since: 2001.07.13 || http://ezpedia.se7enx.com/

Bruce Morrison

Tuesday 24 May 2005 11:23:40 pm

The answer to both questions is yes :)

The following code is from a workflow I wrote to create a user group and assign a role to it. While it's not exactly what your after it should give you a starting point.

Cheers
Bruce

<?php
/*!
  \class CREATEPERMS CREATEPERMStype.php
  \brief Event type for user approvals
                                                                                                                                                         
*/
                                                                                                                                                         
include_once( "kernel/classes/ezworkflowtype.php" );
include_once( 'kernel/classes/ezrole.php' );
                                                                                                                                                         
define( "EZ_WORKFLOW_TYPE_CREATEPERMS_ID", "createperms" );
                                                                                                                                                         
                                                                                                                                                         
class CreatePermsType extends eZWorkflowEventType
{
    function CreatePermsType()
    {
        $this->eZWorkflowEventType( EZ_WORKFLOW_TYPE_CREATEPERMS_ID, ezi18n( 'kernel/workflow/event', "Create Group and Apply Role" ) );
        $this->setTriggerTypes( array( 'content' => array( 'publish' => array( 'after' ) ) ) );
    }
                                                                                                                                                         
    function execute( &$process, &$event )
    {
      $ini =& eZINI::instance('createperms.ini');
      $runForClassIDs = $ini->variable( 'CreateClassInfo', 'RunFor' );
                                                                                                                                                         
      $parameters = $process->attribute( 'parameter_list' );
      $versionID =& $parameters['version'];
      $object =& eZContentObject::fetch( $parameters['object_id'] );
      $classIdentifier = $object->attribute('class_identifier');
      $objectName = $object->attribute('name');
                                                                                                                                                         
      if ($versionID == 1 &&
          is_array($runForClassIDs) &&
          in_array($classIdentifier, $runForClassIDs))
      {
        // Create group with the same name as Object
        $siteini =& eZINI::instance();
        $UserGroupClassID = $siteini->variable( 'UserSettings', 'UserGroupClassID' );
        $userCreatorID = $siteini->variable( "UserSettings", "UserCreatorID" );
        $defaultSectionID = $siteini->variable( "UserSettings", "DefaultSectionID" );
                                                                                                                                                         
        $class =& eZContentClass::fetch( $UserGroupClassID );
        $contentObject =& $class->instantiate( $userCreatorID, $defaultSectionID );
        //$objectID = $contentObject->attribute( 'id' );
                                                                                                                                                         
                                                                                                                                                         
        $createParentNodeID = $ini->variable( "CreateDetails", "ParentNodeID" );
                                                                                                                                                         
        $nodeAssignment =& eZNodeAssignment::create(
          array(
                 'contentobject_id' => $contentObject->attribute( 'id' ),
                 'contentobject_version' => 1,
                 'parent_node' => $createParentNodeID,
                 'is_main' => 1
               )
        );
        $nodeAssignment->store();
        $version =& $contentObject->version( 1 );
        $version->setAttribute( 'modified', time() );
        $version->setAttribute( 'status', EZ_VERSION_STATUS_DRAFT );
        $version->store();
 
        $contentObjectID = $contentObject->attribute( 'id' );
        $contentObjectAttributes =& $version->contentObjectAttributes();
 
        $contentObjectAttributes[0]->setAttribute( 'data_text', $objectName );
        $contentObjectAttributes[0]->store();
 
        $contentObjectAttributes[1]->setAttribute( 'data_text', $objectName.' Group' );
        $contentObjectAttributes[1]->store();
 
        include_once( 'lib/ezutils/classes/ezoperationhandler.php' );
        $operationResult = eZOperationHandler::execute( 'content', 'publish', array( 'object_id' => $contentObjectID,
                                                                                     'version' => 1 ) );
 
        // Assign Role to new group
        $roleID = $ini->variable( "CreateDetails", "RoleID" );
        $role = eZRole::fetch( $roleID );
        $role->assignToUser($contentObjectID,'subtree',$object->attribute('main_node_id'));
 
        // Assign new group object to client group attribute
        $contentObjectAttributes =& $object->contentObjectAttributes();
        $contentObjectAttributes[1]->setAttribute( 'data_int', $contentObjectID );
        $contentObjectAttributes[1]->store();
 
         
        //eZDebug::writeDebug($UserGroupClassID);
      }
        
      return EZ_WORKFLOW_TYPE_STATUS_ACCEPTED;
    }
 
}
 
eZWorkflowEventType::registerType( EZ_WORKFLOW_TYPE_CREATEPERMS_ID, "CreatePermsType" );
?>

My Blog: http://www.stuffandcontent.com/
Follow me on twitter: http://twitter.com/brucemorrison
Consolidated eZ Publish Feed : http://friendfeed.com/rooms/ez-publish

Xavier Dutoit

Tuesday 24 May 2005 11:53:21 pm

Hi Bruce,

You example uses ini variables/files that you have created, right ?

Could you consider "packaging" your event and put it on the contrib area, as they are very few events contributed ?

Better yet, ask Paul Borgermans to create you an account on pubsvn and put it there.

X+

P.S. Technical/logic question: why are your using ini files to set the RunFor ? Wouldn't it be easier to read/setup to put that as an element to setup from the back office ?

http://www.sydesy.com

Bruce Morrison

Wednesday 25 May 2005 12:13:33 am

Hi Xavier

> You example uses ini variables/files that you have
> created, right ?

Yep createperms.ini

[CreateClassInfo]
RunFor[]=client
 
[CreateDetails]
ParentNodeID=69
RoleID=7

> Could you consider "packaging" your event and put it on
> the contrib area, as they are very few events contributed
> ?

I'll add it to my list :) I'm flat out at the moment and looks like it will be that way for the next couple of months (ez Forums are my procrastination :) But seriously it's on the list :)

At the moment it's quite specific and I'm looking at ways to make it more generic.

> P.S. Technical/logic question: why are your using ini
> files to set the RunFor ? Wouldn't it be easier to
> read/setup to put that as an element to setup from the
> back office ?

I'm not sure what you mean by the question. As I said the code is quite specific at the moment the ini files usage is a first attempt to make it more generic.

I'm using the extension in an extranet situatation. When a new client object is created a corresponding user group and role is also created. The RunFor ini var determines the class id of the client object.

Cheers
Bruce

My Blog: http://www.stuffandcontent.com/
Follow me on twitter: http://twitter.com/brucemorrison
Consolidated eZ Publish Feed : http://friendfeed.com/rooms/ez-publish

Clemens T

Wednesday 25 May 2005 1:59:55 am

WOW... Thanks a LOT all.. I'm going to do some research now, read/understand the code... and try to give some useful comment!

You're all life savers :D

Xavier Dutoit

Thursday 26 May 2005 2:43:52 am

Hi Bruce,

Let me try to clarify:
When you create an attribute, you can let the user customise it when he edits the class (eg, the default text on a string attribute or more complex with an selection attribute).

With an event, you can also let the user add parameters when he edits the event on its workflow (eg with the payment event, he can choose if he wants paypal).

The idea is instead of puting that into a ini file, let the admin do that when he edits the workflow (easier IMO).

Does it make sense ?

X+

http://www.sydesy.com

Bruce Morrison

Saturday 28 May 2005 5:49:28 pm

Hi Xavier

I'm with you now. Sounds like a plan. At the moment it's a very initial bit of code and personally I'm more interested in making it a more generic than making it easier to configure.

Mind you, what you have suggested would get around the issue of having different settings if the event was used multiple times.

BTW I spent 10 years as a unix sysadmin and I like ini file ;)

Cheers
Bruce

My Blog: http://www.stuffandcontent.com/
Follow me on twitter: http://twitter.com/brucemorrison
Consolidated eZ Publish Feed : http://friendfeed.com/rooms/ez-publish

Powered by eZ Publish™ CMS Open Source Web Content Management. Copyright © 1999-2014 eZ Systems AS (except where otherwise noted). All rights reserved.

eZ debug

Timing: Jan 18 2025 22:13:33
Script start
Timing: Jan 18 2025 22:13:33
Module start 'layout'
Timing: Jan 18 2025 22:13:33
Module start 'content'
Timing: Jan 18 2025 22:13:34
Module end 'content'
Timing: Jan 18 2025 22:13:34
Script end

Main resources:

Total runtime0.8984 sec
Peak memory usage4,096.0000 KB
Database Queries93

Timing points:

CheckpointStart (sec)Duration (sec)Memory at start (KB)Memory used (KB)
Script start 0.00000.0051 587.9141152.6250
Module start 'layout' 0.00510.0026 740.539139.4453
Module start 'content' 0.00770.8891 779.9844825.5156
Module end 'content' 0.89680.0016 1,605.500036.1563
Script end 0.8984  1,641.6563 

Time accumulators:

 Accumulator Duration (sec) Duration (%) Count Average (sec)
Ini load
Load cache0.00320.3600160.0002
Check MTime0.00130.1473160.0001
Mysql Total
Database connection0.00070.080910.0007
Mysqli_queries0.777986.5891930.0084
Looping result0.00100.1109910.0000
Template Total0.868396.720.4342
Template load0.00190.216420.0010
Template processing0.866496.432220.4332
Template load and register function0.00020.026810.0002
states
state_id_array0.00130.140210.0013
state_identifier_array0.00140.150720.0007
Override
Cache load0.00190.20991180.0000
Sytem overhead
Fetch class attribute can translate value0.00160.174350.0003
Fetch class attribute name0.00200.2216170.0001
XML
Image XML parsing0.00720.798850.0014
class_abstraction
Instantiating content class attribute0.00000.0054220.0000
General
dbfile0.00670.7478360.0002
String conversion0.00000.000840.0000
Note: percentages do not add up to 100% because some accumulators overlap

Templates used to render the page:

UsageRequested templateTemplateTemplate loadedEditOverride
1node/view/full.tplfull/forum_topic.tplextension/sevenx/design/simple/override/templates/full/forum_topic.tplEdit templateOverride template
13content/datatype/view/ezxmltext.tpl<No override>extension/community_design/design/suncana/templates/content/datatype/view/ezxmltext.tplEdit templateOverride template
27content/datatype/view/ezxmltags/paragraph.tpl<No override>extension/ezwebin/design/ezwebin/templates/content/datatype/view/ezxmltags/paragraph.tplEdit templateOverride template
15content/datatype/view/ezxmltags/line.tpl<No override>design/standard/templates/content/datatype/view/ezxmltags/line.tplEdit templateOverride template
9content/datatype/view/ezimage.tpl<No override>extension/sevenx/design/simple/templates/content/datatype/view/ezimage.tplEdit templateOverride template
2content/datatype/view/ezxmltags/literal.tpl<No override>extension/community/design/standard/templates/content/datatype/view/ezxmltags/literal.tplEdit templateOverride template
1print_pagelayout.tpl<No override>extension/community/design/community/templates/print_pagelayout.tplEdit templateOverride template
 Number of times templates used: 68
 Number of unique templates used: 7

Time used to render debug report: 0.0001 secs