How cakePHP build form data - arrays

i've created a form that loop in my table and give me some images:
id1: ->Image path, title etc
id2: -> Image path title etc
i've created my view in this way:
<div>
<?php echo $this->Form->create('Gallery',
array( 'action' => 'save')); ?>
<table cellpadding="0" cellspacing="0">
<?php foreach($images as $image): ?>
<tr>
<td>
<?php echo $this->PhpThumb->thumbnail($image['medias']['file'], array('w' => 75, 'h' => 75)); ?>
</td>
<td><?php echo $this->Form->input('title'.$image['medias']['id'], array('value' => $image['medias']['title']));?></td>
<td><?php echo $this->Form->input('description'.$image['medias']['id'], array('value' => $image['medias']['description']));?></td>
</tr>
<?php endforeach; ?>
</table>
<?php echo $this->Form->end(__('Submit')); ?>
After submit, i have an array like this:
array(
'Gallery' => array(
'title19' => 'test',
'description19' => '',
'title20' => '',
'description20' => '',
'title21' => '',
'description21' => '',
'title22' => '',
'description22' => ''
)
)
For sure, i cant use the save() method because the array isnt well formatted. I think the right format should be:
array(
'Gallery' => array(
array('id' => 19,
'title => 'test',
'description => ''),
array( 'id' =>20,
title => '',
description => '')
)
)
but, how can i get this ? Or some array that is right formatted?

When you iterate over them put the iterator or id in the right place:
$this->Form->input('Model.' . $i . 'field');
$this->Form->input('Model.' . $i . 'other_field');
References:
Saving your data
Form Helper

Related

wp_query same data on every page

In my wordpress site where I use ACF, I created an array of arrays with wp_query and imported them into the datatable. It also acts according to the posts_per_page wordpress settings. Currently wordpress is set to 10 impressions per page. I also wrote code in function.php to display the page under the table. 10 data comes into the table. Below is the correct number of pages. The problem starts here. Although the number of pages is correct, I always see the same 10 data when I click on the pages. Where did I make the mistake?
<?php
$show_logo = (!empty($date_or_logo) and $date_or_logo == 'logo') ? true : false;
$posts_per_page = (!empty($number) and intval($number)) ? $number : get_option( 'posts_per_page' );
$current = (!empty($offset) and intval($offset)) ? $offset : 1;
$offset = (!empty($offset) and intval($offset)) ? ( $offset * $posts_per_page ) - $posts_per_page : 0;
$args = array(
'post_type' => 'stm_ico_listing',
'posts_per_page' => $posts_per_page,
'offset' => $offset,
'meta_key' => 'end_date',
'orderby' => 'meta_value_num',
'order' => 'ASC',
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'end_date',
'compare' => '<',
'value' => time(),
),
array(
'key' => 'end_date',
'compare' => '!=',
'value' => '',
),
)
);
$args = (!empty($add_args)) ? wp_parse_args($add_args, $args) : $args;
$q = new WP_Query($args);
if ($q->have_posts()): ?>
<!-- the loop -->
<?php while ($q->have_posts()): $q->the_post();
?>
<tr>
<td width="10%">
.............
</td>
</tr>
<?php endwhile; ?>
</tbody>
</table>
<!-- end of the loop -->
<ul class='page-numbers'>
<li><?php pagination_bar_venue($q); ?></li>
</ul>
<!-- pagination here -->
<?php wp_reset_postdata(); ?>
<?php endif; ?>
</div>
<script>
$(document).ready(function() {
$('#table').DataTable( {
"language": {
"lengthMenu": "Display _MENU_ records. per page",
"zeroRecords": "Nothing found - sorry",
"info": "Showing page _PAGE_ of _PAGES_",
"infoEmpty": "No records available",
"infoFiltered": "(filtered from _MAX_ total records)"
},
"lengthMenu": [[50, 100, -1], [50, 100, "All"]]
} );
} );
</script>
function.php
add_action( 'wp_enqueue_scripts', 'team_script' );
function pagination_bar_venue( $q ) {
$total_pages = $q->max_num_pages;
$big = 999999999; // need an unlikely integer
if ($total_pages > 1){
$current_page = max(1, get_query_var('paged'));
echo paginate_links(array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%',
'current' => $current_page,
'total' => $total_pages,
));
}
}

CakePHP: ArraySource + Paginator

with CakePHP I want to use an array with the Paginator component. I'm using the Datasources plugin and I have created the Fake model:
<?php
/**
* A Fake model.
*/
class Fake extends AppModel {
public $useDbConfig = 'arraySource';
public $records = array(
array('id' => 1, 'name' => 'Alfa', 'height' => 300, 'width' => 300),
array('id' => 2, 'name' => 'Beta', 'height' => 200, 'width' => 100),
array('id' => 3, 'name' => 'Gamma', 'height' => 450, 'width' => 200),
array('id' => 4, 'name' => 'Omega', 'height' => 600, 'width' => 50)
);
}
On the controller:
<?php
class ExampleController extends AppController {
public $components = array('Paginator');
public $uses = array('Fake');
public function justatest() {
$this->Paginator->settings = array(
'order' => array('id' => 'desc'),
'limit' => 2
);
$records = $this->Paginator->paginate('Fake');
$this->set(compact('records'));
}
Now, the data is retrieved correctly by the component. The "limit" condition works correctly. What doesn't work is the "order" condition: it doesn't work or the condition that I have indicated, or sort the data according to user input.
I cannot understand if I've done something wrong or if I cannot sort the data obtained with ArraySource.
EDIT
The view:
<table>
<tr>
<th><?php echo $this->Paginator->sort('id'); ?></th>
<th><?php echo $this->Paginator->sort('name'); ?></th>
<th><?php echo $this->Paginator->sort('height'); ?></th>
<th><?php echo $this->Paginator->sort('width'); ?></th>
</tr>
<?php foreach($records as $v): ?>
<tr>
<td><?php echo $v['Fake']['id']; ?></td>
<td><?php echo $v['Fake']['name']; ?></td>
<td><?php echo $v['Fake']['height']; ?></td>
<td><?php echo $v['Fake']['width']; ?></td>
</tr>
<?php endforeach; ?>
</table>
Right from the top of my head, try this :
$this->Paginator->settings = array(
'order' => array('id DESC'),
'limit' => 2
);
Not sure at all

cakePHP Paginator issue with second model

still a novice, but I am fighting with the paginator to limit my view to 10 records [properties] and to sort it on a field in the properties model. What am I doing wrong or miss in my code to get the paginator to control my view???
I have 2 models, Regions and Properties, a region has many properties, for example, my view is /region/view/13 This shows all properties for region 13.
The paginator is displaying the correct amount of properties, set the pages correct and all seems correct, but the paginator is not limiting my view, it just displays all properties by that region in one huge list instead of limit the view to 10 per page.
The sort per sleeps doesn't work either although the url in the browser seems to be ok.
/regions/view/13/sort:sleeps/direction:asc
/regions/view/13/sort:sleeps/direction:desc
Model:
<?php
App::uses('AppModel', 'Model');
/**
* Region Model
*
* #property Country $Country
* #property Property $Property
*/
class Region extends AppModel {
/**
* Display field
*
* #var string
*/
public $displayField = 'regionname';
/**
* belongsTo associations
*
* #var array
*/
public $belongsTo = array(
'Country' => array(
'className' => 'Country',
'foreignKey' => 'country_id',
'conditions' => '',
'fields' => '',
'order' => ''
)
);
/**
* hasMany associations
*
* #var array
*/
public $hasMany = array(
'Property' => array(
'className' => 'Property',
'foreignKey' => 'region_id',
'dependent' => false,
'conditions' => '',
'fields' => '',
'order' => '',
'limit' => '',
'offset' => '',
'exclusive' => '',
'finderQuery' => '',
'counterQuery' => ''
)
);
}
Controller:
public function view($id = null) {
if (!$this->Region->exists($id)) {
throw new NotFoundException(__('Invalid region'));
}
$this->Region->recursive = 2; // related to associated model data, Region -> Properties -> PropertyImages
$options = array('conditions' => array('Region.' . $this->Region->primaryKey => $id));
$total = $this->Region->Property->find('count', array(
'conditions' => array('Property.region_id' => $id)
));
$this->set('total', $total); // Push to counter the view.
$this->set('region', $this->Region->find('first', $options)); // Push the properties to the view.
$this->paginate = array(
'limit' => 10,
'conditions' => array('Property.region_id' => $id),
);
$this->Region->Property->virtualFields['sleeps'] = 'Property.sleeps';
$this->set('regions', $this->paginate('Property'));
}
View:
<div class="paging">
<?php
echo $this->Paginator->prev('< ' . __('previous'), array(), null, array('class' => 'prev disabled'));
echo $this->Paginator->numbers(array('separator' => ''));
echo $this->Paginator->next(__('next') . ' >', array(), null, array('class' => 'next disabled')); ?>
</div>
<br>
<?php
echo $this->Paginator->counter(array(
'format' => __('Page {:page} of {:pages}, showing {:current} records out of {:count} total, starting on record {:start}, ending on {:end}'))); ?><br>
Total properties: <?php echo $total . "\n"; ?><br>
Sort by: <?php echo $this->Paginator->sort('sleeps'); ?>
<?php if (!empty($region['Property'])): ?>
<div class="regionviewfooter"></div>
<?php
$i = 0;
foreach ($region['Property'] as $property): ?>
<!-- We only need 1 image to show up -->
<?php foreach ($property['PropertyImage'] as $key =>$propertyImage): ?>
<div class="regionview">
<div class="regionviewleft">
<?php echo '<span style="font-size:12px;line-height:18px;font-weight:bold;">'; echo $this->Html->link(__($property['description']), array('controller' => 'properties', 'action' => 'view', $property['id'])); echo '</span>'; ?>
<div class="regionviewheader">Sleeps <?php echo $property['sleeps']; echo ' :: ' ?>
<?php
if ($property['minPrice'] == 0) {
echo 'Please call for prices';
} else {
echo 'Prices from ';
echo $this->Number->currency($property['minPrice'], 'GBP');
if ($property['maxPrice'] == 0) {
echo ' PW';
} else {
echo ' - ';
echo $this->Number->currency($property['maxPrice'], 'GBP');
echo ' PW';
}
}
echo '<span style="font-size:11px;line-height:18px;font-weight:normal;">'; echo ' :: ';
echo $this->Html->link(__('View Property'), array('controller' => 'properties', 'action' => 'view', $property['id'])); echo '</span>'; ?>
</div>
<?php echo ($property['shortDesc']); ?><br>
Add to my Enquiry List :: Property Ref. (<?php echo strtoupper($property['ref']); ?>)
</div>
<div class="regionviewright">
<!-- display image -->
<?php echo $this->Html->image(($propertyImage['filename']), array('alt' => ($propertyImage['description']),'width' => '150' ,'height' => '77')); $key ?>
<?php $key++; ?>
</div>
</div>
<div class="clear"></div>
<div class="regionviewfooter"></div>
<?php if ($key == 1) {
break; // Stop, we did 1 image.
}
?>
<?php endforeach; ?>
<?php endforeach; ?>
<?php endif; ?>
<br>Top of Page<br><br>
You're setting your paginated results to $regions, yet in your view, you're looping through and displaying $region (singular), which is a straight-up find() above, with recursive 2, which will pull all properties.
So - although there are many other things that need cleaned up with your code, for now, just use $regions (plural) instead of $region singular in your View.

Cakephp Undefined Index

When creating a view I am getting a undefined index error: Account on the line with $senderName['Account']['company_name']but when debugging the variable the array prints out
array(
(int) 0 => array(
'Account' => array(
'id' => '0',
'street' => 'SYSTEM',
'city' => 'SYSTEM',
'postcode' => '0',
'state' => 'SYS',
'country' => 'SYS',
'active' => true,
'company_name' => 'SYSTEM',
'abn' => '0'
),
'Template' => array(),
'User' => array(),
'Invoice' => array()
),
here is the code for my view
<?php foreach($invoice as $invoices):?>
<?php foreach($senderName as $senderName):?>
<?php foreach($receiverName as $receiverName):?>
<tr>
<tr>
<td align='center'><?php echo $senderName['Account']['company_name']; ?></td>
<td align='center'><?php echo $receiverName['Account']['company_name']; ?></td>
<td align='center'><?php echo $this->Form->Html->link($invoices['Invoice']['id'],
array('controller' => 'Invoices','action'=>'viewinvoice',$invoices['Invoice']['id'])); ?></td>
</tr>
<?php endforeach; ?>
<?php endforeach; ?>
<?php endforeach; ?>
and just in case here is my related function
$accounts2=$this->User->find('list', array(
'fields'=>array('account_id'),
'conditions' => array(
'id' => $this->Auth->user('id'))));
$invoices=$this->Invoice->find('all', array(
'conditions' => array(
'Invoice.receiver_id' => $accounts2)));
$sender=$this->Invoice->Find('list', array('fields'=>('sender_id')));
$receiver=$this->Invoice->Find('list', array('fields'=>('receiver_id')));
$senderName=$this->Account->Find('all', array(
'conditions' => array(
'id'=>array_values($sender))));
$receiverName=$this->Account->find('all', array(
'conditions' => array(
'id'=>array_values($receiver))));
debug($senderName);
$this->set('senderName', $senderName);
$this->set('accounts2', $accounts2);
$this->set('receiverName', $receiverName);
$this->set('sender',$sender);
$this->set('receiver',$receiver);
$this->set('invoice', $invoices);
}
You're computer is right. :)
$senderName['Account']['company_name']
does not exists.
$senderName['0']['Account']['company_name']
does.
The data comes in this format as they may be several account liked to senderName.
Edit:
Could you give the relationship in your models too?
I think you should review your code in view :
<?php foreach($senderName as $senderName):?>
<?php foreach($receiverName as $receiverName):?>
in foreach array_expression and value variable should be different but you have used same variable name, please use different names for this.

cakephp: search page giving http 404 webpage cannot be found

When I click the search link in the cupcake forum plugin, enter the search criteria and click submit, I get a blank page in firefox and http 404 website cannot be found in IE.
I have no idea on what i'm doing wrong. Can someone help me? Thank you.
the following is the search_controller:
class SearchController extends ForumAppController {
/**
* Controller Name
* #access public
* #var string
*/
public $name = 'Search';
/**
* Models
* #access public
* #var array
*/
public $uses = array('Forum.Topic');
/**
* Pagination
* #access public
* #var array
*/
public $paginate = array(
'Topic' => array(
'order' => 'LastPost.created DESC',
'contain' => array('ForumCategory.title', 'User.id', 'User.username', 'LastPost.created', 'LastUser.username', 'Poll.id', 'FirstPost.content')
)
);
/**
* Search the topics
* #access public
* #param string $type
*/
public function index($type = '') {
$searching = false;
print_r($this->params['named']);
// Build
if (!empty($this->params['named'])) {
foreach ($this->params['named'] as $field => $value) {
$this->data['Topic'][$field] = urldecode($value);
}
}
if ($type == 'new_posts') {
$this->data['Topic']['orderBy'] = 'LastPost.created';
$this->paginate['Topic']['conditions']['LastPost.created >='] = $this->Session->read('Forum.lastVisit');
}
echo '<br/>';
print_r($this->data);
// Search
if (!empty($this->data)) {
$searching = true;
$this->paginate['Topic']['limit'] = $this->Toolbar->settings['topics_per_page'];
if (!empty($this->data['Topic']['keywords'])) {
if ($this->data['Topic']['power'] == 0) {
$this->paginate['Topic']['conditions']['Topic.title LIKE'] = '%'. $this->data['Topic']['keywords'] .'%';
} else {
$this->paginate['Topic']['conditions']['OR'] = array(
array('Topic.title LIKE' => '%'. $this->data['Topic']['keywords'] .'%'),
array('FirstPost.content LIKE' => '%'. $this->data['Topic']['keywords'] .'%')
);
}
}
if (!empty($this->data['Topic']['category'])) {
$this->paginate['Topic']['conditions']['Topic.forum_category_id'] = $this->data['Topic']['category'];
}
if (!empty($this->data['Topic']['orderBy'])) {
$this->paginate['Topic']['order'] = $this->data['Topic']['orderBy'] .' DESC';
}
if (!empty($this->data['Topic']['byUser'])) {
$this->paginate['Topic']['conditions']['User.username LIKE'] = '%'. $this->data['Topic']['byUser'] .'%';
}
$this->set('topics', $this->paginate('Topic'));
}
$this->Toolbar->pageTitle(__d('forum', 'Search', true));
$this->set('menuTab', 'search');
$this->set('searching', $searching);
$this->set('forums', $this->Topic->ForumCategory->getHierarchy($this->Toolbar->getAccess(), $this->Session->read('Forum.access'), 'read'));
}
}
?>
topic.php model:
class Topic extends ForumAppModel {
/**
* Belongs to
* #access public
* #var array
*/
public $belongsTo = array(
'ForumCategory' => array(
'className' => 'Forum.ForumCategory',
'counterCache' => true
),
'User' => array(
'className' => 'Forum.User'
),
'FirstPost' => array(
'className' => 'Forum.Post',
'foreignKey' => 'firstPost_id'
),
'LastPost' => array(
'className' => 'Forum.Post',
'foreignKey' => 'lastPost_id'
),
'LastUser' => array(
'className' => 'Forum.User',
'foreignKey' => 'lastUser_id'
)
);
/**
* Has one
* #access public
* #var array
*/
public $hasOne = array(
'Poll' => array(
'className' => 'Forum.Poll',
'dependent' => true
)
);
/**
* Has many
* #access public
* #var array
*/
public $hasMany = array(
'Post' => array(
'className' => 'Forum.Post',
'exclusive' => true,
'dependent' => true,
'order' => 'Post.created DESC',
)
);
index.ctp view:
<?php // Search orderbY
$orderBy = array(
'LastPost.created' => __d('forum', 'Last post time', true),
'Topic.created' => __d('forum', 'Topic created time', true),
'Topic.post_count' => __d('forum', 'Total posts', true),
'Topic.view_count' => __d('forum', 'Total views', true)
); ?>
<h2>Search</h2>
<?php echo $form->create('Topic', array('url' => array('controller' => 'search', 'action' => 'index'))); ?>
<div id="search">
<?php
echo $form->input('keywords', array('div' => false, 'label' => false, 'style' => 'width: 300px'));
echo $form->label('power', __d('forum', 'Power Search?', true));
echo $form->input('category', array('div' => false, 'label' => false, 'options' => $forums, 'escape' => false, 'empty' => true));
echo $form->input('orderBy', array('div' => false, 'label' => false, 'options' => $orderBy));
echo $form->label('byUser', __d('forum', 'By User (Username)', true) .':');
echo $form->input('byUser', array('div' => false, 'label' => false, 'style' => 'width: 150px'));
?>
</div>
<?php echo $form->end(__d('forum', 'Search Topics', true));
pr($this->validationErrors);
?>
<?php // Is searching
if ($searching === true) { ?>
<div class="forumWrap">
<?php echo $this->element('pagination'); ?>
<table cellspacing="0" class="table">
<tr>
<th colspan="2"><?php echo $paginator->sort(__d('forum', 'Topic', true), 'Topic.title'); ?></th>
<th><?php echo $paginator->sort(__d('forum', 'Forum', true), 'Topic.forum_category_id'); ?></th>
<th><?php echo $paginator->sort(__d('forum', 'Author', true), 'User.username'); ?></th>
<th><?php echo $paginator->sort(__d('forum', 'Created', true), 'Topic.created'); ?></th>
<th><?php echo $paginator->sort(__d('forum', 'Posts', true), 'Topic.post_count'); ?></th>
<th><?php echo $paginator->sort(__d('forum', 'Views', true), 'Topic.view_count'); ?></th>
<th><?php echo $paginator->sort(__d('forum', 'Activity', true), 'LastPost.created'); ?></th>
</tr>
<?php if (empty($topics)) { ?>
<tr>
<td colspan="8" class="empty"><?php __d('forum', 'No results were found, please refine your search criteria.'); ?></td>
</tr>
<?php } else {
$counter = 0;
foreach ($topics as $topic) {
$pages = $cupcake->topicPages($topic['Topic']); ?>
<tr<?php if ($counter % 2) echo ' class="altRow"'; ?>>
<td class="ac" style="width: 35px"><?php echo $cupcake->topicIcon($topic); ?></td>
<td>
<?php if (!empty($topic['Poll']['id'])) {
echo $html->image('/forum/img/poll.png', array('alt' => 'Poll', 'class' => 'img'));
} ?>
<?php echo $cupcake->topicType($topic['Topic']['type']); ?>
<strong><?php echo $html->link($topic['Topic']['title'], array('controller' => 'topics', 'action' => 'view', $topic['Topic']['id'])); ?></strong>
<?php if (count($pages) > 1) { ?>
<br /><span class="gray"><?php __d('forum', 'Pages'); ?>: [ <?php echo implode(', ', $pages); ?> ]</span>
<?php } ?>
</td>
<td class="ac"><?php echo $html->link($topic['ForumCategory']['title'], array('controller' => 'categories', 'action' => 'view', $topic['Topic']['forum_category_id'])); ?></td>
<td class="ac"><?php echo $html->link($topic['User']['username'], array('controller' => 'users', 'action' => 'profile', $topic['User']['id'])); ?></td>
<td class="ac"><?php echo $time->niceShort($topic['Topic']['created'], $cupcake->timezone()); ?></td>
<td class="ac"><?php echo number_format($topic['Topic']['post_count']); ?></td>
<td class="ac"><?php echo number_format($topic['Topic']['view_count']); ?></td>
<td>
<?php // Last activity
if (!empty($topic['LastPost'])) {
$lastTime = (!empty($topic['LastPost']['created'])) ? $topic['LastPost']['created'] : $topic['Topic']['modified']; ?>
<em><?php echo $time->relativeTime($lastTime, array('userOffset' => $cupcake->timezone())); ?></em><br />
<span class="gray"><?php __d('forum', 'by'); ?> <?php echo $html->link($topic['LastUser']['username'], array('controller' => 'users', 'action' => 'profile', $topic['Topic']['lastUser_id'])); ?></span>
<?php echo $html->image('/forum/img/goto.png', array('alt' => '', 'url' => array('controller' => 'topics', 'action' => 'view', $topic['Topic']['id'], 'page' => $topic['Topic']['page_count'], '#' => 'post_'. $topic['Topic']['lastPost_id']))); ?>
<?php } else {
__d('forum', 'No latest activity to display');
} ?>
</td>
</tr>
<?php ++$counter;
}
} ?>
</table>
<?php echo $this->element('pagination'); ?>
</div>
<?php } ?>
I added:
if (isset($this->Security)){
$this->Security->enabled=false;
}
to the beforeFilter function of search_controller.php and i'm able to get the search results now. No more HTTP 404 website not found error. :)

Resources