Попытка понять код для поведения MeioUpload для CakePHP - PullRequest
0 голосов
/ 15 апреля 2009

Я читал исходный код 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 ]

1 голос
/ 15 апреля 2009

Ну, я не могу объяснить фактические причины, по которым он это делает, но когда вы используете определенный индекс для строкового значения, подобного этому, вы получаете доступ к определенному символу строки. То есть он проверяет, есть ли в имени файла второй символ, который затем заменяется на «_» или «a». Если имя файла имеет длину всего один символ, оно заменяет целое на «_» или «a».

Я могу объяснить более подробно, что делает эта функция, если хотите, но я не совсем понимаю, чего она пытается достичь.

0 голосов
/ 15 апреля 2009

Чад Бёрч уже ответил на мой вопрос (мое первоначальное замешательство было связано с непониманием того, что $ 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» как поле загрузки. Эта модель называется « product », поэтому каталог для загрузки будет « / 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 () используется для добавления новых зарезервированных слов, когда изображение по умолчанию именуется как-то иначе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...