PHP - простой рефакторинг - PullRequest
       34

PHP - простой рефакторинг

1 голос
/ 18 февраля 2011

У меня есть следующий код:

$image_1 = $value->getElementsByTagName("Image1");
$image1  = $image_1->item(0)->nodeValue;

$image_2 = $value->getElementsByTagName("Image2");
$image2  = $image_2->item(0)->nodeValue;

Есть ли более простой способ не повторять код Если мне нужно $ image_3?

т.е. как я могу рефакторинг это?

Спасибо

UPDATE:

Я использую переменные $ images_x в следующем коде, который также нуждается в рефакторинге:

ОБНОВЛЕНИЕ 2: - Мой полный код:

$image_1 = $value->getElementsByTagName("Image1");
$image1  = $image_1->item(0)->nodeValue;

$image_2 = $value->getElementsByTagName("Image2");
$image2  = $image_2->item(0)->nodeValue;

$image_3 = $value->getElementsByTagName("Image3");
$image3  = $image_3->item(0)->nodeValue;

$filename_1 = basename($image1);
$ch = curl_init ($image1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
$rawdata_1=curl_exec ($ch);
curl_close ($ch);
$fp = fopen(Mage::getBaseDir('media') . DS . 'import/'.$filename_1,'w');
fwrite($fp, $rawdata_1);
fclose($fp);

$filename_2 = basename($image2);
$ch = curl_init ($image2);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
$rawdata_2=curl_exec ($ch);
curl_close ($ch);
$fp = fopen(Mage::getBaseDir('media') . DS . 'import/'.$filename_2,'w');
fwrite($fp, $rawdata_2);
fclose($fp);

$filename_3 = basename($image3);
$ch = curl_init ($image3);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
$rawdata_3=curl_exec ($ch);
curl_close ($ch);
$fp = fopen(Mage::getBaseDir('media') . DS . 'import/'.$filename_3,'w');
fwrite($fp, $rawdata_3);
fclose($fp);

$product->addImageToMediaGallery(Mage::getBaseDir('media') . DS . 'import/' .  $filename_1, array('image', 'small_image','thumbnail'), false, false);
$product->addImageToMediaGallery(Mage::getBaseDir('media') . DS . 'import/' .  $filename_2, array('image', 'small_image','thumbnail'), false, false);
$product->addImageToMediaGallery(Mage::getBaseDir('media') . DS . 'import/' .  $filename_3, array('image', 'small_image','thumbnail'), false, false);

Ответы [ 6 ]

5 голосов
/ 18 февраля 2011

Вы можете использовать циклы:

$images = array();
for ($i = 1; $i <= 2; $i++) {
   $images[] = $value->getElementsByTagName("Image" . $i)->item(0)->nodeValue;
}

// and then you can get an image via $images[0], $images[1] and so on

Весь код можно переписать так, как предложил Брэд Ф. Джейкобс:

function downloadAndSave($image) {
    $filename = basename($image);
    $ch = curl_init ($image);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
    $rawdata=curl_exec ($ch);
    curl_close ($ch);
    $fp = fopen(Mage::getBaseDir('media') . DS . 'import/'.$filename,'w');
    fwrite($fp, $rawdata);
    fclose($fp);
    return $filename;
}
// here you should have another loop, suppose foreach ($products as $product) {
    for ($i = 1; $i <= 2; $i++) {
       $filename = downloadAndSave($value->getElementsByTagName("Image" . $i)->item(0)->nodeValue);
       $product->addImageToMediaGallery(Mage::getBaseDir('media') . DS . 'import/' .  $filename, array('image', 'small_image','thumbnail'), false, false);
    }
// end of foreach }
1 голос
/ 18 февраля 2011

Лучшее использование массивов. Это даст вам массив изображений:

for ($i = 1; $i < 3; $i++)
{
  $imageElement = $value->getElementsByTagName("Image".$i);
  $imageElements[] = $imageElement;
  $images[] = $imageElement->item(0)->nodeValue;
}
1 голос
/ 18 февраля 2011

Использовать цикл?

$max_ids = 5; // or whatever
$images = array();

for( $i=1; $i <= $max_ids; $i++ ) {
    $images[$i]['tag'] = $value->getElementsByTagName("Image$i");
    $images[$i]['value'] = $image[$i]['tag']->item(0)->nodeValue;
}

Также создает структуру данных для ваших изображений.

1 голос
/ 18 февраля 2011

Вы можете связать это в функцию:

$image = getImage("Image1");

function getImage($path)
{
  $image_raw = $value->getElementsByTagName($path);
  return $image_raw->item(0)->nodeValue;
}

Более того, вы можете прочитать имена ресурсов из файла (если это подходит в контексте, в котором вы хотите использовать это), возвращая массивзначений в цикле foreach:

Псевдокод:

$imgArray = array();

foreach($pathNames as $path)
{
   $imgArray[] = getImage($path);
}
1 голос
/ 18 февраля 2011
$images = array();
for ($x = 1; $x <= 3; $x++) {
    $images[] = $value->getElementsByTagName("Image$x")->item(0)->nodeValue;
}
0 голосов
/ 18 февраля 2011

создать функцию для объединения двух строк.

...