PermissionModel::save PHP Method

save() public method

Save a permission row.
public save ( array $Values, boolean $SaveGlobal = false )
$Values array The values you want to save. See the Permission table for possible columns.
$SaveGlobal boolean Also save a junction permission to the global permissions.
    public function save($Values, $SaveGlobal = false)
    {
        // Get the list of columns that are available for permissions.
        $PermissionColumns = Gdn::permissionModel()->defineSchema()->Fields();
        if (isset($Values['Role'])) {
            $PermissionColumns['Role'] = true;
        }
        $Values = array_intersect_key($Values, $PermissionColumns);
        // Figure out how to find the existing permission.
        if (array_key_exists('PermissionID', $Values)) {
            $Where = array('PermissionID' => $Values['PermissionID']);
            unset($Values['PermissionID']);
            $this->SQL->update('Permission', $this->_Backtick($Values), $Where)->put();
        } else {
            $Where = array();
            if (array_key_exists('RoleID', $Values)) {
                $Where['RoleID'] = $Values['RoleID'];
                unset($Values['RoleID']);
            } elseif (array_key_exists('Role', $Values)) {
                // Get the RoleID.
                $RoleID = $this->SQL->getWhere('Role', array('Name' => $Values['Role']))->value('RoleID');
                if (!$RoleID) {
                    return;
                }
                $Where['RoleID'] = $RoleID;
                unset($Values['Role']);
            } else {
                $Where['RoleID'] = 0;
                // default role.
            }
            if (array_key_exists('JunctionTable', $Values)) {
                $Where['JunctionTable'] = $Values['JunctionTable'];
                // If the junction table was given then so must the other values.
                if (array_key_exists('JunctionColumn', $Values)) {
                    $Where['JunctionColumn'] = $Values['JunctionColumn'];
                }
                $Where['JunctionID'] = $Values['JunctionID'];
            } else {
                $Where['JunctionTable'] = null;
                // no junction table.
                $Where['JunctionColumn'] = null;
                $Where['JunctionID'] = null;
            }
            unset($Values['JunctionTable'], $Values['JunctionColumn'], $Values['JunctionID']);
            $this->SQL->replace('Permission', $this->_Backtick($Values), $Where, true);
            if ($SaveGlobal && !is_null($Where['JunctionTable'])) {
                // Save these permissions with the global permissions.
                $Where['JunctionTable'] = null;
                // no junction table.
                $Where['JunctionColumn'] = null;
                $Where['JunctionID'] = null;
                $this->SQL->replace('Permission', $this->_Backtick($Values), $Where, true);
            }
        }
        $this->ClearPermissions();
    }

Usage Example

Ejemplo n.º 1
0
 /**
  * If any role has no permission records, set Member-like permissions on it.
  *
  * @return array
  */
 public function fixPermissions()
 {
     $Roles = RoleModel::roles();
     $RoleModel = new RoleModel();
     $PermissionModel = new PermissionModel();
     // Find roles missing permission records
     foreach ($Roles as $RoleID => $Role) {
         $Permissions = $this->SQL->select('*')->from('Permission p')->where('p.RoleID', $RoleID)->get()->resultArray();
         if (!count($Permissions)) {
             // Set basic permission record
             $DefaultRecord = array('RoleID' => $RoleID, 'JunctionTable' => null, 'JunctionColumn' => null, 'JunctionID' => null, 'Garden.Email.View' => 1, 'Garden.SignIn.Allow' => 1, 'Garden.Activity.View' => 1, 'Garden.Profiles.View' => 1, 'Garden.Profiles.Edit' => 1, 'Conversations.Conversations.Add' => 1);
             $PermissionModel->save($DefaultRecord);
             // Set default category permission
             $DefaultCategory = array('RoleID' => $RoleID, 'JunctionTable' => 'Category', 'JunctionColumn' => 'PermissionCategoryID', 'JunctionID' => -1, 'Vanilla.Discussions.View' => 1, 'Vanilla.Discussions.Add' => 1, 'Vanilla.Comments.Add' => 1);
             $PermissionModel->save($DefaultCategory);
         }
     }
     return array('Complete' => true);
 }