Основной курс по Joomla
0 Пользователей и 1 Гость просматривают эту тему.
  • 31 Ответов
  • 855 Просмотров
*

goga_pgasovav

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

goga_pgasovav

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

goga_pgasovav

  • Осваиваюсь на форуме
  • ***
  • 182
  • 0
  • Внимательный джумловод
Вобщем сделал частично, но пока, что называется, "через задницу".

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

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

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

Код: php
//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. Эта хрень выполняется каждый раз, когда загружается страница со статьёй  :o
2. Срабатывает только после того, как страницу хотя бы один раз загрузили, т.е. выполнился РНР-код.

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

voland

  • Профи
  • ********
  • 9383
  • 420
  • Эта строка съедает место на вашем мониторе
Здесь нужно использовать плагины. И смотреть какие события удобнее использовать
*

goga_pgasovav

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

voland

  • Профи
  • ********
  • 9383
  • 420
  • Эта строка съедает место на вашем мониторе
Зачем ***кодить?
Проще написать плагинчик и спокойно забыть о проблеме.
А то как обновляться то будете?
*

goga_pgasovav

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

voland

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

robert

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

SeBun

  • Практически профи
  • *******
  • 3085
  • 187
  • @SeBun48
Оказываю услуги по Joomla | Миграция на Joomla 3.x | Администрирование | Разработка
Ник занят
*

goga_pgasovav

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

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

KKAAZZOO

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

Так в чем проблема? Идите в коммерческий раздел
*

goga_pgasovav

  • Осваиваюсь на форуме
  • ***
  • 182
  • 0
  • Внимательный джумловод
KKAAZZOO, Вы, видимо, читаете обрывками
*

KKAAZZOO

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

goga_pgasovav

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

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

Код: xml
<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
<?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

  • Осваиваюсь на форуме
  • ***
  • 182
  • 0
  • Внимательный джумловод
KKAAZZOO, не увидел сразу Ваше сообщение. Я говорил, что рассмотрю предложения, и тогда видно будет, смогу ли я за это заплатить. Так или иначе сам пробовать начал  :dry:
*

robert

  • Профи
  • ********
  • 4009
  • 371
Зачем еще раз загрузить JTableContent? Он и так уже передан. Попробуйте так
Спойлер
[свернуть]
На счет свойства $article->create_folder не уверен, если он не передан, то получите по-вашему.
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.
*

goga_pgasovav

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

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

goga_pgasovav

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

Спойлер
[свернуть]

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

robert

  • Профи
  • ********
  • 4009
  • 371
Не хватало "/":
Спойлер
[свернуть]
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.
*

goga_pgasovav

  • Осваиваюсь на форуме
  • ***
  • 182
  • 0
  • Внимательный джумловод
robert, вы знаете, что-то не срабатывает. Пытаюсь сохранить и выбрасывает на белую страницу  :(
*

robert

  • Профи
  • ********
  • 4009
  • 371
Спойлер
[свернуть]
Исправлен по замечанию dmitry_stas.
« Последнее редактирование: 27.03.2016, 14:44:52 от robert »
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.
*

dmitry_stas

  • Профи
  • ********
  • 9680
  • 932
я так на всякий случай уточню, JFolder же подключен? а то не видно по этому коду.
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

robert

  • Профи
  • ********
  • 4009
  • 371
я так на всякий случай уточню, JFolder же подключен? а то не видно по этому коду.
+dmitry_stas :), сам не заметил.
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.
*

goga_pgasovav

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

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

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

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

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

goga_pgasovav

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

robert

  • Профи
  • ********
  • 4009
  • 371
Вобщем что-то не так с проверкой главной категории...
Стоит попробовать подключить JСategories: может быть, он тоже не загружен?
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.
*

goga_pgasovav

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

goga_pgasovav

  • Осваиваюсь на форуме
  • ***
  • 182
  • 0
  • Внимательный джумловод
Добавил

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

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

goga_pgasovav

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

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

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