Russian TYPO3 community

Russian TYPO3 community (http://forum.typo3.ru/index.php)
-   TypoScript практикум (http://forum.typo3.ru/forumdisplay.php?f=27)
-   -   Свой PHP-код на TYPO3 (http://forum.typo3.ru/showthread.php?t=9433)

Андрей Аксенов 18.05.2011 14:35

Цитата:

Сообщение от Anlov (Сообщение 31168)
где в документации (TREF, Typo3 by examples, FTB) написано, как в TypoScript получить значение ID текущей страницы?

не буду спорить... открываем TSref здесь, ищем page_id:
Цитата:

A page id (int) or "this" (=current page id)
Цитата:

Сообщение от Anlov (Сообщение 31168)
как из подключенного пхп скрипта подключиться к базе данных 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

а что вообще нужно сделать? Зачем это поле-то читать? Потом же что-то с этим надо сделать... А приведенный выше код вообще черт знает что делает...
PHP код:

# Автор страницы в заголовке
COA
{
    
wrap = <title> | </title>

    
TEXT
    1.data 
TSFE:page|author
    1.htmlSpecialChars 
1


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

Anlov 18.05.2011 16:27

Цитата:

Сообщение от Андрей Аксенов (Сообщение 31173)
а что вообще нужно сделать? Зачем это поле-то читать? Потом же что-то с этим надо сделать... А приведенный выше код вообще черт знает что делает...
PHP код:

# Автор страницы в заголовке

    
1.data TSFE:page|author 

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

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

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

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

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

За код - спасибо. Просто и работает. Если я правильно понимаю, через
Код:

TFSE:page
мы получаем доступ ко всем атрибутам текущей страницы?

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

Андрей Аксенов 18.05.2011 17:41

Зря так, в документации действительно все есть, хотя примеров маловато, да и трудно разобраться. Документацию официальную я сам перевожу и примеры в ней стараются давать правильные.
А код этот я сам написал, только что...
Можно еще так вывести текст где-нибудь:
PHP код:

10 TEXT
10.value 
Автор страницы: {page:author}
10.insertData 

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>";

*автора для каждой страницы при ее создании/редактировании автоматом добавляет это расширение в поле author и author_email таблицы pages


Часовой пояс GMT +4, время: 18:19.

Работает на vBulletin® версия 3.8.1.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot