Doctrine persisting an array into an entity - doctrine-orm

I am pulling some data from an API and this is set in an array like such:
array (size=8)
'name' => string 'Application Name'
'description' => string 'Application Description'
'author' => string 'Author name'
'version' => string '1.0.0'
'ip' => string '127.1.1'
'host' => string 'http://www.host.com'
'image' => string 'http://www.hostc.com/image.png'
'route' =>
array
1 =>
array
'name' => string 'route'
'description' => string 'The description of route'
'route' => string 'http://www.myroute.com/route'
2 =>
array
'name' => string 'route'
'description' => string 'The description of route'
'route' => string 'http://www.myroute.com/route'
3 =>
'name' => string 'route'
'description' => string 'The description of route'
'route' => string 'http://www.myroute.com/route'
This array reflects my Application Entity and its OneToMany join to the ApplicationRoute entity.
My question is this. is there a simple way to convert this into a usable object and to persist using Doctrine?
EDIT
A working solution that I have was to do this:
I created a function in my Application entity called: fromArray
public function fromArray($array)
{
$this->setName($array['name']);
$this->setDescription($array['description']);
$this->setAuthor($array['author']);
$this->setIp($array['ip']);
$this->setHost($array['host']);
$this->setImageUrl($array['image']);
$routeCollection = new ArrayCollection();
foreach ( $array['route'] AS $route) {
$routeObejct = new ApplicationRoutes();
$routeObejct->setName($route['name']);
$routeObejct->setDescription($route['description']);
$routeObejct->setRoute($route['route']);
$routeCollection[] = $routeObejct;
}
$this->setRoute($routeCollection);
return $this;
}
This does the job, I however feel there is a better way...
Any advice, much appreciated!

Related

Query string in drupal service custom resources

I am trying to use query string structure in drupal services API. it's not working for me.
I have also search most of the solutions, but all failed.
here is m drupal code:
function rapid_services_resources() {
$resources = array(
'get_data' => array(
'operations' => array(
'retrieve' => array(
'help' => t('Gets user email of uid passed.'),
'callback' => 'my_module_get_user_email',
'args' => array(
array(
'name' => 'nid',
'type' => 'int',
'description' => 'The display ID of the view to get.',
'source' => array('param' => 'nid'),
'optional' => TRUE,
'default value' => 'default',
),
),
'access arguments' => '_blog_access_provide_access',
'access callback' => '_blog_access_provide_access',
//~ 'access arguments append' => FALSE,
),
),
),
);
return $resources;
}
function _blog_access_provide_access() {
return TRUE;
}
function my_module_get_user_email($nid){
var_dump($args);die;
}
I want url like this.:
http://localhost/drupaltest/rapidapi/get_data/?nid=111
Please let me know where i did wrong.
thanks in advance.
Hi here are to reference that will be useful
http://pingv.com/blog/an-introduction-drupal-7-restful-services
https://www.drupal.org/node/783460
Also I am not sure about the query string, but for the retrieve operation you can set it as part of the url
ex:
http://localhost/drupaltest/rapidapi/get_data/<nid should be here>
http://localhost/drupaltest/rapidapi/get_data/111
Also using the source path as source
'source' => array('path' => '0'),
I would think that source param only works for an index operation and not retrieve

how can I display error when the pattern does not fit my pattern using Form builder

Update:
I'am trying to add a pattern to ChangePaswwordForm of FOSUserBundle and I want to display a specific message error , I tried to override the Form by adding the attribute 'oninvalide' but in this case the error shows up only when we field is empty and it does not work when the password doesn't fit my pattern.here is the code :
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('plainPassword', 'repeated', array(
'type' => 'password',
'options' => array('translation_domain' => 'FOSUserBundle'),
'first_options' => array('label' => 'form.new_password','pattern' => "[A-Za-z0-9]{4,}",
'attr'=>array( 'oninvalid'=>"setCustomValidity(',,Hi')")),
'second_options' => array('label' => 'form.new_password_confirmation','pattern' => "[A-Za-z0-9]{4,}"),
'invalid_message' => 'fos_user.password.mismatch',
));
}

Doctrine Module objectSelect setvalue not working

I have a simple question regarding Doctrine Modules Object Select.
I have a simple objectSelect form element
$this->add(array(
'name' => 'timezone',
'type' => 'DoctrineModule\Form\Element\ObjectSelect',
'options' => array(
'label' => _('Timezone:'),
'label_attributes' => array('class' => 'required'),
'object_manager' => $this->getEntityManager(),
'target_class' => 'Application\Entity\Timezones',
'property' => 'timezone',
'is_method' => true,
'find_method' => array(
'name' => 'FindAll',
),
),
));
Now I want to select a certain option as default, I have used the setValue method to do this but it is not working.
$this->get('timezone')->setValue(335);
Does anyone know why this is?
Many thanks in advance.
I figured out why it wasn't working.
In my controller I was binding my form to a Doctrine entity which was empty. This was overriding my values I set. I added the values in my controller after the form was bound and this fixed the issue.
$entityManager = $this->getEntityManager();
$site = new Sites($this->getServiceLocator());
$form = new AddSiteForm($this->getServiceLocator());
$form->setHydrator(new DoctrineObject($entityManager));
$form->bind($site);
$form->get('timezone')->setValue(335);
$form->get('currencyCode')->setValue('GBP');

Cakephp display other model associated with foreign key

I have the models Item and Actor with a HABTM relation (working fine).
Now, I added the Role model, wich holds the actorid, itemid (as foreign key) and the actors' role.
In my Item view, I'd like to display the actor and its' role.
I have set recursive =2.
When I debug $items, I receive all the roles belonging to that actor.
Instead I'd like only the role displayed, that contains the viewed itemid AND actorid.
I believe I might need to tweak my models but don't know how.. Any suggestions?
Item Model
public $hasAndBelongsToMany = array(
'Actor' => array(
'className' => 'Actor',
'joinTable' => 'item2actor',
'foreignKey' => 'item_id',
'associationForeignKey' => 'actor_id',
'unique' => 'true'
));
public $hasMany = array(
'Role' => array(
'className' => 'Role',
'foreignKey' => 'actorid',
));
Actor Model
public $hasAndBelongsToMany = array(
'Item' => array(
'className' => 'Item',
'joinTable' => 'item2actor',
'foreignKey' => 'actor_id',
'associationForeignKey' => 'item_id',
'unique' => 'true'));
public $hasMany = array(
'Role' => array(
'className' => 'Role',
'foreignKey' => 'actorid',
));
Instead of using a -very large- query and recursive I suggest using Containable behavior with which it's much easier to maintain the data you want to receive from DB.
http://book.cakephp.org/2.0/en/core-libraries/behaviors/containable.html # Cake Book.

Pretty HABTM List Entry

I have a Recipe, Item, and Units table/model. I have a HABTM relationship with Recipe and Item, and I get the default multiple-select box when adding/editing Recipe. (am using Bake for everything for the most part). The problem is I need to associate quantities and units with each Item.
Sample of UI I'm hoping for:
A big component of it is the ability to add/delete/edit the individual items. I imagine looking at the submitted form data, and using some jquery and clone would work. But I was wondering if someone already created a Behavior perhaps for this already?
Current Models (shortened to the relevant stuff, ie removed users/notes/etc):
class Item extends AppModel {
var $name = 'Item';
// id : int
// name : varchar
// unit_id : int
var $belongsTo = array(
'Unit' => array(
'className' => 'Unit',
'foreignKey' => 'unit_id'
),
);
var $hasAndBelongsToMany = array(
'Recipe' => array(
'className' => 'Recipe',
'joinTable' => 'recipes_items',
'foreignKey' => 'item_id',
'associationForeignKey' => 'recipe_id',
)
);
}
.
class Recipe extends AppModel {
var $name = 'recipe';
var $displayField = "name";
// id : int
// name : varchar
var $hasAndBelongsToMany = array(
'Item' => array(
'className' => 'Item',
'joinTable' => 'recipes_items',
'foreignKey' => 'recipe_id',
'associationForeignKey' => 'item_id',
)
);
}
.
class RecipesItem extends AppModel {
var $name = 'RecipesItem';
// id : int
// quantity : int
// unit_id : int
// recipe_id : int
// item_id : int
var $belongsTo = array(
'Unit' => array(
'className' => 'Unit',
'foreignKey' => 'unit_id'
),
'Recipe' => array(
'className' => 'Recipe',
'foreignKey' => 'recipe_id'
),
'Item' => array(
'className' => 'Item',
'foreignKey' => 'item_id'
)
);
}
Not quite sure what you're asking. For adding, editing and deleting items you would need create actions in your items controller. Saving association data (ie which Items a Recipe has) should be handled more-or-less automatically by the save() method in your controller action, assuming you have your forms set up correctly.
Out of curiosity, where did the RecipesItem model come from? What does that represent? If I am understanding you correctly, you have a Recipe model, and an Item model, with HABTM relationship. You shouldn't need a model for their join table, the recipes_items table just relates items from the two models.
that's not something Cake can do for you. Maybe there's some js that can helps you a bit, but you'll pretty much have to write your own javascript for that.
You have to use javascript to "transform" the select tag into something "cooler".
Here is the jquery-multiselect plugin which I use quite a bit. You can easily set it up to replace all of your multi selects with 1 line of code.
More info here:
http://www.erichynds.com/jquery/jquery-ui-multiselect-widget/