Как сделать новый элемент управления?

[10 ноября 2016 г.]    Российская сборка Magento 2.49.12
Magento 2: модули и услуги
#1 Евгений Смирнов
  • Группа: Заблокирован
  • Сообщений: 81
  • Регистрация: 03.03.2011

03.03.2011 00:31

Здравствуйте,

Хочу создать свои custom опции или аттрибуты.
Такие как колорпикер, селект со шрифтами, и так далее и к каждому будет привязываться отдельный яваскрипт.

Пока откопал только это:
http://www.magentocommerce.com/boards/viewthread/57119/
,но выходит как-то вяло, так что ищу больше инфы.

Благодарен за всю возможную инфу.

#2 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8884
  • Регистрация: 20.02.2010

03.03.2011 00:48

Посмотрите папку lib/Varien/Data/Form/Element
Там расположены стандартные элементы управления Magento.
Часть из них использует JavaScript: например, класс Varien_Data_Form_Element_Date.

#3 Евгений Смирнов
  • Группа: Заблокирован
  • Сообщений: 81
  • Регистрация: 03.03.2011

03.03.2011 00:57

Посмотрел.
Там лежат элементы формы. Но даже создав элемент со своим именем и аналогичный класс. Все равно не работает.
Мне бы логику где и что менять :)

#4 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8884
  • Регистрация: 20.02.2010

03.03.2011 00:59

Программный код стандартной сборки Magento полностью открыт.
Если вам затруднительно в нём разобраться и сделать по аналогии — возможно, разумней заказать эту работу специалисту.

#5 Евгений Смирнов
  • Группа: Заблокирован
  • Сообщений: 81
  • Регистрация: 03.03.2011

03.03.2011 01:02

Что-то более конкретное вы можете посоветовать. Какую-то наводку или что-то такое.

#6 Евгений Смирнов
  • Группа: Заблокирован
  • Сообщений: 81
  • Регистрация: 03.03.2011

03.03.2011 01:07

Может логику какую проверить.
Мне всего лишь наводка нужна.

#7 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8884
  • Регистрация: 20.02.2010

03.03.2011 01:08

Что обладает большей степенью конкретности, чем готовый рабочий программный код стандартной сборки?

#8 Евгений Смирнов
  • Группа: Заблокирован
  • Сообщений: 81
  • Регистрация: 03.03.2011

03.03.2011 01:15

Что обладает большей степенью конкретности, чем готовый рабочий программный код стандартной сборки?

Ну допустим небольшая наводка какие файлы стоит посмотреть или модули.

#9 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8884
  • Регистрация: 20.02.2010

03.03.2011 01:19

Я же написал: посмотрите устройство, например, класса Varien_Data_Form_Element_Date.
Это элемент управления для редактирования даты.
Он использует JavaScript.
На этом примере можно понять все основные черты создания подобных элементов:
  • как получить текущее значение даты с сервера
  • как отобразить интерактивный элемент управления
  • как отправить новое выбранное значение даты на сервер


#10 Евгений Смирнов
  • Группа: Заблокирован
  • Сообщений: 81
  • Регистрация: 03.03.2011

03.03.2011 01:32

Вообще моя идея заключалась в следующем.

Товар имеет Custom options. Так для 1 товара мне нужно будет к примеру 2 кастом опции с выбором цвета(я подозревал два текст инпута с колор пикером) а также потребуются поля для текста. Но дело в том что я могу создать только текст инпут. Что не очень удобно, поэтому я и подумал создать кастом опшн на основе старых кастом опшнов. Вроде попробовал по примеру в ссылке номер 1. Могу к товару эту опцию добавить, но она не отображается в превью товара как текст инпут, и не дает загрузить кастом опшн меня в товаре.

СОздавать элементы в план не входило.

Как лучше выйти из положения?

#11 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8884
  • Регистрация: 20.02.2010

03.03.2011 01:50

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

#12 Евгений Смирнов
  • Группа: Заблокирован
  • Сообщений: 81
  • Регистрация: 03.03.2011

03.03.2011 11:00

Вообщем после некоторых исправлений и теста получил следующее:

Fatal error: Call to a member function getIsRequire() on a non-object in Z:\home\magento.os\www\app\design\frontend\base\default\template\catalog\product\view\options\type\simpletext.phtml on line 6

Понимаю что это значит что simpletext.phtml не привязан к модели или к блоку.

Но не понимаю что я делаю не правильно. МОй config.xml файл:

<?xml version="1.0"?>
<config>
    <modules>
        <Throne_Copt>
            <version>0.1.0</version>
        </Throne_Copt>
    </modules>
	<global>
		<catalog>
			<product>
				<options>
					<custom>
						<groups>
								<customs translate="label" module="copt">
									<label>Customs</label>
									<render>copt/catalog_product_edit_tab_options_type_simpletext</render>
									<types>
										<simpletext translate="label" module="copt" >
											<label>Simple Text</label>
										</simpletext>
									</types>
								</customs>
						</groups>
					</custom>
				</options>
			</product>
		</catalog>  
		<models>
			<catalog>
			  <rewrite>
				<product_option_type_simpletext>Throne_Copt_Model_Catalog_Product_Option_Type_Simpletext</product_option_type_simpletext>
			  </rewrite>
			</catalog>
		 </models>		 
		<blocks>
            <copt>
                <class>Throne_Copt_Block</class>
            </copt>
        </blocks>
	</global>
</config>


catalog.xml
<catalog_product_view translate="label">
---
        <reference name="head">
            <action method="addJs"><script>varien/product.js</script></action>
            <action method="addJs"><script>varien/configurable.js</script></action>

            <action method="addItem"><type>js_css</type><name>calendar/calendar-win2k-1.css</name><params/><!--<if/><condition>can_load_calendar_js</condition>--></action>
            <action method="addItem"><type>js</type><name>calendar/calendar.js</name><!--<params/><if/><condition>can_load_calendar_js</condition>--></action>
            <action method="addItem"><type>js</type><name>calendar/calendar-setup.js</name><!--<params/><if/><condition>can_load_calendar_js</condition>--></action>
			<block type="copt/catalog_product_view_options_type_simpletext" name="head.simpletext" as="simpletext" template="catalog/product/view/options/type/simpletext.phtml"></block>
        </reference>
+++++
</catalog_product_view>


#13 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8884
  • Регистрация: 20.02.2010

03.03.2011 11:05

Найдите полнотекстовым поиском по коду точки вызова метода getIsRequire и проведите в этих точках отладку.

#14 Евгений Смирнов
  • Группа: Заблокирован
  • Сообщений: 81
  • Регистрация: 03.03.2011

03.03.2011 11:22

Вызывается это в :
simpletext.phtml

<dt><label<?php if ($_option->getIsRequire()) echo ' class="required"' ?>><?php if ($_option->getIsRequire()) echo '<em>*</em>' ?><?php echo  $this->htmlEscape($_option->getTitle()) ?></label>
    <?php echo $this->getFormatedPrice() ?></dt>


Сама функция определена только в
class Mage_Customer_Model_Attribute extends Mage_Eav_Model_Entity_Attribute

У меня имеется модель class Throne_Copt_Model_Catalog_Product_Option_Type_Simpletext extends Mage_Catalog_Model_Product_Option_Type_Default
а также блок class Throne_Copt_Block_Catalog_Product_View_Options_Type_Simpletext
extends Mage_Catalog_Block_Product_View_Options_Abstract .

Ни в дефолте, ни в абстракте эта функция не определена.

Кстати. Я добавил во все файлы связанные с симплтекстом такую штуку: Mage::log (__FILE__);

Выводит только пхтмл файл

#15 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8884
  • Регистрация: 20.02.2010

03.03.2011 11:22

Прочитайте про метод __call.

#16 Евгений Смирнов
  • Группа: Заблокирован
  • Сообщений: 81
  • Регистрация: 03.03.2011

03.03.2011 11:59

Вы могли бы сказать правильно ли у меня организованы модель блок конфиг.хмл и каталог.хмл ?

#17 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8884
  • Регистрация: 20.02.2010

03.03.2011 12:05

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

#18 Евгений Смирнов
  • Группа: Заблокирован
  • Сообщений: 81
  • Регистрация: 03.03.2011

03.03.2011 12:09

Если я убираю строку блока из
        <reference name="head">
            <action method="addJs"><script>varien/product.js</script></action>
            <action method="addJs"><script>varien/configurable.js</script></action>

            <action method="addItem"><type>js_css</type><name>calendar/calendar-win2k-1.css</name><params/><!--<if/><condition>can_load_calendar_js</condition>--></action>
            <action method="addItem"><type>js</type><name>calendar/calendar.js</name><!--<params/><if/><condition>can_load_calendar_js</condition>--></action>
            <action method="addItem"><type>js</type><name>calendar/calendar-setup.js</name><!--<params/><if/><condition>can_load_calendar_js</condition>--></action>
			<block type="copt/catalog_product_view_options_type_simpletext" name="head.simpletext" as="simpletext" template="catalog/product/view/options/type/simpletext.phtml"></block>
        </reference>


Страница с товаром отображается нормально, кроме той детали что мой кастомный элемент не отображается как надо, только лабел.
Кстати если поменять simpletext.phtml на text.phtml то вылезает та же ошибка.

#19 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8884
  • Регистрация: 20.02.2010

03.03.2011 12:13

Применяя дедуктивный метод сверху-вниз и рассматривая Magento как чёрный ящик, экспериментируя с настройками и наблюдая за результатами, не вникая в суть происходящего внутри - сложно будет добиться эффективности в программировании Magento.

#20 Евгений Смирнов
  • Группа: Заблокирован
  • Сообщений: 81
  • Регистрация: 03.03.2011

03.03.2011 12:16

Я ещё только изучаю магенто. Какие инструменты вы посоветуете для дебага? Эклпис+хдебаг?

К сожалению, сейчас мне нужно сделать чтобы все работало, в очень короткие сроки, поэтому не могу уделить достаточно времени изучению.

#21 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8884
  • Регистрация: 20.02.2010

03.03.2011 12:21

Я вообще использую просто Mage::log() в нужных местах для нужных переменных, а остальное мне становится понятным при анализе кода в IntelliJ IDEA, которая в последнее время хорошо понимает PHP и всегда обладала хорошими универсальными инструментами статического анализа.

#22 Евгений Смирнов
  • Группа: Заблокирован
  • Сообщений: 81
  • Регистрация: 03.03.2011

03.03.2011 12:43

Сейчас использую вот такую конструкцию:
Mage::helper('copt/callstack')->toLog();

Она определяет калл стак для файла.

Только для simpletext.phtml я получаю следующее:

2011-03-03T09:41:34+00:00 DEBUG (7): Z:\home\magento.os\www\app\code\local\Throne\Copt\Helper\Callstack.php line 15 calls get_callstack()
Z:\home\magento.os\www\app\design\frontend\base\default\template\catalog\product\view\options\type\simpletext.phtml line 3 calls toLog()
Z:\home\magento.os\www\app\code\core\Mage\Core\Block\Template.php line 216 calls include()
Z:\home\magento.os\www\app\code\core\Mage\Core\Block\Template.php line 247 calls fetchView()
Z:\home\magento.os\www\app\code\core\Mage\Core\Block\Template.php line 261 calls renderView()
Z:\home\magento.os\www\app\code\core\Mage\Core\Block\Abstract.php line 758 calls _toHtml()
Z:\home\magento.os\www\app\code\core\Mage\Core\Block\Abstract.php line 525 calls toHtml()
Z:\home\magento.os\www\app\code\core\Mage\Core\Block\Abstract.php line 472 calls _getChildHtml()
Z:\home\magento.os\www\app\design\frontend\base\default\template\page\html\head.phtml line 45 calls getChildHtml()
Z:\home\magento.os\www\app\code\core\Mage\Core\Block\Template.php line 216 calls include()
Z:\home\magento.os\www\app\code\core\Mage\Core\Block\Template.php line 247 calls fetchView()
Z:\home\magento.os\www\app\code\core\Mage\Core\Block\Template.php line 261 calls renderView()
Z:\home\magento.os\www\app\code\core\Mage\Core\Block\Abstract.php line 758 calls _toHtml()
Z:\home\magento.os\www\app\code\core\Mage\Core\Block\Abstract.php line 525 calls toHtml()
Z:\home\magento.os\www\app\code\core\Mage\Core\Block\Abstract.php line 476 calls _getChildHtml()
Z:\home\magento.os\www\app\design\frontend\base\default\template\page\2columns-right.phtml line 35 calls getChildHtml()
Z:\home\magento.os\www\app\code\core\Mage\Core\Block\Template.php line 216 calls include()
Z:\home\magento.os\www\app\code\core\Mage\Core\Block\Template.php line 247 calls fetchView()
Z:\home\magento.os\www\app\code\core\Mage\Core\Block\Template.php line 261 calls renderView()
Z:\home\magento.os\www\app\code\core\Mage\Core\Block\Abstract.php line 758 calls _toHtml()
Z:\home\magento.os\www\app\code\core\Mage\Core\Model\Layout.php line 529 calls toHtml()
Z:\home\magento.os\www\app\code\core\Mage\Core\Controller\Varien\Action.php line 389 calls getOutput()
Z:\home\magento.os\www\app\code\core\Mage\Catalog\Helper\Product\View.php line 147 calls renderLayout()
Z:\home\magento.os\www\app\code\core\Mage\Catalog\controllers\ProductController.php line 132 calls prepareAndRender()
Z:\home\magento.os\www\app\code\core\Mage\Core\Controller\Varien\Action.php line 418 calls viewAction()
Z:\home\magento.os\www\app\code\core\Mage\Core\Controller\Varien\Router\Standard.php line 253 calls dispatch()
Z:\home\magento.os\www\app\code\core\Mage\Core\Controller\Varien\Front.php line 176 calls match()
Z:\home\magento.os\www\app\code\core\Mage\Core\Model\App.php line 340 calls dispatch()
Z:\home\magento.os\www\app\Mage.php line 627 calls run()
Z:\home\magento.os\www\index.php line 80 calls run()


Но как связать данный вывод с моим модулем немного не понимаю.

#23 Евгений Смирнов
  • Группа: Заблокирован
  • Сообщений: 81
  • Регистрация: 03.03.2011

03.03.2011 12:49

Вызвал
Mage::log($this->getData());
Mage::log($this->getModel());
Mage::log($this->getBlock());


получил

2011-03-03T09:46:39+00:00 DEBUG (7): Array
(
    [type] => copt/catalog_product_view_options_type_simpletext
    [module_name] => Throne_Copt
)

2011-03-03T09:46:39+00:00 DEBUG (7): 
2011-03-03T09:46:39+00:00 DEBUG (7): 


Это значит нет ни модели ни блока, или я просто не так что-то опять сделал?

[type] => copt/catalog_product_view_options_type_simpletext Прописываем в catalog.xml файле как я понял, должен ли тип быть привязан к чему-то?

#24 Евгений Смирнов
  • Группа: Заблокирован
  • Сообщений: 81
  • Регистрация: 03.03.2011

05.03.2011 11:26

Здравствуйте. Я нашел проблему.

Она возникала вот на этом шаге:

class My_Module_Model_Catalog_Product_Option extends Mage_Catalog_Model_Product_Option
    const OPTION_GROUP_MYTYPE   = 'mytype';

    const OPTION_TYPE_MYOPTION      = 'myoption';

    /**
     * Get group name of option by given option type
     *
     * @param string $type
     * @return array
     */
    public function getGroupByType($type = null){
        if (is_null($type)) {
            $type = $this->getType();
        }
        
        if($type==self::OPTION_TYPE_MYOPTION){
            return self::OPTION_GROUP_MYTYPE  ;
        } else {
            return parent::getGroupByType($type);
        }
    }
} 


Когда я добавил свою группу и опцию в Mage_Catalog_Model_Product_Option хардкодом, все прекрасно заработало.

Теперь вот интересуюсь можно ли как-нибудь написать модуль, чтобы не надо было ничего редактировать, а только дополнять? Основная проблема вылезает с options.phtml. Так как там имеется switch в которые пришлось вставлять свою группу и опцию.

Поделиться темой: