0

我的 php 知识不是最强的部分。我正在尝试减少此代码,但真的不知道如何。也许对如何做有任何建议?

if (isset($this->data['upload_main_bg_pattern_image']) && $this->data['upload_main_bg_pattern_image'] != "" && file_exists(DIR_IMAGE . $this->data['upload_main_bg_pattern_image'])) {
    $this->data['image_pattern_preview'] = $this->model_tool_image->resize($this->data['upload_main_bg_pattern_image'], 100, 100);
} else {
    $this->data['image_pattern_preview'] = $this->model_tool_image->resize('no_image.jpg', 100, 100);
}

if (isset($this->data['upload_main_full_bg_image']) && $this->data['upload_main_full_bg_image'] != "" && file_exists(DIR_IMAGE . $this->data['upload_main_full_bg_image'])) {
    $this->data['image_main_full_bg_preview'] = $this->model_tool_image->resize($this->data['upload_main_full_bg_image'], 100, 100);
} else {
    $this->data['image_main_full_bg_preview'] = $this->model_tool_image->resize('no_image.jpg', 100, 100);
}

if (isset($this->data['upload_header_bg_pattern_image']) && $this->data['upload_header_bg_pattern_image'] != "" && file_exists(DIR_IMAGE . $this->data['upload_header_bg_pattern_image'])) {
    $this->data['image_header_pattern_preview'] = $this->model_tool_image->resize($this->data['upload_header_bg_pattern_image'], 100, 100);
} else {
    $this->data['image_header_pattern_preview'] = $this->model_tool_image->resize('no_image.jpg', 100, 100);
}

if (isset($this->data['upload_header_full_bg_image']) && $this->data['upload_header_full_bg_image'] != "" && file_exists(DIR_IMAGE . $this->data['upload_header_full_bg_image'])) {
    $this->data['image_header_full_bg_preview'] = $this->model_tool_image->resize($this->data['upload_header_full_bg_image'], 100, 100);
} else {
    $this->data['image_header_full_bg_preview'] = $this->model_tool_image->resize('no_image.jpg', 100, 100);
}
4

5 回答 5

4

而不是做

isset($this->data['upload_main_bg_pattern_image']) && $this->data['upload_main_bg_pattern_image'] != ""

你应该做!empty($this->data['upload_main_bg_pattern_image'])

等等你的每一个陈述

于 2013-04-30T18:17:54.070 回答
2

由于所有四个代码块似乎都在做同样的事情,只是使用不同的键data,因此您可以创建一个接受键作为字符串的函数,然后根据需要多次运行该函数。您还可以使用三元运算符来定义输出文件名,然后您只需声明一次实际的调整大小代码。

function resizeImage(uploadKey, previewKey) {
    $fileName = (isset($this->data[uploadKey]) && $this->data[uploadKey] != "" && file_exists(DIR_IMAGE . $this->data[uploadKey])) ? $this->data[previewKey] : 'no_image.jpg';
    $this->data[previewKey] = $this->model_tool_image->resize(fileName, 100, 100);
}

resizeImage('upload_main_bg_pattern_image', 'image_pattern_preview');
resizeImage('upload_main_full_bg_image', 'image_main_full_bg_preview');
resizeImage('upload_header_bg_pattern_image', 'image_header_pattern_preview');
resizeImage('upload_header_full_bg_image', 'image_header_full_bg_preview');
于 2013-04-30T18:24:42.137 回答
2

这应该是一个功能

   if (isset($this->data['upload_header_full_bg_image']) && $this->data['upload_header_full_bg_image'] != "" && file_exists(DIR_IMAGE . $this->data['upload_header_full_bg_image'])) {
        $this->data['image_header_full_bg_preview'] = $this->model_tool_image->resize($this->data['upload_header_full_bg_image'], 100, 100);
    } else {
        $this->data['image_header_full_bg_preview'] = $this->model_tool_image->resize('no_image.jpg', 100, 100);
    }

重复 4 次传递图像名称和所有你需要的东西

于 2013-04-30T18:16:37.777 回答
2

你可以添加

$data = $this->data;

在它前面,然后使用$data以下代码而不是$this->data.

下一步是将字符串提取到变量中。每个部分都有效:

$upload_main_bg = 'upload_main_bg_pattern_image';
$image_pattern  = 'image_pattern_preview';
$image_default  = 'no_image.jpg';

if (isset($data[$upload_main_bg]) && $data[$upload_main_bg] != "" && file_exists(DIR_IMAGE . $data[$upload_main_bg])) {
    $data[$image_pattern] = $this->model_tool_image->resize($data[$upload_main_bg], 100, 100);
} else {
    $data[$image_pattern] = $this->model_tool_image->resize($image_default, 100, 100);
}

之后,您还提取 exists 和 resize 函数调用:

$exists = function($path) {
    return file_exists(DIR_IMAGE . $path);
};

$resize = function($image) {
    return $this->model_tool_image->resize($image, 100, 100);
};

...

if (isset($data[$upload_main_bg]) && $data[$upload_main_bg] != "" && $exists($data[$upload_main_bg])) {
    $data[$image_pattern] = $resize($data[$upload_main_bg]);
} else {
    $data[$image_pattern] = $resize($image_default);
}

然后你提取整个块:

$image = function(&$subject, $default = NULL) use ($exists, $image_default) {
    if ($default === NULL) {
        $default = $image_default;
    }
    if (strlen($subject) && $exists($subject)) {
        return $subject;
    }
    return $default;
};

使用传递引用,以便您可以传递未定义的变量而不会发出任何警告。

然后,您可以使用它:

$data[$image_pattern] = $resize($image($data[$upload_main_bg]));

那条线代替了if你到目前为止的块。

下一步是将不同图像的信息放入一个数组并对其进行迭代:

$images = [
    ['upload_main_bg_pattern_image',   'image_pattern_preview'       ],
    ['upload_main_full_bg_image',      'image_main_full_bg_preview'  ],
    ['upload_header_bg_pattern_image', 'image_header_pattern_preview'],
    ['upload_header_full_bg_image',    'image_header_full_bg_preview'],
];

foreach($images as $imageData)
{
    list($name, $result) = $imageData;
    $data[$result] = $resize($image($data[$name]));
}

这也表明名称仅在前缀和后缀上有所不同,因此您可以进一步对其进行编码。但这不起作用,因为第一个不同。因此,您应该首先考虑简化您在此处使用的数据结构,以便在代码中受益。第三个元素相同:

$images = [
    ['upload_main_bg_pattern_image',   'image_main_bg_pattern_preview'  ],
    ['upload_main_full_bg_image',      'image_main_full_bg_preview'     ],
    ['upload_header_bg_pattern_image', 'image_header_bg_pattern_preview'],
    ['upload_header_full_bg_image',    'image_header_full_bg_preview'   ],
];

这将允许有两个掩码和图像名称:

$patternInput  = 'upload_%s_image';
$patternOutput = 'image_%s_preview';

$images = [
    'main_bg_pattern',
    'main_full_bg',
    'header_bg_pattern',
    'header_full_bg',
];

然后,您可以将掩码与sprintf()like in一起使用sprintf($patternInput, $imageName);

完成所有这些之后,您可以在版本控制系统中恢复到原始版本,并使用途中获得的知识重新开始。

所以你现在应该做的第一件事就是将你的代码置于版本控制之下。这使您可以轻松地做这些事情,而不必担心会破坏某些东西并做一些小步骤。

这可能会导致以下结果:

$resizeWithDefaultFallback = function(&$subject) {
    $resize = [$this->model_tool_image, 'resize'];
    if (strlen($subject) && is_file(DIR_IMAGE . $subject)) {
        return $resize($this->data['upload_main_bg_pattern_image'], 100, 100);
    } else {
        return $resize('no_image.jpg', 100, 100);
    }
};

$images = [
    ['upload_main_bg_pattern_image',   'image_pattern_preview'       ],
    ['upload_main_full_bg_image',      'image_main_full_bg_preview'  ],
    ['upload_header_bg_pattern_image', 'image_header_pattern_preview'],
    ['upload_header_full_bg_image',    'image_header_full_bg_preview'],
];

foreach($images as $image) {
    $this->data[$image[1]] = $resizeWithDefaultFallback($this->data[$image[0]]);
}
于 2013-04-30T18:16:47.053 回答
1
function imageResize($data,$check)
{
    return (isset($this->data[$check]) && $this->data[$check] != "" && file_exists(DIR_IMAGE . $this->data[$check])) 
            ? $this->model_tool_image->resize($this->data[$check], 100, 100);
            : $this->model_tool_image->resize('no_image.jpg', 100, 100);
}

$this->data['image_pattern_preview'] = imageResize($data,"upload_main_bg_pattern_image");
$this->data['image_main_full_bg_preview'] = imageResize($data,"upload_main_full_bg_image");
$this->data['image_header_pattern_preview'] = imageResize($data,"upload_header_bg_pattern_image");
$this->data['image_header_full_bg_preview'] = imageResize($data,"upload_header_full_bg_image");
于 2013-04-30T18:25:19.897 回答