PDA

Просмотр полной версии : tt_news, экстракт cHash для линки


kyzma
12.11.2007, 14:09
Пишу расширение которое берет контент новости из tt_news c ссылкой на эту новость. При формировании ссылки не удается достать cHash. Откуда берется этот параметр???????????????

Pavel Antonov
12.11.2007, 14:51
Генерируется функцией typolink

kyzma
12.11.2007, 15:09
Спасибо. Счас ещё этот вариант проверю. Нашел решение, как вообще не использовать cHash

надобыло немножко похакать tt_news

т.е. теперь ссылка вида
http://t3.test/index.php?
id=новостная страница
&tx_ttnews[tt_news]=новость

корректно работает без добавления хвоста из Pid и cHash

dmartynenko
14.11.2007, 19:43
корректно работает без добавления хвоста из Pid и cHash
Зато теперь у тебя вероятнее всего не кэшируются страницы (программный no_cache) где вставлено расширение tt_news.

Что не есть хорошо для нагруженных сайтов.

cHash - параметр позволяющий кэшировать новости.

kyzma
14.11.2007, 22:35
а куда вообще эти новости кешируются? как расчитать cHash? Почему его нет в таблицах?

dmartynenko
15.11.2007, 13:43
а куда вообще эти новости кешируются? как расчитать cHash? Почему его нет в таблицах?

Кэшируются во внутренний кэш typo3. Но не новости, а страницы (сгенеренный html код), где размещен контент-элемент новостей.

cHash расчитывается на основе параметров из URL, и позволяет typo3 кэшировать одну страницу с разным контентом. Здесь описано подробно: http://typo3.org/development/articles/the-mysteries-of-chash/

В двух словах как это работает:
1. Обычно typo3 кэширует страницу по id - http://t3.test/index.php?id=ххх
2. Если на странице размещен например контент-элемент новости (а это кэшируемый тип плагина USER), то кэшируется он вместе со страницей один раз, т.е. будет показываться какая-то одна новость (та, которая попалась при первом открытии страницы).
3. Что бы на одной странице можно было показать разные новости, и при этом она кэшировалась (с разными новостями), то нужно добавить в URL cHash - тогда кэшируется страница со своим контентом именно по cHash (т.е. в кэше оказывается много вариантов одной и той же страницы). Это происходит автоматически внутри typo3 уже упомянутой функцией typolink

razawa
22.11.2007, 16:50
Второй день бьюсь:

Вставил PHP_CONTENT на страницу.
Нужно по GET-параметрам выбирать определенные данные, ссылка в таком виде: ?id=258&mon=05&day=15
Но, если я на страницу захожу без параметров mon и day - мне нужно найти последнюю имеющуюся комбинацию этих параметров, что я и делаю.
Но как привязать найденные mon и day к кешированию...? В основном люди будут заходить на страницу именно только по id=258, чтобы прочитать последнее поступление. И желательно чтобы оно сразу и прокешировалось вместе с cHash
Код:


.... выше определюятся mon и day (к кешированию не относится) ...

// Вставляю найденные mon и day в _GET в надежде, что они будут восприняты как пришедшие извне:
t3lib_div::_GETset(Array('day'=>$maxday, 'mon'=>$maxmon, 'vipusk'=>$maxvipusk));
// следующий код взял из makeCacheHash()
$GET = t3lib_div::_GET();
$this->cHash_array = t3lib_div::cHashParams(t3lib_div::implodeArrayForU rl('',$GET));
$cHash_calc = t3lib_div::shortMD5(serialize($this->cHash_array));
$GLOBALS['TSFE']->cHash = $cHash_calc;
// $cHash_calc расчитывается, все верно, но как его привязать к странице без GET...

// Уже даже решил загнать cHash в _GET:
t3lib_div::_GETset(Array('cHash'=>$cHash_calc));

// А начинал вот с этого
$this->piVars = t3lib_div::_GET();
if ($this->pi_checkCHash && count($this->piVars)) {
// $GLOBALS['TSFE']->makeCacheHash();
$GLOBALS['TSFE']->reqCHash();
};

При вызове в ссылке "?id=258&mon=01&day=15&cHash=80b8d87d0f" кешируется нормально, как и должно быть. А если просто зайти без параметров - не то.

dmartynenko
22.11.2007, 17:17
Но, если я на страницу захожу без параметров mon и day - мне нужно найти последнюю имеющуюся комбинацию этих параметров, что я и делаю.
Но как привязать найденные mon и day к кешированию...? В основном люди будут заходить на страницу именно только по id=258, чтобы прочитать последнее поступление.

Странный подход, мне кажется Вы слишком усложняете вашу задачу...
Что мешает на странице без параметров вывести только последние поступления (отобрав последние записи по дате из БД) ?

При этом кэширование страницы настроить на определенный срок - 1 час, 3 часа и т.п. (по умолчанию кэш храниться 24 часа). И каждые Х часов у вас будет новая кэшированная страница с последними "новостями".

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

razawa
22.11.2007, 17:38
Странный подход, мне кажется Вы слишком усложняете вашу задачу...
Та "усложняю" - не то слово :-)

Последнее то я получу. Но оно ведь позже потеряется, у него нет cHash
Я предполагал что сделать. Сверху страницы форма с выбором даты (день/месяц/год/номер выпуска). Ниже - текст последнего поступления.
При выборе даты - передаются _GET
Можно кешировать и каждые 4 часа.
Тогда встречный вопрос. А как мне из формы передавать значения cHash, чтобы правильно организовать ссылку? Или это не обязательно? Просто указать cHash=1?
Или Crawler мне поможет? (вспомнил про него). Вот. Наверное нужно его натравить.

И вообще, посмотрите как работают другие подобные плагины и почитайте доки по их разработке. Мне кажется вы не используете массу возможностей typo3, а копаете глубоко, но не туда.
та залез на свою голову :-) Впервые решился заняться программированием под Typo3 и залез :-)

dmartynenko
22.11.2007, 22:15
Тогда встречный вопрос. А как мне из формы передавать значения cHash, чтобы правильно организовать ссылку? Или это не обязательно? Просто указать cHash=1?

PHP_CONTENT - это не то. Делайте свой плагин через kickstarter.

Обычно плагины наследуются от класса tslib_pibase
В нем много функций вида pi_link***, которые как раз и предназначены для формирования "правильных" ссылок.
При указании параметра $cache=1 будет добавляться нужный cHash (конечно только в том случае, когда плагин допускает кэширование - но это отдельный разговор - читайте доки так сказать).

Также обычно в формах (типа поиска) делается скрытое поле no_cache=1. Тогда typo3 не будет кэшировать выдаваемую страницу и контент отобразиться нужный.

Как в форме выбирать ссылки правильно сгенеренные pi_link* - это скорее вопрос правильно организации программы, а не такого хака typo3.

В вашем случае можно делать выбор даты не в select-ах формы (это ж не удобно!), а в виде календарика.

razawa
23.11.2007, 09:51
Я бы не назвал это Плагином :-) Просто небольшой скрипт, который к тому же не работает с базой данных, а работает с файлами.
Скрипт мой наследует tslib_pibase, но pi_link*** - на сколько я понял, организовывают ссылку уже внутри скрипта, но у меня сразу выдается содержимое. pi_link - действительно можно будет использовать в календарике (это пока только в планах заменить форму на календарик).
Пока решил обойтись Crawler-ом и кешированием через 3-4 часа. Но тут есть несколько моментов: новые данные могут поступить и через 3 часа (чаще - уж врядли), но и через 2 недели. И кеширование страницы каждые 3 часа может быть впустую (а это минимум 250 кБт). И второе - научить неподготовленных пользователей работе с Crawler, это будет самое сложное :-)
А вот если бы сразу системе определить и передать cHash, чтобы она с ним проиндексировалась - это было бы решение проблемы. Я пока еще буду биться :-)

Вчера, ради интереса, вспомнил и попробовал с 10-к других CMS - всетаки как Typo3 отличается от них. Я теперь на 200% уверен в своем выборе :-)

dmartynenko
23.11.2007, 15:08
Пока решил обойтись Crawler-ом и кешированием через 3-4 часа. Но тут есть несколько моментов: новые данные могут поступить и через 3 часа (чаще - уж врядли), но и через 2 недели. И кеширование страницы каждые 3 часа может быть впустую (а это минимум 250 кБт).
Перегенерация страницы каждые 3 часа вряд ли создаст серьезную нагрузку на сервер - этим можно пренебречь.
Также можно настроить кэширование на много дней, а при поступлении новых данных очищать кэши для нужных страниц.


А вот если бы сразу системе определить и передать cHash, чтобы она с ним проиндексировалась - это было бы решение проблемы. Я пока еще буду биться :-)
Этот "хак" вряд ли сработает. TYPO3 делает выборку из кэша до того, как будут выполнены ваши скрипты. Поэтому программно добавить cHash уже на этапе генерации страницы ничего не даст в плане работы кэширования.