sergeytolkachyov / WT-Content-Image-Gallery

Image gallery plugins package for insertion into Joomla articles and modules, as well as wherever the content group plugins work. Create your own image gallery layouts
https://web-tolk.ru/en/dev/joomla-plugins/wt-content-image-gallery
GNU General Public License v3.0
3 stars 0 forks source link

Ошибка индексации #2

Closed mediafoks closed 10 months ago

mediafoks commented 10 months ago

Joomla 5 чистая, PHP 8.2.8, MySQL 8. Установлен плагин WT Content Image Gallery. При индексации выдается ошибка "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3". Оказалось, что из-за плагина WT Content Image Gallery. Отключил плагин, индексация заработала. Проиндексировал, потом включил плагин опять. PS: плагин - бомба. Спасибо за разработку.

sergeytolkachyov commented 10 months ago

Странно... Проверка на индексацию в плагине есть. https://github.com/sergeytolkachyov/WT-Content-Image-Gallery/blob/bd3c3ca75f0f775cdf3876b468a2cfe1bc39685f/wtcontentimagegallery/src/Extension/Wtcontentimagegallery.php#L73C7-L73C7 Можете колстак ошибки скинуть?

mediafoks commented 10 months ago

Странно... Проверка на индексацию в плагине есть. https://github.com/sergeytolkachyov/WT-Content-Image-Gallery/blob/bd3c3ca75f0f775cdf3876b468a2cfe1bc39685f/wtcontentimagegallery/src/Extension/Wtcontentimagegallery.php#L73C7-L73C7 Можете колстак ошибки скинуть?

https://github.com/sergeytolkachyov/WT-Content-Image-Gallery/assets/106742407/23e1b95c-30c6-4584-91e2-135bcae7082f

А колстак ,где его взять?

sergeytolkachyov commented 10 months ago

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

https://github.com/sergeytolkachyov/WT-Content-Image-Gallery/assets/6236403/929ac0e8-82a7-4ecc-b80a-254e69dca353

mediafoks commented 10 months ago

Я понял где начинается проблема.

nat_01

Вот смотрите. У меня есть custom field типа "Editor". В материале, в это поле я вставляю код галереи {gallery}...{/gallery}, на сайте галерея выводится, всё работает прекрасно.

nat_02

nat_03

Та вот, при таком раскладе индексация выдаёт ошибку. Но если просто временно это поле снять с публикации, то индексация проходит отлично. Иными словами галерея в custom_field - editor что-то барахлит.

sergeytolkachyov commented 10 months ago

Очень интересно )) Нужно смотреть с каким контекстом запускается индексация полей. ЧуднО )

mediafoks commented 10 months ago

Причем в параметрах поля выбрано "Недоступно для поиска". Если поставить "Доступно", то все равно ошибка индексации. И так, и так, разницы никакой.

nat4

sergeytolkachyov commented 10 months ago

А попробуйте туда любой другой контент плагин вставить, вместо моего. Видео с ютуба какое-нибудь с помощью AllVideos - будет такая же ошибка?

mediafoks commented 10 months ago

Начал копать дальше. Простите, оказалось, что это мой косяк. Со стандартным шаблоном галереи всё работает прекрасно. Но у меня свой шаблон, и вот с ним какая-то проблема. В своем шаблоне из БД я получаю заголовок материала ,чтобы вставить его в ALT картинки, только и всего. Может подскажете где я накосячил?



/**
 * @package       WT Content Image gallery
 * @version       1.0.0
 * @Author        Sergey Tolkachyov, https://web-tolk.ru
 * @copyright     Copyright (C) 2023 Sergey Tolkachyov
 * @license       GNU/GPL http://www.gnu.org/licenses/gpl-3.0.html
 * @since         1.0.0
 */

use Joomla\CMS\HTML\HTMLHelper;

defined('_JEXEC') or die;

/**
 * Note! This is a demo layout that shows how to access the list of images in PHP.
 * It is not intended for use on websites and serves simply as a sample.
 *
 * @var $context  string  Like 'com_content.article'
 * @var $images   array Images array
 * @var $iterator int regex iterator - 0, 1, 2 etc. Shortcode number
 *
 * For your images gallery layouts your can make unique id or data-attributes
 * combining $context and $iterator.
 * For example: <img src="'.$image['img_src'].'" id="'.$context.'-'.$iterator.'" />
 * You will receive: <img src="images/you-image.webp" id="com_content.article-0" />
 */

/**
 * @var $unique string Unique string for unique id.
 */

// Достаем данные материала из базы данных
use Joomla\CMS\Factory;

$db = Factory::getContainer()->get('DatabaseDriver');
if ($context === 'com_contact.contact') {
    $query = $db
        ->getQuery(true)
        ->select('name')
        ->from('#__contact_details')
        ->where('id' . ' = ' . Factory::getApplication()->input->get('id'));
} else {
    $query = $db
        ->getQuery(true)
        ->select('title')
        ->from('#__content')
        ->where('id' . ' = ' . Factory::getApplication()->input->get('id'));
};
$db->setQuery($query);
$current_title = $db->loadResult();
$page_title = Factory::getDocument()->getTitle();
// если есть заголовок материала, то выводим его, иначе выводим заголовок страницы
$img_alt = $current_title ? $current_title : $page_title;
// END Достаем данные материала из базы данных

$unique = str_replace(['-', '.'], '_', $context) . '_' . $iterator;
?>
<div class="gallery gallery-length-<?php echo count($images); ?>">
    <?php foreach (array_reverse($images) as $image) : ?>
        <a href="<?php echo $image['img_src']; ?>" target="_blank" title="<?php echo $img_alt; ?>" data-lightgallery="photo">
            <?php
            $img_attribs = [
                'loading' => 'lazy',
                'decoding' => 'async',
            ];
            echo HTMLHelper::image($image['img_src'], $img_alt, $img_attribs);
            ?>
        </a>
    <?php endforeach; ?>
</div>```
sergeytolkachyov commented 10 months ago

Не надо напрямую из базы дёргать. Нужно брать из модели (Model - MVC), тогда лишнего запроса в базу не будет и работать всё будет нормально. Посмотрите, как я в плагине сео шаблонов это делаю

https://github.com/sergeytolkachyov/WT-SEO-Meta-templates---Content/blob/78bd4554c0a23f9cdeee0ba9fbb7bc0c7fae6fe5/src/Extension/Wt_seo_meta_templates_content.php#L281

sergeytolkachyov commented 10 months ago

Нейспейсы только нужные подключить

mediafoks commented 10 months ago

Спасибо! Заголовок страницы я получил таким образом:

use Joomla\CMS\Factory;

$app = Factory::getApplication();
$model = $app->bootComponent('com_content')->getMVCFactory()->createModel('Article', 'Site', ['ignore_request' => false]);
$article = $model->getItem($id);
$article_title = $article->title;

Но вот теперь при индексации получаю ошибку: "Call to undefined method Joomla\CMS\Application\AdministratorApplication::getParams()"

sergeytolkachyov commented 10 months ago

Индексация идёт из Приложения Администратора, а не Сайта. id нужно откуда-то брать...

mediafoks commented 10 months ago

Огромное спасибо за помощь. Больше у меня ума не хватает, оставлю как есть.

sergeytolkachyov commented 10 months ago

Начал копать дальше. Простите, оказалось, что это мой косяк. Со стандартным шаблоном галереи всё работает прекрасно. Но у меня свой шаблон, и вот с ним какая-то проблема. В своем шаблоне из БД я получаю заголовок материала ,чтобы вставить его в ALT картинки, только и всего. Может подскажете где я накосячил?


/**
 * @package       WT Content Image gallery
 * @version       1.0.0
 * @Author        Sergey Tolkachyov, https://web-tolk.ru
 * @copyright     Copyright (C) 2023 Sergey Tolkachyov
 * @license       GNU/GPL http://www.gnu.org/licenses/gpl-3.0.html
 * @since         1.0.0
 */

use Joomla\CMS\HTML\HTMLHelper;

defined('_JEXEC') or die;

/**
 * Note! This is a demo layout that shows how to access the list of images in PHP.
 * It is not intended for use on websites and serves simply as a sample.
 *
 * @var $context  string  Like 'com_content.article'
 * @var $images   array Images array
 * @var $iterator int regex iterator - 0, 1, 2 etc. Shortcode number
 *
 * For your images gallery layouts your can make unique id or data-attributes
 * combining $context and $iterator.
 * For example: <img src="'.$image['img_src'].'" id="'.$context.'-'.$iterator.'" />
 * You will receive: <img src="images/you-image.webp" id="com_content.article-0" />
 */

/**
 * @var $unique string Unique string for unique id.
 */

// Достаем данные материала из базы данных
use Joomla\CMS\Factory;

$db = Factory::getContainer()->get('DatabaseDriver');
if ($context === 'com_contact.contact') {
  $query = $db
      ->getQuery(true)
      ->select('name')
      ->from('#__contact_details')
      ->where('id' . ' = ' . Factory::getApplication()->input->get('id'));
} else {
  $query = $db
      ->getQuery(true)
      ->select('title')
      ->from('#__content')
      ->where('id' . ' = ' . Factory::getApplication()->input->get('id'));
};
$db->setQuery($query);
$current_title = $db->loadResult();
$page_title = Factory::getDocument()->getTitle();
// если есть заголовок материала, то выводим его, иначе выводим заголовок страницы
$img_alt = $current_title ? $current_title : $page_title;
// END Достаем данные материала из базы данных

$unique = str_replace(['-', '.'], '_', $context) . '_' . $iterator;
?>
<div class="gallery gallery-length-<?php echo count($images); ?>">
  <?php foreach (array_reverse($images) as $image) : ?>
      <a href="<?php echo $image['img_src']; ?>" target="_blank" title="<?php echo $img_alt; ?>" data-lightgallery="photo">
          <?php
          $img_attribs = [
              'loading' => 'lazy',
              'decoding' => 'async',
          ];
          echo HTMLHelper::image($image['img_src'], $img_alt, $img_attribs);
          ?>
      </a>
  <?php endforeach; ?>
</div>```

Можно класть рядом с картинками labels.txt посмотрите по документации как он называться должен. И туда альты писать.

mediafoks commented 10 months ago

Можно класть рядом с картинками labels.txt посмотрите по документации как он называться должен. И туда альты писать.

Да, можно и я так делаю, всё отлично работает. Но не всегда это удобно. Вот представьте, новостной сайт, куча статей, в статье бывает галерея на 50 фото, а то и больше. В таком случае вовсе не требуется прописывать ALT для каждой фотографии. Это неудобно. Гораздо проще всем фото указать в качестве ALT - заголовок материала. Что я и пытался сделать. Как видно, не очень получилось. Вот бы в настройках галереи была возможность указать единый ALT для всех фото, типа {gallery tmpl=default alt=блабла} Либо в labels.txt написать что-то типа *|блабла

sergeytolkachyov commented 10 months ago

Вот бы в настройках галереи была возможность указать единый ALT для всех фото, типа {gallery tmpl=default alt=блабла} Либо в labels.txt написать что-то типа *|блабла

Это будет неправильно с точки зрения СЕО. Атрибут alt должен описывать данную конкретную картинку. Причем там не ключевики нужно писать, а конкретно то, что на ней изображено. Описывать картинку так, как будто незрячему описываете или обучаете ИИ.

Для этой картинки image правильный alt будет не "Заказать торт на день рождения в Москве от ХХХХ рублей", а "бисквитный торт крупным планом, политый коричневым кремом и обильно украшенный ягодами малиной, голубикой, ещё какой-то ягодой. добавлено немного зефира. На шоколадной пластинке белая надпись С днём рождения."