]> git.andy128k.dev Git - ipf.git/commitdiff
File Uploads & Ready for first project
authoravl <alex.litovchenko@gmail.com>
Thu, 21 Aug 2008 03:44:29 +0000 (06:44 +0300)
committeravl <alex.litovchenko@gmail.com>
Thu, 21 Aug 2008 03:44:29 +0000 (06:44 +0300)
28 files changed:
ipf/admin/app.php
ipf/admin/media/css/global.css
ipf/admin/model.php
ipf/admin/templates/admin/add.html
ipf/admin/templates/admin/change.html
ipf/admin/views.php
ipf/auth/app.php
ipf/auth/forms/login.php
ipf/auth/models/User.php
ipf/form.php
ipf/form/db/file.php [new file with mode: 0644]
ipf/form/db/image.php [new file with mode: 0644]
ipf/form/field.php
ipf/form/field/file.php
ipf/form/field/float.php
ipf/form/field/image.php [new file with mode: 0644]
ipf/form/field/varchar.php
ipf/form/model.php
ipf/form/widget/fileinput.php
ipf/form/widget/image.php [new file with mode: 0644]
ipf/orm/record.php
ipf/orm/table.php
ipf/orm/utils.php
ipf/orm/validator/file.php [new file with mode: 0644]
ipf/orm/validator/image.php [new file with mode: 0644]
ipf/shortcuts.php
ipf/utils.php
ipf/version.php

index add99d2a89d036c1eb72e26667aa6cf67174d3f7..ba5a905b9dabe8d5770f5a40bbe6f4dd4a743484 100644 (file)
@@ -9,11 +9,11 @@ class IPF_Admin_App extends IPF_Application{
     public static function urls(){
         return array(
             array('regex'=>'$#', 'func'=>'IPF_Admin_Views_Index'),
-            array('regex'=>'([\w\_]+)/([\w\_]+)/$#i', 'func'=>'IPF_Admin_Views_ListItems'),
-            array('regex'=>'([\w\_]+)/([\w\_]+)/add/$#i', 'func'=>'IPF_Admin_Views_AddItem'),
-            array('regex'=>'([\w\_]+)/([\w\_]+)/([\w\_]+)/$#i', 'func'=>'IPF_Admin_Views_EditItem'),
-            array('regex'=>'([\w\_]+)/([\w\_]+)/([\w\_]+)/delete/$#i', 'func'=>'IPF_Admin_Views_DeleteItem'),
-            array('regex'=>'auth/user/([\w\_]+)/password/$#i', 'func'=>'IPF_Admin_Views_ChangePassword'),
+            array('regex'=>'([\w\_\-]+)/([\w\_\-]+)/$#i', 'func'=>'IPF_Admin_Views_ListItems'),
+            array('regex'=>'([\w\_\-]+)/([\w\_\-]+)/add/$#i', 'func'=>'IPF_Admin_Views_AddItem'),
+            array('regex'=>'([\w\_\-]+)/([\w\_\-]+)/([\w\_\-]+)/$#i', 'func'=>'IPF_Admin_Views_EditItem'),
+            array('regex'=>'([\w\_\-]+)/([\w\_\-]+)/([\w\_\-]+)/delete/$#i', 'func'=>'IPF_Admin_Views_DeleteItem'),
+            array('regex'=>'auth/user/([\w\_\-]+)/password/$#i', 'func'=>'IPF_Admin_Views_ChangePassword'),
             array('regex'=>'login/$#i', 'func'=>'IPF_Admin_Views_Login'),
             array('regex'=>'logout/$#i', 'func'=>'IPF_Admin_Views_Logout'),
         );
index ee6e9d1403278e67ea59a6a95d0d4a5125fcd6b2..c7e07ae4be3e949b9eb828076b000d647faf0e96 100644 (file)
@@ -88,19 +88,20 @@ table thead th.ascending a { background:url(../img/arrow-down.gif) right .4em no
 table thead th.descending a { background:url(../img/arrow-up.gif) right .4em no-repeat; }
 
 /*  MODULES  */
-.module        { border:1px solid #ABB0BE; margin-bottom:5px;  }
+.module        { border:1px solid #ABB0BE; margin-bottom:5px; border-top:none; }
 .module p, .module ul, .module h3, .module h4, .module dl, .module pre { padding-left:10px; padding-right:10px; }
 .module blockquote { margin-left:12px; }
 .module ul, .module ol { margin-left:1.5em; }
-.module h2, .module caption { border-bottom:1px solid #ABB0BE; margin:0; padding:2px 5px 3px 5px; font-size:11px; text-align:left; background:url(../img/hbg.gif) left top repeat-x; color:#444444; font-weight:bold; }
+.module h2, .module caption { border-bottom:1px solid #ABB0BE; border-top:1px solid #ABB0BE; margin:0; padding:2px 5px 3px 5px; font-size:11px; text-align:left; background:url(../img/hbg.gif) left top repeat-x; color:#444444; font-weight:bold; }
 .module caption        { border:1px solid #ABB0BE; }
 .module h3 { margin-top:.6em; }
 #ipfcontent-related .module h2 { background:#eee url(../img/nav-bg.gif) bottom left repeat-x; color:#666; }
 #ipfcontent-main .verbose .actionlist { float:right; font-size:10px; width:17em; position:relative; top:-1.6em; margin:0 8px; }
 
 /* DASHBOARD */
-.dashboard .module table th { width:100%; }
-.dashboard .module table td { white-space:nowrap; }
+
+.dashboard .module table th { width:100%;}
+.dashboard .module table td { white-space:nowrap;}
 .dashboard .module table td a { display:block; padding-right:.6em; }
 
 /*  RECENT ACTIONS MODULE  */
index ad6dc2a73f7bed37575bc5f99de331d2d6d717d5..fce08dbc10e0895b5506fe21195021e04944a08b 100644 (file)
@@ -108,7 +108,7 @@ class IPF_Admin_Model{
     public function AddItem($request, $lapp, $lmodel){
         $model = new $this->modelName();
         if ($request->method == 'POST'){
-            $form = IPF_Shortcuts::GetFormForModel($model,$request->POST,array('user_fields'=>$this->fields()));
+            $form = IPF_Shortcuts::GetFormForModel($model,$request->POST+$request->FILES,array('user_fields'=>$this->fields()));
             $this->_setupAddForm(&$form);
             if ($form->isValid()) {
                 $item = $form->save();
@@ -134,7 +134,7 @@ class IPF_Admin_Model{
 
     public function EditItem($request, $lapp, $lmodel, $o){
         if ($request->method == 'POST'){
-            $form = IPF_Shortcuts::GetFormForModel($o,$request->POST,array('user_fields'=>$this->fields()));
+            $form = IPF_Shortcuts::GetFormForModel($o,$request->POST+$request->FILES,array('user_fields'=>$this->fields()));
             $this->_setupEditForm(&$form);
             if ($form->isValid()) {
                 $item = $form->save();
@@ -146,6 +146,7 @@ class IPF_Admin_Model{
         else{
             $form = IPF_Shortcuts::GetFormForModel($o,$o->getData(),array('user_fields'=>$this->fields()));
             $this->_setupEditForm(&$form);
+            $dd = $o->getData();
         }
         $context = array(
             'page_title'=>'Edit '.$this->modelName, 
index 66dc26b24e95b122b68e80549da67c2fc4233db7..1092492bf73e01481f3ab31ac11970dc40c91ff9 100644 (file)
@@ -7,7 +7,7 @@
 <div id="ipfcontent">
     <h1>{$page_title}</h1>
     
-    <form method="post" action="">
+    <form method="post" {if $form.hasFileField() }enctype="multipart/form-data"{/if}>
     <fieldset>
     <table>
     {$form.render_table}
index 0cc037e51fecfb2473043117c75f8cd185b3233d..5e2d30a762b16f5365b5c9c5a23594cf414f1e9a 100644 (file)
@@ -8,7 +8,7 @@
 <div id="ipfcontent">
     <h1>{$page_title}</h1>
     
-    <form method="post">
+    <form method="post" {if $form.hasFileField() }enctype="multipart/form-data"{/if}>
     <fieldset>
     <table>
     {$form.render_table}
index 971c7c807c6a6ec8ed447fbe340341bb350fa456..e6fe5aaa54e3bd825f6d86593b8fdad087255d63 100644 (file)
@@ -1,9 +1,16 @@
 <?php
 
 function checkAdminAuth($request){
+    $ok = true;
     if ($request->user->isAnonymous())
+        $ok = false;
+    elseif ( (!$request->user->is_staff) && (!$request->user->is_superuser) )
+        $ok = false;
+    
+    if ($ok)
+        return true;
+    else
         return new IPF_HTTP_Response_Redirect(IPF_HTTP_URL_urlForView('IPF_Admin_Views_Login'));
-    return true;
 }
 
 function IPF_Admin_Views_Index($request, $match){
@@ -175,11 +182,7 @@ function IPF_Admin_Views_Login($request, $match){
             if (false === ($user = $users->checkCreditentials($form->cleaned_data['username'], $form->cleaned_data['password']))) {
                 $form->message = __('The login or the password is not valid. The login and the password are case sensitive.');
             } else {
-                $request->user = $user;
-                $request->session->clear();
-                $request->session->setData('login_time', gmdate('Y-m-d H:i:s'));
-                $user->last_login = gmdate('Y-m-d H:i:s');
-                $user->save();
+                IPF_Auth_App::login($request, $user);
                 return new IPF_HTTP_Response_Redirect($success_url);
             }
         }
@@ -194,10 +197,7 @@ function IPF_Admin_Views_Login($request, $match){
 }
 
 function IPF_Admin_Views_Logout($request, $match){
-    $request->user = new User();
-    $request->session->clear();
-    $request->session->setData('logout_time', gmdate('Y-m-d H:i:s'));
-
+    IPF_Auth_App::logout($request);
     $context = array(
        'page_title' => __('IPF Administration'),
     );
index f1d42f5d024c80adafa3904a9a0d64a072a0d96d..2656a6be170ac6341d27ee8f8b312fa09282ff23 100644 (file)
@@ -1,9 +1,24 @@
 <?php
 
 class IPF_Auth_App extends IPF_Application{
+
     public function __construct(){
         parent::__construct(array(
             'models'=>array('User','Role')
         ));
     }
+    
+    static function login($request, $user){
+        $request->user = $user;
+        $request->session->clear();
+        $request->session->setData('login_time', gmdate('Y-m-d H:i:s'));
+        $user->last_login = gmdate('Y-m-d H:i:s');
+        $user->save();
+    }
+
+    static function logout($request){
+        $request->user = new User();
+        $request->session->clear();
+        $request->session->setData('logout_time', gmdate('Y-m-d H:i:s'));
+    }
 }
\ No newline at end of file
index ab55603d9992ede08ded9b7f95b489eb57a2de9c..5813712e024658c87f1628933c99cb1b0a8ca95b 100644 (file)
@@ -1,6 +1,7 @@
 <?php 
 
 class IPF_Auth_Forms_Login extends IPF_Form{
+    var $message = null;
     function initFields($extra=array()){
         $this->fields['username'] = new IPF_Form_Field_Varchar(array('required'=>true));
         $this->fields['password'] = new IPF_Form_Field_Varchar(array('required'=>true,'widget'=>'IPF_Form_Widget_PasswordInput'));
index 2a645328e3988284c28513585e271eb5e0115a65..ce37531e0d6f2260ae815e4e458b690f5dfa9abf 100644 (file)
@@ -53,6 +53,16 @@ class User extends BaseUser
             return 'Anonymous';
         return $s;
     }
+
+    public function smartName() {
+        $username = $this->username;
+        if ($username===null)
+            return __('Anonymous');
+        $name = $this->first_name.' '.$this->last_name;
+        if (trim($name)=='')
+            return $username;
+        return $name;
+    }
     
     static function createUser($username, $password=null, $email=null, $first_name=null, $last_name=null, $is_active=false, $is_staff=false, $is_superuser=false){
         $user = new User();
@@ -130,4 +140,4 @@ class User extends BaseUser
     }
 }
 
-IPF_Admin_Model::register(User,AdminUser);
+IPF_Admin_Model::register('User','AdminUser');
index 3f516c6fee31010dae09b14ded4f545aae12d0b2..cb5bd82403db48b7be3a7cccd36401d90e52f8a3 100644 (file)
@@ -14,6 +14,7 @@ class IPF_Form implements Iterator
     public $label_suffix = ':';
 
     protected $is_valid = null;
+    
 
     function __construct($data=null, $extra=array(), $label_suffix=null)
     {
@@ -39,6 +40,15 @@ class IPF_Form implements Iterator
         }
         return $field_name;
     }
+    
+    function hasFileField(){
+        foreach($this->fields as $field){
+            if (is_a($field,'IPF_Form_Field_File')){
+                return true;
+            }
+        }
+        return false;
+    }
 
     function isValid()
     {
diff --git a/ipf/form/db/file.php b/ipf/form/db/file.php
new file mode 100644 (file)
index 0000000..2f78f0c
--- /dev/null
@@ -0,0 +1,7 @@
+<?php
+
+class IPF_Form_DB_File extends IPF_Form_DB{
+    function formField($def, $form_field='IPF_Form_Field_File'){
+        return parent::formField($def, $form_field);
+    }
+}
diff --git a/ipf/form/db/image.php b/ipf/form/db/image.php
new file mode 100644 (file)
index 0000000..c97ac87
--- /dev/null
@@ -0,0 +1,7 @@
+<?php
+
+class IPF_Form_DB_Image extends IPF_Form_DB{
+    function formField($def, $form_field='IPF_Form_Field_Image'){
+        return parent::formField($def, $form_field);
+    }
+}
index d516cb3df8d59a6561568e5c53488f4b1ba88890..fdd33193b10dadd8fc763b77cf2dcfb0b1f8b86f 100644 (file)
@@ -20,14 +20,15 @@ class IPF_Form_Field
         $default = array();
         foreach ($params as $key=>$in) {
             if ($key !== 'widget_attrs')
-                $default[$key] = $this->$key; 
+                if (isset($this->$key))
+                    $default[$key] = $this->$key; 
         }
         $m = array_merge($default, $params);
         foreach ($params as $key=>$in) {
             if ($key !== 'widget_attrs')
                 $this->$key = $m[$key];
         }
-        $widget_name = $this->widget;
+        $widget_name = $this->getWidget();
         if (isset($params['widget_attrs'])) {
             $attrs = $params['widget_attrs'];
         } else {
@@ -48,6 +49,10 @@ class IPF_Form_Field
         }
         return $value;
     }
+    
+    protected function getWidget(){
+        return $this->widget;
+    }
 
     public function widgetAttrs($widget)
     {
index e7d7621bf04744216c81736c619e9df9c898a0d4..b38bb56f21154daface9838fbe8889ddb359e5c2 100644 (file)
@@ -9,7 +9,11 @@ class IPF_Form_Field_File extends IPF_Form_Field
 
     function clean($value)
     {
+        if ($value['name']=='')
+            return '';
+
         parent::clean($value);
+        
         $errors = array();
         $no_files = false;
         switch ($value['error']) {
@@ -52,8 +56,8 @@ function IPF_Form_Field_moveToUploadFolder($value, $params=array())
     if (isset($params['upload_path'])) {
         $upload_path = $params['upload_path'];
     }
-    $dest = $upload_path.'/'.$name;
-    if (!@move_uploaded_file($value['tmp_name'], $dest)) {
+    $dest = $upload_path.DIRECTORY_SEPARATOR.$name;
+    if (!move_uploaded_file($value['tmp_name'], $dest)) {
         throw new IPF_Exception_Form(__('An error occured when upload the file. Please try to send the file again.'));
     } 
     @chmod($dest, 0666);
index ca67fb356ab4909fb28484abb04b8285de2f1f5f..ab78f78dc316d118ea9fdd3d9dd87c059ed69205 100644 (file)
@@ -9,12 +9,14 @@ class IPF_Form_Field_Float extends IPF_Form_Field
     public function clean($value)
     {
         parent::clean($value);
+        
         if (in_array($value, $this->empty_values)) {
             $value = '';
         }
         $_value = $value;
         $value = (float) $value;
-        if ((string) $value !== (string) $_value) {
+        
+        if (!is_numeric($value)) {
             throw new IPF_Exception_Form(__('Enter a number.'));
         }
         if ($this->max_value !== null and $this->max_value < $value) {
diff --git a/ipf/form/field/image.php b/ipf/form/field/image.php
new file mode 100644 (file)
index 0000000..0a35c70
--- /dev/null
@@ -0,0 +1,5 @@
+<?php
+
+class IPF_Form_Field_Image extends IPF_Form_Field_File{
+    public $widget = 'IPF_Form_Widget_Image';
+}
index 723b446c8172d79f8e1b2d0d18a72a37527bed37..46e2fb3df2ecc655e871cf1f773ea8ac12cdccc9 100644 (file)
@@ -26,5 +26,11 @@ class IPF_Form_Field_Varchar extends IPF_Form_Field{
         }
         return array();
     }
+    
+    protected function getWidget(){
+        if ($this->max_length>255)
+            return 'IPF_Form_Widget_TextAreaInput';
+        return $this->widget;
+    }
 }
 
index 7cfd8747d1db1b8c0026f0ef66c489b75b770e7e..4ddb1a1a6f0da5147b484a4459f12097757de701 100644 (file)
@@ -27,14 +27,16 @@ class IPF_Form_Model extends IPF_Form
         }
         else{
             foreach($user_fields as $uname){
+                $add_method = 'add__'.$uname.'__field';
+                if (method_exists($this->model,$add_method)){
+                    //print $add_method;
+                    $this->$add_method();
+                    continue;
+                }
                 if (array_key_exists($uname,$db_columns))
                     $this->addDBField($uname,$db_columns[$uname]);
                 elseif (array_key_exists($uname,$db_relations))
                     $this->addDBRelation($uname,$db_relations[$uname]);
-                else{
-                    $add_method = 'add__'.$uname.'__field';
-                    $this->$add_method();
-                }
             }
         }
     }
@@ -55,11 +57,21 @@ class IPF_Form_Model extends IPF_Form
             $defaults['max_length'] = (int)($col['length']);
         if (isset($col['email']))
             $type = 'email';
+
+        if (isset($col['file']))
+            $type = 'file';
+
+        if (isset($col['image']))
+            $type = 'image';
+
         $cn = 'IPF_Form_DB_'.$type;
         
         $db_field = new $cn('', $name);
         //echo $name;
         //print_r($defaults);
+
+
+
         
         if (null !== ($form_field=$db_field->formField($defaults))) {
             $this->fields[$name] = $form_field;
@@ -68,7 +80,7 @@ class IPF_Form_Model extends IPF_Form
 
     function addDBRelation($name,$relation){
         if ($relation->getType()==IPF_ORM_Relation::ONE_AGGREGATE){
-            //$name .= "_id";
+            $name .= "_id";
             $db_field = new IPF_Form_DB_Foreignkey('',$name);
             $defaults = array('blank' => true, 'verbose' => $name, 'help_text' => '', 'editable' => true, 'model'=>$relation->getClass());
             $form_field = $db_field->formField($defaults);
@@ -97,9 +109,19 @@ class IPF_Form_Model extends IPF_Form
             }
             */
             
-            $this->model->save();
-            return $this->model;
+            try{
+                $this->model->save();
+                return $this->model;
+            } catch(IPF_ORM_Exception_Validator $e) {
+                $erecords = $e->getInvalidRecords();
+                $errors = $erecords[0]->getErrorStack();
+                print_r($this->cleaned_data);
+                foreach($errors as $k=>$v){
+                    print_r($v);
+                }
+                //die('zz');
+            }
         }
-        throw new Exception(__('Cannot save the model from an invalid form.'));
+        throw new IPF_Exception_Form(__('Cannot save the model from an invalid form.'));
     }
 }
index ae03788f0ec27a9b2a6f7dcb198a01f558d6a9f5..0fcbfd90bcad0979397188692439824f2d7a57a5 100644 (file)
@@ -10,5 +10,14 @@ class IPF_Form_Widget_FileInput extends IPF_Form_Widget_Input
         $value = '';
         return parent::render($name, $value, $extra_attrs);
     }
+    
+    public function valueFromFormData($name, $data)
+    {
+        if (isset($data[$name])) {
+            return $data[$name];
+        }
+        return null;
+    }
+    
 
 }
\ No newline at end of file
diff --git a/ipf/form/widget/image.php b/ipf/form/widget/image.php
new file mode 100644 (file)
index 0000000..15ad5d9
--- /dev/null
@@ -0,0 +1,12 @@
+<?php
+
+class IPF_Form_Widget_Image extends IPF_Form_Widget_FileInput
+{
+    public function render($name, $value, $extra_attrs=array())
+    {
+        if ($value!='')
+            $sim = 'Currently: <a target="_blank" href="'.IPF::get('upload_url').$value.'">'.$value.'</a><br />Change:';
+        $value = '';
+        return $sim.parent::render($name, $value, $extra_attrs);
+    }
+}
\ No newline at end of file
index 7b2b03c4f390d733e351eaf899ca802085c7c5b4..fd81dcc7381baa6a7f901adb8b7294acc7ee27c0 100644 (file)
@@ -1257,16 +1257,15 @@ abstract class IPF_ORM_Record extends IPF_ORM_Record_Abstract implements Countab
         return null;
     }
 
-    function SetFromFormData($cleaned_values)
+    public function SetFromFormData($cleaned_values)
     {
-        //$relations = $this->getTable()->getRelations();
         foreach ($cleaned_values as $key=>$val) {
-            /*
-            if (array_key_exists($key,$relations)){
-                
-                
-            }else*/
-                $this->$key = $val;
+            $validators = $this->getTable()->getFieldValidators($key);
+            if (array_key_exists('image',$validators) || array_key_exists('file',$validators)){
+                if ($val=='')
+                    continue;
+            }
+            $this->$key = $val;
         }
     }
 }
\ No newline at end of file
index 6403fa819d0eb1233c54b1cf6a277088991f296f..9f00d7bb9f4aedd86121fdf2dc1bd97f2c53d7aa 100644 (file)
@@ -1271,6 +1271,10 @@ class IPF_ORM_Table extends IPF_ORM_Configurable implements Countable
         $columnName = $this->getColumnName($fieldName);
         // this loop is a dirty workaround to get the validators filtered out of
         // the options, since everything is squeezed together currently
+        
+        if (!isset($this->_columns[$columnName]))
+            return array();
+        
         foreach ($this->_columns[$columnName] as $name => $args) {
              if (empty($name)
                     || $name == 'primary'
index 5afd7da09234f72d0442f9f4436bec18afbfec96..5664c70d1ce711743b28dba263e15a70c6a83fb5 100644 (file)
@@ -54,6 +54,8 @@ class IPF_ORM_Utils {
             'unique',
             'unsigned',
             'usstate',
+            'file',
+            'image',
         );
     }
 
diff --git a/ipf/orm/validator/file.php b/ipf/orm/validator/file.php
new file mode 100644 (file)
index 0000000..b235643
--- /dev/null
@@ -0,0 +1,8 @@
+<?php
+
+class IPF_ORM_Validator_File
+{
+    public function validate($value){
+        return true;
+    }
+}
\ No newline at end of file
diff --git a/ipf/orm/validator/image.php b/ipf/orm/validator/image.php
new file mode 100644 (file)
index 0000000..fb2e1e8
--- /dev/null
@@ -0,0 +1,8 @@
+<?php
+
+class IPF_ORM_Validator_Image
+{
+    public function validate($value){
+        return true;
+    }
+}
\ No newline at end of file
index 27ddb6921821e6186d5645f986f118b4c83d3c34..a5236dcab32796da8bf69c553b143625f462c452 100644 (file)
@@ -11,15 +11,18 @@ final class IPF_Shortcuts{
         throw new IPF_HTTP_Error404();
     }
 
-    static function RenderToResponse($tplfile, $params, $request=null)
-    {
+    static function RenderToResponse($tplfile, $params=array(), $request=null){
+        return new IPF_HTTP_Response(IPF_Shortcuts::RenderToString($tplfile, $params, $request));
+    }
+
+    static function RenderToString($tplfile, $params=array(), $request=null){
         $tmpl = new IPF_Template($tplfile);
         if (is_null($request)) {
             $context = new IPF_Template_Context($params);
         } else {
             $context = new IPF_Template_Context_Request($request, $params);
         }
-        return new IPF_HTTP_Response($tmpl->render($context));
+        return $tmpl->render($context);
     }
 
     static function GetFormForModel($model, $data=null, $extra=array(), $label_suffix=null)
index 3b64b16a1e85c45838ae8b9e6f42be38adf395c8..5979aa978304c4a1cda53b4124b6a759f3bdabc1 100644 (file)
@@ -58,7 +58,7 @@ class IPF_Utils {
     }
     
     static function humanTitle($s){
-        return ucfirst(str_replace('_',' ',$s));
+        return ucfirst(str_replace('_',' ',str_replace('_id','',$s)));
     }
 
     static function randomString($len=35)
index 920d2a26de7f09a1d3e98d4951f2b1d0e5ee45f7..8fb3868d57c58cbe42be6c001fb16a123b6f9318 100644 (file)
@@ -1,5 +1,5 @@
 <?php
 
 final class IPF_Version{
-    static $name = '0.2 alpha';
+    static $name = '0.3 alpha';
 }
\ No newline at end of file