воскресенье, 22 апреля 2012 г.

Новая работа !

Как говорится, первым делом самолеты... ну видео  и games потом.
...предложили мне разобраться с Magrnto за деньги...

Да, могу однозначно сказать модель базы данных основа основ, в MAGENTO реализована
так.




 

МОДЕЛИ В MAGENTO


Magento, как большинство фреймворков в наши дни, предлагают систему Объектно-реляционных Сопоставлений (ORM).
ORMs выводит вас из написание SQL логики и позволяет манипулировать хранилищем данных исключительно через PHP код. Например:
  1.    $model = Mage::getModel('catalog/product')->load(27);
  2.    $price = $model->getPrice();
  3.    $price += 5;
  4.    $model->setPrice($price)->setSku('SK83293432');
  5.    $model->save();
В примере выше мы вызываем методы “getPrice” и “setPrice”. Однако класс Mage_Catalog_Model_Product не имеет методов с такими именами.
Все это потому что That’s because ORM в Magento использует волшебные методы _get and _set из PHP.
Вызывая метод $product→getPrice(); получаем атрибут Модели “price”. Вызывая $product→setPrice(); устанавливаем атрибут Модели “price”. Все это допускуает что класс Модели не имеет методы называемыми getPrice или setPrice. Если это так, то волшебные методы будут пропущены. Если Вам интересно как это реализовано изучите класс Varien_Object, от которого наследуются все Модели.
Если Вы хотите получить все доступные данные из Модели, вызовите $product→getData(); будет получен массив со всеми атрибутами.
Так же Вы заметили, что возможно сделать цепочку из вызовов нескольких методов set:$model→setPrice($price)→setSku(’SK83293432’);
Это все потому что каждый метод set возвращает и ссылается на Модель. Использования этого принципа будет много раз встречаться Вам в коде Magento.
ORM в Magento так же содержит возможность запроса к нескольким Объектам через интерфейс Коллекций. Следующий код выдаст нам коллекцию продуктов с ценой в $5.00
  1.    $products_collection = Mage::getModel('catalog/product')
  2.    ->getCollection()
  3.    ->addAttributeToSelect('*')
  4.    ->addFieldToFilter('price','5.00');
Снова Вы видите здесь использование цепочного интерфейса Magento. Коллекции используют Стандартную Библиотеку PHP для реализации Объектов, в которых имеется в качестве свойств массив.
  1.   foreach($products_collection as $product)
  2.   {
  3.      echo $product->getName();
  4.   }
Вы можите задаться вопросом для чего “addAttributeToSelect” метод. В Magento имеется две основных объектных модели. Одна традиционная “Один Объект – Одна Таблица” Активная Модель стиля Записи. Когда вы создаете такие Модели все атрибуты автоматически помечаются.
Второй тип Модели это Объект Атрибут Значение (EAV) Модель. EAV Модели распределяют данные в нескольких раздельных таблицах в базе данных.
Это дает Magento гибкость в предложении системы атрибутов товара без необходимости изменять ее каждый раз когда Вы добавляете атрибут.
Когда создается коллекция EAV объектов, Magento консервативен в числе столбцов которые будут запрошены, поэтому Вы можете addAttributeToSelect чтобы получить столбцы нужные Вам или addAttributeToSelect(’*’) чтобы получить все столбцы.


ПОМОЩНИКИ


Классы пощников в Magento содержат полезные методы которые помогают Вам выполнять общие задачи для объектов и переменных. Например:
  1. $helper = Mage::helper('catalog');
Вы заметили что мы отбросили вторую часть Группового Имени Класса. Каждый модуль имеет класс Data Helper по умолчанию. Следующая запись равнозначна предыдущей:
  1. $helper = Mage::helper('catalog/data');
Большинство Помощников наследуются от Mage_Core_Helper_Abstract, который дает вам несколько полезных методов по умолчанию.
  1.   $translated_output$helper->__('Magento is Great'); //gettext style translations
  2.   if($helper->isModuleOutputEnabled()): //is output for this module on or off?

 

МАКЕТЫ


И так, мы рассмотрели Контроллеры, Модели, и помощники. В типичной PHP MVC системе, после того как мы воздействовали на нашу модель мы бы
  1. Задали бы несколько переменных для нашей витрины
  2. Система бы загрузила по умолчанию “внешний” HTML макет
  3. Затем система загрузила бы нашу витрину внутрь этого внешнего макета
Однако, если Вы посмотрите на типичное действие в Контроллере Magento, Вы ничего такого не увидите:
  1.   /**
  2.   * View product gallery action
  3.   */
  4.   public function galleryAction()
  5.   {
  6.     if (!$this->_initProduct()) {
  7.         if (isset($_GET['store']) && !$this->getResponse()->isRedirect()) {
  8.             $this->_redirect('');
  9.         } elseif (!$this->getResponse()->isRedirect()) {
  10.             $this->_forward('noRoute');
  11.         }
  12.         return;
  13.     }
  14.     $this->loadLayout();
  15.     $this->renderLayout();
  16.   }
Вместо этого действие Контроллера заканчивается двумя вызовами
  1.   $this->loadLayout();
  2.   $this->renderLayout();
Итак “V” в MVC от Magento отличается возможно от того что вы использовали, в том что Вы должны явно начать рендеринг макета. Макет сам по себе отличается.
В Magento Макет это объект который содержит вложенную/древовидную коллекцию “Block” объектов. Каждый объект Блока будет представлять маленький специфичный HTML.
Объекты Блоков создаются из комбинации PHP кода, и внедрения PHP шаблонов из .phtml файлов.
Объекты Блоков предназначены для взаимодействия с Magento чтобы получить данные от Моделей, пока шаблонные файлы phtml будут производить HTML необходимый для страницы.
Например, Блок заголовка страницы расположенный app/code/core/Mage/Page/Block/Html/Head.php использует файл head.phtml расположенный page/html/head.phtml. По другому можно представить классы Блока как маленькие мини-контроллеры, а .phtml файлы это витрина. Неявно, когда Вы вызываете
  1.   $this->loadLayout();
  2.   $this->renderLayout();
Magento загружает Макет в скелет структуры сайта. В ней будут Структурные Блоки чтобы предоставить Вам ваш html, заголовок и тело, а также HTML для установки одного или нескольких столбцов макета.
Вдобавок там будет несколько Блоков Контента для навигации, сообщения приветствия по умолчанию и т.д.
“Структура” и “Контент” это произвольные обозначения в Макете. Программно Блок не знает Структура это или Контент, но их полезно разделять на те или другие.
Чтобы добавить Контент в Макет Вам необходимо сообщить Magento что-то типа этого
"Эй, Magento, добавь эти дополнительные Блоки в Блок "content" скелета"
или
"Эй, Magento, добавь эти дополнительные Блоки в Блок "left column" скелета"
Это может быть сделано программно в Контроллере действия
  1.   public function indexAction()
  2.   {
  3.       $block = $this->getLayout()->createBlock('adminhtml/system_account_edit')
  4.       $this->getLayout()->getBlock('content')->append($block);
  5.   }
но чаще всего (по крайней мере во frontend приложении), используют систему XML Макета.
В XML файлах Макета в темах возможно исключить Блоки обычно формирующиеся или добавить Блоки в определенные области скелета.
Например, рассмотрим этот XML файл Макета:
  1.   <catalog_category_default>
  2.     <reference name="left">
  3.         <block type="catalog/navigation" name="catalog.leftnav" after="currency" template="catalog/navigation/left.phtml"/>
  4.     </reference>
  5.   </catalog_category_default>
Это говорит Модулю catalog, Контроллеру category, и Действию по умолчанию, вставить Блок ‘catalog/navigation’ в структурный Блок “left”, используя шаблон catalog/navigation/left.phtml.
Еще одна важная вещь о Блоках. Часто вы можете видеть код в шаблонах похожий на:
  1. $this->getChildHtml('order_items')
Это так Блок выводит вложенный Блок. Однако, Блок может выводить только Блок потомок, если Блок потомок включен как вложенный Блок в XML файле Макета.
В примере выше наш Блок ‘catalog/navigation’ не имеет вложенных Блоков. Это значит что любой вызов $this→getChildHtml() в left.phtml будет выведен как пустота.
Если мы будем иметь что-то типа этого:
  1.   <catalog_category_default>
  2.     <reference name="left">
  3.         <block type="catalog/navigation" name="catalog.leftnav" after="currency" template="catalog/navigation/left.phtml">
  4.             <block type="core/template" name="foobar" template="foo/baz/bar.phtml"
  5.         </block>
  6.     </reference>   
  7.   </catalog_category_default>
Из Блока ‘catalog/navigation’, мы сможем вызвать $this→getChildHtml(’foobar’);

ОБОЗРЕВАТЕЛИ


Как любая хорошая объектно-ориентированная система, Magento реализует модель Событие/Обозреватель для конечных пользователей.
Как только некоторое действие происходит во время запроса Страницы (сохранение Модели, пользователь авторизуется и т.д.), Magento производит сигнал о событии.
При создании Ваших собственных Модулей, Вы можете “слушать” эти события. Скажем Вы хотите получать email каждый раз когда конкретный пользователь авторизуется в магазине.
Вам следует слушать “customer_login” событие (установленное в config.xml)
  1.   <events>
  2.     <customer_login>
  3.         <observers>
  4.             <unique_name>
  5.                 <type>singleton</type>
  6.                 <class>mymodule/observer</class>
  7.                 <method>iSpyWithMyLittleEye</method>
  8.             </unique_name>
  9.         </observers>
  10.     </customer_login>
  11.   </events>
и затем написать некоторый код, который будет выполняться как только пользователь авторизуется:
  1.   class Packagename_Mymodule_Model_Observer
  2.   {
  3.       public function iSpyWithMyLittleEye($observer)
  4.       {
  5.           $data = $observer->getData();
  6.           //code to check observer data for out user,
  7.           //and take some action goes here
  8.       }
  9.   }

 

ПЕРЕОПРЕДЕЛЕНИЕ КЛАССОВ


Наконец, Magento предлагает Вам возможность заменять классы Моделей, Помощников и Блоков из базовых модулей своими собственными.
Эта особенность похожа на “Duck Typing” или “Monkey Patching” в таких языках как Ruby или Python.
Этот пример будет полезен для понимания. Класс Модели для продукта это Mage_Catalog_Model_Product.
Всякий раз когда следующий код вызывается объект Mage_Catalog_Model_Product создается
  1. $product = Mage::getModel('catalog/product');
Это “заводской” образец. То, что делает система переопределения класса в Magento, позволяют Вам говорить систему
"Эй, всякий раз когда кто-нибудь запрашивает ''catalog/product'', вместо того
чтобы вернуть Mage_Catalog_Model_Product, возвращать
Packagename_Modulename_Model_Foobazproduct"
Кроме того, если Вы хотите, Ваш Packagename_Modulename_Model_Foobazproduct класс может расширить исходный класс продукта
  1.   class Packagename_Modulename_Model_Foobazproduct extends Mage_Catalog_Model_Product
  2.   {
  3.   }
Который позволит Вам изменять поведение любого метода класса, но сохранить функциональность существующих методов.
  1.   class Packagename_Modulename_Model_Foobazproduct extends Mage_Catalog_Model_Product
  2.   {
  3.       public function validate()
  4.       {
  5.           //add custom validation functionality here
  6.           return $this;
  7.       }
  8.   }
Как Вы и могли ожидать это переопределение делается в файле config.xml.
  1.   <models>
  2.     <!-- tells the system this module has models -->
  3.     <modulename>
  4.         <class>Packagename_Modulename_Model</class>
  5.     </modulename>
  6.     <!-- does the override for catalog/product-->
  7.     <catalog> 
  8.         <rewrite>
  9.             <product>Packagename_Modulename_Model_Foobazproduct</product>
  10.         </rewrite>
  11.     </catalog>         
  12.   </models>
Одна вещь, которую важно отметить. Конкретные классы в Вашем Модуле переопределяют конкретные классы в других Модулях.
Тем не менее вы не переопределяете весь Модуль. Это позволяет Вам изменять поведение специфических методов, не переживая что о том что делает остальная часть Модуля.

ЗАКЛЮЧЕНИЕ


Мы надеемся что этот беглый обзор по некоторым возможностям которые система электронной коммерции Magento предлагает разработчикам был полезным.
Может быть это немного ошеломительно для начала, особенно, если это Ваш первый опыт использования современной объектно-ориентированной PHP системы.
Если это Вас расстроило, глубоко вдохните, напомните себе что это новое для вас, а все новое всегда трудно, но к концу дня Вы поймете что это всего лишь другой способ программирования.
Однажды на очередной стадии изучения, Вы поймаете себя на том, что не желаете возвращаться к другой, менее мощной системе.

Первые наброски тут

Комментариев нет:

Отправить комментарий

Примечание. Отправлять комментарии могут только участники этого блога.