PDA

Просмотр полной версии : Свой PHP-код на TYPO3


heken
26.04.2011, 01:27
Всем привет!
Ситуация такая: есть отдельно созданная таблица в базе данных сайта на TYPO3. Нужно выводить содержимое на страницы сайта. \вопрос как это сделать?
Мои соображения:
в директории fileadmin создать папку. в нее сложить скрипты обработчики таблицы. создать новый материал (чистый хтмл). проинклудить(?) файлы ПХП. получить результат.
Схему эту не пробовал. в TYPO новичок. Наверняка придется что-то писать в TS, или даже создавать отдельный шаблон для этой (этих) страниц. Вот тут и начинаются пляски с бубном. что делать, подскажите!

Андрей Аксенов
26.04.2011, 09:53
Тебе нужно вот это (http://www.typo3-tesseract.com/ru/), там же документация на русском.

reva2
26.04.2011, 23:09
Андрей, зачем человеку такие сложности для вывода записей из одной таблицы?

Heken самый простой вариант это подключить ваш скрипт через TypoScript (см. эту документацию (http://typo3.org/documentation/document-library/core-documentation/doc_core_tsref/4.4.0/view/1/7/#id2640097)).

Андрей Аксенов
26.04.2011, 23:25
ну можно и так... кстати перевод этого документа тоже здесь есть (http://forum.typo3.biz/showthread.php?t=9092)... Его версия для TYPO3 4.5 появится примерно через месяц, ну а перевод, как переведу...
Можно посмотреть еще и это (http://forum.typo3.biz/showthread.php?t=9235), хоть и старое руководство, но основы те же.
Ну а что касается сложностей, которые я посоветовал, то там все как раз очень просто... Запрос к базе данных, шаблон на чем угодно, том же PHP, ну и все увязать в диспетчере - и все выведено!
Тут уж кому что проще, не угадаешь.

heken
03.05.2011, 15:24
Спасибо! нужно старое руководство (v.4.1.3)

Anlov
17.05.2011, 20:17
аналогичная ситуация. нельзя ли простенький пример, как с помощью php-скрипта получить значение поля uid к примеру из таблицы page? как к базе приконнектиться? как читать данные из ее таблиц?

Андрей Аксенов
17.05.2011, 22:08
Если с помощью php-сценария - то это к руководству по php. А если посредством typoscript, то нужно читать справочник Tref, перевод последней версии которого надеюсь закончить за неделю. Пример прям оттуда:
page.60 = CONTENT

page.60 {

table = tt_content

select {

pidInList = 73

where = header != ###whatever###

orderBy = ###sortfield###

markers {

whatever.data = GP:first

sortfield.value = sor

sortfield.wrap = |ting

}

}

}

как-то так

Anlov
18.05.2011, 13:02
Сорри, но тот TREF, что у меня мало чем может помочь. Как можно понять вот это: orderBy SQL-orderBy Без "order by"! Например, "sorting, title"? А уж как это все использовать - вообще нигде не нашел (я не про справочник). Поэтому и спрашивал, как из PHP скрипта подцепиться к базе данных Typo3 и выбрать оттуда какие-нибудь данные?

И опять-же - согласно TREF, CONTENT служит для получения данных из tt_content, а мне надо из pages.

Андрей Аксенов
18.05.2011, 13:11
Ну переписывать всем TSref не имеет смысла, тем более ссылки на него и перевод имеются выше. Новая версия (пока английская) имеется в репозитории TYPO3 - появилась позавчера.
Выше привел пример доступа к данным в полях таблицы из TypoScrypt.
Если не ясно что-то с TypoScrypt, то и здесь доступен официальный русский перевод (ключ расширения doc_tut_ts45_ru).
Понимаю, что TYPO3 изучить непросто, для этого и стараюсь делать перевод документации.
Стремление обучиться тоже похвально, но каждому заново повторять одно и то же - читайте документацию, там все есть...

Anlov
18.05.2011, 13:58
нет, там далеко не все есть. если уж мы говорим про TypoScript, скажите мне, где в документации (TREF, Typo3 by examples, FTB) написано, как в TypoScript получить значение ID текущей страницы?
tt_pages = COA
tt_pages.wrap = |<HR>
tt_pages.10 = TEXT
tt_pages.10.field = author
tt_pages.10.wrap = | <BR>
tt_pages.20 = TEXT
tt_pages.20.field = SYS_LASTCHANGED
lib.field_author = RECORDS
lib.field_author.source = ??? здесь должен быть ID страницы, в данный момент выведенной на экран
lib.field_author.tables = pages
lib.field_author.conf.pages < tt_pages

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

Андрей Аксенов
18.05.2011, 14:35
где в документации (TREF, Typo3 by examples, FTB) написано, как в TypoScript получить значение ID текущей страницы?
не буду спорить... открываем TSref здесь (http://typo3.org/documentation/document-library/core-documentation/doc_core_tsref/4.5.0/view/1/2/#id2313303), ищем page_id:
A page id (int) or "this" (=current page id)
как из подключенного пхп скрипта подключиться к базе данных Typo3 и прочитать оттуда нужные записи??? То есть, как сделать тоже самое, но из пхп?
Ответ ищем в расширениях, но вообще понадобиться документ doc_core_api, которые также переведен. Там ищем "t3lib_DB" и находим:
Функции: $GLOBALS['TYPO3_DB']->
exec_INSERTquery
exec_UPDATEquery
exec_DELETEquery
exec_SELECTquery

API доступа к базе данных.

Для совместимости с Database Abstraction Layers, для доступа к базе данных всегда необходимо использовать глобальный объект $TYPO3_DB. Класс "t3lib_db" содержит список функций оберток MySQL (sql(), sql_fetch_assoc(), и т.п.), которые могут использоваться почти как есть. Просто воспользуйтесь поиском/заменой.
Но рекомендуется перенести свое приложение для непосредственного использования четырех выполняемых функций. Это позволяет одновременно построить запрос и выполнит его.
Обратитесь к документа­ции руководства по программированию, t3lib_db API и Inside TYPO3 за дополнительной информацией.

Вставка записи:
Просто внесите в массив пары "поле => значение" и передайте в функцию exec_INSERTquery() вместе с названием таблицы, в которую все это должно быть вставлено:

$insertFields = array(
    'md5hash' => $md5,
    'tstamp' => time(),
    'type' => 2,
    'params' => $inUrl
);
$GLOBALS['TYPO3_DB']->exec_INSERTquery(
    'cache_md5params',
    $insertFields
);
Обновление записи:
Перед вызовом exec_UPDATEquery(), создайте массив пар "поле => значение". Вызов функции происходит почти как при вставке, но необходимо добавить условие WHERE для обновления необходимых записей. Это второй назначаемый аргумент, вроде значения "uid=???".

$fields_values = array(
    'title' => $data['sys_todos'][$key]['title'],
    'deadline' => $data['sys_todos'][$key]['deadline'],
    'description' => $data['sys_todos'][$key]['description'],
    'tstamp' => time()
);
$GLOBALS['TYPO3_DB']->exec_UPDATEquery(
    'sys_todos',
    'uid=' . intval($key),
    $fields_values
);
Удаление записи:
Вызовите exec_DELETEquery() с названием таблицы и условием выбора WHERE для удаляемых записей:

$GLOBALS['TYPO3_DB']->exec_DELETEquery(
    'sys_todos',
    'uid=' . intval($key)
);
Выбор записи:
Вызовите exec_SELECTquery() с, по крайней мере тремя первыми аргументами (список выбираемых полей, названием таблицы и условием WHERE). Возвращаемое значение — результирующий указатель (или объект), который должен быть передан в ->sql_fetch_assoc(), циклично, по порядку результирующих рядов.

$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
    '*',
    $theTable,
    $theField . '="' .
        $GLOBALS['TYPO3_DB']->quoteStr($theValue, $theTable) . '"' .
        $this->deleteClause($theTable) . ' ' .
        $whereClause,
    $groupBy,
    $orderBy,
    $limit
);
$rows = array();
while(($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))) {
    $rows[] = $row;
}
$GLOBALS['TYPO3_DB']->sql_free_result($res);
if (count($rows))    return $rows;

Anlov
18.05.2011, 14:56
нет, в данном случае page_id не работает. в качестве source я должен указать текущую страницу, вернее ее id. казалось бы, page_id = this - самое то, ан нет... так что мне вставить в мой код?

Андрей Аксенов
18.05.2011, 15:01
я так и не понял, а что этот код должен делать?

Anlov
18.05.2011, 15:04
этот - читать из pages поле author для текущей страницы

Андрей Аксенов
18.05.2011, 15:55
а что вообще нужно сделать? Зачем это поле-то читать? Потом же что-то с этим надо сделать... А приведенный выше код вообще черт знает что делает...
# Автор страницы в заголовке
1 = COA
1 {
wrap = <title> | </title>

1 = TEXT
1.data = TSFE:page|author
1.htmlSpecialChars = 1
}
Вот так, например, можно автора, если он есть, поставить в заголовок страницы...
По аналогии - куда угодно, и все это имеется в TSref!

Anlov
18.05.2011, 16:27
а что вообще нужно сделать? Зачем это поле-то читать? Потом же что-то с этим надо сделать... А приведенный выше код вообще черт знает что делает...
# Автор страницы в заголовке

1.data = TSFE:page|author

Вот так, например, можно автора, если он есть, поставить в заголовок страницы...
По аналогии - куда угодно, и все это имеется в TSref!

Вот это ты где взял? Где написано, что есть такая переменная author или свойство, что я могу ее/его вот так через | применить?

А код, кстати, из Typo3 by example.

Так что не все можно найти в документации и не все, что там найдено, работает правильно. Поэтому, большая просьба, если уж кто-то здесь и спрашивает что-то, то уж. наверняка, после того, как попытался найти ответ на свой вопрос в так называемой документации. и не надо его туда опять отсылать. С точки зрения психологии объяснить все моменты?

и опять же, мне надо еще и дату последнего изменения страницы SYS_LASTCHANGED показывать, кроме ее автора. как мне до нее добраться, как из UNIX-времени ее перевести в нормальное? и еще херова туча вопросов, ответов на которые в документации нет. их можно было бы получить здесь, если бы и здесь не посылали... в документацию.

За код - спасибо. Просто и работает. Если я правильно понимаю, через TFSE:page мы получаем доступ ко всем атрибутам текущей страницы?

и все-равно с пхп было бы проще (и привычнее). потому что через поле author в pages надо вытаскивать для каждого автора его контакты да и время, как я уже говорил, надо как-то переводить... поэтому буду зрить в core.

Андрей Аксенов
18.05.2011, 17:41
Зря так, в документации действительно все есть, хотя примеров маловато, да и трудно разобраться. Документацию официальную я сам перевожу и примеры в ней стараются давать правильные.
А код этот я сам написал, только что...
Можно еще так вывести текст где-нибудь:
10 = TEXT
10.value = Автор страницы: {page:author}
10.insertData = 1

PHP оно конечно сначала привычнее, но здесь трудно учесть все ньюансы, типа разрешен ли доступ у этого пользователя к тому, что нужно вывести, не удалено ли это было и куча всего.
Как раз API TYPO3 для этого и нужно.

Anlov
18.05.2011, 18:55
аха, вот про это-то я и не подумал. хотя для данного случая это не критично, если уж страница на сайте есть - то выдайте ее автора и время последнего изменения.

Anlov
18.05.2011, 19:47
Итак, выводим автора страницы* и дату последнего изменения с помощью PHP через запись текущей страницы в $GLOBALS["TSFE"]:


$author = $GLOBALS["TSFE"]->page[author]; //author - поле "author" таблицы "pages"
$author_mail = $GLOBALS["TSFE"]->page[author_email]; //author_email - поле "author_email" таблицы "pages"
if($author)
{
echo "<p class='page_info'>"."Author:"."<br>";
echo "<span class='author'>".$author."</span><br>";
echo "E-Mail: <span class='author_mail'>".$author_mail."</span></p>";
$last_change = $GLOBALS["TSFE"]->page[SYS_LASTCHANGED]; //SYS_LASTCHANGED - поле "SYS_LASTCHANGED" таблицы "pages"
$last_change_formated = date("d.m.Y", $last_change);
echo "<p>"."Last change"."<br>";
echo "<span class='last_change'>".$last_change_formated."</span></p>";
}


и еще раз - на бис, но с получением данных из таблицы базы данных Typo3 (только автора, остальное - по аналогии):


$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
'uid,author', //выбираем поля uid и author
'pages', //из таблицы pages
'uid='.$GLOBALS["TSFE"]->id, //условие: только для текущей страницы
'',
'',
''
);
$rows = array();
while(($rows = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))) {
//$rows[] = $row;
$author = $rows[author];
}
$GLOBALS['TYPO3_DB']->sql_free_result($res);
//if (count($rows)) return $rows;
echo "<b>".$author."</b>";


*автора для каждой страницы при ее создании/редактировании автоматом добавляет это (http://typo3.org/extensions/repository/view/fhm_author/current/) расширение в поле author и author_email таблицы pages