Pluf Framework

Pluf Framework Commit Details


Date:2010-08-27 09:08:15 (14 years 8 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.18213s using 13 queries.