Привет ребята! Помогите мне пожалуйста разобратся и сформировать кастомный массив с атрибутами товара, в котором будет содержатся кастомная разметка для <select></select> полей
работать нужно в
Таблице Product (jshopProduct::
getBuildSelectAttributes) вот в этом методе
И формировать кастомный select (если указан в attr type выбран как select) или кастомный radio (если указан в attr type выбран как radio) нужно в том случае, если имя атрибута заканчивается на суффикс _tpl-sel (
ИМЯ-АТРИБУТА_tpl-sel) Я то знаю как это сделать, но у меня вместе с обработкой моего массива
$_tpl_options, который я и планирую использовать для построения options полей для select и radio идет и обработка оригинального массива
$options.
А мне нужно чтобы мой массив $_tpl_options обрабатывался и при этом $options - не затрагивался!А мне нужно чтобы мой массив $_tpl_options обрабатывался и при этом $options - не затрагивался!вот мой код, который я буду вставлять в тем места в оригинальном коде, которые указал ниже с моими комментами
// мои правки
$_tpl_options = array(); // создаю отдельный массив в котором будут опции
//атрибутов.. на основе него и будет формироваться код для select или radio
//атрибутов.
$tmpl_attr_name = explode('_', $selects[$attr_id]->attr_name);
if ($tmpl_attr_name[1] == 'tpl-sel') { // если в имени атрибута содержится _tpl-sel
$selects[$attr_id]->attr_name = $tmpl_attr_name[0]; // устанавливаем имя атрибута без преф. _tpl-sel
foreach ($options as $k3 => $v3) {
$_tpl_options[$k3]=$v3; // заполняем массив $_tpl_options можно было
// и так $_tpl_options = array_merge($_tpl_options,$options); или
//$_tpl_options = $options;
}
$regexp_img = '/(<img.*?src\s*=.*?>)([\w\s-,]+)/'; // регулярка для обработки $_tpl_options[$k4]->value_name
// убираем из $_tpl_options[$k4]->value_name текстовое название и оставляем там только картинку
foreach ($_tpl_options as $k4 => $v4) {
preg_match_all($regexp_img, $_tpl_options[$k4]->value_name, $matches);
if ($matches[1]) {
$_tpl_options[$k4]->value_name = $matches[1][0];
} else if ($matches[2]) {
$_tpl_options[$k4]->value_name = $matches[2][0];
}
}
// как видите обработка идет только с $_tpl_options, но почему-то и оригинальный массив $options тоже обрабатывается и из $options ($options[$k]->value_name) так же убирается название опции атрибута, хотя этого быть не должно.. потому как с $options я не работаю..
$selects[$attr_id]->tpl_selects = 'will build!';
//wrap_pre($_tpl_options, '$_tpl_options');
}
вот код оригинального метода .. там я покажу куда буду вставлять свои правкиfunction getBuildSelectAttributes($attributeValues, $attributeActive, $displayonlyattrtype = null){
$jshopConfig = JSFactory::getConfig();
if (!$jshopConfig->admin_show_attributes) return array();
$dispatcher = JDispatcher::getInstance();
$attrib = JSFactory::getAllAttributes();
$userShop = JSFactory::getUserShop();
$selects = array();
foreach($attrib as $k=>$v){
$attr_id = $v->attr_id;
if ($displayonlyattrtype){
$v->attr_type = $displayonlyattrtype;
}
if (isset($attributeValues[$attr_id]) && $attributeValues[$attr_id]){
if (isset($attributeActive[$attr_id])){
$_firstval = $attributeActive[$attr_id];
}else{
$_firstval = 0;
}
$selects[$attr_id] = new stdClass();
$selects[$attr_id]->attr_id = $attr_id;
$selects[$attr_id]->attr_name = $v->name;
$selects[$attr_id]->attr_description = $v->description;
$selects[$attr_id]->groupname = $v->groupname;
$selects[$attr_id]->firstval = $_firstval;
$options = $attributeValues[$attr_id];
$attrimage = array();
foreach($options as $k2=>$v2){
$attrimage[$v2->val_id] = $v2->image;
$addPrice = $v2->addprice;
$addPrice = getPriceFromCurrency($addPrice, $this->currency_id);
$addPrice = getPriceCalcParamsTax($addPrice, $this->product_tax_id);
if ($userShop->percent_discount){
$addPrice = getPriceDiscount($addPrice, $userShop->percent_discount);
}
$options[$k2]->addprice = $addPrice;
}
if ($v->attr_type==1){
// attribut type select
if ($jshopConfig->attr_display_addprice){
foreach($options as $k2=>$v2){
if (($v2->price_mod=="+" || $v2->price_mod=="-" || $jshopConfig->attr_display_addprice_all_sign) && $v2->addprice>0){
$ext_price_info = " (".$v2->price_mod.formatprice($v2->addprice, null, 0, -1).")";
$options[$k2]->value_name .=$ext_price_info;
}
}
}
if ($jshopConfig->product_attribut_first_value_empty){
$first = array();
$first[] = JHTML::_('select.option', '0', _JSHOP_SELECT, 'val_id','value_name');
$options = array_merge($first, $options);
}
if (isset($attributeActive[$attr_id]) && isset($attrimage[$attributeActive[$attr_id]])){
$_active_image = $attrimage[$attributeActive[$attr_id]];
}else{
$_active_image = '';
}
if (isset($attributeActive[$attr_id])){
$_select_active = $attributeActive[$attr_id];
}else{
$_select_active = '';
}
// СЮДА ВСТАВЛЯЮ СВОИ ПРАВКИ ДЛЯ ФОРМИРОВАНИЯ КАСТОМНОГО ATTR TYPE SELECT
// СЮДА ВСТАВЛЯЮ СВОИ ПРАВКИ ДЛЯ ФОРМИРОВАНИЯ КАСТОМНОГО ATTR TYPE SELECT
// СЮДА ВСТАВЛЯЮ СВОИ ПРАВКИ ДЛЯ ФОРМИРОВАНИЯ КАСТОМНОГО ATTR TYPE SELECT
$html_select_attribute_param = 'class="'.$jshopConfig->frontend_attribute_select_class_css.'" size = "'.$jshopConfig->frontend_attribute_select_size.'" onchange="setAttrValue(\''.$attr_id.'\', this.value);"';
$selects[$attr_id]->selects = JHTML::_('select.genericlist', $options, 'jshop_attr_id['.$attr_id.']', $html_select_attribute_param, 'val_id', 'value_name', $_select_active).
"<span class='prod_attr_img'>".$this->getHtmlDisplayProdAttrImg($attr_id, $_active_image)."</span>";
$selects[$attr_id]->selects = str_replace(array("\n","\r","\t"), "", $selects[$attr_id]->selects);
}else{
// attribut type radio
foreach($options as $k2=>$v2){
if ($v2->image) $options[$k2]->value_name = "<img src='".$jshopConfig->image_attributes_live_path."/".$v2->image."' alt='' /> ".$v2->value_name;
}
if ($jshopConfig->attr_display_addprice){
foreach($options as $k2=>$v2){
if (($v2->price_mod=="+" || $v2->price_mod=="-" || $jshopConfig->attr_display_addprice_all_sign) && $v2->addprice>0){
$ext_price_info = " (".$v2->price_mod.formatprice($v2->addprice).")";
$options[$k2]->value_name .=$ext_price_info;
}
}
}
// СЮДА ВСТАВЛЯЮ СВОИ ПРАВКИ ДЛЯ ФОРМИРОВАНИЯ КАСТОМНОГО ATTR TYPE RADIO
// СЮДА ВСТАВЛЯЮ СВОИ ПРАВКИ ДЛЯ ФОРМИРОВАНИЯ КАСТОМНОГО ATTR TYPE RADIO
// СЮДА ВСТАВЛЯЮ СВОИ ПРАВКИ ДЛЯ ФОРМИРОВАНИЯ КАСТОМНОГО ATTR TYPE RADIO
$radioseparator = '';
if ($jshopConfig->radio_attr_value_vertical) $radioseparator = "<br/>";
foreach($options as $k2=>$v2){
$options[$k2]->value_name = "<span class='radio_attr_label'>".$v2->value_name."</span>";
}
$selects[$attr_id]->selects = sprintRadioList($options, 'jshop_attr_id['.$attr_id.']', 'onclick="setAttrValue(\''.$attr_id.'\', this.value);"', 'val_id', 'value_name', $attributeActive[$attr_id], $radioseparator);
$selects[$attr_id]->selects = str_replace(array("\n","\r","\t"), "", $selects[$attr_id]->selects);
}
$dispatcher->trigger('onBuildSelectAttribute', array(&$attributeValues, &$attributeActive, &$selects, &$options, &$attr_id, &$v));
}
}
$grname = '';
foreach($selects as $k=>$v){
if ($v->groupname!=$grname){
$grname = $v->groupname;
$selects[$k]->grshow = 1;
}else{
$selects[$k]->grshow = 0;
}
}
return $selects;
}