Russian TYPO3 community

Russian TYPO3 community (http://forum.typo3.ru/index.php)
-   Общие вопросы (http://forum.typo3.ru/forumdisplay.php?f=12)
-   -   flexform и создание extensions (http://forum.typo3.ru/showthread.php?t=8275)

3ton 30.12.2009 11:31

flexform и создание extensions
 
создал расширение которое отлично работает
суть заключается в том что расширение лезет на защищеный WebSrvice и берет оттуда данные, после чего закидывает их в базу
предварительно проверяет если последние данные были взяты меньше часу назад то не лезет а берет сразу данные из базы.

проблема в том что с этими данными будут работать несколько модулей и у меня ситуация при которой либо я делаю 5-6 отдельных расширений, либо я добавляю в BE к расширению параметры
пользователь при вставке плагина выбирает параметр и расширение в соответствии с выбором будет выдаст нужный результат

расширение и таблицы создал через KickStarter, но не нашел как сделать форму для внесения параметров, почитал что вроде как это FlexForm, но никакой нормальной инфы по ней не нашел, может кто поможет?

Valery Romanchev 30.12.2009 13:40

кикстартер флекс формы к сожалению не делает
Я сам разбирался с флексформами на примерах (экстеншен comments)
Пара страниц об этом есть в книжке Дулепова, но проще на примере посмотреть.

3ton 30.12.2009 13:46

тогда вопрос к Вам, как к уже прошедшему данный этап

достаточно ли создать файл flexform.xml и задать в нем нужную структуру или есть еще пару файлов необходимых для появления формы настроек в BE ???

void 30.12.2009 14:53

Ещё есть пара файлов

3ton 30.12.2009 14:54

можете подсказать или лучше книжку купить??? ;)

Lucifer 30.12.2009 15:11

Думаю, лучше на примерах смотреть. методом научного тыка так сказать :)

void 30.12.2009 22:35

http://wiki.typo3.org/index.php/Exte...sing_Flexforms

3ton 31.12.2009 00:40

спасибо Void - то что доктор прописал!

3ton 04.01.2010 12:22

значит для остальных и по существу.

после написания расширения в KickStarter необходимо его доработать дабы в BE появилась возможность ввести переменные для вставляемого на страницу контент-плагина

для этого необходимо
1. создать файл flexform.xml (его структуру можете изучить, почти в любом имеющемся плагине он в корневой папке)
2. добавить строки соответствующие объявленым в flexform.xml в файл locallang_db.xml (он так же находится в корневой папке)
3. в файле ext_tables.php(тоже в корневой директории) добавить строки

Код:

if(t3lib_div::int_from_ver(TYPO3_version) >= 4002000)
        t3lib_extMgm::addPiFlexFormValue('*','FILE:EXT:'.$_EXTKEY.'/flexform.xml');
else
        t3lib_extMgm::addPiFlexFormValue('default','FILE:EXT:'.$_EXTKEY.'/flexform.xml');

$TCA['tt_content']['types']['list']['subtypes_addlist'][$_EXTKEY.'_pi1']='pi_flexform';

позволяющие нам работать с flexform из нашего плагина

4. добавить в файл нашего расширения (pi1/class.tx_нашеРасширение_pi1.php)
следующий код

Код:

        function main($content, $conf) {
                $this->conf = $conf;
                $this->pi_setPiVarDefaults();
                $this->pi_loadLL();
                // Init FlexForm configuration for plugin:
                $this->pi_initPIflexForm();
                $this->mergeflexFormValuesIntoConf();
                // Get vars
                $var1 = $this->flexFormValue('var1', 's_модуль');
                $var2 = $this->flexFormValue('var2', 's_модуль');
                $var3 = $this->flexFormValue('var3', 's_модуль');

далее добавить методы

Код:

        protected function mergeflexFormValuesIntoConf() {
                $flex = array();
                if ($this->flexFormValue('var1', 's_модуль')) {
                        $flex['var1'] = $this->flexFormValue('var1', 's_модуль');
                }

                if ($this->flexFormValue('var2', 's_модуль')) {
                        $flex['var2'] = $this->flexFormValue('var2','s_модуль');
                }

                if ($this->flexFormValue('var3', 's_модуль')) {
                        $flex['var3'] = $this->flexFormValue('var3', 's_модуль');
                }

                $pid = $flex['pages'] ? $this->pi_getPidList($flex['pages'], $flex['recursive']) : 0;
                if ($pid > 0) {
                        $flex['storagePid'] = $pid;
                }

                $this->conf = array_merge($this->conf, $flex);
        }


        protected function flexFormValue($var, $sheet) {
                return $this->pi_getFFvalue($this->cObj->data['pi_flexform'], $var,$sheet);
        }

        protected function getDisplayText($label, $stdWrapArray=array()) {
                return $this->flexFormValue($label,'s_messages') ? $this->cObj->stdWrap($this->flexFormValue($label,'s_messages'),$stdWrapArray) : $this->cObj->stdWrap($this->pi_getLL('ll_'.$label, '', 1), $stdWrapArray);
        }

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

в принципе 4 этих пунктов достаточно чтоб создать форму параметров для вставляемого расширения

dmartynenko 04.01.2010 16:50

Вы так пишете, что новички могут подумать что flexform.xml всегда один и в корневой папке. На самом деле их может может быть много - например один для каждого плагина (piX).

Я для удобства обычно пишу их не в корень, а в подпапку плагина:
pi1/flexform.xml
pi2/flexform.xml

Так легче разбираться с ними если плагинов в экстеншене несколько. Надо только правильно прописать пути в вызове addPiFlexFormValue().

Ваша функция getDisplayText это от какого-то копипаста остаток. Она вовсе не обязательна и никем кроме вас не может вызываться. Хотя это может быть удобным способом локализации - она берет локализованную строку либо заданную пользователем со странички FF s_messages, либо из стандартного locallang файла. Но это все должно быть должным образом сконфигурировано.

Также у вас есть дублирование в коде, так как вы уже FF в $this->conf записали используя mergeflexFormValuesIntoConf():
Код:

$this->mergeflexFormValuesIntoConf();
// Get vars
$var1 = $this->conf('var1');

И стоит сказать, что такая практика нужна если вы хотите использовать в плагине возможность конфигурирования одновременно через FF и через TypoScript. Иначе записывать в $this->conf совсем не обязательно.

3ton 04.01.2010 16:56

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

почитайте что мне выше писали...

я же написал чтоб пользователь, который вообще об этом не знает, мог хоть както получить результат

у меня складывается впечатление что население начинает делиться только когда они покажут что другие вообще в этом не понимают

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

dmartynenko 04.01.2010 17:18

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

Ведь для ответа на вопрос может быть необходимо поднять и процитировать вам много источников, и затратить на это много времени.

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

По сути вам это и советовали сделать в первых ответах.

3ton 04.01.2010 17:40

можете мне поверить что занят я не меньше Вашего, а с Typo3 знаком меньше месяца.

подсесть на него вызвано необходимостью передать продукт для поддержки другим лицам так как нет времени заниматься фронтами, так как мой приоритет сервисы с которыми этот фронт работает

кое что реализую щас на нем, проект не сложный, но в контексте typo3 занимает очень много времени всякого рода тонкости которые являются важной составляющей typo3, но по которым нет туториалов.
что не мешает мне при этом оставлять пару строк в наследие грядущим таким же как и я новичкам.
а посему считаю нужным прекратить данный оффтоп, о чем и Вас прошу, эта тема имеет совсем другое предназначение.

3ton 04.01.2010 19:09

Цитата:

Сообщение от dmartynenko (Сообщение 26682)
И стоит сказать, что такая практика нужна если вы хотите использовать в плагине возможность конфигурирования одновременно через FF и через TypoScript. Иначе записывать в $this->conf совсем не обязательно.

к слову сказать у меня 3 способа получения этих данных - FF , TypoScript и RealUrl
поэтому мне необходимо получать их всех и уже правилами в расширении решать кто из них и как будет обрабатываться

Flex 18.09.2010 15:38

Возникла проблема, как я предполагаю, с flexform, но возможно я ошибаюсь.
Ситуация такая: я написал несколько плагинов типа "Frontend Plugins". Плагины создавал kickstarter'ом, потом прикручивал flexform для того чтобы можно было менять их параметры из backend'а.
Всё хорошо, всё работает по отдельности. Но когда уже установлен один из моих плагинов и я устанавливаю другой, то происходит так, что формы flexform первого плагина заменяются формами второго (последнего установленного).
Кто-нибудь с этим сталкивался? Или какие есть мысли на этот счет?

dmartynenko 20.09.2010 14:58

Запостите сюда файл ext_tables.php

Возможно вы что-то напутали с путями к flexform в нем.

Flex 20.09.2010 16:56

вот код ext_tables.php одного из моих расширений, ну собственно у остальных он такой же, разное лишь имя расширения:
Код:

<?php
if (!defined ('TYPO3_MODE')) {
        die ('Access denied.');
}

t3lib_div::loadTCA('tt_content');
$TCA['tt_content']['types']['list']['subtypes_excludelist'][$_EXTKEY.'_pi1']='layout,select_key';


t3lib_extMgm::addPlugin(array(
        'LLL:EXT:flex_gallery_collection/locallang_db.xml:tt_content.list_type_pi1',
        $_EXTKEY . '_pi1',
        t3lib_extMgm::extRelPath($_EXTKEY) . 'ext_icon.gif'
),'list_type');


if (TYPO3_MODE == 'BE') {
        $TBE_MODULES_EXT['xMOD_db_new_content_el']['addElClasses']['tx_flexgallerycollection_pi1_wizicon'] = t3lib_extMgm::extPath($_EXTKEY).'pi1/class.tx_flexgallerycollection_pi1_wizicon.php';
}

if(t3lib_div::int_from_ver(TYPO3_version) >= 4002000)
        t3lib_extMgm::addPiFlexFormValue('*','FILE:EXT:'.$_EXTKEY.'/flexform.xml');
else
        t3lib_extMgm::addPiFlexFormValue('default','FILE:EXT:'.$_EXTKEY.'/flexform.xml');

$TCA['tt_content']['types']['list']['subtypes_addlist'][$_EXTKEY.'_pi1']='pi_flexform';

?>


dmartynenko 20.09.2010 17:10

Попробуйте примерно так написать:

t3lib_extMgm::addPiFlexFormValue($_EXTKEY.'_pi1', 'FILE:EXT:'.$_EXTKEY.'/flexform.xml');
$TCA['tt_content']['types']['list']['subtypes_addlist'][$_EXTKEY.'_pi1']='pi_flexform';

Так как первый параметр addPiFlexFormValue() это некий уникальный ключ, а у вас он один и тот же.

Flex 21.09.2010 02:03

Спасибо! Это помогло =)


Часовой пояс GMT +4, время: 03:50.

Работает на vBulletin® версия 3.8.1.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot