- Создание пустого модуля и Enabler (пособник) файла
- Создание конфигурационного файла и объявление виджетов
- Написание помощника модуля (module helper Data.php) по умолчанию
- Создание исходной модели для услуг мульти выбора в конфигурации виджета
- Создание интерфейсного блока для нашего виджета
- Создание шаблонов
Введение
Magento виджеты - это новая функция, которая вышла в последнее время (начиная с версии 1.4 и выше), чтобы справиться с прохладной модификацией интерфейса со страницы CMS админ-панели, что может быть достигнуто без каких-либо знаний в области программирования для владельца магазина. Это блок интерфейса с некоторыми предопределенными конфигурациями. Способность легко установить опции конфигурации виджета позволяет полностью контролировать размещение виджета на странице для владельцев магазинов.
После завершения этой главы мы будем заниматься созданием нашего собственного виджета, а также обменом этим виджетом с различными ссылками социальных сетей. Ниже приведен скриншот того, чего мы добьемся после изучения этой главы:
Мы добавили пять ссылок, чтобы вы могли знать, как это работает. Вам настоятельно рекомендуется добавить еще несколько ссылок.
Виджет может иметь один или несколько других виджетов в себе. В этой главе мы создадим один виджет, который будет содержать несколько виджетов.
Создание пустого модуля и Enabler файла
Виджет довольно похож на любой модуль, но имеет некоторые различные директивы конфигурации. Она требует файл config.xml и некоторые другие файлы, как делает любой другой модуль. В этом рецепте мы создадим необходимую структуру файла и файлы конфигурации, что запустит новый виджет. Хорошо, давайте начнем с этого, что мы ждем!
Как это сделать…
1. Создайте папку Packt в папке app/code/loca, если такой еще не существует.
2. Создайте папку под названием Socialwidget в папке app/code/local/Packt.
3. Создайте папки Block, etc, Helper и Model в папке app/code/local/Socialwidget, как показывает следующий скриншот:
4. Теперь создайте XML файл по имени Packt_Socialwidget.xml в папке app/etc/modules и поместите в него следующий блок кода:
<?xml version="1.0"?> <!-- /** * @category Packt * @package Packt_Socialwidget * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) */ --> <config> <modules> <Packt_Socialwidget> <active>true</active> <codePool>local</codePool> <depends> <Mage_Cms /> </depends> </Packt_Socialwidget> </modules> </config>
Как это работает...
Это очень похоже на любой другой стандартный процесс создания модуля. Мы добавили необходимую структуру каталога и создали Enabler файл в папке app/etc/modules. Мы использовали локальный codepool, т.к. это наш собственный модуль и установили его, как активный. Существует одна зависимость для этого модуля, которая есть Mage_Cms.
Создание конфигурационного файла и объявление виджетов
config.xml и widget.xml - это файлы, в которых находятся определения виджета. Этот рецепт имеет дело с созданием этих двух файлов.
Как это сделать…
1. Давайте создадим новый XML файл в папке app/code/local/Socialwidget/etc и назовем его как config.xml.
2. Замените существующий контент следующим:
<?xml version="1.0"?> <!-- /** * @category Packt * @package Packt_Socialwidget * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) */ --> <config> <modules> <Packt_Socialwidget> <version>0.0.1</version> </Packt_Socialwidget> </modules> <global> <helpers> <socialwidget> <class>Packt_Socialwidget_Helper</class> </socialwidget> </helpers> <blocks> <socialwidget> <class>Packt_Socialwidget_Block</class> </socialwidget> </blocks> <models> <socialwidget> <class>Packt_Socialwidget_Model</class> </socialwidget> </models> </global> </config>
3. Сохраните его.
4. Мы должны создать другой XML файл, т.к. это виджет. Создайте еще один файл XML в той же папке и назовите его как widget.xml.
5. Замените существующий контент следующим:
<?xml version="1.0"?> <!-- /** * @category Packt * @package Packt_Socialwidget * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) */ --> <widgets> <socialwidget_list type="socialwidget/list" translate="name description" module="socialwidget"> <name>Packt Share this</name> <description>Adds a list of share links</description> <parameters> <enabled_services> <label>Enabled Services</label> <visible>1</visible> <required>1</required> <type>multiselect</type> <source_model>socialwidget/services</source_model> </enabled_services> <template translate="label"> <label>Frontend Template</label> <visible>1</visible> <required>1</required> <type>select</type> <values> <text translate="label"> <value>socialwidget/text.phtml</value> <label>Text Links</label> </text> <icons translate="label"> <value>socialwidget/icons.phtml</value> <label>Icon Links</label> </icons> </values> </template> </parameters> </socialwidget_list> </widgets>
6. Сохраните этот файл.
Как это работает...
В файле config.xml мы заявили необходимые блок, helper и модели. Мы назвали нашу компанию модуля как Packt и имя виджета как Socialwidget, которые можно было бы назвать по своему усмотрению.
widget.xml файл имеет параметрыконфигурации, которые будут видны в админ-панели магазина Magento на странице CMS в виджет форме, пока владелец магазина инициирует виджет вставки (insert Widget) и выбирает этот виджет.
Написание модуля помощника (module helper) Data.php по умолчанию
Это самый простой рецепт в этой главе! Нам необходимо создать пустой класс для нашего модуля.
Как это сделать...
1. Создайте новый файл PHP в папке app/code/local/Packt/Socialwidget/Helper и назовите его как Data.php.
2. Введите следующий контент и сохраните данный файл:
<?php /** * Packt Socialwidget Helper class * * @category Packt * @package Packt_Socialwidget * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) */ class Packt_Socialwidget_Helper_Data extends Mage_Core_Helper_ Abstract { }
Как это работает...
Обычно вспомогательный класс (helper class) задает формат (форматирует) данным до вынесения их на экран. В этом случае мы только что создали пустого помощника (empty helper) с именем Packt_Socialwidget_Helper_Data и продлили его с Mage_Core_Helper_Abstract, чтобы получить доступ к некоторым основным функциям.
Создание исходной модели для мульти выбора услуг в виджет конфигурации
Мы будем писать модель, возвращающую сервисы, которые будут использоваться в нашем социальном виджете, как ссылки или в тексте или в значке (иконке) в соответствии с выбором владельца магазина. Это не что иное, как простой класс PHP.
Как это сделать…
1. Создайте новый PHP файл в папке app/code/local/Packt/Socialwidget/Model и назовите его как Services.php.
2. Замените существующий контент следующим:
<?php /** * Packt Socialwidget Services model * * @category Packt * @package Packt_Socialwidget * @subpackage Model * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) */ class Packt_Socialwidget_Model_Services { /** * Generate available services as array * * you can add a new value to the array if you wish to add yet another link * to this widget. keep in mind that you have to add the details in the * List Block as well. * * @return array */ public function toOptionArray() { return array( array('value' => 'buzz', 'label' => 'Buzz'), array('value' => 'facebook', 'label' => 'Facebook'), array('value' => 'twitter', 'label' => 'Twitter'), array('value' => 'digg', 'label' => 'Digg'), array('value' => 'delicious', 'label' => 'Delicious') ); } }
3. Сохраните и закройте этот файл.
Как это работает...
Существует только одна функция в нашей модели, которая имеет несколько значений в массиве и возвращает их.
Создание блока интерфейса для нашего виджета
Этот рецепт является важной частью этой главы, где мы будем генерировать HTML для ссылок и возвращать его. Файлы шаблонов будут визуализировать (render ) его позже. Это Magento путь!
Как это сделать…
1. Создайте новый файл PHP в папке app/code/local/Packt/Socialwidget/Block и назовите его как list.php.
2. Этот файл получил несколько хороший объем кода. Мы будем обсуждать его по частям, пока полный файл сам по себе вместе с другими предоставляется в комплекте с этой книгой.
3. Самый первый из list.php - это объявление класса и конструктора и защищенной собственности с именем $ _serializer. Внутри конструктора мы присвоили экземпляр Varien_Object () к $ _serializer и вызвали его родительский конструктор.
<?php class Packt_Socialwidget_Block_List extends Mage_Core_Block_ Template implements Mage_Widget_Block_Interface { protected $_serializer = null; protected function _construct() { $this->_serializer = new Varien_Object(); parent::_construct(); }
4. _toHtml () – это функция шаблона Magento, которая делает HTML разметки (HTML markups). В этом методе мы повторили в указанных сервисах и отнесли ее в списки.
protected function _toHtml() { $html = ''; $config = $this->getData('enabled_services'); if (empty($config)) { return $html; } $services = explode(',', $config); $list = array(); foreach ($services as $service) { $item = $this->_generateServiceLink($service); if ($item) { $list[] = $item; } } $this->assign('list', $list); return parent::_toHtml(); }
5. Это функция, где все социальные ссылки (social links) создаются из данного сервиса. В этой функции существует switch case блок, который определяет сервис (service) и порождает соответствующую ссылку. Если вы добавляли дополнительные ссылки, то вы должны добавить case блок и создать правильную ссылку, как сервис предлагает.
protected function _generateServiceLink($service) { $pageTitle = ''; $headBlock = $this->getLayout()->getBlock('head'); if ($headBlock) { $pageTitle = $headBlock->getTitle(); } $currentUrl = $this->getUrl('*/*/*', array('_current' => true, '_use_rewrite' => true)); $attributes = array(); $icon = ''; switch ($service) { case 'buzz': $attributes = array( 'href' => 'http://www.google.com/buzz/post?message=' . $pageTitle .'&url='.rawurlencode($currentUrl), 'title' => ucfirst($service), 'target' => '_blank' ); $icon = 'buzz.png'; break; case 'facebook': $attributes = array( 'href' => 'http://www.facebook.com/sharer.php?u=' . rawurlencode($currentUrl) .'&t='.$pageTitle.'%26s+website', 'title' => ucfirst($service), 'target' => '_blank' ); $icon = 'facebook.png'; break; case 'twitter': $attributes = array( 'href' => 'http://twitter.com/home?status=' . rawurlencode('Check it out ' . $pageTitle . ' at ' . $currentUrl), 'title' => ucfirst($service), 'target' => '_blank' ); $icon = 'twitter.png'; break; case 'digg': $attributes = array( 'href' => 'http://www.digg.com/submit?url=' . rawurlencode($currentUrl) . '&phase=2', 'title' => ucfirst($service), 'target' => '_blank' ); $icon = 'digg.png'; break; case 'delicious': $attributes = array( 'href' => 'http://del.icio.us/post?url=' . rawurlencode($currentUrl), 'title' => ucfirst($service), 'onclick' => 'window.open(\'http://del.icio.us/post?v=4& amp;noui&jump=close&url=' . rawurlencode($currentUrl) . "&title=" . rawurlencode($pageTitle) . "','delicious', 'toolbar=no,width=700,height=400'); return false;", ); $icon = 'delicious.png'; break; default: return array(); break; } $item = array( 'text' => $attributes['title'], 'attributes' => $this->_serializer->setData($attributes)- >serialize(), 'image' => $this->getSkinUrl("images/socialwidget/" . $icon), ); return $item; } }
6. Сохраните и закройте этот файл.
Как это работает...
Здесь мы создали необходимые атрибуты для каждой ссылки в виде массива. Каждый элемент этого массива имеет некоторые общие признаки (атрибуты), которые предоставляются в файлах шаблонов. Мы ссылались на услуги и преобразовали их в виде массива, а затем передали их в качестве параметра в _generateServiceLink () метод.
_generateServiceLink () метод заполняет массив и присваивает его Magento, так что он может быть представлен в шаблонах.
Создание шаблонов
Этот виджет может быть показан в двух форматах: либо в тексте, либо в значке. Этот рецепт позволит вам написать два шаблона: один для текста, а другой для иконок (значков).
Как это сделать...
1. Создайте новую папку в папке app/design/frontend/YOUR_PACKAGE/YOUR_THEME/template и назовите ее socialwidget. В моем случае, это app/design/frontend/default/default/template/socialwidget/.
2. Создайте новый пустой файл и назовите его text.phtml.
Magento использует *. Phtml файл как файлы шаблона.
3. Вставьте следующий код в text.phtml:
<div style="border-top: 1px dotted #777;border-bottom: 1px dotted #777;padding: 5px 10px;margin: 20px 0;"> <?php foreach ($list as $item) : ?> <a style="margin-right: 5px;" <?php echo $item['attributes']; ?>><?php echo $this->escapeHtml($item['text']); ?></a> <?php endforeach; ?> </div>
4. Сохраните и закройте его.
5. Давайте создадим еще один шаблон для отображения ссылок в иконках. Создайте еще один файл как icons.phtml, так же как text.phtml.
6. Вложите следующее содержание:
<div style="border-top: 1px dotted #777;border-bottom: 1px dotted #777;padding: 5px 10px;margin: 20px 0;"> <?php foreach ($list as $item) : ?> <a style="margin-right: 5px;" <?php echo $item['attributes']; ?>><img src="<?php echo $item['image']; ?>" title="<?php echo $this->escapeHtml($item['text']); ?>" border="0" /></a> <?php endforeach; ?> </div>
7. Сохраните и закройте этот файл.
8. Последним шагом для этой главы является создание/сбор некоторых социальных иконок для использования в нашем файле шаблона и вложение их в надлежащее место. Создайте новую папку в папке skin/frontend/YOUR_PACKAGE/YOUR_THEME/images и назовите ее socialwidget. В моем случае это /skin/frontend/default/default/images/socialwidget/.
9. Вставьте значки сюда. Убедитесь, что файловые имена ваших иконок такие же, как мы писали в блоке List.php.
10. Эй! Вы двигаетесь, проверьте это в Magento бэкэнде сейчас. Редактируйте любую страницу (например, домашнюю страницу) и вставьте наш новый виджет. Если вы нажмете на кнопку Insert Widget и выберитеь наш новый виджет, ваш экран должен выглядеть, например, как на следующем скриншоте:
11. Сохраните страницу.
12. Запустите ее в интерфейсе! Вы должны увидеть следующий скриншот, как это показано во введении этой главы:
Как это работает...
Шаблоны довольно просты. Мы просто повторили массив и напечатали его как якорь. Весь виджет добавлен, вы можете скачать его с www.packtpub.com.