Перейти к содержимому


Фотография
- - - - -

Не индексируется поле, в которое при сохранении материала копируется его ID.


Лучший Ответ SmetDenis , 12 March 2014 - 16:05

Да, такой баг может быть.
Дело в том, что событие saved вызывается уже после сохранения в базу данных.
А авто-индексация проходит до сохранения.

Получается, что ваш код должен находится в этом месте
66e_200x0.png

Можете показать полный листинг вашей функции saved ? Перейти к сообщению


  • Закрытая тема Тема закрыта
Сообщений в теме: 3

#1 .polega.

.polega.

Отправлено 11 March 2014 - 18:14

В продолжение этой темы и частично этой темы

 

Обнаружился глюк в реализации хака, позволяющего копировать ID материала в нужное поле при подаче нового материала. При создании нового материала он должен автоматом индексироваться, за этим следит сам JBZOO.

И всё вроде бы нормально, все поля индексируются (проверял таким образом - пытаюсь найти через поиск только что созданный новый материал, задаю его конкретные параметры - находит, всё нормально), за исключением поля, в которое копируется ID материала. Поиск по этому полю новых материалов невозможен без принудительной ручной переиндексации, что собственно напрягает.

Я так понимаю, что проблема была сразу, просто как-то не замечали. Не работал поиск - тупо переиндексировали, и всё нормально. А сегодня, после очередной жалобы менеджеров на то, что не работает поиск по ID материала, решил сам проверить, что за ерунда так часто с этим поиском. Ну и нарисовалась проблема :)

Может разработчики глянут ещё раз на реализацию хака, позволяющего копировать ID в нужное поле при подаче? Чтобы была автоматическая  индексация этого поля.

 


  • 0

#2 SmetDenis

SmetDenis

Отправлено 12 March 2014 - 16:05   Лучший Ответ

Да, такой баг может быть.
Дело в том, что событие saved вызывается уже после сохранения в базу данных.
А авто-индексация проходит до сохранения.

Получается, что ваш код должен находится в этом месте
66e_200x0.png

Можете показать полный листинг вашей функции saved ?
  • 0
JBZoo v4.0 и новый чудный мир Open Source GPL
Отключайте проверку лицензий как можно скорее!



— Есть два типа людей: Кто еще не делает бекапы и кто уже делает бекапы.


#3 .polega.

.polega.

Отправлено 12 March 2014 - 16:17

вот полный код файла /media/zoo/applications/jbuniversal/framework/events/jbevent.item.php

с хаком, позволяющим копировать ID в нужное поле при сохранении.

<?php
/**
 * JBZoo App is universal Joomla CCK, application for YooTheme Zoo component
 *
 * @package     jbzoo
 * @version     2.x Pro
 * @author      JBZoo App http://jbzoo.com
 * @copyright   Copyright (C) JBZoo.com,  All rights reserved.
 * @license     http://jbzoo.com/license-pro.php JBZoo Licence
 * @coder       Denis Smetannikov <denis@jbzoo.com>
 */

// no direct access
defined('_JEXEC') or die('Restricted access');


/**
 * Class JBEventItem
 */
class JBEventItem extends JBEvent
{

    /**
     * On item init
     * @param AppEvent $event
     */
    public static function init($event)
    {
    }

    /**
     * On item saved event
     * @static
     * @param $event AppEvent
     * @return null
     */
    public static function saved($event)
    {
        // vars
        $app      = self::app();
        $item     = $event->getSubject();
        $itemType = $item->getType()->id;

        // hack for JBZoo import optimization
        if ($item->getParams()->get('jbzoo.no_index', 0) == 1) {
            return null;
        }

        // update index data
        $app->jbtables->checkSku(true);

        $indexTableName = $app->jbtables->getIndexTable($item->getType()->id);
        if ($app->jbtables->isTableExists($indexTableName, true)) {
            JBModelSearchindex::model()->updateByItem($item);

        /////////////////   код для копирования ID в нужное поле  ///////////////////////////
        $item = $event->getSubject(); // получаем объект сохраняемого материала
         
        // чтобы не было бесконечного цикла (должно выполнятся всегда, иначе будут проблемы с импортом)
        $item->getParams()->set('jbzoo.no_index', 1); 

        // для обычного поля text (а также проверка существования элемента)
        if ($item->getElement('9594d3bd-b58c-4adf-97c7-77dae1d7e27f')) {
          $item->getElement('9594d3bd-b58c-4adf-97c7-77dae1d7e27f')->bindData(array(
              array('value' => $item->id)
          ));
         
          // сохраняем изменения
          self::app()->table->item->save($item);
          }
        /////////////////   конец вставки для копирования ID в нужное поле  ///////////////////////////
        }
    }

    /**
     * On item deleted event
     * @static
     * @param $event AppEvent
     */
    public static function deleted($event)
    {
        // vars
        $app      = self::app();
        $item     = $event->getSubject();
        $itemType = $item->getType()->id;

        // check index table
        $tableName = $app->jbtables->getIndexTable($itemType);
        if (!$app->jbtables->isTableExists($tableName)) {
            $app->jbtables->createIndexTable($itemType);
        }

        // update index data
        JBModelSku::model()->removeByItem($item);
        JBModelSearchindex::model()->removeById($item);

        // execute item trigger
        $jbimageElements = $item->getElements();
        foreach ($jbimageElements as $element) {
            if (method_exists($element, 'triggerItemDeleted')) {
                $element->triggerItemDeleted();
            }
        }
    }

    /**
     * On item status changed
     * @param AppEvent $event
     */
    public static function stateChanged($event)
    {
    }

    /**
     * On item before display
     * @param AppEvent $event
     */
    public static function beforeDisplay($event)
    {
    }

    /**
     * On item after display
     * @param AppEvent $event
     */
    public static function afterDisplay($event)
    {
    }

    /**
     * On item before save category relations
     * @param AppEvent $event
     */
    public static function beforeSaveCategoryRelations($event)
    {
    }

    /**
     * On item order
     * @param AppEvent $event
     */
    public static function orderQuery($event)
    {
        $order     = $event->getSubject();
        $ordParams = $event->getParameters();

        $newOrder = self::app()->jborder->setItemOrder($order, $ordParams['result']);

        if ($newOrder) {
            $ordParams['result'] = $newOrder;
        }

    }

}

Сообщение отредактировал realtygroupinfo: 12 March 2014 - 17:25

  • 0

#4 .polega.

.polega.

Отправлено 13 March 2014 - 06:04

перенёс "код для копирования ID в нужное поле" на место перед строкой "// update index data" (т.е. в то место, которое указал Денис).

я всё правильно сделал по логике программы?

 

вроде работает корректно.

будем наблюдать.

Денис, спасибо.


  • 1




Click to return to top of page in style!