Неустранимая ошибка Magento не может повторно объявить тему функции Blanco

Наша команда купила Тема Blanco, отличная тема для Magento. Затем после установки я попытался войти на страницу сведений о продукте и получил эту ошибку:

Fatal error: Cannot redeclare themeOptions() (previously declared in
C:\wamp\www\magento\app\design\frontend\default\blanco\template\page\html\head.phtml:6) in
C:\wamp\www\magento\app\design\frontend\default\blanco\template\page\html\head.phtml on line 113

Сначала я проверил веб-сайт провайдера, чтобы прочитать часто задаваемые вопросы и любые возможные проблемы. Не повезло, поэтому я разместил свой вопрос там. В любом случае, я не могу дождаться, пока они ответят, поэтому... Я искал эту ошибку и нашел несколько предложений здесь, в StackOverflow, этот пост, этот другой и некоторые другие. Но ответы, данные там, бесполезны, или, может быть, я неправильно это реализую. Пробовал использовать function_exist, но это препятствует загрузке функции, а тема вообще не загружается на странице сведений о продукте. Ни include_once "head.html"; не работает.

Я убедился, что функция больше нигде в коде не объявлена.

Что вы рекомендуете мне делать? Является файлом phtml, поэтому внутри него есть комбинация тегов php и html. Вот код:

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>
<script type="text/javascript">var slide_on=false;</script>
<?php 
function themeOptions ($themeOption) {
    switch ($themeOption) {

         /* GENERAL */
         case 'additionalLink':
           return Mage::getStoreConfig('mygeneral/generaloptions/additional_nav', Mage::app()->getStore()->getId());
         break;
         case 'menutype':
           return Mage::getStoreConfig('mygeneral/generaloptions/menutype', Mage::app()->getStore()->getId());
         break;
         case 'use_cufon':
           return (Mage::getStoreConfig('mygeneral/generaloptions/use_cufon', Mage::app()->getStore()->getId()) == 1);
         break;
         case 'topbanner':
           return Mage::getStoreConfig('mygeneral/generaloptions/topbanner', Mage::app()->getStore()->getId());
         break;     
         case 'phones':
           return Mage::getStoreConfig('mygeneral/generaloptions/phones', Mage::app()->getStore()->getId());
         break;
         case 'additionalLinkUrl':
           return Mage::getStoreConfig('mygeneral/generaloptions/additional_nav_href', Mage::app()->getStore()->getId());
         break;
         case 'topbtn':
           return (Mage::getStoreConfig('mygeneral/generaloptions/topbtn', Mage::app()->getStore()->getId()) == 1);
         break;
         case 'enable_ajax':
           return (Mage::getStoreConfig('mygeneral/generaloptions/enable_ajax', Mage::app()->getStore()->getId()) == 1);
         break;

          /* BackGroung */
         case 'pattern':
           return Mage::getStoreConfig('mygeneral/background/pattern', Mage::app()->getStore()->getId());
         break; 
         case 'maincolor':
           return Mage::getStoreConfig('mygeneral/background/maincolor', Mage::app()->getStore()->getId());
         break;  
         case 'bg_repeat':
           return Mage::getStoreConfig('mygeneral/background/bg_repeat', Mage::app()->getStore()->getId());
         break;  
         case 'bg_attachment':
           return Mage::getStoreConfig('mygeneral/background/bg_attachment', Mage::app()->getStore()->getId());
         break;  
         case 'bg_position_x':
           return Mage::getStoreConfig('mygeneral/background/bg_position_x', Mage::app()->getStore()->getId());
         break; 
         case 'bg_position_y':
           return Mage::getStoreConfig('mygeneral/background/bg_position_y', Mage::app()->getStore()->getId());
         break;   

         /* SLIDESHOW */
         case 'use_slideshow':
           return (Mage::getStoreConfig('mygeneral/slideshow/use_slideshow', Mage::app()->getStore()->getId()) == 1);
         break;
         case 'autoplay':
           return (Mage::getStoreConfig('mygeneral/slideshow/autoplay', Mage::app()->getStore()->getId()) == 1);
         break;
         case 'speed':
           return Mage::getStoreConfig('mygeneral/slideshow/speed', Mage::app()->getStore()->getId());
         break;

         /* PRODUCT LIST */
         case 'hover_swap':
           return (Mage::getStoreConfig('mygeneral/product_list/hover_swap', Mage::app()->getStore()->getId()) == 1);
         break;
         case 'column_count':
           return Mage::getStoreConfig('mygeneral/product_list/column_count', Mage::app()->getStore()->getId());
         break;
         case 'layer':
           return Mage::getStoreConfig('mygeneral/product_list/layer', Mage::app()->getStore()->getId());
         break;
         case 'new_label':
           return (Mage::getStoreConfig('mygeneral/product_list/new_label', Mage::app()->getStore()->getId()) == 1);
         break;
         case 'sale_label':
           return (Mage::getStoreConfig('mygeneral/product_list/sale_label', Mage::app()->getStore()->getId()) == 1);
         break;
         case 'addto':
           return (Mage::getStoreConfig('mygeneral/product_list/addto', Mage::app()->getStore()->getId()) == 1);

         /* SHARE */
         break;
         case 'use_share':
           return (Mage::getStoreConfig('mygeneral/share/use_share', Mage::app()->getStore()->getId()) == 1);
         break;
         case 'share_code':
           return Mage::getStoreConfig('mygeneral/share/share_code', Mage::app()->getStore()->getId());
         break;

         /* PRODUCT PAGE */
         case 'layout':
           return Mage::getStoreConfig('mygeneral/productpage/layout', Mage::app()->getStore()->getId());
         break;
         case 'use_zoom':
           return (Mage::getStoreConfig('mygeneral/productpage/use_zoom', Mage::app()->getStore()->getId()) == 1);
         break;
         case 'use_carousel':
           return (Mage::getStoreConfig('mygeneral/productpage/use_carousel', Mage::app()->getStore()->getId()) == 1);
         break;

         /* COLORS */
         case 'active_color':
           return Mage::getStoreConfig('mygeneral/colors/active_color');
         break;
         case 'button_hover':
           return Mage::getStoreConfig('mygeneral/colors/button_hover');
         break;
    }
}
?>
<meta http-equiv="Content-Type" content="<?php echo $this->getContentType() ?>" />
<title><?php echo $this->getTitle() ?></title>
<meta name="description" content="<?php echo htmlspecialchars($this->getDescription()) ?>" />
<meta name="keywords" content="<?php echo htmlspecialchars($this->getKeywords()) ?>" />
<meta name="robots" content="<?php echo htmlspecialchars($this->getRobots()) ?>" />
<link rel="icon" href="<?php echo $this->getFaviconFile(); ?>" type="image/x-icon" />
<link rel="shortcut icon" href="<?php echo $this->getFaviconFile(); ?>" type="image/x-icon" />
<!--[if lt IE 7]>
<script type="text/javascript">
//<![CDATA[
    var BLANK_URL = '<?php echo $this->helper('core/js')->getJsUrl('blank.html') ?>';
    var BLANK_IMG = '<?php echo $this->helper('core/js')->getJsUrl('spacer.gif') ?>';
//]]>
</script>
<![endif]-->
<script type="text/javascript">
  var BASE_URL = '<?php echo $this->getBaseUrl(); ?>';
  var clearenceUrl = '<?php echo themeOptions('additionalLinkUrl'); ?>';
</script>
<?php echo $this->getCssJsHtml() ?>
<?php echo $this->getChildHtml() ?>
<?php echo $this->helper('core/js')->getTranslatorScript() ?>
<?php echo $this->getIncludes() ?>

<!-- MENU -->
<?php $menutype = themeOptions('menutype'); ?>
<?php if($menutype == 1): ?>
    <link rel="stylesheet" type="text/css" href="<?php echo $this->getSkinUrl('css/menu1.css'); ?>" media="screen"/>
<?php elseif($menutype == 2): ?>
    <link rel="stylesheet" type="text/css" href="<?php echo $this->getSkinUrl('css/menu2.css'); ?>" media="screen"/>
    <script type="text/javascript" src="<?php echo $this->getJsUrl('varien/menu.js'); ?>"></script>
<?php endif; ?>

<!-- ZOOM -->
<?php $use_zoom = themeOptions('use_zoom'); ?>
<?php if($use_zoom): ?>
    <script type="text/javascript" src="<?php echo $this->getJsUrl('zoom/easyzoom.js'); ?>"></script>
    <link rel="stylesheet" type="text/css" href="<?php echo $this->getSkinUrl('css/easyzoom.css'); ?>" media="screen"/>
<?php endif; ?>
<!-- CUFON -->
<?php $use_cufon = themeOptions('use_cufon'); ?>
<?php $use_slideshow = themeOptions('use_slideshow'); ?>
<?php if($use_cufon): ?>
    <script type="text/javascript" src="<?php echo $this->getJsUrl('cufon/cufon-yui.js'); ?>"></script>
    <script type="text/javascript" src="<?php echo $this->getJsUrl('cufon/Bebas_Neue_400.font.js'); ?>"></script>
    <script type="text/javascript" src="<?php echo $this->getJsUrl('cufon/cufon-replace.js'); ?>"></script>
<?php endif; ?>


<?php 
$selectors = Array();
$selectors['active_color'] = '
#nav > li.over > a > span,
#nav > li:hover > a > span,
#nav > li.active > a > span,
.product-tabs li.active a,
a:hover,
#nav > li > ul > li.parent > a:hover,
.footer-container a:hover,
.block-layered-nav dd a:hover,
.blocklist > li > ul > li a:hover,
#nav > li > ul > li ul > li a:hover,
.block-account .block-content li.current strong,
.form-search button.button:hover,
.special-price .price,
.product-tabs li a:hover,
.products-grid li.item:hover a,
.newproducts li.item:hover a,
.related li.item:hover a,
.saleproduct  
';

$selectors['active_color_imp'] = '.special-price .price';

$selectors['active_bg'] = '
.pages li a:hover,
.pages .current, 
button.button:hover,
.tintButton:hover,
.footer-container .form-subscribe button.button,
.add-to-cart button.button,
#added a:hover,
button.button.btn-checkout,
.opc .active .step-title,
a.readmore,
#added a,
.quantity_box_button_up:hover,
.quantity_box_button_down:hover,
.left-categorys-container a:hover,
.home-text a.readmore,
.box-tags button.button,
.tintButton,
.blocklist > li > ul > li:hover, 
#nav > li > ul > li ul > li:hover,
.block-account .block-title,
.block.left-categorys .block-title
';

$selectors['active_bg2'] = '
.add-to-cart button.button:hover,
button.btn-checkout.button:hover,
#banner-rotator .tintButton:hover,
a.readmore:hover,
.box-tags button.button:hover,
#added a:hover,
.footer-container .form-subscribe button.button:hover 
';

$selectors['active_border'] = '
.etheme_cp .etheme_cp_content .etheme_cp_section .pattern_select.selected,
.product-view .product-img-box .more-views a.thumbnail-active    
';

$selectors['brown_color'] = '
.blocklist > li > ul > li a,
#nav > li > ul > li ul > li a';

$selectors['brown_bg'] = '
.blocklist > li > ul > li,
.left-categorys-container a,
#nav > li > ul > li ul > li';

    function jsString($str='') { 
        return trim(preg_replace("/('|\"|\r?\n)/", '', $str)); 
    }     
?>


<style type="text/css">
    /* Active Color */
    <?php echo jsString($selectors['active_color']); ?>              { color: #<?php echo themeOptions('active_color') ?>; }

    <?php echo jsString($selectors['active_color_imp']); ?>          { color: #<?php echo themeOptions('active_color') ?>!important; }

    ::-moz-selection, ::selection { background-color: #<?php echo themeOptions('active_color') ?>; }
    /* Active BG */
    <?php echo jsString($selectors['active_bg']); ?>                 {  background-color: #<?php echo themeOptions('active_color') ?>; }

    <?php echo jsString($selectors['active_bg2']); ?>                {  background-color: #<?php echo themeOptions('button_hover') ?>; text-decoration: underline; }

    /* Active Border */
    <?php echo jsString($selectors['active_border']); ?>             {  border-color: #<?php echo themeOptions('active_color') ?>; }

    <?php echo jsString($selectors['brown_color']); ?>               {  color:#818181; }

    <?php echo jsString($selectors['brown_bg']); ?>                  {  background-color:#818181; }



</style>

<?php if($use_slideshow): ?>
<?php $speed = themeOptions('speed'); ?>
<script type="text/javascript">
    if(slide_on){
        jQuery(document).ready(function($) {
            $('.iosSlider').iosSlider({
                desktopClickDrag: true,
                touchMoveThreshold:4,
                snapToChildren: true,
                infiniteSlider: true,
                autoSlide:<?php echo (themeOptions('autoplay')) ? 'true' : 'false'; ?>,
                autoSlideTimer:<?php echo ($speed) ? $speed : '3000'  ?>,
                navSlideSelector: '.sliderNavi .naviItem',                
                navNextSelector: '.iosSlider .next',
                navPrevSelector: '.iosSlider .prev',
                onSlideChange: slideContentChange,
                onSlideComplete: slideContentComplete,
                onSliderLoaded: slideContentLoaded
            }); 

        }); 
    }
</script>
<?php endif; ?>

<script type="text/javascript">
        jQuery(document).ready(function (){
            jQuery('.toolbar').jqTransform({imgPath:'<?php echo $this->getSkinUrl('images/jqforms/'); ?>'});
            jQuery('.limiter').jqTransform({imgPath:'<?php echo $this->getSkinUrl('images/jqforms/'); ?>'});
        });  
</script>
<style>
    body{
        background-color:#<?php echo themeOptions('maincolor') ?>;
        background-attachment: <?php echo themeOptions('bg_attachment') ?>;
        background-position: <?php echo themeOptions('bg_position_y') ?> <?php echo themeOptions('bg_position_x') ?>;
        background-repeat: <?php echo themeOptions('bg_repeat') ?>;
    }   
</style>
<?php if(themeOptions('pattern') && themeOptions('pattern') != ''): ?>
    <style>
        body{ background-image: url(<?php echo Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_MEDIA).'wysiwyg/blanco/'.themeOptions('pattern') ?>); }    
    </style>
<?php endif; ?>
<!--[if IE 7]>
    <link rel="stylesheet" type="text/css" href="<?php echo $this->getSkinUrl('css/ie7.css'); ?>" media="screen"/>
<![endif]-->
<!--[if IE 9]>
    <link rel="stylesheet" type="text/css" href="<?php echo $this->getSkinUrl('css/ie9.css'); ?>" media="screen"/>
<![endif]-->

person Yaroslav    schedule 21.11.2012    source источник
comment
скажите им, что tempalte — не лучшее место для размещения php-функции (слой Block предназначен для этого!). Если бы он был правильно закодирован, у вас не было бы этой проблемы.   -  person Jscti    schedule 21.11.2012
comment
спросите у компании-поставщика тем, они готовы решить вашу проблему.   -  person Kalpesh    schedule 21.11.2012
comment
Они только что ответили: в ваших логах написано, что вы тестируете на локальном сервере, так что мы не смогли его посмотреть. Последняя версия нашего шаблона не должна выдавать ошибок на хостинге. Итак, какие-либо рекомендации, кроме как ждать, пока они дадут мне успешный ответ?   -  person Yaroslav    schedule 21.11.2012


Ответы (3)


Эта статья дала хороший старт для решения проблемы. Я закомментировал строки, предложенные Ярославом, но это не решило проблему для меня. Затем я использовал структуру function_exists, которая, похоже, сработала. Он должен использоваться для двух функций в файле head.phtml.

1) функция themeOptions ($themeOption)

2) функция jsString($str='')

Оберните вышеуказанные функции в function_exits

if(!function_exists(themeOptions)){
function themeOptions ($themeOption) {
    //Piece of Code
    }
    }

if(!function_exists(jsString)){
    function jsString($str='') {
//Piece of Code
}
}

После этого вроде все нормально работает.

person jaipster    schedule 25.11.2012
comment
Нужно попробовать. В моих предыдущих тестах использование function_exists вообще не позволяло загружать страницу сведений. Проверит функцию jsString. - person Yaroslav; 25.11.2012
comment
Это решение, в частности, не работает для меня. Ранее я уже пробовал if(!function_exists(themeOptions)), но на этот раз добавил проверку функции jsString. Те же результаты, что и раньше, страница сведений вообще не загружается. Тем не менее, я оставлю голосование, так как это может быть полезно для других, имеющих аналогичную проблему. - person Yaroslav; 26.11.2012
comment
Проверьте мой ответ, отредактировал и добавил ошибку. Проверено еще раз, в обоих случаях одна и та же ошибка, с использованием только первого !function_exists (как в моих первых тестах) и с использованием обеих проверок (как вы предложили). - person Yaroslav; 27.11.2012

Поскольку этот модуль закодирован неправильно (функция php никогда не должна быть объявлена ​​​​в шаблоне, а в БЛОКЕ!) 2 решения вашей проблемы:

  • посмотрите на свои макеты, чтобы понять, почему этот шаблон включен дважды. Это нормально (вы пытаетесь отобразить этот шаблон в двух разных местах? Если это так: вам нужно перейти к решению № 2, поскольку функция PHP не может быть повторно объявлена)

  • модифицируйте модуль, чтобы он начал работать «способом magento» (MVC): переместите объявление функции в выделенный блок (в папку BLock модуля). При необходимости объявите слой BLock в файле config.xml модуля и свяжите свой шаблон и блок в XML-файле макета модуля.

и скажите создателю шаблона соблюдать стандарт magento;)

person Jscti    schedule 21.11.2012
comment
Хорошо, я попробую это завтра, как только доберусь до офиса... пожалуйста, не используйте слово f * - person Yaroslav; 22.11.2012
comment
По совету одного из наших разработчиков я установил новый экземпляр Magento. Все отлично работает на этой свежей установке Magento. Начну чистку отсюда. Как предложил @Bixi, ответ должен быть связан с дублирующим вызовом этого макета шаблона где-то глубоко в коде. У меня есть несколько разных модулей на предыдущей установке Magento, некоторые сделаны мной, другие из 3-й части. Может быть, кто-то из них испортил эту тему или что-то подобное. Тем не менее я последую вашим рекомендациям Bixi и постараюсь выяснить, что же было не так. - person Yaroslav; 22.11.2012

Наконец ошибка снова появилась при новой установке Magento. После тщательного просмотра файла exception.log и конкретного файла phtml, в котором была обнаружена ошибка, мне удалось заставить его работать, прокомментировав строку и добавив небольшой фрагмент кода.

Это ошибка из файла exception.log:

исключение «Исключение» с сообщением «Уведомление: неопределенная переменная: вкладка в C:\wamp\www\magento\app\design\frontend\default\blanco\template\catalog\product\view\tabs.phtml в строке 8» в C :\wamp\www\magento\app\code\core\Mage\Core\functions.php:245

Вот виновная строка в файле tab.phtml:

<?php if ($tab != $this->getChildHtml('product_custom_tab')): $last = 'last'; endif; ?>

Что я сделал, так это прокомментировал это и добавил новую строку:

<?php //if ($tab != $this->getChildHtml('product_custom_tab')): $last = 'last'; endif; ?>
<?php $last = 'last'; ?>

Сейчас вроде все идет гладко, сейчас проверяю, детали продукта отображаются, все причудливые ролловеры работают, вкладки тоже в порядке.

person Yaroslav    schedule 22.11.2012
comment
Я столкнулся с той же проблемой. Попробовал предложенный вами, но безрезультатно. Необходимо очистить любые конкретные кеши, которые вы можете порекомендовать. Спасибо - person jaipster; 25.11.2012
comment
Хорошо, я понял это. Спасибо. Ваша статья дала мне хороший старт для решения проблемы. Я отправляю свое решение в качестве ответа. Структура function_exists решила проблему для меня. - person jaipster; 25.11.2012