Pluf Framework

Pluf Framework Commit Details


Date:2010-08-27 09:08:15 (14 years 3 months ago)
Author:Mehdi Kabab
Branch:develop, master
Commit:d594a0c0d44f5dda84903f3698f4c643671d1a42
Parents: f2c18d7c0ea05d41116cd1f2e5eac0ca7bd4cf6e
Message:Added new DB field type Slug.

Changes:

File differences

src/Pluf/DB.php
116116
117117
118118
119
120
119121
120122
121123
......
214216
215217
216218
219
220
221
array('Pluf_DB_IdentityFromDb', 'Pluf_DB_PasswordToDb'),
'Pluf_DB_Field_Sequence' =>
array('Pluf_DB_IntegerFromDb', 'Pluf_DB_IntegerToDb'),
'Pluf_DB_Field_Slug' =>
array('Pluf_DB_IdentityFromDb', 'Pluf_DB_SlugToDb'),
'Pluf_DB_Field_Text' =>
array('Pluf_DB_IdentityFromDb', 'Pluf_DB_IdentityToDb'),
'Pluf_DB_Field_Varchar' =>
return $db->esc('sha1:'.$salt.':'.sha1($salt.$val));
}
function Pluf_DB_SlugToDB($val, $db) {
return $db->esc(Pluf_DB_Field_Slug::slugify($val));
}
src/Pluf/DB/Field/Slug.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<?php
/* -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
# ***** BEGIN LICENSE BLOCK *****
# This file is part of Plume Framework, a simple PHP Application Framework.
# Copyright (C) 2001-2010 Loic d'Anterroches and contributors.
#
# Plume Framework is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
#
# Plume Framework is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
# ***** END LICENSE BLOCK ***** */
/**
* This field will automatically slugify its content.
*
* A slug is a short label for something, containing only letters,
* numbers, underscores or hyphens. They're generally used in URLs.
*
* In your model, you can specify `max_length` in the `widget_attrs`
* parameter. If `max_length` is not specified, Pluf will use a
* default length of 50.
*/
class Pluf_DB_Field_Slug extends Pluf_DB_Field
{
public $type = 'varchar';
/**
* @see Pluf_DB_Field::formField()
*/
function formField($def, $form_field = 'Pluf_Form_Field_Slug')
{
return parent::formField($def, $form_field);
}
/**
* Return a "URL friendly" version in lowercase.
*
* Define the words separator with the configuration
* option <code>slug-separator</code>. Default to <code>-</code>.
*
* @param $value string Value to convert
* @return string The slugify version.
*/
public static function slugify($value)
{
$separator = Pluf::f('slug-separator', '-');
$value = Pluf_Text_UTF8::romanize(Pluf_Text_UTF8::deaccent($value));
$value = preg_replace('#[^'.$separator.'\w]#u',
$separator,
mb_strtolower($value, Pluf::f('encoding', 'UTF-8')));
// remove redundant
$value = preg_replace('#'.$separator.'{2,}#u',
$separator,
trim($value, $separator));
return $value;
}
}
src/Pluf/Form/Field/Slug.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
<?php
/* -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
# ***** BEGIN LICENSE BLOCK *****
# This file is part of Plume Framework, a simple PHP Application Framework.
# Copyright (C) 2001-2010 Loic d'Anterroches and contributors.
#
# Plume Framework is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
#
# Plume Framework is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
# ***** END LICENSE BLOCK ***** */
class Pluf_Form_Field_Slug extends Pluf_Form_Field
{
/**
* Name of the widget to use for build the forms.
*
* @var string
*/
public $widget = 'Pluf_Form_Widget_TextInput';
/**
* Minimum size of field.
*
* Default to 1.
*
* @var int
**/
public $min_size = 1;
/**
* Maximum size of field.
*
* Default to 50.
*
* @var int
**/
public $max_size = 50;
protected $_error_messages = array();
public function __construct($params=array())
{
if (in_array($this->help_text, $this->empty_values)) {
$this->help_text = __('The &#8220;slug&#8221; is the URL-friendly'.
' version of the name, consisting of '.
'letters, numbers, underscores or hyphens.');
}
$this->_error_messages = array(
'min_size' => __('Ensure this value has at most %1$d characters (it has %2$d).'),
'max_size' => __('Ensure this value has at least %1$d characters (it has %2$d).')
);
parent::__construct($params);
}
/**
* Removes any character not allowed and valid the size of the field.
*
* @see Pluf_Form_Field::clean()
* @throws Pluf_Form_Invalid If the lenght of the field has not a valid size.
*/
public function clean($value)
{
parent::clean($value);
if ($value) {
$value = Pluf_DB_Field_Slug::slugify($value);
$len = mb_strlen($value, Pluf::f('encoding', 'UTF-8'));
if ($this->max_size < $len) {
throw new Pluf_Form_Invalid(sprintf($this->_error_messages['max_size'],
$this->max_size,
$len));
}
if ($this->min_size > $len) {
throw new Pluf_Form_Invalid(sprintf($this->_error_messages['min_size'],
$this->min_size,
$len));
}
}
else
$value = '';
return $value;
}
/**
* @see Pluf_Form_Field::widgetAttrs()
*/
public function widgetAttrs($widget)
{
$attrs = array();
if (!isset($widget->attrs['maxlength'])) {
$attrs['maxlength'] = $this->max_size;
} else {
$this->max_size = $widget->attrs['maxlength'];
}
return $attrs;
}
}
src/Pluf/Tests/Model/SlugField.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
<?php
/* -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
# ***** BEGIN LICENSE BLOCK *****
# This file is part of Plume Framework, a simple PHP Application Framework.
# Copyright (C) 2001-2010 Loic d'Anterroches and contributors.
#
# Plume Framework is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
#
# Plume Framework is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
# ***** END LICENSE BLOCK ***** */
class Pluf_Tests_Model_SlugField_Model extends Pluf_Model
{
public $_model = __CLASS__;
function init()
{
$this->_a['verbose'] = 'slug';
$this->_a['table'] = 'slug';
$this->_a['model'] = __CLASS__;
$this->_a['cols'] = array(
'id' => array(
'type' => 'Pluf_DB_Field_Sequence',
'blank' => true,
),
'slug_default_length' => array(
'type' => 'Pluf_DB_Field_Slug',
),
'slug_custom_legnth' => array(
'type' => 'Pluf_DB_Field_Slug',
'widget_attrs' => array(
'maxlength' => 5,
),
),
);
}
}
class Pluf_Tests_Model_SlugField extends UnitTestCase
{
function __construct()
{
parent::__construct('Test the slug field.');
}
function testSlugifyLowercase()
{
$slug = Pluf_DB_Field_Slug::slugify('Pluf');
$this->assertEqual('pluf', $slug);
}
function testSlugifyReplaceWhiteSpaces()
{
// replaces a white space by the separator
$slug = Pluf_DB_Field_Slug::slugify('ceondo pluf');
$this->assertEqual('ceondo-pluf', $slug);
// replaces several white spaces by a single the separator
$slug = Pluf_DB_Field_Slug::slugify('ceondo pluf');
$this->assertEqual('ceondo-pluf', $slug);
// removes separator at the bound of a string
$slug = Pluf_DB_Field_Slug::slugify(' ceondo pluf');
$this->assertEqual('ceondo-pluf', $slug);
$slug = Pluf_DB_Field_Slug::slugify('ceondo pluf ');
$this->assertEqual('ceondo-pluf', $slug);
}
function testSlugifyNonASCII()
{
// replaces non-ASCII characters by the separator
$slug = Pluf_DB_Field_Slug::slugify('ceondo,pluf');
$this->assertEqual('ceondo-pluf', $slug);
$slug = Pluf_DB_Field_Slug::slugify('ceondo€pluf');
$this->assertEqual('ceondo-pluf', $slug);
// replaces accents by their equivalent non-accented
$slug = Pluf_DB_Field_Slug::slugify('éiùàñ');
$this->assertEqual('eiuan', $slug);
}
function testSlugifyWithCustomSeparator()
{
$backup = $GLOBALS['_PX_config'];
$GLOBALS['_PX_config']['slug-separator'] = '_';
$slug = Pluf_DB_Field_Slug::slugify('ceondo pluf');
$this->assertEqual('ceondo_pluf', $slug);
$slug = Pluf_DB_Field_Slug::slugify('ceondo pluf');
$this->assertEqual('ceondo_pluf', $slug);
$GLOBALS['_PX_config'] = $backup;
}
function testCreate()
{
$db = Pluf::db();
$schema = new Pluf_DB_Schema($db);
$m = new Pluf_Tests_Model_SlugField_Model();
$schema->model = $m;
$schema->createTables();
$m->slug_default_length = 'Pluf, supported by Céondo Ltd.';
$m->create();
$this->assertEqual(1, $m->id);
$m = new Pluf_Tests_Model_SlugField_Model(1);
$this->assertEqual('pluf-supported-by-ceondo-ltd', $m->slug_default_length);
$schema->dropTables();
}
}

Archive Download the corresponding diff file

Branches

Tags

Number of commits:
Page rendered in 0.07395s using 13 queries.