2013-12-23

Magento: получение всех атрибутов продуктов

public function getAttributes()
{
 $result = [];

 $attributes = Mage::getResourceModel('catalog/product_attribute_collection')
  ->getItems();

 foreach ($attributes as $attribute){

  $result[] = [
   'label' => $attribute->getAttributecode(),
   'value' => $attribute->getFrontendLabel()
  ];
 }

 return $result;
}

Или:
public function getAttributes()
{
 $attributes = Mage::getModel('catalog/product')->getAttributes();
 $attributeArray = [];

 foreach($attributes as $a){

  foreach ($a->getEntityType()->getAttributeCodes() as $attributeName) {

   $attributeArray[] = [
    'label' => $attributeName,
    'value' => $attributeName
   ];
  }
  break;
 }
 return $attributeArray;
}

2013-12-09

Получение CMS страницы

Получение CMS страницы:
$block = Mage::getModel('cms/page')->setStoreId(Mage::app()->getStore()->getId())->load($id);
$html = $block->getContent();

2013-11-27

Изменение группы атрибутов для товара

Группа атрибутов указывается через id, его можно посмотреть в таблице eav_attribute_set.
foreach ($products as $_product) {
 if ((int)$_product->getData("attribute_set_id") !== 64) {
  $_product->setData("attribute_set_id", 64);
  $_product->save();
 }
}

Magento: get tier price

Для получения tier price:
$product->getTierPrice();

Возвращает массив:
Array
(
    [1-1] => Array
        (
            [price_id] => 6
            [website_id] => 7
            [all_groups] => 0
            [cust_group] => 1
            [price] => 30.0000
            [price_qty] => 1.0000
            [website_price] => 30.0000
        )

)

2013-11-26

Response status codes

Server response status codes:
• 1xx: Informational - Request received, continuing process
• 2xx: Success - The action was successfully received, understood, and accepted
• 3xx: Redirection - Further action must be taken in order to complete the request
• 4xx: Client Error - The request contains bad syntax or cannot be fulfilled
• 5xx: Server Error - The server failed to fulfill an apparently valid request

2013-11-14

Передача параметров в дочерний template

Передать параметр в template можно так:
$this->getChild('quickgalleryview')->setData("productId", $_product->getId());
echo $this->getChildHtml('quickgalleryview');

Или если template вызывается несколько раз:
echo $this->getChildHtml("quickgalleryview", false)

Использовать переданный параметр так:
$this->getData("productId")

2013-11-13

Включение WYSIWYG редактора

Для добавления WYSIWYG редактора добавляем кнопку
<button
  onclick="catalogWysiwygEditor.open('/admin/catalog_category/wysiwyg/key/<?php echo $this->getFormKey(); ?>', 'id_<?php echo $this->getHtmlId() ?>')"
  class="scalable btn-wysiwyg"
  type="button"
  title="WYSIWYG Editor">
  <span><span><span><?= Mage::helper('core')->__('WYSIWYG Editor') ?></span></span></span></button>

При нажатии на нее будет открываться редактор и редактировать текстовое поле с переданным id

2013-11-08

Очистка кэша magento

Очистка кэша magento находится в контроллере /app/code/core/Mage/Adminhtml/controllers/System/CacheController.php.

Для очистки кэша js/css
Mage::getDesign()->cleanMergedJsCss()
Очистка кэша изображений
Mage::getModel('catalog/product_image')->clearCache();

2013-11-07

Создание контроллера для админки

Название модуля - "SliRx_Example".
Сначала отредактируем "app/​code/​local/SliRx/​Example/​etc/​config.xml"
    <modules>
        <SliRx_Example>
            <version>1.0.0</version>
        </SliRx_Example>
    </modules>

    <admin>
        <routers>
            <adminhtml>
                <args>
                    <modules>
                        <slirx_example before="Mage_Adminhtml">
                            SliRx_Example_Adminhtml
                        </slirx_example>
                    </modules>
                </args>
            </adminhtml>
        </routers>
    </admin>
</config>

Затем создаем файл контроллера: "app/​code/​local/SliRx/Example/​controllers/​Adminhtml/​ExampleController.php":

Ошибка "Magento Read timed out after 10 seconds"

Ошибка возникает из-за долгого ожидания сервера.
Можно изменить в /lib/Zend/Http/Client.php "timeout" => 10

2013-11-06

Удаление продуктов через magmi

Для удаления продуктов необходимо включить плагин "Product Deleter" и использовать файл со столбцами "sku" и "magmi:delete". Во второй столбец надо указать "1" для удаления продукта.
Продукты удаляются со всех магазинов, т.е. таким способом нельзя удалить продукты только с определенного store view'a.

2013-10-31

Добавление правила перезаписи ссылки (rewrite url)

Для создания перезаписи ссылки используем такой код:

$rewrite = Mage::getModel('core/url_rewrite');
$rewrite->setStoreId($storeId)
    ->setIdPath('path_1')
    ->setRequestPath('mego-page.html')
    ->setTargetPath('cityinfo/index/index/city/Киев')
    ->setIsSystem(false)
    ->save();

где path_1 - уникальный идентификатор записи,
mego-page.html - новый адрес для ссылки,
cityinfo/index/index/city/Киев - оригинальный адрес, сюда на самом деле будет идти запрос.

Смена пароля администратора

Для смены пароля администратора можно выполнить sql запрос:
UPDATE admin_user SET password=CONCAT(MD5('qXpassword'), ':qX') WHERE username='admin';

где "qXpassword" - пароль с солью, qX - соль.

2013-10-25

Печать всех событий Magento

Для печати всех событий мадженто:
  $eventAreas = array('global', 'frontend', 'adminhtml');
  foreach ($eventAreas as $eventArea) {
   $eventConfig = Mage::app()->getConfig()
    ->getNode(sprintf('%s/events', $eventArea));
   foreach ($eventConfig->children() as $key => $value) {
    foreach ($value->observers->children() as $key1 => $value1) {
     $observer_method = array((string)$eventArea,
      (string)$key,
      (string)$key1,
      (string)Mage::app()->getConfig()
       ->getModelClassName($value1->class),
      (string)$value1->method);
     echo $observer_method[1]."</br>";
    }
   }
  }

Creating Observer

Для обработки события добавляем в config.xml:
 <config>
...
 <adminhtml>
  <events>
   <adminhtml_catalog_category_tabs>
     <observers>
    <SliRx_CategoryAttachment_Model_Tab_Observer>
     <type>singleton</type>
     <class>SliRx_CategoryAttachment_Model_Tab_Observer</class>
     <method>addTab</method>
    </SliRx_CategoryAttachment_Model_Tab_Observer>
    </observers>
   </adminhtml_catalog_category_tabs>
  </events>
 </adminhtml>
...
 </config> 

Создаем соответствующий класс, с методом определенным в config.xml
public function addTab($observer) {
}

2013-10-23

События Magento

File Line Event
cron.php 46 default
app/code/core/Mage/Adminhtml/Controller/Action.php 159 adminhtml_controller_action_predispatch_start
app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/Carts.php 61 adminhtml_block_html_before
app/code/core/Mage/Adminhtml/Block/Report/Grid.php 186 adminhtml_widget_grid_filter_collection
app/code/core/Mage/Adminhtml/Block/Cms/Page/Edit/Tab/Meta.php 76 adminhtml_cms_page_edit_tab_meta_prepare_form
app/code/core/Mage/Adminhtml/Block/Cms/Page/Edit/Tab/Design.php 125 adminhtml_cms_page_edit_tab_design_prepare_form
app/code/core/Mage/Adminhtml/Block/Cms/Page/Edit/Tab/Main.php 119 adminhtml_cms_page_edit_tab_main_prepare_form
app/code/core/Mage/Adminhtml/Block/Cms/Page/Edit/Tab/Content.php 98 adminhtml_cms_page_edit_tab_content_prepare_form
app/code/core/Mage/Adminhtml/Block/Api/User.php

Добавление нового значения атрибута

Для добавление нового значения атрибута используем:
$arg_attribute = 'youtube_video'; // name of attribute
$arg_value = 'value to be added'; // option value

$attr_model = Mage::getModel('catalog/resource_eav_attribute');
$attr = $attr_model->loadByCode('catalog_product', $arg_attribute);
$attr_id = $attr->getAttributeId();

$option['attribute_id'] = $attr_id;
$option['value']['youtube_video'][0] = $arg_value;

$setup = new Mage_Eav_Model_Entity_Setup('core_setup');
$setup->addAttributeOption($option);

2013-10-18

Условия фильтрации И и ИЛИ для коллекций magento

Добавить фильтр по атрибуту можно мотодом addFieldToFilter. Для фильтрации атрибутов с условием И надо использовать такой код:
->addFieldToFilter(array(
    array('attribute'=>'action','eq'=> 1),
))
->addFieldToFilter(array(
    array('attribute'=>'status','eq'=> 1),
))
а для условия ИЛИ такой:
->addFieldToFilter(
    array(
        array('attribute'=>'my_field1','eq'=>'my_value1'),
        array('attribute'=>'my_field2', 'eq'=>'my_value2')
    )
);

Email to friend in magento

Вставка ссылки на отправку продукта на почту френда
 <?php if ($this->canEmailToFriend()): ?>
   <p class="email-friend"><a href="<?php echo $this->helper('catalog/product')->getEmailToFriendUrl($_product) ?>"><?php echo $this->__('Email to a Friend') ?></a></p>
  <?php endif; ?>

2013-10-17

HTML5 placeholder fallback


if ( !("placeholder" in document.createElement("input")) ) {
        jQuery("input[placeholder], textarea[placeholder]").each(function() {
            var val = jQuery(this).attr("placeholder");
            if ( this.value == "" ) {
                this.value = val;
            }
            jQuery(this).focus(function() {
                if ( this.value == val ) {
                    this.value = "";
                }
            }).blur(function() {
                    if ( jQuery.trim(this.value) == "" ) {
                        this.value = val;
                    }
                })
        });

Laravel: удаление public с пути

Если на сервере нет возможности установить DocumentRoot на папку public, то можно в .htaccess прописать:

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

2013-07-29

Импорт сопутствующих/похожих товаров в Magento

Импортировать будем используя magmi.

В файле импорта создаем необходимые колонки:
sku - идентификатор товара, к которому буде грузить супутствующие товары.

Для сопутствующих товаров:
re_skus - список идентификаторов сопутствующих товаров. разделяются через запятую. будут загружены как сопутствующие для sku.
xre_skus - список идентификаторов сопутствующих товаров. разделяются через запяту. будут загружены как сопутствующие для sku и sku станет сопутствующим для них.

Для похожих товаров:
us_skus - список идентификаторов похожих товаров. разделяются через запятую. будут загружены как похожие для sku.

2013-07-09

Codeigniter pagination


$this->load->library('pagination');
$config['base_url'] = 'http://www.your-site.com/index.php/test/page/';
$config['total_rows'] = '200';
$config['per_page'] = '20'; 
$this->pagination->initialize($config); 
echo $this->pagination->create_links();

http://code-igniter.ru/user_guide/libraries/pagination.html

В codeigniter в пагинации существует такой параметр

$config['uri_segment'] = 3;
он отвечает за сегмент пути адреса в котором содержится номер страницы.
с его помощью вычисляется теущий номер страницы.
Например если адрес выглядит как /ttn/intime_ttn_requests/20130702/20130709/10, где 10 это номер страницы то uri_segment должен быть 5

2013-04-04

Magento: remove index.php from urls

You can remove the index.php in the frontend URLs performing the following steps:

Go to the admin section of Magento.
In System -> Configuration -> Web -> Search Engines Optimizations, select YES.
In System -> Configuration -> Web -> Secure -> Use secure URLs in the frontend, select YES.
Edit the .htaccess and uncomment the line:

RewriteBase /magento/

2013-02-15

memcached

Memcache это название php-расширения для работы с сервисом кеширования memcached. Но существует еще одно (а может и не одно) php-расширение для работы сервисом кеширования memcached с названием memcached

Итого имеется:
  • один сервис кеширования memcached
  • два php-расширения для работы с указанным выше сервисом кеширования:

2013-01-22

Linux commands (snippets)

Устанавка apache, php, mysql:
sudo apt-get install apache2 php5 mysql-server php5-mysql php5-curl

Обрезка полей в pdf:
ставим пакет texlive-extra-utils
pdfcrop --margins "1 1 1 1" myfile.pdf

chmod

Синтаксис: chmod rwx

r (4) - право на чтение;
w (2) - право на запись;
x (1) - право на исполнение;

Рекурсивное применение правил для всех файлов в директории "/home/test", а также для всех файлов во всех поддиректориях:  
# find /home/test -type f -exec chmod 644 {} \;

Рекурсивное применение правил для всех директорий в директории "/home/test", а также для всех директорий во всех поддиректориях: 
# find /home/test -type d -exec chmod 755 {} \;

2013-01-21

CSS snippets

Подбирает ширину, сохраняя пропорции изображения:
img
{
   max-height: 64px;
   width: auto;
}

Текст поверх изображения:

apache

Перенаправляет все *.jpg запросы на /img/no_pic121.png, если такого файла не найдено:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)\.jpg$ /img/no_pic121.png [L]

2013-01-09

js snippets

Разделение разрядов числа пробелами:


var str = "3830000";
alert(str.replace(/(\d)(?=(\d\d\d)+([^\d]|$))/g, '$1 '));