Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8790999
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 13, 20262026-06-13T22:46:57+00:00 2026-06-13T22:46:57+00:00

In my model, a Song is linked to a Type . A Type can

  • 0

In my model, a Song is linked to a Type. A Type can be Youtube, Soundcloud, Deezer, etc..

When the link value has been validated by my validator, I want to set the style_id value with the correct Type.

What is the best way to do it ?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-13T22:46:57+00:00Added an answer on June 13, 2026 at 10:46 pm

    I think the best way is to perform the check twice:

    • first time: using the validator, so you know it’s one of these video provider and then return the video link (not the id)
    • second time: redefine the setLink() so it takes the link, extract the id and save both the link and the style_id

    How to do that.

    Create a custom lib, like lib/videoProvider.class.php. This is kind of prototyped class to valid & retrieve id from a video provider. It, of course, needs improvements.

    class videoProvider
    {
      private $url;
      private $providers = array('youtube','deezer','soundcloud');
      private $youtubePattern = '%^# Match any youtube URL
          (?:https?://)?  # Optional scheme. Either http or https
          (?:www\.)?      # Optional www subdomain
          (?:             # Group host alternatives
            youtu\.be/    # Either youtu.be,
          | youtube\.com  # or youtube.com
            (?:           # Group path alternatives
              /embed/     # Either /embed/
            | /v/         # or /v/
            | /watch\?v=  # or /watch\?v=
            )             # End path alternatives.
          )               # End host alternatives.
          ([\w-]{10,12})  # Allow 10-12 for 11 char youtube id.
          $%x';
      private $deezerPattern = '/\d+/';
      private $soundcloudPattern = '[\w-]+/[\w-]+$';
    
      public function __construct($url)
      {
        $this->url = $url;
      }
    
      /**
       * @return true / false
       */
      private function checkYoutube()
      {
        return preg_match($this->youtubePattern, $this->url) ? true : false;
      }
    
      /**
       * @return true / false
       */
      private function checkDeezer()
      {
         // A Deezer URL has this format : http://www.deezer.com/track/61340079
    
         return preg_match($this->deezerPattern, $this->url) ? true : false;
      }
    
      /**
       * @return true / false
       */
      private function checkSoundcloud()
      {
         // A Soundcloud URL has this format : http://soundcloud.com/[A-Z Artist]/[A-Z Title]
    
         return preg_match($this->soundcloudPattern, $this->url) ? true : false;
      }
    
      /**
       * @return true / false
       */
      public function isValid()
      {
        // check all video provider as you do in your validator
        // so it will return true if it find one, otherwise false
    
        foreach ($this->providers as $provider)
        {
          $function = 'check'.ucfirst($provider);
    
          if (true === $this->$function())
          {
            return true;
          }
        }
    
        return false;
      }
    
      /**
       * @return string
       */
      public function getId()
      {
        if ($this->checkYoutube() && preg_match($this->youtubePattern, $this->url, $matches))
        {
          return $matches[1];
        }
    
        if ($this->checkDeezer() && preg_match($this->deezerPattern, $this->url, $matches))
        {
          return $matches[1];
        }
    
        if ($this->checkSoundcloud() && preg_match($this->deezerPattern, $this->url, $matches))
        {
          return $matches[1];
        }
      }
    
      /**
       * @return string
       */
      public function getProvider()
      {
        if ($this->checkYoutube())
        {
          return 'youtube';
        }
    
        if ($this->checkDeezer())
        {
          return 'deezer';
        }
    
        if ($this->checkSoundcloud())
        {
          return 'soundcloud';
        }
      }
    }
    

    Then in the doClean of your validator, you just need to call this class, like that:

    $videoProvider = new videoProvider($url);
    if (false === $videoProvider->isValid())
    {
      throw new sfValidatorError($this, 'invalid', array('value' => $url));
    }
    
    return $url;
    

    Finally, the setLink in Song.class.php should now be:

    public function setLink($value)
    {
      // only perform this tweak if the value is a http link
      if (preg_match('/^http/i', $value))
      {
        $videoProvider = new videoProvider($value);
    
        // define url id
        parent::_set('link', $videoProvider->getId());
    
        // define type id
        $provider = $videoProvider->getProvider();
        $type     = Doctrine_Core::getTable('Type')->findOneByName($provider);
    
        parent::_set('type_id', $type->getId());
      }
    }
    

    This is a first draft that must be tested and improved (test if getId() returns an id and not false, same for getProvider, etc …)

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

model Sample has attributes car,bike x =bike y = Sample.new How can I do?
Afternoon all, I have a post model, which has a song name, song string
I've got a model named Song with has_many :genre_songs, :dependent => :destroy I've got
I have created this model. But I need each song need each artist How
Suppose if we have the album, artist, and song model in rails. In album:
I have a Playlist, Song and a PlaylistSong model. When I add a song
I'm observing changes on the Player model and console.logging the currently played song. When
Let's say you've got a domain model class for a Song. Song's have a
My User model has a bunch of Songs. I want to as a user
I have a model named Song . I also have a model named Listen

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.