Добавление нового поля в материал Joomla 1.5

Joomla 1.5 новое полеПоявилась необходимость в материалы Joomla 1.5 добавить новое поле, точне добавление поля в стандртный компонент Joomla com_content.

Ну приступим :)

1. Добавление в шаблон интерфейса back-end

Открываем файл administrator/components/com_content/admin.content.html.php - здесь содержится шаблон страницы добавляемого/редактируемого материала. Идем на строку номер 833* где видим закрывающий тег. Непосредственно после него добавляем свою таблицу:

<table class="adminform">
  <tbody>
     <tr>
       <td>Новое поле:</td>
           <td><input id="new_field" class="inputbox" maxlength="255" name="new_field" size="40" type="text" value="<php echo $row->new_field; ?>" /></td>
       <td></td>
       <td></td>
    </tr>
  </tbody>
</table>

2.  Добавление в шаблон интерфейса front-end

Для возможности работы с новым полем непосредственно со страниц сайта, дабовляем в файл components/com_content/views/article/tmpl/form.php:

<table class="adminform">
  <tbody>
     <tr>
        <td>Новое поле:</td>
            <td><input id="new_field" class="inputbox" maxlength="255" name="new_field" size="40" type="text" value="<php echo  $row->new_field; ?>" /></td>
        <td></td>
        <td></td>
    </tr>
   </tbody>
</table>

3. Работа с базой данных

Нам надо в таблице #_content добавить новое поле. Я сделал это через phpMyAdmin. Зашел в таблицу #_content и сделал запрос:

ALTER TABLE jos_content ADD new_field VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL

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

4. Вытаскивание данных

Открываем файл libraries/joomla/database/table/content.php , находим строку class JTableContent extends JTable и добавляем свойство var $new_field = null;

class JTableContent extends JTable {
/** @var string This is our new field */
var $new_field = null;
/** @var int Primary key */
var $id = null;
/** @var string */
var $title = null;

5. Изменение модели компонента

В папке components/com_content/models расположены несколько файлов, функциональное назначение которых отражено в их названии. Например, category.php содержит код отвечающего за вывод данных в формате списка/блога. В случае использования данных из нового поля вне пределов страницы материала/статьи, за которую отвечает файл article.php который не требует модификаций, необходимо будет внести изменения в запрос для выборки из таблицы . Проще всего это сделать найдя в нужном файле текст a.title_alias и добавив в список столбцов a.new_field

Для категорий в файла category.php найти текст:

$query = 'SELECT cc.title AS category, a.id, a.title, a.alias, a.title_alias, a.introtext, ...

И вставить a.new_field:

$query = 'SELECT cc.title AS category, a.id, a.title, a.alias, a.title_alias, a.new_field, a.introtext, ...

6. Вывод нового поля

Для вывода нового поля в самом материале необходимо открыть файл components/com_content/views/article/tmpl/default.php и, добавив в него код, в том месте где хотите его видеть:

<?php echo $this->article->new_field; ?>

Для вывода в списке материалов категории, надо в файле components/com_content/views/category/default_items.php добавить новый столбик в таблице, в верхней стоке будет название, а в строке вывода добавить код:

<?php echo $this->item->new_field; ?>

Ну все, теперь должно все заработать и не забудьте отчистить кэшь ;)

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

Интересные статьи:

  • Артур

    Здравствуйте. Спасибо за статью.
    А как быть с полем типа file?

    • http://facknet.ru fAcknet

      $file = JRequest::getVar( 'filename', '', 'files', 'array' );
      if($file['size'] > 3*1024*1024 )
      $msg = JText::_( 'File more than 3Mb' );
      else
      {
      $filepath="tmp//import.txt";
      if (!JFile::upload($file['tmp_name'], $filepath))
      $msg='Can\'t save file '.$filepath;
      }

      Сначала заполняется ассоциативный массив данными о файле через JRequest::getVar, где filename — имя поля формы, отвечающего за передачу файла. Затем проверяем что файл допустимого размера (меньше 3 мб). И затем через JFile::upload сохраняем файл с именем, заданным в переменной $filepath.

  • Артур

    Спасибо Вам.
    А то я в контроллере уже нагородил ручную загрузку.

  • Айдос

    Здравствуйте, я добавил новое поле, теперь хочу вывести данные по добавленному полю. Например select * from jos_content where new_field = ‘asus’. Как сделать, где запрос писать?

    • http://facknet.ru fAcknet

      Читайте пункт 6. Вывод нового поля.

  • Rediska

    Добавил в настройки материала поле textarea, которое у меня предназначается для вставки кода карты гугла или ядекса, но обнаружил что при сохранении материала html код который находится в етом поле вырезается(в базу попадает уже обрезанный). Как отключить очистку кода в етом поле, или вобще для всех полей.

  • http://facknet.ru fAcknet

    Если честно, тоже была такая проблема, но так и не до ковырялся до решения.

  • Rediska

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

    /libraries/joomla/filter/filterinput.php строка 197.

    $source[$key] = $filter->_remove($filter->_decode($value));
    заменяем на:
    $result = $source;

    Версия Joomla! 1.5.22 Stable

    • http://facknet.ru fAcknet

      Спасибо. Надо попробовать и проверить )

  • Rediska

    Хотя роциональней будет удалить весь foreach, строки 193-199 включительно.

  • Deus34

    А как вывести из админки (при добавлении материала) поле псевдоним (url)?
    При добавлении материала не из админки нет такого поля, а хочется!

    • http://facknet.ru/ Anatoliy

      так из админки надо или из front-end’а ?

      • Deus34

        из front-end (в админке он есть)

        • http://facknet.ru/ Anatoliy

          ну так читай 2 пункт

          • Deus34

            Спасибо!
            Нашел данное поле в шаблоне админки и добавил код в front-end!

  • Петр

    Здравствуйте!
    В редакторе материала всегда присутствует надпись:php echo $row->new_field; ?>
    как ее убрать? Или как сделать так, чтобы там отображалось именно то, что было введено туда заранее? (если ввести туда например *ааа*, то на сайте будет отображаться всё ок, но зайдя на страницу редактирования заново, опять будет *php echo $row->new_field; ?>*

  • http://facknet.ru/ Anatoliy

    Где то забыли поставить какой то знак коде, возможно перед php забыли <

  • http://www.iterra.biz/ Blinoff

    в этом коде «new_field; ?>» забыли «знак вопроса»
    должно быть так  — «new_field; ?>»

  • Skoro3662

    Добрый день! Очень интересная статья. Только вот у меня при внесении данных во вновь созданное  поле и после сохранении нового нового материала. В таблицу content в новое поле не чего не записывает. Подскажите пожалуйста как записать данные и нового поля в таблицу content БД.

  • Skoro3662

    Все разобрался я просто пункт 4 не сохранил! Спасибо огромное великолепная статья! Очень помогла решить одну проблему =)

    • http://facknet.ru/ Anatoliy

      Пожалуйста :)

  • maliska

    Согласная с Skoro3662, заполняю поле в форме, сохраняю статью, птом если мне надо ее открдактировать — вхожу — поля пустые. Почему-то значения не сохраняются. Подскажите, как исправить?

    • http://facknet.ru/ Anatoliy

      Он же написал в чем причина. Смотри пункт 4.

      • maliska

         Я сохранила пункт 4. Ошибки не вижу.

        • http://facknet.ru/ Anatoliy

          все пункты правильно сделала?, какая версия joomlы?

  • maliska

     да, все так, joomla 1.5 я делала для комонента k2, меняя аналогично, естественно, все получилось хорошо, только вт после редактирования значение исчезает.

    • http://facknet.ru/ Anatoliy

      проверь в базу записывается? с K2 не пробовал но говорят работает.

      • maliska

         Да, работает, в базе есть, так как если не редактировать материал, то все нормально выводит в статье каждый раз.

        • http://facknet.ru/ Anatoliy

          значит просто не выводит из базы, смотри ошибки.Проверяй пункт 4, правильно название поля.

          • maliska

             Буду смотреть. Хоть вроде все так. Еще, если можно, вопрос, чтобы эти поля не выводились во всех категориях, как мне прописать условие? Откуда я узнаю id категории (мне нужно только 1 категория)?

          • http://facknet.ru/ Anatoliy

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