Friday 9 November 2012

symfony guard group permissions from database


Sometimes we need to have permission from database.
Suppose that uor tables look like this:

guard_permission:
    _attributes:                            { phpName: GuardPermission }
    code:                                   { type: char,    size: 150, required: true,  primaryKey: true }
    name:                                   { type: varchar, size: 100, required: true   }

  guard_group:
    _attributes:                            { phpName: GuardGroup }
    code:                                   { type: char,    size: 150, required: true,  primaryKey: true }
    name:                                   { type: varchar, size: 100, required: true   }
    description:                            { type: longvarchar,        required: false  }
    is_default:                             { type: boolean,            required: true,  default: false }

  guard_group_permission:
    _attributes:                            { phpName: GuardGroupPermission }
    id:                                     ~
    group_code:                             { type: char,    size: 150, required: true,  foreignTable:  guard_group,       foreignReference: code,   onDelete: cascade }
    permission_code:                        { type: char,    size: 150, required: true,  foreignTable:  guard_permission,  foreignReference: code,   onDelete: cascade }

  guard_user:
    _attributes:                            { phpName: GuardUser }
    id:                                     ~
    is_email_verified:                      { type: boolean,            required: true,  default: false  }

  guard_user_group:
    _attributes:                            { phpName: GuardUserGroup }
    id:                                     ~
    user_id:                                { type: integer,            required: true,  foreignTable: guard_user,       foreignReference: id,   onDelete: cascade }
    group_code:                             { type: char,    size: 150, required: true,  foreignTable: guard_group,      foreignReference: code, onDelete: cascade }


To check permissions from database, we just need to override  hasCredential method in apps/app_name/lib/MyUser.php. My data in database were 'module_name-action_name' e.g (permisssion_code: home-index), so i have overwritten parmission name to look like data from database.


 /**
   * Overridden method to use data from DB
   *
   * @param  string  permission name
   *
   * @return boolean true if the user has credential
   */

  public function hasCredential($permission_name)
  {
    if(!$this->isAuthenticated())

    {
      return false;
    }

    $GuardUser = $this->getGuardUser();

    $c = new Criteria();
    $c->add(GuardUserGroupPeer::USER_ID, $GuardUser->getId());
    $UserGroup = GuardUserGroupPeer::doSelectOne($c);   

    $Group = $UserGroup->getGuardGroup();
    $permissions = $Group->getGuardGroupPermissions();

    $permission_names = array();
    foreach($permissions as $permission)

    {
      $permission_names[] = $permission->getPermissionCode();
    }

   
    $moduleName = sfContext::getInstance()->getModuleName();
    $actionName = sfContext::getInstance()->getActionName();
    $permission_name = $moduleName . '-' . $actionName;

    return (in_array($permission_name, $permission_names)) ? true : false;
  }


Now all we need is to fill out the data in database, and this should work.

Wednesday 7 November 2012

Create ssl certificate for site

If You allready have configured your apache server for ssl, type in these command lines for new cert for site

openssl req -new -days 365 -nodes -out www.mydomain.com.csr`
openssl x509 -in www.mydomain.com.csr -out www.mydomain.com.cert -req -signkey www.mydomain.com.key -days 365


And add your configuration to thhpd-ssl.conf


<VirtualHost _default_:443> 
    ServerAdmin admin@admin.com 
    DocumentRoot "YOUR_PRROJECT_PATH" 
    ServerName YOUR_PRROJECT_HOST:443 
    ServerAlias YOUR_PRROJECT_ALIAS:443 
    SSLEngine on

    SSLCertificateFile "C:/wamp/bin/apache/Apache2.2.21/conf/www.mydomain.com.cert"

    SSLCertificateKeyFile "C:/wamp/bin/apache/Apache2.2.21/conf/www.mydomain.com.key" 
</VirtualHost>       

Tuesday 6 November 2012

Symfony propel file form widget editable

This is a simple editable file form widget:

If we have file_path field type varchar(255) in database, our widget will look like:

'file_path'        => new sfWidgetFormInputFileEditable(array('template' => '<div class="row file-editable-input">%input%</div><div class="row file-editable-remove"><ul class="inputs-list"><li><label>%delete%%delete_label%</label></li></ul></div><div class="row file-editable-img">%file%</div>',
        'file_src' =>  UPLOADS_DIR . $this->getObject()->getFilePath(),
        'is_image' => FALSE,
        'edit_mode' => TRUE,
        'delete_label' => __('Check this box if you want to remove current file'),
        'with_delete' => TRUE), array()),
And validator should look like:

'file_path' => new sfValidatorFile(array(
        'max_size' => Utils::getMaxUploadSize() * 1024 * 1024,
        'mime_types' => 'all_documents',
        'path' => UPLOADS_DIR,
        'required' => FALSE)),

And that's it. 'all_documents' is array of file extensions i creted in the validator file, along wit web_images and other. And off course your uploads dir must exist.

Monday 5 November 2012

symfony admin generator examples from config:

I always loose much time looking for these simple generator.yml config settings:

With edit and new actions:


    config:
      actions:               ~
      fields:
        id:                  { label: "ID" }
        created_at:          { label: "Created At", date_format: "MM/dd/yyyy HH:mm:ss" }
      list:
        title:               Title
        display:             [id, word, created_at]
        max_per_page:        50
        sort:                [id, asc]
      filter:                ~
      form:                  ~
      edit:
        title:               Edit
      new:
        title:               New

Without new action, batch actions...:

    config:
      actions:               ~
      fields:
        id:                  { label: "ID" }
        created_at:          { label: "Created At", date_format: "MM/dd/yyyy HH:mm:ss" }
        
      list:
        title:               Title
        display:             [id, subject, description]
        max_per_page:        50
        sort:                [id, asc]
        actions:             []
        batch_actions:       []
        object_actions:
          _edit:             ~
      filter:                ~
      form:                  ~
      edit:
        title:               Edit
        actions:        
          _list:             ~
          _save:             ~
          _save_and_add:     ~
      new:
        title:               New

Symfony admin generator add custom criteria to filter

If you have in list field that doesn't exist as a database feild to the formFilter class you need to add your custom criteria for that field.
Note: function needs to be called addYourFieldNameColumnCriteria

Example: /lib/filter/User/UserFormFilterClass
public function addYourFilterColumnCriteria(Criteria $criteria, $field, $values)
  {
    $values = trim($values);
    if (!empty($values))
    {
      $criteria->add(YourPeer::FIELD_NAME, $values);
    }
  }


But sometimes $values returns an ampty array (I am not sure when), then you need to register you type of field and then to access it ina a different way:

public function addYOUR_FIELDColumnCriteria(Criteria $c, $field, $values)
  {
    $value = trim($values['text']);
    if (!empty($value))
    {
      // Your ciriteria
    }
  }
  public function getFields()
 {
  $fields = parent::getFields();
  $fields['YOUR_FIELD'] = 'Text';
  return $fields;
 }
Off course YourFilter, YourPeer, FIELD_NAME,YOUR_FIELD and field type you need to adjust to your needs.