<?php
if (!defined('TYPO3_MODE' )) {
die('Access denied.' );
}
\TYPO3 \CMS \Extbase \Utility \ExtensionUtility ::configurePlugin (
'Xp.' . $ _EXTKEY ,
'Category' ,
array (
'Category' => 'list, show, search, top, recommend' ,
),
// non-cacheable actions
array (
'Category' => 'list,search' ,
)
);
// set ajax get/post site
//$TYPO3_CONF_VARS['FE']['eID_include']['youreidkey'] = 'EXT:extension/Classes/Utility/Ajax.php';
$ GLOBALS ['TYPO3_CONF_VARS' ]['FE' ]['eID_include' ]['youreidkey' ] = Xp \Extension \Utility \Ajax ::class . '::searchAction' ;
$ GLOBALS ['TYPO3_CONF_VARS' ]['FE' ]['eID_include' ]['youreidkey2' ] = Xp \Extension \Utility \Autocomplete ::class . '::competeAction' ;
<?php
namespace Xp \Extension \Utility ;
use TYPO3 \CMS \Frontend \Plugin \AbstractPlugin ;
use Psr \Http \Message \ResponseInterface ;
use Psr \Http \Message \ServerRequestInterface ;
use TYPO3 \CMS \Core \Resource \Hook \FileDumpEIDHookInterface ;
use TYPO3 \CMS \Core \Resource \ProcessedFileRepository ;
use TYPO3 \CMS \Core \Resource \ResourceFactory ;
use TYPO3 \CMS \Core \Utility \GeneralUtility ;
use TYPO3 \CMS \Core \Utility \HttpUtility ;
class Ajax extends AbstractPlugin
{
/**
* Main method to search a file
*
* @param ServerRequestInterface $request
* @param ResponseInterface $response
* @return NULL|ResponseInterface
*
* @throws \InvalidArgumentException
* @throws \RuntimeException
* @throws \TYPO3\CMS\Core\Resource\Exception\FileDoesNotExistException
* @throws \UnexpectedValueException
*/
public function searchAction (ServerRequestInterface $ request , ResponseInterface $ response )
{
$ parameters = array ();
/* $variable = \TYPO3\CMS\Core\Utility\GeneralUtility::_GP('variable');
echo json_encode($parameters); */
$ eid = $ this ->getGetOrPost ($ request , 'eID' );
if ($ eid ) {
$ parameters ['eID' ] = $ eid ;
}
$ variable = $ this ->getGetOrPost ($ request , 'variable' );
if ($ variable ) {
$ parameters ['variable' ] = $ variable ;
}
$ search = trim($ parameters ['variable' ][6 ]['value' ]);
$ uid = intval($ parameters ['variable' ][7 ]['value' ]);
//echo json_encode($parameters);
$ content = array ();
foreach ($ this ->getTheProducts ($ uid , $ search ) as $ row ) {
$ content = $ row ;
}
//file
if ($ content ['file' ] == 1 ) {
$ files = $ this ->getSysfile ($ content ['uid' ], 'file' );
foreach ($ files as $ row ) {
$ content ['file' ] = $ row ;
}
}
if ($ content ['img' ] == 1 ) {
$ imgs = $ this ->getSysfile ($ content ['uid' ], 'img' );
foreach ($ imgs as $ row ) {
$ content ['img' ] = $ row ;
}
}
echo json_encode($ content );
}
/**
*
* @param int $uid
* @param string $type
* @return array
*/
protected function getSysfile ($ uid = 1 , $ type = 'img' )
{
$ rows = $ this ->getDatabaseConnection ()->exec_SELECTgetRows (
'*' ,
'sys_file' ,
'sys_file.uid IN ( SELECT sys_file_reference.uid_local FROM sys_file_reference WHERE sys_file_reference.tablenames = "tx_werkstatt_domain_model_product" AND sys_file_reference.fieldname="' .$ type .'" AND sys_file_reference.uid_foreign = "' .$ uid .'")'
);
if (!$ rows ) {
$ rows = array ();
}
return $ rows ;
}
/**
* @param ServerRequestInterface $request
* @param string $parameter
* @return NULL|mixed
*/
protected function getGetOrPost (ServerRequestInterface $ request , $ parameter )
{
return isset($ request ->getParsedBody ()[$ parameter ])
? $ request ->getParsedBody ()[$ parameter ]
: (isset($ request ->getQueryParams ()[$ parameter ]) ? $ request ->getQueryParams ()[$ parameter ] : null );
}
/**
* returns the result of the product
*
* @param int $uid
* @param string $search
* @return array
*/
protected function getTheProducts ($ uid = 0 , $ search = '' )
{
$ now = date('Y-m-d' );
$ rows = $ this ->getDatabaseConnection ()->exec_SELECTgetRows (
'*' ,
'tx_werkstatt_domain_model_product' ,
'(`name` LIKE "%' .$ search . '%" OR `description` LIKE "%' . $ search . '%" ) AND `category` = ' .$ uid .' AND `hidden` = 0 AND `deleted` = 0 AND (`end` = 0 OR `end` >= ' .$ now .')'
);
if (!$ rows ) {
$ rows = array ();
}
return $ rows ;
}
/**
* @return \TYPO3\CMS\Core\Database\DatabaseConnection
*/
protected function getDatabaseConnection ()
{
return $ GLOBALS ['TYPO3_DB' ];
}
}
Resources/Private/Templates/Category/List.html
< f:layout name ="Default " />
< f:section name ="main ">
< f:flashMessages />
< div class ="tx_werkstatt " >
< f:form action ="list " name ="category " object ="{category} " class ="werkstatt_form ">
< div class ="werkstatt_form ">
< f:form .textfield property ="name " class ="werkstatt_search " />
< f:form .select property ="uid " options ="{categories} " optionValueField ="uid " optionLabelField ="name "> </ f:form .select>
< f:form .submit value ="Search " class ="werkstatt_submit " />
</ div >
< div id ="results ">
</ div >
</ f:form >
< f:for each ="{categories} " as ="category ">
< div class ="category cat_uid_{category.uid} ">
< f:if condition ="{category.products} ">
< br />
< h1 class ="category_name ">
< f:image image ="{category.icon} " alt ="{category.icon.originalResource.name} " width ="50 " />
{category.name}
</ h1 >
</ f:if >
< f:for each ="{category.products} " as ="product ">
< div class ="product pro_uid_{product.uid} ">
< h2 class ="product_name " style ="color:{f:if(condition: product.top, then: ' red', else: 'green')}; "> {product.name}</ h2 >
< div class ="product_img "> < f:image image ="{product.img} " alt ="{product.img.originalResource.name} " width ="150 " /></ div >
< div class ="product_desc "> {product.description-> f:format.html()}</ div >
< f:link .page pageUid ="fileadmin{product.file.originalResource.identifier} " target ="_blank " class ="product_link "> {product.file.originalResource.name}</ f:link .page>
</ div >
</ f:for >
</ div >
</ f:for >
< div class ="ajax_test ">
< h2 class ="ajax_name " style ="color:green; "> </ h2 >
< div class ="ajax_img "> </ div >
< div class ="ajax_desc "> </ div >
< div class ="ajax_link "> </ div >
</ div >
</ div >
</ f:section >
Configuration/TypoScript/setup.txt
page.includeJSFooter {
WerkstattAjax = EXT:extension/Resources/Public/Js/extension.js
}
page.includeCSS {
Werkstatt = EXT:extension/Resources/Public/Css/extension.css
}
Resources/Public/Js/extension.js
( function ( $ ) {
$ ( '.werkstatt_submit' ) . click ( function ( event ) {
var search = $ ( '.werkstatt_form' ) . serializeArray ( ) ;
$ . post (
'index.php' ,
{ eID :'youreidkey' , variable : search } ,
function ( data ) {
$ ( '.category' ) . hide ( ) ;
$ ( '.ajax_name' ) . text ( data . name ) ;
if ( data . top == 1 ) {
$ ( '.ajax_name' ) . css ( { 'color' :'red' } ) ;
}
$ ( '.ajax_desc' ) . html ( data . description ) ;
if ( data . file . identifier ) {
$ ( '.ajax_link' ) . html ( '<a href="fileadmin' + data . file . identifier + '"> ' + data . file . name + ' </a>' ) ;
}
if ( data . img . identifier ) {
$ ( '.ajax_img' ) . html ( '<img src="fileadmin' + data . img . identifier + '" width="150" />' ) ;
}
} , 'json' ) ;
event . preventDefault ( ) ;
} ) ;
/*
var MIN_LENGTH = 3;
$('.werkstatt_search').keyup(function() {
var keyword = $(this).val();
if(keyword.length >= MIN_LENGTH) {
$.get( 'index.php', {eID: 'youreidkey2', keyword: keyword })
.done(function( data ) {
console.log(data);
var results = jQuery.parseJSON(data);
$(results).each(function(key, value) {
console.log(value);
$('#results').append('<div class="item">' + value.name + '</div>');
});
$('.item').click(function() {
var text = $(this).text();
$('.werkstatt_search').val(text);
});
});
}else {
$('.werkstatt_search').html('');
}
}).blur(function(){
$('#results').fadeOut(500);
}).focus(function() {
$('#results').show();
});
*/
} ) ( jQuery ) ;