Magento создает новый продукт с самостоятельно созданными атрибутами и опциями - PullRequest
0 голосов
/ 19 декабря 2011

Подобные вопросы здесь не помогли мне с моей проблемой, поэтому я просто задам сам.

У меня есть файл php, который создает атрибут (раскрывающийся список), и файл php, который создает параметры для него.

Теперь я хочу создать php-файл, который генерирует мне простой продукт для magento с одним или несколькими атрибутами (которые были созданы ранее)

Вот мой кусок кода для генерации данных для него:

$code = "\$newProductData = array(  
          " . ((!empty($name)) ? "'name' => '$name', " : "") . "
          " . ((!empty($websites)) ? "'websites' => '$websites[0]', " : "") . "
          " . ((!empty($description)) ? "'description' => '$description', " : "") . "
          " . ((!empty($description_short)) ? "'description_short' => '$description_short', " : "") . "
          " . ((!empty($price)) ? "'price' => '$price', " : "") . "
          " . ((!empty($type)) ? "'type' => '$type', " : "") . "
          " . ((!empty($status)) ? "'status' => '$status', " : "") . "
          " . ((!empty($weight)) ? "'weight' => '$weight', " : "") . "
          " . ((!empty($tax_class_id)) ? "'tax_class_id' => '$tax_class_id', " : "") . "
          " . ((!empty($categories)) ? "'categories' => '$categories', " : "") . "
          " . ((!empty($manufacturer)) ? "'manufacturer' => '$manufacturer', " : "") . "
          " . ((!empty($color)) ? "'color' => '$color', " : "") . "
          " . ((!empty($url_key)) ? "'url_key' => '$url_key', " : "") . "
          " . ((!empty($url_path)) ? "'url_path' => '$url_path', " : "") . "
          " . ((!empty($visibility)) ? "'visibility' => '$visibility', " : "") . "
          " . ((!empty($news_from_date)) ? "'news_from_date' => '$news_from_date', " : "") . "
          " . ((!empty($news_to_date)) ? "'news_to_date' => '$news_to_date', " : "") . "
          " . ((!empty($special_price)) ? "'special_price' => '$special_price', " : "") . "
          " . ((!empty($special_from_date)) ? "'special_from_date' => '$special_from_date', " : "") . "
          " . ((!empty($special_to_date)) ? "'special_to_date' => '$special_to_date', " : "") . "
          " . ((!empty($meta_title)) ? "'meta_title' => '$meta_title', " : "") . "
          " . ((!empty($meta_keyword)) ? "'meta_keyword' => '$meta_keyword', " : "") . "
          " . ((!empty($meta_description)) ? "'meta_description' => '$meta_description', " : "") . "
          " . ((!empty($enable_googlecheckout)) ? "'enable_googlecheckout' => '$enable_googlecheckout', " : "") . "
          " . ((!empty($custom_design)) ? "'custom_design' => '$custom_design', " : "") . "
          " . ((!empty($custom_design_from)) ? "'custom_design_from' => '$custom_design_from', " : "") . "
          " . ((!empty($custom_design_to)) ? "'custom_design_to' => '$custom_design_to', " : "") . "
          " . ((!empty($custom_layout_update)) ? "'custom_layout_update' => '$custom_layout_update', " : "") . "
          " . ((!empty($page_layout)) ? "'page_layout' => '$page_layout', " : "") . "
          " . ((!empty($old_id)) ? "'old_id' => '$old_id', " : "") . "
          " . ((!empty($required_options)) ? "'required_options' => '$required_options', " : "") . "
          " . ((!empty($has_options)) ? "'has_options' => '$has_options', " : "") . "
          " . ((!empty($image_label)) ? "'image_label' => '$image_label', " : "") . "
          " . ((!empty($small_image_label)) ? "'small_image_label' => '$small_image_label', " : "") . "
          " . ((!empty($thumbnail_label)) ? "'thumbnail_label' => '$thumbnail_label', " : "") . "
          " . ((!empty($gift_message_available)) ? "'gift_message_available' => '$gift_message_available', " : "") . "
          " . ((!empty($cost)) ? "'cost' => '$cost', " : "") . "
          " . ((!empty($is_in_stock)) ? "'is_in_stock' => '$is_in_stock', " : "") . "
          " . ((!empty($qty)) ? "'qty' => '$qty', " : "") . "
          " . ((!empty($minimal_price)) ? "'minimal_price' => '$minimal_price', " : "") . "
          " . ((!empty($tier_price)) ? "'tier_price' => '$tier_price', " : "") . "
          " . ((!empty($options_container)) ? "'options_container' => '$options_container', " : "") . "
       );";

      /* evaluate code */
      eval($code);

      /* cause i dunno if i could simple add the attributes under the evaluated code, i'm merging  each attribute to main array with product data like productdata = (array)productdata + (array)attributeX */
     /* $attributes[$iteration] = "myattributename like custommanufacturer" */
     /* $attributeoptions[$iteration] = "myoptionname like customname" */
      while($iteration != $attr_count -1)
      {
        $iteration++;
        $attributeData = array($attributes[$iteration] => $attributeoptions[$iteration]);
        $newProductData = array_merge((array)$newProductData,(array)$attributeData);
      }
    if ($proxy->create($type, $set['set_id'], $sku, $newProductData)) 
      {
          $hp_bereich .= "\nsuccess=yes";
          $hp_bereich .= "\nwarning=";
          $hp_bereich .= "\nerrorcode=0";
          $hp_bereich .= "\nSKU=" .$sku;
      } 
      else 
      {
          $hp_bereich .= "\nsuccess=no";
          $hp_bereich .= "\nwarning=Error creating product see scriptblock";
          $hp_bereich .= "\nerrorcode=-2001";
          $hp_bereich .= "\nSKU=" .$sku;
      }

Теперь вот проблема: Создание продукта: сделано отлично Атрибут будет отображаться на панели администратора внутри продукта (раскрывающийся список с выбранным параметром для него): нет.

Может ли кто-нибудь помочь мне с этой проблемой?

Я должен создать продукт с нуля (с небольшим количеством информации), включая атрибуты, которые будут созданы пользователем, который контролирует / заполняет php-файл информацией.

1 Ответ

2 голосов
/ 19 декабря 2011

Во-первых, и самое главное, не используйте eval. Это слишком рискованно и может позволить внедрение кода, если только одна из этих многих переменных не была должным образом проверена, она может содержать атакующий код. Есть причина, по которой многие веб-хосты отключают его полностью. В этом случае eval не приносит никакой пользы, он не достигает ничего, что вы не могли бы сделать иначе.


Сделать простой продукт очень просто.

Mage::getModel('catalog/product')
    ->setTypeId('simple')
    ->setWebsiteIds($websites)
    ->setName($name)
    ->setDescription($description)
    ->setDescriptionShort($description_short)
    // etc...
    ->save();

Сеттеры - это магические методы, поэтому вы можете использовать любое имя атрибута, которое вам нравится. Если переданное значение равно нулю, атрибут не установлен, поэтому безопасно вызывать все эти установщики безоговорочно. Если вы создаете эти переменные из массива - возможно, используя extract() - тогда быстрее использовать массив напрямую:

Mage::getModel('catalog/product')
    ->setTypeId('simple')
    ->addData($array)
    ->save();

Если вы хотите узнать, как существующий продукт хранит его атрибуты, используйте что-то вроде следующего:

$product = Mage::getModel('catalog/product')->load($productId);
print_r($product->debug());

Это хорошая техника отладки и многое раскрывает. Сделайте это, чтобы узнать, как хранятся раскрывающиеся атрибуты.

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