Monday, 8 September 2014

First steps for already exisitngs projects in Laravel

I often have problems to remember what to do when I get to work on existing Laravel project.


Frist error I get is:

"../vendor/autoload.php): failed to open stream: No such file or directory in .."

To fix this, just run in Terminal
composer install
Then setup .htaccess.

Next thing, in config folder to setup local configuration (database and other settings), I usually do like here: http://laravel.com/docs/configuration#environment-configuration.

After setting up the conf next id database. Create database and then run
php artisan migrate
to create tables in your database.

And

php artisan db:seed

to seed data.

And now should be all running.

To set up mail work on localhost and not to send real mails  ...app\config\local\mail.php


return array(
 'driver' => 'mail',);

Friday, 25 January 2013

Create task using symfony and run it form action

Create MyTask.class.php in /lib/Task folder. It should look like this:
/**
 * MyTask class.
 *
 * @author ...
 */
class MyTask extends sfPropelBaseTask
{

  /**
   * Execute configure method.
   * 
   */
  protected function configure()
  {
    $this->addOptions(array(
      new sfCommandOption('application', NULL, sfCommandOption::PARAMETER_OPTIONAL, 'The application name', 'front'),
      new sfCommandOption('env', NULL, sfCommandOption::PARAMETER_REQUIRED, 'The environment', 'dev'),
      new sfCommandOption('connection', NULL, sfCommandOption::PARAMETER_REQUIRED, 'The connection name', 'propel'),
    ));

    $this->namespace = 'namespace';
    $this->name = 'myTask';
    $this->briefDescription = 'Do Task';
    $this->detailedDescription = 'Do Task desc';
  }

  /**
   * Execute execute method.
   * 
   * @param array $arguments
   * @param array $options
   * 
   */
  protected function execute($arguments = array(), $options = array())
  {
    sfContext::createInstance($this->configuration);
    
    //Do Task

  }

}
And now, run it from action that you need:
    $dispatcher = sfContext::getInstance()->getEventDispatcher();
    $formatter = new sfFormatter();
    $task = new ReminderToWriteReviewTask($dispatcher, $formatter);
    chdir(sfConfig::get('sf_root_dir'));
    $task->run(array(), array('connection' =>  sfConfig::get('connection')));
You can also call the task, as it should be called, from command line
    php symfony namespace:myTask

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.