Куча вопросов назрело от того что с Друпал мало знаком, создаю свой первый проект использующий данную CMS.
Есть готовый сверстанный шаблон на Bootstrap 3 сам шаблон. Адекватная критика по шаблону приветствуется. Но только адекватная, больше интересны ответы по темам что ниже!
Задача: создать самостоятельную тему на Друпал используя данный шаблон.
На Главной странице есть куча блоков размещенных в одном регионе, у блоков разные классы, ХТМЛ теги (div / section), также блоку может быть назначен стиль с бакграундом, и дата атрибут с настройкой параллакса.
Что сделано:
1. выбор класса блока: .i-box, .news-large, и др.
2. выбор ХТМЛ тега (div / section)
3. создание стиля с бакграундом.
4. настройки дата для параллакса.
НО! Читая форумы выяснилось, что файлы могут быть временными. Теминизацию блоков сделал используя отдельный модуль хранящий все ХУКи, а в идеале хотелось бы чтобы все хуки находились в файле шаблона. Включил шаблон, работают настройки для блоков, выключил, они исчезли...
Вопрос 1: РЕШЕНО по загрузке 'managed_file'
Не удалится ли при запуске CRON файл записанный таким образом?
<?php
$data = $form['module']['#value'] . '-' . $form['delta']['#value'];
// Загрузка через аякс
$form['file'] = array(
'#type' => 'managed_file',
'#title' => 'Картинка',
'#description' => 'Выберите файл с расширением jpg, jpeg, png или gif',
'#upload_location' => 'public://',
'#upload_validators' => array(
'file_validate_is_image' => array(),
'file_validate_extensions' => array('png gif jpg jpeg'),
'file_validate_size' => array(2 * 1024 * 1024),
),
'#default_value' => isset($img[$data]) ? $img[$data] : '',
);
?>
Ответ: смотреть...
Вопрос 2: РЕШЕНО
для теминизации использую модуль: MyModul в папке sites/all/modules
<?php
/**
* Хук выводящий поля форме
*/
MyModul_form_block_admin_configure_alter(...) {
...
}
?>
Вопрос по данному ХУКу, может быть я его как то не так в шаблоне подключаю что он не хочет работать? Либо подскажите аналог данного хука для шаблона. Подключаю в шаблоне так: MyModul_form_block_admin_configure_alter(...).
Ответ: НИКАК!) Читать...
Вопрос 3:
Есть необходимость использовать не аякс загрузку изображений а стандартным "дедовским") способом.
Т.е. вместо '#type' => 'managed_file', использовать '#type' => 'file', но проблема в другом MyModul_form_validate() не подлючается, пробовал и так: MyModul_form_block_admin_configure_alter_form_validate() - результата НОЛЬ!
Сведения о полях собираю и записываю так:
<?php
function MyModul_form_block_admin_configure_alter(&$form, &$form_state) {
$data = $form['module']['#value'] . '-' . $data['delta']['#value'];
// Сверяем и скидываем данные в массив
$MyModul_block_theme = MyModul_block_theme_get();
$form['MyModul']['MyModul_block_theme'] = array(
'#type' => 'select',
'#title' => t('Block theme'),
'#description' => 'Select the style on block, that defines its purpose.',
'#default_value' => isset($MyModul_block_theme[$data]) ? $MyModul_block_theme[$data] : '',
'#options' => array(
NULL => t('- None -'),
'contact' => t('Contacts block'),
...
),
);
}
function
MyModul_block_theme_get() {
static $MyModul_block_theme;
if (empty($MyModul_block_theme)) {
$MyModul_block_theme= variable_get('MyModul_block_theme_array', array());
}
return
$MyModul_block_theme;
}
?>
Эта конструкция хорошо подходит и для '#type' => 'managed_file'... Но вот с '#type' => 'file' другая песня... Какая? Пока еще не знаю... Может кто и подскажет, по сути это не критично, но хочется все сделать не "ТОПОРОМ"
Вопрос 4: Как проверить статус файлов, и возможно переменных, т.к. их в БД насильно не записываю, сведения о них итак появляются. Запускаю очистку кеша. И крон по адресу http://mysite.com/admin/config/system/cron файлы все на месте, переменные тоже.
Правда в БД статус файлов - 0.
Но как я вычитал не только это влияет на "временность" файлов. Так даже лучше, если они не удаляются пока настройки шаблона активны. Отключил шаблон, удалились файлы.
Вопрос 5:
Друпал выводит файлы стилей массивом:
Возможно ли как то это дело исправить на более привычный вариант, тем более для некоторых стилей я использую ID:
Ну, и так более привычно
Вопрос 6:
Как исключить конфликт 2-х полей АЯКС?
<?php
$form['...']['My_block_background'] = array(
'#type' => 'select',
'#title' => t('Use background image parallax'),
'#options' => array(
1 => t('- Not using -'),
2 => t('Used'),
),
'#default_value' => isset($parallax[$date]) ? $parallax[$date] : 1,
'#ajax' => array(
'callback' => 'parallax_callback',
'wrapper' => 'parallax-set',
'method' => 'replace',
'effect' => 'fade',
),
);
$form['...']['file'] = array(
'#type' => 'managed_file',
'#title' => 'Картинка',
'#description' => 'Выберите файл с расширением jpg, jpeg, png или gif',
'#upload_location' => 'public://',
'#upload_validators' => array(
'file_validate_is_image' => array(),
'file_validate_extensions' => array('png gif jpg jpeg'),
'file_validate_size' => array(2 * 1024 * 1024),
),
'#default_value' => isset($image_bg[$date]) ? $image_bg[$date] : '',
);
?>
Проблема в том, что если загрузить фото, то селект уже не отправит значение.
ЗЫ - буду добавлять вопросы по мере их возникновения
Комментарии
Какие файлы?
Я делал такие сайты через Panels и Fieldable Panels Panes (FPP) https://www.drupal.org/project/fieldable_panels_panes.
Да не дай бог у вас такое получится сделать
Удалиться. Нужно после самбита формы загрузить файл обновить его статус
Это что-то новое
В каком еще шаблоне вы его подключаете? Вы явно путаете понятия или делаете что-то не то.
и к тому же, зачем использовать MyModul_form_block_admin_configure_alter, когда есть hook_block_configure и hook_block_save
потому что надо добавить 'validаte' => array('MyModul_form_block_admin_configure_validate') к элементу. Ну и см. выше, не использовать hook_form_alter
нужно сделать в сабмит колбэке примерно следующее
<?php
// Load the file via file.fid.
$file = file_load($form_state['values']['my_file_field']);
// Change status to permanent.
$file->status = FILE_STATUS_PERMANENT;
// Save.
file_save($file);
// Record that the module (in this example, user module) is using the file.
file_usage_add($file, 'user', 'user', $account->uid);
?>
Судя по вашим отрывкам из кода и вопросам вы делаете не топором. Топором лучше получится
PS
Если взялись сами писать модули, так хоть изучите доки. Здесь https://api.drupal.org/api/drupal/includes%21module.inc/group/hooks/7 все хуки описаны с примерами, тут все возможные элементы формы и доступные параметры https://api.drupal.org/api/drupal/developer%21topics%21forms_api_referen...
Файлы изображений... JPG, JPEG, PNG и т.д.
Айдишников вам должно хватить.
Может что то не так изложил, для того чтобы применить стилизацию из шаблона создал отдельный модуль.
Да, я уже в курсе что хук:
MyModul_form_block_admin_configure_alter(...)
в шаблоне подключать это бред!
Но, мне хотелось бы вбахать ХУК для настройки блоков, и чтобы этот хук хранился не в модуле, а в шаблоне
Для прояснения, скрин того что я инею сейчас:
Юзая hook_block_configure () я не получаю тех полей что на скрине, может опять же что то не так! И по теме об API как раз таки и занимаюсь этим
'validаte' => array, каким образом?
$form['...']['file'] = array(
'#type' => 'managed_file',
'#title' => 'Image',
'validаte' => array(),
);
Примерно так?
Заранее СПС!
<?php
$form['...']['file'] = array(
'#type' => 'managed_file',
'#title' => 'Image',
'#validаte' => array('my_validate_callback
'),
);
?>
Так работать никогда не будет. Во-первых, шаблоны подгружаются только в момент вывода контента, а вам же этот хук нужен на странице настройки блока. Во-вторых, это противоречит модели MVC, которая используется в друпале.
Спасибо за пояснения! В принципе уже догадался.
Но, согласитесь было бы эстетичненько!)
hook_block_configure () - не совсем то что мне нужно.
Для '#type' => 'managed_file'
Файлы теперь сохраняются:
В сабмите сделал так:
<?php
$date = $form_state['values']['module'] . '-' . $form_state['values']['delta'];
if (!
$form_state['values']['file']) {// Вопрос с удалением файла пока не решил в процессе
unset($image_bg[$date]); // Удаляет значение из переменной
}
else {
$image_bg[$date] = file_load($form_state['values']['file']);
$image_bg[$date] -> status = FILE_STATUS_PERMANENT;
file_save($image_bg[$date]);
file_usage_add($image_bg[$date]);
$image_bg[$date] = $form_state['values']['file'];
}
?>
CRONом проверял, в БД статус = 1
Чет все равно не работает(((
Может в _form_block_admin_configure_alter нет данного способа? Такое возможно?
Обощел свою тупость, и пошел от противного, сделал так: для '#type' => 'file',
В сабмите
<?php
$image_bg[$date] = file_load($form_state['values']['file']);
$validators
= array('file_validate_is_image' => array(),
'file_validate_extensions' => array('png gif jpg jpeg'),
'file_validate_size' => array(1),
);
if (!
$image_bg[$date] = file_save_upload('file', $validators, 'public://')) {}
else {
$image_bg[$date]->status = FILE_STATUS_PERMANENT;
drupal_set_message('Картинка загружена');
}
?>
Все грузит, проверяет, но! если добавит строку file_save($image_bg[$date]); ругается с критом(
Блоки это не сущности.
Если хотите поля в блоках, используйте вместо блоков Bean https://www.drupal.org/project/bean.
Еще вопрос 6:
Как исключить конфликт 2-х полей АЯКС?
<?php
$form['...']['file'] = array(
$form['...']['My_block_background'] = array(
'#type' => 'select',
'#title' => t('Use background image parallax'),
'#options' => array(
1 => t('- Not using -'),
2 => t('Used'),
),
'#default_value' => isset($parallax[$date]) ? $parallax[$date] : 1,
'#ajax' => array(
'callback' => 'parallax_callback',
'wrapper' => 'parallax-set',
'method' => 'replace',
'effect' => 'fade',
),
);
'#type' => 'managed_file',
'#title' => 'Картинка',
'#description' => 'Выберите файл с расширением jpg, jpeg, png или gif',
'#upload_location' => 'public://',
'#upload_validators' => array(
'file_validate_is_image' => array(),
'file_validate_extensions' => array('png gif jpg jpeg'),
'file_validate_size' => array(2 * 1024 * 1024),
),
'#default_value' => isset($image_bg[$date]) ? $image_bg[$date] : '',
);
?>
Проблема в том, что если загрузить фото, то селект уже не отправит значение
Это было бы очень не удобно
Внимательно читайте раздел form reference в api. работать должно
так файл, загруженный через форму managed_file уже сохранен на диске и в бд, вам нужно только поменять статус. зачем вы вот это делаете?
<?php if (!$image_bg[$date] = file_save_upload('file', $validators, 'public://')) {
} ?>
Смотреть в консоль браузера на ошибки.
Ваша затея выглядит очень сомнительно. Не зная АПИ и, судя по всему, имея немного опыта в веб разработке пытаетесь сделать какой-то велосипед.
Если нужно предоставить контроль над блоками для юзера - ставьте wysiwig редактор и пусть он себе пишет html в кастомном блоке тот, который ему нравится. Если нужен контроль над views блоками и т.п. - делается через css
Оп-оп-оп! Не пометил, исправлюсь, это уже для '#type' = 'file'
Решение уже описал здесь...
Нет, решение здесь: file_field_widget_form ()
Отдельно для "serega111"
Я не против Вашей критики!
Ваши знания мне помогли в некотором плане. За это Вам спасибо!
Да часто я выношу не ту информацию которую хотелось бы донести, по CSS и WYSIWIG конечно СПС учту...
Пусть я изобретаю велосипед, может мне так хочется? По крайней мере "костылей" в коде у меня нет, весь код выполняется согласно API Друпал! Из выводов по АПИ, да я не ставлю под сомнения ваши глубокие познания. Но прочитать документацию, это принцип любого разработчика...
Я не хочу испортить вам настроение, и это не мои выпадки в вашу сторону... Но если вы считаете мою затею ненужной, никчемной, то хотя бы аргументируйте это более расширенно нежели просто используя свои выводы взятые от не полностью, либо не совсем корректно предоставленной информации.
ЦЫ - На счет информации, согласен на все 100% тут мой "косяк". Но, сложновато писать в редакторе и выдавать мысль одновременно! Спасибо за понимание!
Это скорее вопрос к тому, что возможно, однажды, ваш сайт предстоит править или дорабатывать другому разработчику, или, вам предстоит дорабатывать функциональную часть так, что текущая реализация потребует значительного изменения в целом. Как делать - решать вам. Все, что вы хотите реализовать - уже давно готово и есть в интернетах, часть - даже тут, на д ру. Но сделано это иначе.
Никаких претензий к вам нет. Просто вы делаете это изначально против шерсти. И отсюда все ваши проблемы "когда не работает". Многие ваши "велосипеды" давно готовы, но в другом разрезе идеологии работы в друпалом.
Да я не "парюсь" что не работает! Попутно изучаю АПИ, в итоге все норм! Все летает... и сделано под "себя" под ту задумку которая была изначально... Я всего лишь прошу помочь с АПИ, а не с советом выбора модуля...
Ну, и опять же... советуют что? Где аргументы в пользу каких либо советов?! Аргумент, так лучше, да для ребенка подойдет, но не более!
Я вам не модули предлагаю, а пересмотреть свой подход.
У вас сейчас ситуация такого характера.
Вы берете задачу и делаете так, как сичтаете нужным. Это правильный подход. Но при этом у вас что-то не получается. Вы берете документацию, пытаетесь делать по ней, но у вас ошибка не в коде,а именно в использовании этого кода относительно архитектуры всей cms, о чем выше вам и сказали (проблема с аяксом). Если бы вы изначально делали, как вам посоветовали - проблем бы не было таких в принципе. Да и "летает" понимание относительное. При вашем подходе у вас будут проблемы с кешированием и с последующей адаптацией. Я через это тоже проходил, лет 10 назад. И прекрасно понимаю ваше стремление сделать "лучше для себя". Это правильно. Но это тянет за собой шлейф проблем.
Если же вы хотите и настаиваете на своих решениях, то вам придется их делать самому, так как в голову к вам никто не залезет, и уж тем более разбирать чужие велосипеды.
Вы просите помочь с апи.
Ну тогда давайте вы будете делать все моменты согласно АПИ, и тогда наша помощь будет актуальна. А при подходе "это хочу делать так, а это я буду делать по своему" ничего хорошего не выйдет.
Опять же, я не настаиваю. Но мой опыт будет побольше вашего. И он мне в свое время сказал, что в рамках работающего годами устойчивого движка так делать не стоит. И тем более сетовать на то, что "плохо подсказывают" или "не подсказывают вообще". Код вы пишите согласно стандартам. Но подход - нет. А им пользуются не потому, что делать нехер, а потому что это в итоге повышает производительность и исключает конфликты (как у вас) с другими участками кода. А еще позволяет интегрировать много разного (о чем вы еще не подозреваете) в сам функционал, не трогая уже существующие участки кода. А это важно.
Но опять же, если у вас вагон времени, и вы пишите под себя - то пишите. Но не рассчитывайте на то, что с вами будут возиться как с капризным ребенком (это не хочу, а это хочу).
Мы все писали велосипеды, исправляли костыли, и потом матерились от того, что не изучали АПИ правильно изначально. И есть определенные правила игры. Или вы их придерживаетесь, или нет.
Изучайте АПИ. Это дельное дело. И полезное. Но в рамках вашего подхода - вы или прислушаетесь, или сделайте по своему, и потом все равно переделаете.
По сути.
Вопрос 3.
http://xandeadx.ru/blog/drupal/353
Вопрос 4.
Для управления файлами как минимум стоит хранить их fid. Если вы будете загружать файлы посредством API, то вам просто необходимо хранить где-то fid файла- для управления им, для выгрузки, редактирования и удаления (если нужно).
Так же, почитайте про саму методологию загрузки. Это частично есть в примере-ссылки выше.
Вопрос 5.
Есть несколько решений.
https://api.drupal.org/api/drupal/includes!common.inc/function/drupal_ad...
Вы можете прописать подключение файла стилей через drupal_add_css() в своем обработчике. Но не использовать id, а генерировать/подключать разные файлы. Или участки файлов инлайн.
А можете написать в template.php формирование переменной с нужными стилями и атрибутами и выводить ее в html.tpl.php файле (надеюсь, мне не прийдется рассписывать где именно и в каком предпроцессе это делать?). Но это не правильный путь, так как будут проблемы при агрегации и кешировании. Но он рабочий.
Вопрос 6.
Вам уже ответили.
update.
Я только приветствую ваше стремление изучать и делать правильно. Не подумайте плохо.
Просто доверьтесь в отношении опыта более опытным девелоперам. Вы сохраните кучу времени.
Изучайте, ошибайтесь, пробуйте. Так и появляется опыт. И потом, если не забросите, через пару тройку лет, просматривая эти темы, будете краснеть за свои вопросы и убеждения. Поверьте. Или посмотрите мои вопросы семилетней давности на этом форуме. Это ж ни на одну голову не налезет.
Я не столько против того, что вы учитесь, я против того чтобы такие решения шли в продакшн, поэтому сразу пытаюсь подсказать, что ваш модуль не принесет пользы ни вам, ни разработчику, который в будущем это все будет поддерживать (а это может будете вы сами, но через год, когда у вас опыта будет больше)
Дак "не вопрос"... Как тогда сделать лучше? И что в моем случае не так? ХУК неверный? Чем?
hook_block_configure() - для блоков, определённых в этом же модуле.
hook_form_block_admin_configure_alter() - если задача расширить настройками блок из стороннего модуля, в моем случае, расширение появляется при редактировании блока.
hook_form_block_add_block_form_alter() - тоже самое но, расширение появляется при добавлении блока.
Простого, стандартного блока, это будет стандартный блок, с дополнительными полями необходимыми для настройки каждого блока под вывод определенного контента (иконбоксы, портфолио, новости, и т.д...) ХТМЛ у блоков по сути одинаковый, различие в КСС классе, открывающем/закрывающем ХТМЛ теге, и дата артибуте враппера. Вот и все, блок выводит стандартный контент, все стандартно... Как в версии из коробки... Но только есть дополнительные поля, которые появляются при подключении модуля.
Если модуль пишу не так? То как его надо писать? АПИ неверно подобрал? Как тогда верно будет hook_block_configure() и hook_form_block_admin_configure_alter() это разные хуки, мне нужен именно hook_form_block_admin_configure_alter() и hook_form_block_add_block_form_alter() соответственно...
НЕ ХОЧУ Я БРАТЬ ЧУЖОЙ МОДУЛЬ И КРУТИТЬ ЕГО ПОД СЕБЯ!
С этим вопрос решен! Спасибо, там кстати и смотрел инфу!)
Ответ: смотреть консоль браузера?)
У меня проблема 2-х аякс форм, одна файл (картинка) другая (селект). Гружу картинку, убиваю данные с селекта... наковырял частично file_field_widget_form () но еще не разбирался, в верном пути иду?
file_field_widget_form()
это виджет для формы (В данном случае тот самый участок кода, который отвечает за загрузку файла на форме редактирования ноды).
И его лучше руками не менять, так как коснется всего сайта. Только не говорите, что вы ковыряете контриб модули и модули системы? Я за это джуниоров шваброй бил. Шваброй, Карл!
Почитайте тут темы про создание кастомных полей. ТАм есть и часть по созданию собственных виджетов, в том числе и для уже существующих полей (что вам и нужно).
И там уже переделывать загрузку. И потом подуключать этот виджет в настройках поля в редактировании типа ноды (управление полями). Например, http://www.drupal.ru/node/116071
А данные селекта как раз и убиваете потому, что у вас форма после аякса не верно ребилдится. То есть аякс отработал, а селекс стал пустым, потому что не отработало его формирование повторно.
Вот ковырнул модуль его ОЛЕНЬ написал?
Если модуль прошел валидацию на орге - то не олень. Хотя там в контриб модулях есть такие шляпы, что ни на одну голову не налазят. Но это проблема скорее не самих ошибок, а того, что долго вносят изменения.
К тому же, вас не смущает дата последнего релиза этого модуля "2012-Jun-01"? 3.5 года прошло.
Нее, не в коем. Но подцепляю, вы посмотрите код того модуля что скинул.. Он не большей с 10 функций и те короткие... У меня, в моем модуле, суть практически одинаковая. Есть отличия, небольшие и я не пишу данные в базу, пока не вижу зачем это, если тоже самое делает АПИ, все переменные создаются в таблице variables, после удаления модуля БД чистится, проверял
а вот это уже совсем другой разговор, похвально-похвально (без сарказма).
По моему тут проще и правильнее будет пользоваться не альтерами, а написать свой виджет для формы этого поля. Основа у вас есть, а как сделать - ссылку я тоже дал (по составным полям - там отдельно о том, как создать инициализацию своего виджета). Пробуйте.
Блин... Блин... Блин... Блин... Блин...
Время... Время... Время... Время... Время...
Вы я так понимаю смотрели код модуля?
Если я в своем случае оставляю все как есть, не делаю запись с данными о переменных в БД, т.к. вреде итак пишется, но пока как проверить не знаю... такая конструкция "канает"?)
да, только смысл?
скажу по другому.
я вам дал работающий пример. Ибо я это делал уже (свой виджет для поля).
Вы уже потратили больше времени. На свой виджет уйдет ну пару часов максимум.
п.с. если вы оставите как есть, то ваш загруженный файл будет удаляться по отработке крона каждый раз.
Я не могу понять в чем сейчас ваша проблема?
1. У вас нет времени разобраться в сути?
2. Нет времени попробовать сделать свой виджет? (при условии что у вас ест ьуже код работающего виджета загрузки файлов в поле, что вам и нужно)
Или вы просто не можете понять суть работы архитектуры?
Просто ответить на вопрос, почему ваш код не работает - вам уже ответили. Использовать не альтер формы, а сделать свой виджет.
Поверьте, это будет большой левел ап, если вы разберетесь как делать свои типы полей, виджеты для них и форматтеры. ЛУчше потратье 2-3 дня на изучение вопроса, и потом будет намного больше возможностей (начиная от составных полей и заканчивая сложной фильтрацией по ним).
Не-не-не... уже решил с файлом вот так:
Это в сабмите
<?php
$data = $form_state['values']['module'] . '-' . $form_state['values']['delta'];
if (
$form_state['values']['file']) {$imagebg[$data] = file_load($form_state['values']['file']);
$imagebg[$data]->status = FILE_STATUS_PERMANENT;
file_save($imagebg[$data]);
file_usage_add($imagebg[$data], 'mymodule', 'mymodule', 0);
$imagebg[$data] = $form_state['values']['file']; // Эта конструкция "бабахает" фид в переменную
}
?>
Да нет же, код выполняется без ошибок, но хочется его улучшить...
Сейчас ломаю голову над АЯКСом
Ну и еще с загрузкой изображения стандартом, без аякса разобраться ни как не могу!(
пока не понимаю что это за "..., 'mymodule', 'mymodule', 0" в поле file_usage_add($imagebg[$data], 'mymodule', 'mymodule', 0);
название вашего модуля, в котором вы имплементите код
Нашел как подключить валидатор для hook_form_block_admin_configure_alter();
$form['#validate'][] = 'my_file_validator';
Остальное уже "Дело техники!"
Всем Спасибо за участие!