试图理解CakePHP的MeioUpload行为的代码

时间:2009-04-14 22:22:57

标签: php cakephp

我正在阅读MeioUpload的源代码,以确保我理解它正在做什么,并且在大多数情况下代码很容易理解。然而,我遇到了一段我似乎无法弄清楚的代码,所以我试图确定这是作者的错误还是我错过了什么。

本质上,此函数传递默认图像的文件名,并将该文件名添加到保留字列表中(并为其生成替换字符串)。我在我无法弄清楚的代码行旁边放了一个箭头和问号(在注释中):

/**
 * Include a pattern of reserved word based on a filename, 
 * and it's replacement.
 * @author Vinicius Mendes
 * @return null
 * @param $default String
 */
function _includeDefaultReplacement($default){
    $replacements = $this->replacements;
    list($newPattern, $ext) = $this->splitFilenameAndExt($default);
    if(!in_array($newPattern, $this->patterns)){
        $this->patterns[] = $newPattern;
        $newReplacement = $newPattern;
        if(isset($newReplacement[1])){ // <--- ???
            if($newReplacement[1] != '_'){
                $newReplacement[1] = '_';
            } else {
                $newReplacement[1] = 'a';
            }
        } elseif($newReplacement != '_') {
            $newReplacement = '_';
        } else {
            $newReplacement = 'a';
        }
        $this->replacements[] = $newReplacement;
    }
}

据我所知,$ newReplacement应该始终是一个字符串,而不是一个数组。这是因为它最终从该函数返回的数组的第一个元素中获取其值:

function splitFilenameAndExt($filename){
    $parts = explode('.',$filename);
    $ext = $parts[count($parts)-1];
    unset($parts[count($parts)-1]);
    $filename = implode('.',$parts);
    return array($filename,$ext);
}

所以if()语句对我没有意义。它似乎试图抓住一个永远不会发生的情况。或者我错了,那部分代码确实有用吗?

2 个答案:

答案 0 :(得分:1)

好吧,我无法解释为什么会这样做的实际原因,但是当你在字符串值上使用特定索引时,你正在访问字符串的特定字符。也就是说,它检查文件名是否有第二个字符,然后用'_'或'a'替换。如果文件名只有一个字符长,则用“_”或“a”替换整个文件。

如果你愿意的话,我可以更详细地解释一下这个功能是做什么的,但我对它想要完成的事情并没有任何理解。

答案 1 :(得分:0)

Chad Birch已经回答了我的问题(我最初的困惑是因为不理解 $ var [n] 可以用来找到一个n th 字符。字符串。),但是为了防止其他人想知道,这里是对这些函数试图完成的解释:

MeioUpload是CakePHP的文件/图片上传行为。使用它,您可以将模型中的任何字段设置为上载字段,如下所示:

var $actsAs = array(
    'MeioUpload' => array(
        'picture' => array(
            'dir' => 'img{DS}{model}{DS}{field}',
            'create_directory' => true,
            'allowed_mime' => array('image/jpeg', 'image/pjpeg', 'image/png'),
            'allowed_ext' => array('.jpg', '.jpeg', '.png'),
            'thumbsizes' => array(
                'normal' => array('width'=>180, 'height'=>180),
                'small' => array('width'=>72, 'height'=>72)
            ),
            'default' => 'default.png'
        )
    )
);

在上面的示例中,MeioUpload会将名为“picture”的字段视为上传字段。此模型恰好命名为“产品”,因此上传目录将为“ / img / product / picture / ”。上述配置还指定应生成2个缩略图。因此,如果我要上传名为“ foo.png ”的图像,则以下文件将保存在服务器上:

/img/product/picture/foo.png
/img/product/picture/thumb.foo.png *
/img/product/picture/thumb.small.foo.png

* - 标记为“普通”的拇指标记没有将其密钥附加到其文件名

此外,默认图像也存储在同一目录中:

/img/product/picture/default.png
/img/product/picture/thumb.default.png
/img/product/picture/thumb.small.default.png

但是,由于我们不希望用户上传的图像,默认图像或自动生成的缩略图互相覆盖,因此作者创建了以下一对数组:

var $patterns = array(
    "thumb",
    "default"
);

var $replacements = array(
    "t_umb",
    "d_fault"
);

用于在保存上传文件时防止文件名冲突:

$filename = str_replace($this->patterns,$this->replacements,$filename);

_includeDefaultReplacement()用于在默认图像被命名为其他内容时添加新的保留字。