среда, 23 ноября 2011 г.

Magento. Добавление кириллического доменного имени.

Как привязать еще один домен к magento магазину. Думаю такая ситуация возникает довольно таки редко, но все же, к примеру, у вас появился новый домен на кириллице купленный за кровные. Очень жалко смотреть как он пылится на парковке у провайдера. Надо бы его пустить в работу. Все что будет сказано в статье касается только лишь настроек самого магазина и никак не касается сопутствующей настройки сервера. Итак приступим.
Для реализации задуманного нам понадобится следующее:
  1. Доступ к файлу /index.php
  2. А также доступ к админ-панели магазина.
Затем делаем следующее:
  1. Заходим в админку, переходим Систма>Конфигруация (System>Configuration), на странице выбираем пункт Управление магазинами (Manage Store). Затем создадим новое представление нашего магазина, клацаем на кнопке Создать представление магазина (Create view store). Заполняем поля как вам угодно, главное запомнить Код (Code), он нам еще понадобится. И, да, не забудьте статус поставить во "включен" (enable). Итак, мы создали новое представления для нашего магазина, оно будет полностью наследовать если можно так сказать все что есть у магазина default (или как он там у вас называется).
  2. Теперь необходимо сконфигурировать кое-что специально для нашего нового представления. Переходим Систма>Конфигруация (System>Configuration). В списке "Текущая область действия конфигурации" (Current scope configuration) Выбираем наш нове новое представление . Выбираем секцию Web (Web). Мы будем работать с двумя блоками Безопасное соединение (Secure connection) и небезопасное соединение (Unsecure conneciton). Снимите галочки Использовать с сайта (Use Website) и поля Базовый URL (Base URL) станут доступны для записи вписываем туда, внимание, ваш новый кириллический адрес в формате punycode, сохраняем.
  3. Конечно же не забываем обновить индексы и кеш после всего проделанного.
  4. Теперь самое время подрихтоватьнаш index.php для этого добавим такие строки после определения переменной $mageRunCode.
    $yourPunycodeHostName = 'xn--h1ahfamim.com.ua';
    if ($_SERVER['HTTP_HOST'] == $yourPunycodeHostName  || $_SERVER['HTTP_HOST'] == $yourPunycodeHostName )
        $mageRunCode = 'photomir_ru';
    Где переменой $mageRunCode вы присваиваете Code вашего нового представления
  5. Теперь все хорошо, можете вбивать свой адрес на кириллице, и скорее всего у вас будет ошибка на главной, которая вам намекнет о том что страница не определена (впрочем как и некоторые блоки).
  6. Значит будем определять все страницы (и блоки) для нового представления, это можно сделать в админке (CMS>Pages или CSM>Blocks), путем выбора на странице редактирования нашего нового представления. Или же запустить скрипт, который автоматически перенесет все страницы в новое представление. Код, написанный мной, приведен ниже:
    require 'app/Mage.php';
    $app = Mage::app('default');
    $dbWrite = Mage::getSingleton('core/resource')->getConnection('core_write');
    $dbWrite->query('update cms_page_store set store_id = 0');
    $dbWrite->query('update cms_block_store set store_id = 0');
    
    Вы его можете добавить в файл который будет создан в корне магазина и запустить после чего рекомендую его удалить. 
Все, теперь обратившись к своему сайту по кириллическому домену (при условии конечно же что еще и сервер вы настроили), то попадете туда куда надо.
P.S.: Все вышесказанное, в принципе, касается не только кириллического домена как можно заметить.

3 комментария:

  1. Здравствуйте, помогите, пожалуйста, решить такую проблему, если в состоянии. Судя по всему, Вы имеете об этом более полное представление, чем я :)

    Хочу перенести сайт на магенте с временного места (files.ferrum.org.ua) на постоянное (купимебель.com.ua).

    Отключил все строки кэша в меню “cache management”.
    Перенес файлы в целевую папку.
    БД - та же, так как все в рамках одного хостинга.

    В БД в core_config_data прописал значения:
    web/unsecure/base_url http://xn--90ahbjjkdw9a5g.com.ua/
    web/secure/base_url http://xn--90ahbjjkdw9a5g.com.ua/

    При запуске купимебель.com.ua получаем следующее:
    There has been an error processing your request
    Exception printing is disabled by default for security reasons.
    Error log record number: 1333499677382

    Содержимое лога:
    a:5:{i:0;s:20:"Invalid URI supplied";i:1;s:2217:"#0 /home/evroza00/xn--90ahbjjkdw9a5g.com.ua/www/lib/Zend/Uri.php(143): Zend_Uri_Http->__construct(’http’, ‘//xn--90ahbjjkd...’)
    #1 /home/evroza00/xn--90ahbjjkdw9a5g.com.ua/www/app/code/core/Mage/Core/Model/Store.php(726): Zend_Uri::factory(’http://xn--90ah...’)
    #2 /home/evroza00/xn--90ahbjjkdw9a5g.com.ua/www/app/code/core/Mage/Log/Model/Visitor.php(93): Mage_Core_Model_Store->isCurrentlySecure()
    #3 /home/evroza00/xn--90ahbjjkdw9a5g.com.ua/www/app/code/core/Mage/Log/Model/Visitor.php(162): Mage_Log_Model_Visitor->initServerData()
    #4 /home/evroza00/xn--90ahbjjkdw9a5g.com.ua/www/app/code/core/Mage/Core/Model/App.php(1338): Mage_Log_Model_Visitor->initByRequest(Object(Varien_Event_Observer))
    #5 /home/evroza00/xn--90ahbjjkdw9a5g.com.ua/www/app/code/core/Mage/Core/Model/App.php(1317): Mage_Core_Model_App->_callObserverMethod(Object(Mage_Log_Model_Visitor), ‘initByRequest’, Object(Varien_Event_Observer))
    #6 /home/evroza00/xn--90ahbjjkdw9a5g.com.ua/www/app/Mage.php(447): Mage_Core_Model_App->dispatchEvent(’controller_acti...’, Array)
    #7 /home/evroza00/xn--90ahbjjkdw9a5g.com.ua/www/app/code/core/Mage/Core/Controller/Varien/Action.php(528): Mage::dispatchEvent(’controller_acti...’, Array)
    #8 /home/evroza00/xn--90ahbjjkdw9a5g.com.ua/www/app/code/core/Mage/Core/Controller/Front/Action.php(64): Mage_Core_Controller_Varien_Action->preDispatch()
    #9 /home/evroza00/xn--90ahbjjkdw9a5g.com.ua/www/app/code/core/Mage/Core/Controller/Varien/Action.php(408): Mage_Core_Controller_Front_Action->preDispatch()
    #10 /home/evroza00/xn--90ahbjjkdw9a5g.com.ua/www/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(250): Mage_Core_Controller_Varien_Action->dispatch(’index’)
    #11 /home/evroza00/xn--90ahbjjkdw9a5g.com.ua/www/app/code/core/Mage/Core/Controller/Varien/Front.php(176): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
    #12 /home/evroza00/xn--90ahbjjkdw9a5g.com.ua/www/app/code/core/Mage/Core/Model/App.php(354): Mage_Core_Controller_Varien_Front->dispatch()
    #13 /home/evroza00/xn--90ahbjjkdw9a5g.com.ua/www/app/Mage.php(683): Mage_Core_Model_App->run(Array)
    #14 /home/evroza00/xn--90ahbjjkdw9a5g.com.ua/www/index.php(87): Mage::run(’’, ‘store’)
    #15 {main}”;s:3:"url”;s:1:"/”;s:11:"script_name”;s:10:"/index.php”;s:4:"skin”;s:12:"ma_furniture";}

    Буду очень признателен за любую информацию по теме.
    Могу что-нибудь предложить взамен - домен какой-нибудь подарить, или ссылочку на Ваш блог поставить.

    ОтветитьУдалить
    Ответы
    1. Ой, забыл. Писать можно сюда: makroprophus@gmail.com

      Удалить
    2. Да, проблема есть. И проблема не с Magento в целом, проблема, в частности с Zend Framework'ом на базе которого построен магазин.
      В общем это известный и до сих пор открытый баг (http://framework.zend.com/issues/browse/ZF-12035) самого ZF.
      Для его решения можно прибегнуть к "грязному методу", это найти файл lib/Zend/Validate/Hostname.php. Он содержит проблемный метод decodePunycode. Его содержимое надо заменить на вот это:

      protected function decodePunycode($encoded)
      {
      $errorcode = 0;
      $utf8 = idn_to_utf8('xn--' . $encoded, $errorcode);
      if($utf8 === false) {
      $this->_error(self::CANNOT_DECODE_PUNYCODE);
      return false;
      }
      return $utf8;
      }

      Но перед этим стоит поставить PHP библиотеку для работы с IDN (http://pecl.php.net/package/idn)

      Удалить