среда, 31 июля 2013 г.

Magento. Заполнение home page.

Написать завтра.

Magento. Добавление статического блока.

Если нужно добавить статический блок  для этого нужно в update/install script или где нибудь еще написать вот это:
Mage::getModel('cms/block')
    ->load('footer_nav_menu')
    ->delete()
;//если такой блок уже существует удаляем его из бд.
$content = <<<HTML
 <ul>
      <li>
        Haha
        <ul>
          <li><a href="#">Notre mission</a></li>
          <li><a href="#">Nos boutiques</a></li>
        </ul>
      </li>
      <li>
         SERVICES
        <ul>
          <li><a href="#">Programme de fidélité</a></li>
          <li><a href="#">Guides conseils</a></li>
        </ul>
      </li>
      <li>
        QUESTIONS
        <ul>
          <li><a href="#">FAQ</a></li>
        </ul>
      </li>
    </ul>
HTML;
Mage::getModel('cms/block')->setData(array(
    'title'      => 'footer_nav_menu',
    'identifier' => 'footer_nav_menu',
    'content'    => $content,
    'is_active'  => 1,
    'stores'     => array(Mage_Core_Model_App::ADMIN_STORE_ID)
))
    ->save();

Переменная $content говорит сама за себя, что нужно с ней делать. Понятное дело, что не необходимости данный скрипт выполнять каждый раз при запуске магенты.
Следующим шагом будет создание блока в layout.
Найдя блок в котором мы собираемся отобразить блок, пишем в layout'e следующий код:
                <block type="cms/block" name="footer_nav_menu">
                    <action method="setBlockId">
                        <block_id>footer_nav_menu</block_id>
                    </action>
                </block>
Далее запомнив родительский блок нашего ноовго блока, переходим в его phtml и выводим его содержимое:
  <nav id="footer-links">
    <?php echo $this->getChildHtml('footer_nav_menu') ?>
  </nav>
Вот и все!

среда, 24 июля 2013 г.

Правило 30 секунд.

Нашел классный комент:

Правило 30 секунд заключается в том, что если посторонний программист за 30 секунд не может разобраться в том, что делает метод, то его нужно переписывать. Если метод длинный, то разбить на несколько более мелких с говорящими именами. Если метод короткий, то значит что-то не так с naming’ом.
Прыгать по методам интересно будет, когда их нужно будет править, или когда интересны будут детали реализации. А для того, чтобы понять, что делает код в общем, достаточно хороших имен и короткого метода.
Кстати, у тебя этот прием использован во втором примере: WritePageNumberOnBitmap ты вынес в отдельную функцию, хотя вызывается она всего в одном месте. Точно так же стоит поступать и с остальными, т.е. получится что-то вроде (за синтаксис не пинать, ибо на Delphi уже больше 10 лет не писал).

Mail. Easy Send and Get Mails from local web-server.

Если нужно посмотреть отправленые emails с локального сервера и очень не хочеться устанавливать всякие sendmail'ы, которые, кстати нужно правильно настроить. Есть очень простой способ. Во всех файлах php.ini (в ubuntu их почему-то несколько)  и добавить следующую строчку:
sendmail_path = "cat >> /directories/to/mail/file/php.mail.log"
Потом создать указанные директории, сделать  для них нужные права доступа. И при отправке email's , например, из php скрипта, все будет ДОзаписываться в файл php.mail.log

Magento EAV in Database. Способ поиска ошибок, спомощью запросов к бд.

       Структура очень проста. Есть название атрибута, у которого есть собственный id. Узнать его можно в таблице eav_attribute. Соответственно смотрим на заголовки полей и ориентируемся. Поле entity_type_id указывает к чему относится атрибут, например к customer'ам = 1 или products = 4 (Тут могу ошибится). При создании атрибута указывается его тип: int, text, varchar, datatime и другие.. его тоже необходимо знать.
     Затем, зная всю ту информацию об искомом атрибуте, которая была описана выше, начинаем сам поиск. Если entity_type_id=1, то имена таблиц которые будут хранить значения атрибутов, будут начинаться с customer_entity (для 4 это catalog_category_entity). Далее зная тип атрибута находишь таблицу название которой содержит соответсвующий тип. А затем зная attribut_id находиш строку и смотриш значение. Так же следует учитывать, что это EAV,  и один на один attribute id будет несколько значений. Там нужно ориентироваться по назвнием полей.

     Все это (это запись и все остальные) я пишу для себя и языком понятным только мне для того, что бы в первую очередь, быстро вспомнить, если что-то забыл. А также для того, чтобы лучше запомнить новую информацию.

    Узнал о новом способе поиска ошибок, неполадок (раньше не приходилось пользоваться и не хотелось сильно углублятся в дебри классов). Каждая модель генерирует MySQL запрос в базу данных.  Например в модели order'ов, есть методы getSelect() и assemble(), которые вернут полный Select запрос. Потом копируя в phpmyadmin пробуешь его с разными значениями. Вычисляешь каких значений не хватает, или наооборот какие значения лишние и делаешь  соответсвующий вывод.
     Как я писал ранее, я уже все забыл про то, как magenta взаимодействует с БД. И поэтому нужно все заново изучить, потому что описанные выше методы не у всех моледей есть (а может я спешил и не там попробовал). В общем все нужно изучить заново.

Magento EAV Attribute for Customer

      Недавно столкнулся с проблемой. Был создан атрибут для customer'a. В него записывалось значение, он сохранялся в бд (видно через phpmyadmin), но при загрузке у него было нулевое значение. Самое интересное, что другие атрибуты, котрые были добавлены до меня, тоже странно работали. Но, все таки работали.
      Самое первое, как я понял нужно делать, это обновлять кэш (в т.ч. удалять папку cache), а также делать обновление index'сов. 
      Решение проблемы, было очень простым. 
      Сначала нужно взять коллекцию пользователей:
protected function _getCustomers()
    {
        $collection = Mage::getResourceModel('customer/customer_collection');
        $collection
            ->addAttributeToSelect('loyalty_reward_buy_start_date')
            ->addAttributeToSelect('loyalty_reward_buy_end_date')
            ->addAttributeToSelect('loyalty_reward_buy_points')
            ->addAttributeToSelect('loyalty_reward_total_points')
            ->addAttributeToSelect('loyalty_reward_buy_level')
            ->addAttributeToSelect('loyalty_reward_all_coupons')
            ->addAttributeToSelect('preferred_store_id')
        ;
        $collection->getSelect()->where('is_active = 1');
        return $collection;
    }
И, как видно из кода, нужно было добавить имя атрибута, в запрос используя метод addAttributeToSelect. Потом, из коллекции, выбираешь нужного customer'a и в нем благополучно будут загружены указаные атрибуты. Которые потом изменяешь и благополучно сохраняешь спомощью save(). 
Из этой проблемы я также выяснил, что плохо изучил взаимодействие magento с БД.