Форум русской поддержки Joomla!® CMS
11.12.2016, 06:17:01 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1] 2  Все   Вниз
  Добавить закладку  |  Печать  
Автор

При создании материала создавать папку в каталоге изображений (foldername = alias)

 (Прочитано 578 раз)
0 Пользователей и 1 Гость смотрят эту тему.
goga_pgasovav
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 182


Внимательный джумловод


« : 21.03.2016, 11:54:42 »

Вобщем вопрос: можно ли и как?  Roll Eyes
Создаю материал, и в папке  images автоматически создаётся папка, именем которой является alias материала.
И когда добавляешь изображения для статьи, то уже не нужно придумывать имя папки и создавать её, плюс гораздо удобнее вставлять код для вывода Simple Image Gallery.
« Последнее редактирование: 22.03.2016, 01:56:28 от goga_pgasovav » Записан
goga_pgasovav
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 182


Внимательный джумловод


« Ответ #1 : 21.03.2016, 16:34:40 »

В РНР я, к сожалению, не силён. Кроме 'echo'  едва ли самостоятельно что-то напишу (частично шутка).
Нашёл такую вот функцию: 'mkdir'. Зная алиас материала (а он полюбому задаётся либо пользователем, либо самой Joomla, при создании материала), можно подставить это значение в параметр pathname.
Но вот где происходит сохранение материала не могу разобраться. В файле edit.php админского шаблона не нахожу подобного.
Записан
goga_pgasovav
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 182


Внимательный джумловод


« Ответ #2 : 22.03.2016, 01:47:49 »

Вобщем сделал частично, но пока, что называется, "через задницу".

Сначала добавил дополнительное поле — checkbox при создании/редактировании материала:

Код
<fieldset name="image_folder" label="Image folder">
   <field name="create_folder"
       type="checkbox"
       label="Create automatically"
       value="1"
       default="0"
       filter="intval"
   />

</fieldset>
 

Дальше не придумал ничего умнее, чем написать в шаблоне материала следующее:

Код
//create folder for images
if ($params->get('create_folder') == 1) {
   $folder_name = $this->item->alias;
   $folder_name = substr($folder_name,0,30); //trim folder name to 30 characters
 
   $destination = JPATH_SITE.'/'."images/news";
   if (!file_exists($destination.$folder_name)) {      
       JFolder::create($destination .'/'. $folder_name, 0755);
   }
}
 

Собственно сам алгоритм и код работают. Папка создаётся, при условии, что чекбокс отмечен галочкой, обрезается название до нужной мне длины.
НО! Я думаю и ежу понятно, что:
1. Эта хрень выполняется каждый раз, когда загружается страница со статьёй  Shocked
2. Срабатывает только после того, как страницу хотя бы один раз загрузили, т.е. выполнился РНР-код.

Понимаю, что нечто похожее на мой код выше, надо добавить в какой-то из файлов administrator/com_content/ но не понимаю куда именно
Очень прошу помочь тех, у кого понимание механизмов Joomla куда глубже, чем моё  Roll Eyes
« Последнее редактирование: 22.03.2016, 01:59:29 от goga_pgasovav » Записан
voland
Профи
********

Репутация: +488/-86
Offline Offline

Пол: Мужской
Сообщений: 8736


любит наш народ всякое гавно...


« Ответ #3 : 22.03.2016, 03:20:32 »

Здесь нужно использовать плагины. И смотреть какие события удобнее использовать
Записан
goga_pgasovav
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 182


Внимательный джумловод


« Ответ #4 : 22.03.2016, 14:03:42 »

voland, спасибо. А есть ли соображения, как сделать это без плагинов? Зачастую это громоздкие штуковины, и ради одной галочки в настройках материала крайне не хотелось бы их использовать. Кроме того, я искал плагины, позволяющие сделать это, но так и не нашёл.
Записан
voland
Профи
********

Репутация: +488/-86
Offline Offline

Пол: Мужской
Сообщений: 8736


любит наш народ всякое гавно...


« Ответ #5 : 22.03.2016, 14:10:28 »

Зачем ***кодить?
Проще написать плагинчик и спокойно забыть о проблеме.
А то как обновляться то будете?
Записан
goga_pgasovav
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 182


Внимательный джумловод


« Ответ #6 : 22.03.2016, 14:12:39 »

voland сайт, для которого пытаюсь реализовать эту задумку, работает на 2.5, которая уже не поддерживается. Перейти на 3.0 нет возможности. Так что обновление, в моей ситуации, роли не играет. К тому же я сам написание плагина не осилю.
Записан
voland
Профи
********

Репутация: +488/-86
Offline Offline

Пол: Мужской
Сообщений: 8736


любит наш народ всякое гавно...


« Ответ #7 : 22.03.2016, 14:15:29 »

Там все просто.
Тут поискать - была пара сервисов генерации плагинов - дальше обычный PHP
Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3595


« Ответ #8 : 22.03.2016, 14:18:17 »

Плагин - это врезка кода в том месте, где срабатывается событие. Этот механизм придуман, чтобы можно было добавить свой код, но не терять его при обновлении расширения, а также для удобства его дальнейшего изменения. Он будет стоько громоздким, сколько ваш код. Писать плагин несложно, нужно только соблюдение некоторых правил.
Записан
SeBun
Практически профи
*******

Репутация: +134/-3
Offline Offline

Пол: Мужской
Сообщений: 2289



« Ответ #9 : 22.03.2016, 14:23:07 »

Перейти на 3.0 нет возможности.
Почему?
Записан
goga_pgasovav
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 182


Внимательный джумловод


« Ответ #10 : 22.03.2016, 15:27:57 »

Друзья, мы же не в идеальном мире живём. Когда клиент платит, я ищу фрилансера, который пишет всё, что необходимо, и получаю нормально обновляемую систему. В данном случае иемеем сайт с уже хакнутым ядром на устаревшей системе, которую никто не станет обновлять. Ресурсов для написания плагинов нет. Сам плагин написать я не в состоянии, если есть примеры, то дайте ссылку, но я не вижу смысла разводить здесь оффтоп, который совершенно не касается вопроса.

P.S.: Если вы рассматриваете вариант помощи за плату, то напишите пожалуйста в личку. Возможно мне хватит средств из собственного кармана для создания такого плагина, а разработка пригодится и на будущее. Я совершенно не против. Просто исходя из ситуации, я не рассматривал такой вариант изначально.
« Последнее редактирование: 22.03.2016, 15:35:59 от goga_pgasovav » Записан
KKAAZZOO
Практически профи
*******

Репутация: +102/-9
Offline Offline

Сообщений: 2096


« Ответ #11 : 22.03.2016, 15:37:17 »

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

Так в чем проблема? Идите в коммерческий раздел
Записан
goga_pgasovav
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 182


Внимательный джумловод


« Ответ #12 : 22.03.2016, 15:38:09 »

KKAAZZOO, Вы, видимо, читаете обрывками
Записан
KKAAZZOO
Практически профи
*******

Репутация: +102/-9
Offline Offline

Сообщений: 2096


« Ответ #13 : 22.03.2016, 15:42:25 »

Прочитал всю тему, вплоть до вашего последнего поста, где вы сами сказали как решаете проблемы. Более того вы сказали что готовы заплатить из собственного кармана. Коммерческий раздел для этого и предназначен.
Записан
goga_pgasovav
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 182


Внимательный джумловод


« Ответ #14 : 23.03.2016, 01:13:54 »

Вообщем послушал я вас, ребята, и решил попробовать самостоятельно полноценный плагин написать.
Практически всё получилось, лишь одно препятствие встало на пути! Но обо всём по порядку:

Значит имеется дополнительное поле в материале:
(о нём уже писал, ничего не изменилось тут)

Код
<fieldset name="image_folder" label="Image folder">
   <field name="create_folder"
       type="checkbox"
       label="Create automatically"
       value="1"
       default="0"
       filter="intval"
   />

</fieldset>
 

Далее код плагина:

imgdir.php
Код
<?php
defined('_JEXEC') or die;
class plgContentImgDir extends JPlugin
{
   public function onContentAfterSave($context, &$article)
   {
       $articleId = (JRequest::getVar('option')==='com_content' && JRequest::getVar('view')==='article')? JRequest::getInt('id') : 0;
       $article =& JTable::getInstance('content');
       $article->load($articleId);
       $folder_name = $article->alias;
       $folder_name = substr($folder_name,0,30);
 
       $art_attribs = new JParameter($article->attribs);
 
       if ($art_attribs->get('create_folder') == 1) {
           $destination = JPATH_SITE.'/'."images/news";
           if (!file_exists($destination.$folder_name)) {      
               JFolder::create($destination .'/'. $folder_name, 0755);
           }
       }
   }
}
 
?>
 

Вобщем при сохранении материала выдаёт ошибку: Save failed with the following error: Another article from this category has the same alias
Я пробовал менять onContentAfterSave($context, &$article) на onContentPrepare($context, &$row, &$params, $page = 0) и тогда всё работает прекрасно!
Но в этом случае я получаю решение, аналогичное тому, что было в самом начале: т.е. пока страничку один раз не загрузят директория создана не будет.
Вот такая печаль... Google ничем не помог, так что прошу помощи знатоков!  !
Записан
goga_pgasovav
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 182


Внимательный джумловод


« Ответ #15 : 23.03.2016, 01:15:54 »

KKAAZZOO, не увидел сразу Ваше сообщение. Я говорил, что рассмотрю предложения, и тогда видно будет, смогу ли я за это заплатить. Так или иначе сам пробовать начал  dry
Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3595


« Ответ #16 : 23.03.2016, 01:46:34 »

Зачем еще раз загрузить JTableContent? Он и так уже передан. Попробуйте так
Показать текстовый блок
На счет свойства $article->create_folder не уверен, если он не передан, то получите по-вашему.
Записан
goga_pgasovav
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 182


Внимательный джумловод


« Ответ #17 : 23.03.2016, 02:07:18 »

robert, это потрясающе! Спасибо огромное!
Действительно, заработало только когда убрал проверку параметра if ($article->create_folder==1) {}
Да ещё и так невероятно мой код сократили... Вобщем низкий поклон!

Да и вообще, всем кто писал спасибо! Если бы не вы, я бы не решился плагин писать, и топтался бы на месте, время от времени обходясь хаками ядра... Вобщем вопрос считаю закрытым.
Записан
goga_pgasovav
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 182


Внимательный джумловод


« Ответ #18 : 26.03.2016, 19:06:55 »

Не спится мне спокойно. Решил усложнить задачу, и создавать папки в разных каталогах, в зависимости от категории.
У меня две основных категории: "news" и "catalog".
Я тут уже задавался вопросом, как узнать ID или alias самого верхнего уровня, и на фронтэнде это срабатывает безотказно, а вот в плагине моём работать отказывается..
Делал так:

Показать текстовый блок

После сохранения материала вылетает просто белая страница и ничего не происходит :/ Папка не создаётся.
Хотя после обновления списка материалов вижу, что материал создался успешно.
Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3595


« Ответ #19 : 26.03.2016, 21:11:55 »

Не хватало "/":
Показать текстовый блок
Записан
goga_pgasovav
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 182


Внимательный джумловод


« Ответ #20 : 26.03.2016, 22:57:52 »

robert, вы знаете, что-то не срабатывает. Пытаюсь сохранить и выбрасывает на белую страницу  Sad
Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3595


« Ответ #21 : 26.03.2016, 23:49:11 »

Показать текстовый блок
Исправлен по замечанию dmitry_stas.
« Последнее редактирование: 27.03.2016, 13:44:52 от robert » Записан
dmitry_stas
Профи
********

Репутация: +798/-4
Offline Offline

Сообщений: 7786



« Ответ #22 : 27.03.2016, 09:40:29 »

я так на всякий случай уточню, JFolder же подключен? а то не видно по этому коду.
Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3595


« Ответ #23 : 27.03.2016, 13:41:20 »

я так на всякий случай уточню, JFolder же подключен? а то не видно по этому коду.
+dmitry_stas Azn, сам не заметил.
Записан
goga_pgasovav
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 182


Внимательный джумловод


« Ответ #24 : 27.03.2016, 23:32:35 »

Во-первых, спасибо всем за помощь!
Во-вторых, надеюсь я ещё не надоел вам окончательно...
Но, к сожалению, пока что плагин не работает должным образом :/
Я попытался как можно глубже разобраться в причинах, и хотя бы найти проблемный участок кода. И таки нашёл!

Значит, для начала надо вообще удалить проверку if(!$isNew).
Объясняю почему: иногда нужно создать папку для уже существующего материала. А эта проверка не даёт это сделать (проверено!).
Кроме того, хотелось бы, чтобы плагин всё-таки работал в зависимости от опции "создавать/не создавать папку". Пока что обработку этого параметра из кода убрал, т.к. не срабатывало.

Ну и самое главное: пустая белая страница вылетает из-за этих строк:

Код
$categoriesModel=JCategories::getInstance('content');
$category=$categoriesModel->get($article->catid);
$parent=$category->getParent();
 

Когда я их удаляю, а вместо $parent->alias прописываю старое доброе 'news', всё сразу же начинает работать.
Вобщем что-то не так с проверкой главной категории...
Записан
goga_pgasovav
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 182


Внимательный джумловод


« Ответ #25 : 27.03.2016, 23:52:30 »

Да. Вот ещё что добавить хотел.
В каталоге у меня вложенность типа "Основная категория" > "Подкатегория" > Материал – тут получается определить основную категорию как "catalog"
Но у новостей структура проще: "Новости" > Материал – тут основная категория определяется уже как root.
Я понимал, что это усложнит проверку и может повлиять на работоспособность плагина, потому временно убрал 'news' из параметров в плагине.
Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3595


« Ответ #26 : 28.03.2016, 00:38:11 »

Вобщем что-то не так с проверкой главной категории...
Стоит попробовать подключить JСategories: может быть, он тоже не загружен?
Записан
goga_pgasovav
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 182


Внимательный джумловод


« Ответ #27 : 28.03.2016, 00:57:27 »

Стоит попробовать подключить JСategories: может быть, он тоже не загружен?
Спасибо! Попробую. Но дело в том, что когда я ставил событие onContentPrepare, то всё работало и без JFolder и без JСategories  dry
Всмысле проверял вывод параметров с помощью echo
Записан
goga_pgasovav
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 182


Внимательный джумловод


« Ответ #28 : 28.03.2016, 01:12:58 »

Добавил

Код
jimport('joomla.application.categories');

Перестало выбрасывать на пустую страницу, но папки не создаются...
Несколько раз внимательно изучил весь код плагина, особенно ту часть, где проверяются названия категорий и подставляются для создания папок. Всё вроде правильно. Не вижу почему оно не должно работать  Sad
Записан
goga_pgasovav
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 182


Внимательный джумловод


« Ответ #29 : 28.03.2016, 01:21:08 »

Аааааа! Урааа! Победа! Заработало! Azn
Я просто в последней модификации кода забыл название папок в массиве поменять)
Я приводил "catalog" для примера, а на самом деле папка "collection" называется теперь (раньше я сразу поправлял, а в этот раз забыл!)
Вобщем подключение JСategories помогло!
Ещё раз благодарю robert за поддержку и помощь!

P.S.: Пока что этого вполне достаточно. В будущем было бы прекрасно расширить плагин настройками: например поле для воода ID (или alias) категорий, которые необходимо включать в обработку плагином. Ну чтоб каждый раз не поправлять этот вот массив категорий. И будет полноценное решение для всех желающих.

P.S.2: Ну и печально, что опция "создавать/не создавать" не срабатывает... Папки создаются каждый раз для любого материала из перечисленных категорий. А если, к примеру, новость без изображения, и папку создавать не нужно, то она всё равно будет создана.
« Последнее редактирование: 28.03.2016, 01:26:33 от goga_pgasovav » Записан
Страниц: [1] 2  Все   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet