我的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);
}
答案 0 :(得分:4)
而不是做
isset($this->data['upload_main_bg_pattern_image']) && $this->data['upload_main_bg_pattern_image'] != ""
你应该!empty($this->data['upload_main_bg_pattern_image'])
等等你的每个陈述
答案 1 :(得分: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次传递图像名称和所需的所有内容
答案 2 :(得分: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;
};
使用Pass-by-reference,以便您可以在没有任何警告的情况下传递未定义的变量。
然后你可以使用它:
$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()
中的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]]);
}
答案 3 :(得分: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');
答案 4 :(得分: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");