I have some problems with my project. I use typeahead to make a search. So, i use typeahead with handlebars. But, there is a problem because it's not show options. This is my code:
model:
public function getDataForJson($q = null)
{
if($q === null)
{
$penerimas = Penerima::findAll('');
if(empty($penerimas))
{
return array('value' => 'No Data');
}
else
{
$u = array();
foreach ($penerimas as $penerima)
{
$u[] = ['value' => $penerima->nama];
}
return $u;
}
}
else
{
$query = new Query;
$query->select(['nama'])->from('tb_penerima');
$data = $query->createCommand()->queryAll();
if(empty($data))
{
return array('value' => 'No Data');
}
else
{
$return = [];
foreach ($data as $datum)
{
$out[] = ['value' => $datum['nama']];
}
return $out;
}
}
}
view:
<?php
echo '<label class="control-label">Select Repository</label>';
$template = '<div><p class="repo-language">{{no_telepon}}</p>' .
'<p class="repo-name">{{nama}}</p>';
'<p class="repo-description">{{email}}</p></div>';
echo Typeahead::widget([
'name' => 'twitter_oss',
'options' => ['placeholder' => 'Filter as you type ...'],
'dataset' => [
[
'prefetch' => Url::to(['tertuju/getpenerima']),
'datumTokenizer' => "Bloodhound.tokenizers.obj.whitespace('value')",
'display' => 'value',
'templates' => [
'notFound' => '<div class="text-danger" style="padding:0 8px">Unable to find repositories for selected query.</div>',
'suggestion' => new JsExpression("Handlebars.compile('{$template}')")
]
]
]
]);
?>
controller:
public function actionGetpenerima($q = null)
{
return Json::encode(Tertuju::getDataForJson($q));
}
Related
Prestashop v1.6.1.6, Homefeatured module v1.8.1
Prestashop on homepage in homefeatured module in standard didn't display attribute color like in category page, in product-list.tpl it is this smarty code: {$product.color_list} When I dump it on home page it give me NULL. I start search in controllers to find it and in FrontController.php I was find this:
if (!in_array($product['id_product'], $products_need_cache) || isset($colors[$product['id_product']])) {
$product['color_list'] = $tpl->fetch(_PS_THEME_DIR_.'product-list-colors.tpl', $this->getColorsListCacheId($product['id_product']));
} else {
$product['color_list'] = '';
}
I think this is what I need but I am not sure how I can put it to homefeatured.php
This is code in homefeatured:
class HomeFeatured extends Module {
protected static $cache_products;
public function __construct()
{
$this->name = 'homefeatured';
$this->tab = 'front_office_features';
$this->version = '1.8.1';
$this->author = 'PrestaShop';
$this->need_instance = 0;
$this->bootstrap = true;
parent::__construct();
$this->displayName = $this->l('Featured products on the homepage');
$this->description = $this->l('Displays featured products in the central column of your homepage.');
$this->ps_versions_compliancy = array('min' => '1.6', 'max' => '1.6.99.99');
}
public function install()
{
$this->_clearCache('*');
Configuration::updateValue('HOME_FEATURED_NBR', 8);
Configuration::updateValue('HOME_FEATURED_CAT', (int)Context::getContext()->shop->getCategory());
Configuration::updateValue('HOME_FEATURED_RANDOMIZE', false);
if (!parent::install()
|| !$this->registerHook('header')
|| !$this->registerHook('addproduct')
|| !$this->registerHook('updateproduct')
|| !$this->registerHook('deleteproduct')
|| !$this->registerHook('categoryUpdate')
|| !$this->registerHook('displayHomeTab')
|| !$this->registerHook('displayHomeTabContent')
)
return false;
return true;
}
public function uninstall()
{
$this->_clearCache('*');
return parent::uninstall();
}
public function getContent()
{
$output = '';
$errors = array();
if (Tools::isSubmit('submitHomeFeatured'))
{
$nbr = Tools::getValue('HOME_FEATURED_NBR');
if (!Validate::isInt($nbr) || $nbr <= 0)
$errors[] = $this->l('The number of products is invalid. Please enter a positive number.');
$cat = Tools::getValue('HOME_FEATURED_CAT');
if (!Validate::isInt($cat) || $cat <= 0)
$errors[] = $this->l('The category ID is invalid. Please choose an existing category ID.');
$rand = Tools::getValue('HOME_FEATURED_RANDOMIZE');
if (!Validate::isBool($rand))
$errors[] = $this->l('Invalid value for the "randomize" flag.');
if (isset($errors) && count($errors))
$output = $this->displayError(implode('<br />', $errors));
else
{
Configuration::updateValue('HOME_FEATURED_NBR', (int)$nbr);
Configuration::updateValue('HOME_FEATURED_CAT', (int)$cat);
Configuration::updateValue('HOME_FEATURED_RANDOMIZE', (bool)$rand);
Tools::clearCache(Context::getContext()->smarty, $this->getTemplatePath('homefeatured.tpl'));
$output = $this->displayConfirmation($this->l('Your settings have been updated.'));
}
}
return $output.$this->renderForm();
}
public function hookDisplayHeader($params)
{
$this->hookHeader($params);
}
public function hookHeader($params)
{
if (isset($this->context->controller->php_self) && $this->context->controller->php_self == 'index')
$this->context->controller->addCSS(_THEME_CSS_DIR_.'product_list.css');
$this->context->controller->addCSS(($this->_path).'css/homefeatured.css', 'all');
}
public function _cacheProducts()
{
if (!isset(HomeFeatured::$cache_products))
{
$category = new Category((int)Configuration::get('HOME_FEATURED_CAT'), (int)Context::getContext()->language->id);
$nb = (int)Configuration::get('HOME_FEATURED_NBR');
if (Configuration::get('HOME_FEATURED_RANDOMIZE'))
HomeFeatured::$cache_products = $category->getProducts((int)Context::getContext()->language->id, 1, ($nb ? $nb : 8), null, null, false, true, true, ($nb ? $nb : 8));
else
HomeFeatured::$cache_products = $category->getProducts((int)Context::getContext()->language->id, 1, ($nb ? $nb : 8), 'position');
}
if (HomeFeatured::$cache_products === false || empty(HomeFeatured::$cache_products))
return false;
}
public function hookDisplayHomeTab($params)
{
if (!$this->isCached('tab.tpl', $this->getCacheId('homefeatured-tab')))
$this->_cacheProducts();
return $this->display(__FILE__, 'tab.tpl', $this->getCacheId('homefeatured-tab'));
}
public function hookDisplayHome($params)
{
if (!$this->isCached('homefeatured.tpl', $this->getCacheId()))
{
$this->_cacheProducts();
$this->smarty->assign(
array(
'products' => HomeFeatured::$cache_products,
'add_prod_display' => Configuration::get('PS_ATTRIBUTE_CATEGORY_DISPLAY'),
'homeSize' => Image::getSize(ImageType::getFormatedName('home')),
)
);
}
return $this->display(__FILE__, 'homefeatured.tpl', $this->getCacheId());
}
public function hookDisplayHomeTabContent($params)
{
return $this->hookDisplayHome($params);
}
public function hookAddProduct($params)
{
$this->_clearCache('*');
}
public function hookUpdateProduct($params)
{
$this->_clearCache('*');
}
public function hookDeleteProduct($params)
{
$this->_clearCache('*');
}
public function hookCategoryUpdate($params)
{
$this->_clearCache('*');
}
public function _clearCache($template, $cache_id = NULL, $compile_id = NULL)
{
parent::_clearCache('homefeatured.tpl');
parent::_clearCache('tab.tpl', 'homefeatured-tab');
}
public function renderForm()
{
$fields_form = array(
'form' => array(
'legend' => array(
'title' => $this->l('Settings'),
'icon' => 'icon-cogs'
),
'description' => $this->l('To add products to your homepage, simply add them to the corresponding product category (default: "Home").'),
'input' => array(
array(
'type' => 'text',
'label' => $this->l('Number of products to be displayed'),
'name' => 'HOME_FEATURED_NBR',
'class' => 'fixed-width-xs',
'desc' => $this->l('Set the number of products that you would like to display on homepage (default: 8).'),
),
array(
'type' => 'text',
'label' => $this->l('Category from which to pick products to be displayed'),
'name' => 'HOME_FEATURED_CAT',
'class' => 'fixed-width-xs',
'desc' => $this->l('Choose the category ID of the products that you would like to display on homepage (default: 2 for "Home").'),
),
array(
'type' => 'switch',
'label' => $this->l('Randomly display featured products'),
'name' => 'HOME_FEATURED_RANDOMIZE',
'class' => 'fixed-width-xs',
'desc' => $this->l('Enable if you wish the products to be displayed randomly (default: no).'),
'values' => array(
array(
'id' => 'active_on',
'value' => 1,
'label' => $this->l('Yes')
),
array(
'id' => 'active_off',
'value' => 0,
'label' => $this->l('No')
)
),
),
),
'submit' => array(
'title' => $this->l('Save'),
)
),
);
$helper = new HelperForm();
$helper->show_toolbar = false;
$helper->table = $this->table;
$lang = new Language((int)Configuration::get('PS_LANG_DEFAULT'));
$helper->default_form_language = $lang->id;
$helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0;
$this->fields_form = array();
$helper->id = (int)Tools::getValue('id_carrier');
$helper->identifier = $this->identifier;
$helper->submit_action = 'submitHomeFeatured';
$helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false).'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name;
$helper->token = Tools::getAdminTokenLite('AdminModules');
$helper->tpl_vars = array(
'fields_value' => $this->getConfigFieldsValues(),
'languages' => $this->context->controller->getLanguages(),
'id_language' => $this->context->language->id
);
return $helper->generateForm(array($fields_form));
}
public function getConfigFieldsValues()
{
return array(
'HOME_FEATURED_NBR' => Tools::getValue('HOME_FEATURED_NBR', (int)Configuration::get('HOME_FEATURED_NBR')),
'HOME_FEATURED_CAT' => Tools::getValue('HOME_FEATURED_CAT', (int)Configuration::get('HOME_FEATURED_CAT')),
'HOME_FEATURED_RANDOMIZE' => Tools::getValue('HOME_FEATURED_RANDOMIZE', (bool)Configuration::get('HOME_FEATURED_RANDOMIZE')),
);
}
}
Only add this in this part
public function _cacheProducts()
{
if (!isset(HomeFeatured::$cache_products))
{
$category = new Category((int)Configuration::get('HOME_FEATURED_CAT'), (int)Context::getContext()->language->id);
$nb = (int)Configuration::get('HOME_FEATURED_NBR');
if (Configuration::get('HOME_FEATURED_RANDOMIZE'))
HomeFeatured::$cache_products = $category->getProducts((int)Context::getContext()->language->id, 1, ($nb ? $nb : 8), null, null, false, true, true, ($nb ? $nb : 8));
else
HomeFeatured::$cache_products = $category->getProducts((int)Context::getContext()->language->id, 1, ($nb ? $nb : 8), 'position');
}
// PRODUCT COLOR LIST ADDON
$this->context->controller->addColorsToProductList(HomeFeatured::$cache_products);
if (HomeFeatured::$cache_products === false || empty(HomeFeatured::$cache_products))
return false;
}
here i m doing a json_encode
public function get_posts_for_category($user_id,$category_id,$page)
{
$cat_id = $this->ApiModel->get_category_id($category_id);
$total_row = $this->ApiModel->get_category_posts_count($cat_id->category);
$per_page = 2;
$total_pages = $total_row / $per_page;
$posts = $this->ApiModel->get_category_posts($cat_id->category,$per_page,$page);
$data = array();
foreach($posts as $post)
{
$fav = $this->ApiModel->get_favourite($user_id,$post->pid);
if($fav == 1)
{
$status = 'true';
}
else
{
$status = 'false';
}
$array = array('pid' => $post->pid, 'uid' => $post->uid, 'title' => $post->title, 'slug' => $post->slug, 'content' => $post->content, 'image' => $post->image, 'time_stamp' => $post->time_stamp);
$data[] = array('page' => $page, 'posts' => $array, 'is_favorite' => $status);
}
echo strip_tags(json_encode($data));
}
the output i m getting from the above code is
But i want some thing like this
<?php
public function get_posts_for_category($user_id,$category_id,$page)
{
$cat_id = $this->ApiModel->get_category_id($category_id);
$total_row = $this->ApiModel->get_category_posts_count($cat_id->category);
$per_page = 2;
$total_pages = $total_row / $per_page;
$posts = $this->ApiModel->get_category_posts($cat_id->category,$per_page,$page);
$data = array();
foreach($posts as $post)
{
$fav = $this->ApiModel->get_favourite($user_id,$post->pid);
if($fav == 1)
{
$status = 'true';
}
else
{
$status = 'false';
}
$array = array('pid' => $post->pid, 'uid' => $post->uid, 'title' => $post->title, 'slug' => $post->slug, 'content' => $post->content, 'image' => $post->image, 'time_stamp' => $post->time_stamp, 'is_favorite' => $status);
$data[] = array('page' => $page, 'posts' => $array, 'total_posts' => count($posts), 'total_pages' => $total_pages);
}
echo strip_tags(json_encode($data));
}
?>
$return = array(
'page' => $page,
'total_posts' => $total_row,
'total_page' => $total_pages,
);
$data = [];
foreach($posts as $post)
{
$fav = $this->ApiModel->get_favourite($user_id, $post->pid);
if($fav == 1)
{
$status = 'true';
}
else
{
$status = 'false';
}
$array = array('pid' => $post->pid, 'uid' => $post->uid, 'title' => $post->title, 'slug' => $post->slug, 'content' => $post->content, 'image' => $post->image, 'time_stamp' => $post->time_stamp, 'is_favorite' => $status);
$data[] = $array;
}
$return['posts'] = $data;
$this->output->set_content_type('application/json');
$this->output->set_output(json_encode($return));
just replace this code with your foreach & echo statement.
You never should use strip_tags in conjunction with json_encode because you are already encoding the data it's receivers choice to do whatever he wants also in this process you might break the encoding.
Also you should use CI output library to send response you must not echo anything from your controller. see here https://ellislab.com/codeigniter/user-guide/libraries/output.html for more details
If you would like the numeric values to be output as such, (instead of strings) you may wish to try:
json_encode($return, JSON_NUMERIC_CHECK);
To format the outputted JSON nicely (indentation etc) use:
json_encode($return, JSON_PRETTY_PRINT);
You can use various combinations of the above as per json_encode's options.
As for the boolean values (instead of "true" and "false" returned as strings), you'll need to cast them as boolean types first:
$status = (bool) true;
I'm trying to make a menu from an array in PHP.
I would like to make it more readable, so I used an array.
My array is the following:
$menu = array(
'calendar' => array(
'text' => 'Calendar',
'rights' => 'user'
),
'customers' => array(
'text' => 'Customers',
'rights' => 'user',
'sub' => array(
'create-new' => array(
'text' => 'Create new customer',
'rights' => 'user'
),
'show-customers' => array(
'text' => 'Show all customers',
'rights' => 'user'
)
)
)
);
And the PHP to parse the array:
buildMenu($menu);
function buildMenu($menu_array, $is_sub=FALSE) {
$attr = (!$is_sub) ? ' id="menu"' : ' class="submenu"';
$menu = "<ul".$attr.">";
foreach($menu_array as $id => $properties) {
foreach($properties as $key => $val) {
if(is_array($val)) {
$sub = buildMenu($val, TRUE);
}
else {
$sub = NULL;
$$key = $val;
}
}
if(!isset($url)) {
$url = $id;
}
$menu .= "<li>".$text."".$sub."</li>";
unset($url, $text, $sub);
}
return $menu . "</ul>";
}
Do I miss something ?
It don't echo me anything.
Thanks for your help.
Just return will not give output you need to either use below code, inside function.
echo $menu . "</ul>";
instead of
return $menu . "</ul>";
or use below code if you return your html output.
echo $output = buildMenu($menu);
instead of
buildMenu($menu);
So I got this:
$tree = [
array(
'name' => 'One1',
),
array(
'name' => 'One2',
),
array(
'name' => 'One3',
),
array(
'name' => 'One4',
'children' => [
array(
'name' => 'Two1',
),
array(
'name' => 'Two2',
'children' => [
array(
'name' => 'Three1',
),
],
),
array(
'name' => 'Two3',
),
]
),
array(
'name' => 'One5',
),
];
And I'm looking for a way to have this output (recursively):
One1
One2
One3
One4 › Two1
One4 › Two2 › Three1
One4 › Two3
One5
As far as I go I have this function
function getValuesPaths(array $tree, $glue = ' > ') {
$branches = array();
foreach ($tree as &$item) {
$piece = $item['name'];
if (array_key_exists('children', $item)) {
if (count($item['children'])>1) {
$leafs = self::getValuesPaths($item['children']);
foreach ($leafs as $item) {
$branches[] = $piece . $glue . $item;
}
}
} else {
$branches[] = $piece;
}
}
return $branches;
}
This output the following paths:
One1
One2
One3
One4 > Two1
One4 > Two3
One5
It wasn't supposed to find the One4 > Two2 > Three1?
May help you…
function getKeyPaths(array $tree, $glue = '.')
{
$paths = array();
foreach ($tree as $key => &$mixed) {
if (is_array($mixed)) {
$results = getKeyPaths($mixed, $glue);
foreach ($results as $k => &$v) {
$paths[$key . $glue . $k] = $v;
}
unset($results);
} else {
$paths[$key] = $mixed;
}
}
return $paths;
}
How To get Area DropDown/Select-Option by changing the City Option?
Find all Area List by City table primary key.
Condition is City(id) --> area(city_id) then I show that.
Now it's Show only Null when I change city option.
View:
<div class="row">
<?php echo $form->labelEx($model,'city'); ?>
<?php echo $form->dropDownList($model,'city', CHtml::listData(City::model()->findAll(), 'id', 'city'),
array(
'prompt'=>'select',
'ajax' => array(
'type' => 'POST', //My method type
'dataType' => 'JSON',
'url' => CController::createUrl('users/dynamiccities'), //This is my request/ajax URL
'data'=>array(
'city'=>'js:this.value',
),
'success'=>'js:function(data){
$("#Users_area").html(data.areaList);
}' //The functionaliy after success
)
));
?>
<?php echo $form->error($model,'city'); ?>
</div>
<?php echo $form->dropDownList($model, 'area', array(), array('prompt'=>'select')); ?>
Controller:
public function actionDynamiccities(){
$cityId = $_POST['city'];
$areaList = '';
if ($cityId != '') {
$areaList = CHtml::tag('option', array('value' => ''), CHtml::encode("NULL"), true);
} else {
$condition="city_id=".cityId;
$data = Area::model()->findAll(array('condition'=>$condition), 'id');
if($data){
$areaList = CHtml::tag('option', array('value' => ""), "Select", true);
foreach ($data as $d) {
$areaList .= CHtml::tag('option', array('value' => $d->id), CHtml::encode($d->area), true);
}
}else {
$areaList = CHtml::tag('option', array('value' => ''), CHtml::encode("NULL"), true);
}
}
echo CJSON::encode(array(
'areaList' => $areaList,
));
}